[comp.windows.x] XtGetValues.

fred@hpcvlx.HP.COM (Fred Taft) (08/15/88)

When using XtGetValues(), you need to remember that there are two ways to
have the resulting value returned:

   1) It will be returned in the arglist's value slot, if this value has
      been set to NULL before the call to XtGetValues().

   2) It will be returned in the location pointed to by the address stored
      in the arglist's value slot, if this value has been set to a non-NULL
      value before the call to XtGetValues().

In your case, for the first call, the value has been set to NULL, so 
XtGetValues() returns the queried value in the arglist.  However, for the
second call, you now have a non-NULL value in your arglist, so the toolkit
assumes that you have supplied a pointer to a variable into which the
value is to be stored; thus, it is not surprizing that your program dumps
core!

swick@ATHENA.MIT.EDU (Ralph R. Swick) (08/16/88)

    Date: 12 Aug 88 20:09:19 GMT
    From: coltoff@burdvax.prc.unisys.com  (Joel Coltoff)

    The only thing I noticed is that if you use XtGetValues()
    twice in the same function you need to say arg[0].values = 0;
    before you call it or it dumps core.

Nope.  You have to store a pointer to the desired destination in
the arglist for XtGetValues.  See section 11.8.1.  Storing a NULL
pointer appears to work because of some backwards compatibility
code that will disappear from a (unspecified) future release.

rob@cetia.UUCP (05/16/89)

I know this has come up before but this may be new information.

Anyway, on our system which is M68K based, when using the scrollbar widget,
 top always comes back from XtGetValues with a zero value.

However, if i, temporarily, remove the following lines of code from
XtGetValues() in lib/Xt/Resource.c

    /* Get constraint values if necessary */
    if (w->core.constraints != NULL) {
        ConstraintWidgetClass cwc;
        cwc = (ConstraintWidgetClass) XtClass(w->core.parent);
        GetValues(w->core.constraints,
            (XrmResourceList *)(cwc->constraint_class.resources),
            cwc->constraint_class.num_resources, args, num_args);
    }

then the value returned in top is as expected.


Why should this be? (and is it relevant?)

rob

rob@cetia.UUCP (Rob Gordon) (05/16/89)

I know this has come up before but this may be new information.

Anyway, on our system which is M68K based, when using the scrollbar widget,
 top always comes back from XtGetValues with a zero value.

However, if i, temporarily, remove the following lines of code from
XtGetValues() in lib/Xt/Resource.c

    /* Get constraint values if necessary */
    if (w->core.constraints != NULL) {
        ConstraintWidgetClass cwc;
        cwc = (ConstraintWidgetClass) XtClass(w->core.parent);
        GetValues(w->core.constraints,
            (XrmResourceList *)(cwc->constraint_class.resources),
            cwc->constraint_class.num_resources, args, num_args);
    }

then the value returned in top is as expected.


Why should this be? (and is it relevant?)

rob

-- 
Rob Gordon
				rob@inset.co.uk
				...!mcvax!ukc!inset!rob

harish@csl.ncsu.edu (Harish Hiriyannaiah) (08/20/89)

I am having trouble using XtGetValues. Here's a piece of code that doesn't
work right. 

------------------------  Begin file handler.c ------------------------
#include "xdisp.h"

static Arg size_args[2] = 
		      {
			{XtNheight,NUL},
			{XtNwidth,NUL}
		      };

void  topcall(widget,client,call)
	Widget  widget;
	caddr_t client,call;
{
  int height,width;

  XtSetArg(size_args[0],XtNheight,(XtArgVal)&height);
  XtSetArg(size_args[1],XtNwidth,(XtArgVal)&width);

  XtGetValues(widget,size_args,(Cardinal) 2);

  printf("Height = %d, Width = %d\n",height,width);
}

----------------------------End file handler.c---------------------

xdisp.h contains all the proper inclusions like Intrinsic.h etc. The printf
statement spits out garbage. 

The environment is DEC VaxStation 3100 running Ultrix 3.1. Incidentally, the
include files used are the ones in /usr/include/mit/X11, and the libraries
used are libX11.a libXmu.a libXt.a and libXaw.a .

harish pu. hi.				harish@ecelet.ncsu.edu
					harish@ecebucolix.ncsu.edu

swick@ATHENA.MIT.EDU (Ralph R. Swick) (08/28/89)

> I am having trouble using XtGetValues. Here's a piece of code that doesn't
> work right. 
>...
>
>  int height,width;
>
>  XtSetArg(size_args[0],XtNheight,(XtArgVal)&height);
>  XtSetArg(size_args[1],XtNwidth,(XtArgVal)&width);

height and width are of type Dimension.  Dimension and int may
or may not be the same, depending on the implementation.  In the
implementation you are using they are almost certainly not the same.