lmjm@doc.imperial.ac.UK (Lee McLoughlin) (08/17/88)
VERSION:
X11 release 2
CLIENT MACHINE:
HLH Orion 1/05 (Fairchild Clipper processor).
CLIENT OPERATING SYSTEM:
4.2 BSD Unix
DISPLAY:
StarPoint
SYNOPSIS:
Can't move slider in an Xtk scrollbar.
DESCRIPTION:
When trying to move the slider in an Xtk scrollbr (such as in
xterm) you get weird results. The xterm slider leaps back and forth
from where it should be (at the cursor) to the top of the
scrollbar.
REPEAT-BY:
Move the xterm slider.
[[This is the original message from Steve Thomas <steve@hlh.co.uk>.]]
I've discovered what's wrong with scroll bars. Turn to p25 of 'X Toolkit
Widgets - C Language X Interface'. Some of the routines take float
arguments. The trouble is, they are passed through the XtCallBack
mechanism, which states that the "opaque data" is the actual data
if it's one word, or a pointer to the data if it's more than one.
Unfortunately, floats get promoted to doubles, so half the datum
disappears. Typically, it's the half with the exponent and high order
bits of the fraction.
For concreteness, inside lib/Xaw/Scroll.c is the statement
XtCallCallbacks( gw, XtNthumbProc, w->scrollbar.top);
where w->scrollbar.top is a float.
Inside lib/Xt/Callback.c is
void XtCallCallbacks(widget, name, call_data)
Widget widget;
String name;
caddr_t call_data;
{
CallbackList *callbacks;
callbacks = FetchCallbackList(widget, name);
...
_XtCallCallbacks(callbacks, call_data);
} /* XtCallCallbacks */
void _XtCallCallbacks (callbacks, call_data)
CallbackList *callbacks;
caddr_t call_data;
{
...
(*(cl->callback)) (cl->widget, cl->closure, call_data);
...
}
[[end of original message]]
Both Steve and I would like to know what the ``correct'' solution to
this is? I guess it must be to go thru and pass pointers to floats
since you cannot pass them as an arg without the risk of it being
widened. If you force it not to widen on passing by:
XtCallCallbacks( gw, XtNthumbProc, (int)(w->scrollbar.top));
It would still go wrong on calling the callback because the compiler
will widen the argument type from float to double. But now it is only
being passed a float.
Lee & Steve.
--
--
UKUUCP SUPPORT Lee McLoughlin
"What you once thought was only a nightmare is now a reality!"
Janet: lmjm@uk.ac.ic.doc, lmcl@uk.ac.ukc
DARPA: lmjm@doc.ic.ac.uk (or lmjm%uk.ac.ic.doc@nss.cs.ucl.ac.uk)
Uucp: lmjm@icdoc.UUCP, ukc!icdoc!lmjm