Archive-name: motif-faq/part8
Last-modified: 1 FEB 2002
Posting-Frequency: irregular
Organization: Kenton Lee, X/Motif Consultant, http://www.rahul.net/kenton/
URL: http://www.rahul.net/kenton/mfaq.html
Version: 8.1



-----------------------------------------------------------------------------
Subject: 250) TOPIC: KEYSYMS

-----------------------------------------------------------------------------
Subject: 251) What is causing the messages "unknown keysym name osfDown..."?
[Last modified: Oct 98]

Answer: There is an OSF supplied addition to the /usr/lib/X11/XKeysymDB file.
It is found on the release tape and should have been automatically installed
if the installation procedure was followed in the Release Notes.

You have to copy (or append) lib/Xm/XKeysymDB into /usr/lib/X11. This may
require root permission. It is not clear how to fix the problem if you can't
do this. The error comes from Xt translation table parsing and can't be fixed
in Motif, so if you can't get root permission you may be stuck. The file is
not copyrighted so you can install it on other systems.

If X has been built so that XKeysymDB is not in this directory, and you don't
know where it is looking, run 'strings libX11.a | grep XKeysymDB' to find the
path.

On a Sun running openwin with shared libraries, you may need to put the path
for the library containing XKeysymDB *first* in the path list in
LD_LIBRARY_PATH, or it may find the wrong XKeysymDB in the wrong directory.

XKeysymDB simply contains the registered keysym values for the OSF keysyms.
The OSF values are server-independent. And, all registered keysyms will be
included in an XKeysymDB file to be shipped with X11R5.

In the meantime (till all systems are X11R5+), a list of the registered
keysyms can be found in the X11R4 release in mit/doc/Registry/Xregistry.

Also note the XKEYSYMDB environment variable. Setting this to point to the
XKeysymDB file often helps, but not always...

Some people have also reported getting this error if their Motif libraries
were built with libc headers that are not compatible with those installed on
their system. For example, Linux has two incompatible libraries libc5 and
glibc. You may get keysym (and other) errors if your Motif was built with
libc5 but you run your Motif application with glibc. Contact your Motif
vendor for information on the required libc.

Ken Lee

-----------------------------------------------------------------------------
Subject: 252) What happens if I can't install Motif Keysyms?

tessi!george@nosun.West.Sun.COM (George Mitchell) wrote:

Here's what appears to happen if you don't have XKeysymDB in place to define
OSF's virtual keysyms:

1. At class initialize time, for a widget (such as XmText) that uses virtual
keysyms in its event translation table, all entries which refer to those
keysyms fail to parse correctly. In the case of XmText, instead of ending up
with a translation table with roughly 90 entries, you end up with one that has
29.

2. XKeysymDB doesn't exist, so you'd assume that KeyPress events will get
translated to plain vanilla keysyms, right? WRONG! All Motif widgets install
a virtual keysym translator ANYWAY! Consequently, the backspace key (for
example) gets translated to the keysym osfBackSpace.

3. Therefore, if you augment or override your widget's translations with
translations that refer to plain vanilla BackSpace, they will never be
triggered, because you will NEVER see plain vanilla BackSpace, only
osfBackSpace.

4. But you can't use osfBackSpace in an event translation entry, because you
don't have XKeysymDB installed!

Here's how I'm "dealing" with the problem right now: Motif installs its
virtual keysym translator by calling XtSetKeyTranslator every time a
VendorShell (or subclass) widget is created. So every time I create a shell,
I immediately call XtSetKeyTranslator (display, XtTranslateKey) to restore the
default translator. No more funny virtual keysyms! Now I can reinstall non-
osfKeySym translations and have them work the way I expect.

-----------------------------------------------------------------------------
Subject: 253) Why has OSF introduced Keysyms into Motif 1.1? They weren't
there in Motif 1.0.

Answer: ellis@osf.org wrote:

Virtual Keysyms are meant to provide a consistent keyboard model for Motif
applications running in a heterogeneous environment in which proprietary (i.e.
vendor specific) non-Motif applications may also be running.

First of all, for the sake of the rest of the readers, let's explain why this
is an issue:

It would be lovely if Motif's translation tables could just use the obvious
keysyms predefined by X. For example, there are keysyms for XK_BackSpace,
XK_Delete, XK_Left, XK_Right, etc. Shouldn't these be the ones that are used
in our translations? Unfortunately, the problem is not so simple. Some
specific examples:

While most vendors bind XK_BackSpace to the key at the top right
of the standard keyboard (often engraved with a leftwards
pointing arrow), not all do. In fact, some vendors (including DEC)
bind that key to XK_Delete.

While most vendors bind the arrow keys to XK_Up, etc, a number of
vendors (including Sun, on some servers) bind them to function key
keysyms.

A simplistic solution would require the use of xmodmap to change the offending
bindings. That would work swell in an all Motif environment. However, OSF's
goal (not always perfectly achieved) is interoperability. That is, we'd like
to make sure that both Motif and non-Motif programs can happily run in the
same environment.

It is expected that a vendor may have a wide variety of existing X-based
software that uses the keysyms as established by that vendor for specific
purposes. It is expected that these applications may run at the same time as
Motif-based software. Using xmodmap to change keysyms on the server side
could "break" the existing applications (or at the very least their
documentation) by making some keys unavailable, or by moving the location.

So, we chose not to use xmodmap. By the way, though OpenLook uses a different
implementation (they recompile their virtual translation tables into actual
translation tables), they basically adopted the same approach, presumably for
similar reasons.

To work properly, the virtual keysym model we implemented depends on Xlib
finding XKeysymDB installed appropriately (which standard Motif installation
does). This simply defines the keysyms (not the key they are bound to). This
unfortunate piece of stupidity is necessary because MIT only includes standard
keysyms in keysymdef.h. It should be said that our lives would be made easier
if MIT would also see fit to include registered keysyms in keysymdef.h as
well.

Motif applications determine how to bind virtual to actual keys by looking for
either a resource or a property on the root window which describes what to do.
Note that this information is on the server side, so that all applications use
the same virtual bindings regardless of where they are running. Mwm will
happily create the property if it finds a .motifbind file in your home
directory when it starts up. (Actually, things generally work even if none of
this is done, since if all else fails, the Motif toolkit chooses a virtual
bindings table to use based on the identification of the server).

The actual implementation of virtual keys is made possible by a hook in the
Intrinsics. Undoubtably, the implementation would be simpler and cleaner if
virtual key support was more directly supported by the Intrinsics. We will be
exploring this possibility in the future.

-- Ellis

-----------------------------------------------------------------------------
Subject: 254) Why do accented characters not work with Motif applications
linked with X11R6? What is the Compose file?
[Last modified: June 95]

Answer: Note: The list of codes below _should_ contain a backslash before
every numeric value. My FAQ maintainence tools have been stripping the
backslash. Sorry for the confusion...ksall@cen.com.

Roman Czyborra (czyborra@cs.tu-berlin.de) writes:

I've xmodmapped a few accented characters onto my keyboard. They've worked
fine in most every window, but were dead in the Motif applications linked with
X11R6. My LC_CTYPE has always been set to iso_8859_1, so that was not the
problem. It turns out that I can activate the keys by patching
$XLOCALEDIR/iso8859-1/Compose to also include the lines listed below.

: "240"
: "241"
: "242"
: "243"
: "244"
: "245"
: "246"
: "247"
: "250"
: "251"
: "252"
: "253"
: "255"
: "255"
: "256"
: "257"
: "260"
: "261"
: "262"
: "263"
: "264
: "265"
: "266"
: "267"
: "240"
: "271"
: "272"
: "273"
: "274"
: "275"
: "276"
: "277"
: "300"
: "301"
: "302"
: "303"
: "304"
: "305"
: "306"
: "307"
: "310"
: "311"
: "312"
: "313"
: "314"
: "315"
: "316"
: "317"
: "320"
: "321"
: "322"
: "323"
: "324"
: "325"
: "326"
: "327"
: "330"
: "331"
: "332"
: "333"
: "334"
: "335"
: "336"
: "337"
: "340"
: "341"
: "342"
: "343"
: "344"
: "345"
: "346"
: "347"
: "350"
: "351"
: "352"
: "353"
: "354"
: "355"
: "356"
: "357"
: "360"
: "361"
: "362"
: "363"
: "364"
: "365"
: "366"
: "367"
: "370"
: "371"
: "372"
: "373"
: "374"
: "375"
: "376"
: "377"


-----------------------------------------------------------------------------
Subject: 255) TOPIC: UIL

[NOTE: As you can see, this is a new topic area. Send me your ideas for
answered questions pertaining to this topic.]

-----------------------------------------------------------------------------
Subject: 256) What is UIL and why is it so popular?
[Last modified: Sept 94]

Answer: UIL is the acronym for "User Interface Language", a Motif standard
which permits separation of the user interface from application code. UIL is
a textual description of the user interface which is compiled into binary form
called UID ("User Interface Definition") using the Motif-provided compiler
called "uil".

It is important to realize that UIL is a static description of the UI in that
connections between buttons and the dialogs they invoke, for example, is not
expressed here; dynamic UI behavior appears in C code.

The Period Table of Widgets, called "periodic" (delivered by many Motif
vendors) is an example of a UIL application.

There are many advantages and disadvantages of UIL applications. A few of the
advantages are:

UIL is a standard format which encourages separation of the user interface
from application code.

UIL can be read and/or written by many of the GUI builders and UIMS tools
mentioned elsewhere in this FAQ, making your interface portable (to a degree)
across builder tools.

UIL is a much better language than C for defining a widget hierarchy: in C,
the widget hierarchy is expressed "linearly" by referencing a previously-
created parent widget when creating a child widget; in UIL, widget trees are
defined more naturally using nesting.

With UIL, you separate the definition of the widget tree from the application.
You can make major changes to the look-and-feel without re-building the
application.


It is possible to write a "general-purpose" application that defines a library
of callbacks. The application may "execute" any UIL file that references
callbacks from the library.


For a good UIL reference, see "Motif Programming Manual", Volume 6A, published
by O'Reilly and Associates. [See "BOOKS" for details.]

-----------------------------------------------------------------------------
Subject: 257) What is Mrm?
[Last modified: Nov 94]

Answer: Mrm is the "Motif Resource Manager", a set of functions (whose names
begin with Mrm, such as MrmFetchWidget and MrmRegisterNames) in libMrm.a which
retrieve the widget hierarchy from the UID file, associate callbacks, and
create the widgets.

Mrm is usually discussed in books which cover UIL.

Motif Programming Manual, Volume 6A
OSF/Motif Programmers Guide
OSF/Motif Programmers Reference Manual

See the BOOKS section for detailed references.

-----------------------------------------------------------------------------
Subject: 258) How do I specify a search path for ".uid" files? Answer: Use
the UIDPATH environment variable. It is documented on the MrmOpenHierarchy()
man page.

-----------------------------------------------------------------------------
Subject: 259) Can I specify callback functions in resource files?

Answer: To specify callbacks, you must use UIL in addition to or in place of
resource files. You can, however, specify translations in resource files,
which give you most of the same functionality as callback functions.

Ken Lee, http://www.rahul.net/kenton/

-----------------------------------------------------------------------------
Subject: 260) How can I set a multi-line label in UIL?
[Last modified: Sept 94]

Answer: In UIL, you have to explicitly create a compound string with a
separator. Here's what W. Scott Meeks suggests:

value nl : compound_string('', seperate=true);

object my_label : XmLabel
{
arguments
{
XmNlabelString = 'Here' & nl & 'is' & nl & 'the' & nl & 'Label';
};
};


-----------------------------------------------------------------------------
Subject: 261) Is there a program that can convert a UIL file to tclMotif? I
have an old Motif program that I used on SCO unix. Now that I switched to
Linux, I would like to "reprogram" it without the Motif libraries under Linux.
[Last modified: Aug 95]

Answer: Jan Newmarch (jan@ise.canberra.edu.au) writes:

The latest version of tclMotif (v 1.3) will allow you to load uil files
(actually, the uid files output from the uil compiler) directly into tclMotif.
So you don't need to convert at all.

The source is available at ftp.x.org. This, plus a Linux binary are also at
ftp://ftp.canberra.edu.au/pub/motif/tclMotif (Thanks to Ben Elliston
(ben@ise.canberra.edu.au) for correcting this URL.)

-----------------------------------------------------------------------------
Subject: 262) Why does my SCO UIL application fail to open 60 UID files?
[Last modified: Sept 95]

Answer: Make sure that you call MrmCloseHierarchy. There is no need to keep
the file open after you fetch the widgets from it.

Thanks to Tom Schutter (tom@platte.com)

-----------------------------------------------------------------------------
Subject: 263) TOPIC: ICONIFICATION and DE-ICONIFICATION

Iconification/de-iconification is a co-operative process between a client and
a window manager. The relevant standards are set by ICCCM. Mwm is ICCCM
compliant. The toplevel (non-override-redirect) windows of an application may
be in three states: WithdrawnState (neither the window nor icon visible),
NormalState (the window visible) or IconicState (the icon window or pixmap
visible). This information is contained in the WM_STATE property but ordinary
clients are not supposed to look at that (its values have not yet been
standardised). Movement between the three states is standardised by ICCCM.

-----------------------------------------------------------------------------
Subject: 264) How can I keep track of changes to iconic/normal window state?

Answer: You can look at the WM_STATE property, but this breaks ICCCM
guidelines. ICCCM compliant window managers will map windows in changing them
to normal state and unmap them in changing them to iconic state. Look for
StructureNotify events and check the event type:

XtAddEventHandler (toplevel_widget,
StructureNotifyMask,
False,
StateWatcher,
(Opaque) NULL);
void StateWatcher (w, unused, event)
Widget w;
caddr_t unused;
XEvent *event;
{
if (event->type == MapNotify)
printf ("normal\n");
else if (event->type == UnmapNotify)
printf ("iconified\n");
else printf ("other event\n");
}


If you insist on looking at WM_STATE, here is some code (from Ken Sall) to do
it:

/*
------------------------------------------------------------------
Try a function such as CheckWinMgrState below which returns one of
IconicState | NormalState | WithdrawnState | NULL :
------------------------------------------------------------------
*/
#define WM_STATE_ELEMENTS 1

unsigned long *CheckWinMgrState (dpy, window)
Display *dpy;
Window window;
{
unsigned long *property = NULL;
unsigned long nitems;
unsigned long leftover;
Atom xa_WM_STATE, actual_type;
int actual_format;
int status;

xa_WM_STATE = XInternAtom (dpy, "WM_STATE", False);

status = XGetWindowProperty (dpy, window,
xa_WM_STATE, 0L, WM_STATE_ELEMENTS,
False, xa_WM_STATE, &actual_type, &actual_format,
&nitems, &leftover, (unsigned char **)&property);

if ( ! ((status == Success) &&
(actual_type == xa_WM_STATE) &&
(nitems == WM_STATE_ELEMENTS)))
{
if (property)
{
XFree ((char *)property);
property = NULL;
}
}
return (property);
} /* end CheckWinMgrState */


One problem with testing WM_STATE is that a race condition is possible;
immediately after testing it, it could change, and the logic proceeds to
behave as if it were in the old state.

-----------------------------------------------------------------------------
Subject: 265) How can I check if my application has come up iconic? I want
to delay initialization code and other processing.

Answer: Use XtGetValues and check for the XmNinitialState value of the
toplevel shell just before XtMainLoop. -- IconicState is iconic, NormalState
is not iconic.


-----------------------------------------------------------------------------
Subject: 266) How can I start my application in iconic state?

Answer: Try this from the command line:

application -iconic

Using the resource mechanism, set the resource XmNinitialState to IconicState
of the toplevel shell widget (the one returned from XtInitialise).

-----------------------------------------------------------------------------
Subject: 267) How can an application iconify itself?

Answer: In R4 and later, use the call XIconifyWindow. Ken Lee adds "Set
XmNiconic on your shell. This should work in X11R6 and later patch levels of
X11R5."

For R3, send an event to the root window with a type of WM_CHANGE_STATE and
data IconicState.

void
IconifyMe (dpy, win)
Display *dpy;
Window win; /* toplevel window to iconify */
{
Atom xa_WM_CHANGE_STATE;
XClientMessageEvent ev;

xa_WM_CHANGE_STATE = XInternAtom (dpy,
"WM_CHANGE_STATE", False);

ev.type = ClientMessage;
ev.display = dpy;
ev.message_type = xa_WM_CHANGE_STATE;
ev.format = 32;
ev.data.l[0] = IconicState;
ev.window = win;

XSendEvent (dpy,
RootWindow (dpy, DefaultScreen(dpy)),
True,
(SubstructureRedirectMask | SubstructureNotifyMask),
&ev);
XFlush (dpy);
}


-----------------------------------------------------------------------------
Subject: 268) How can an application de-iconify itself?
[Last modified: Aug 98]

Answer: Carolyn Allen writes:

if(XtIsRealized(shell_widget))
{
Display *dpy = XtDisplay(shell_widget);
Window win = XtWindow(shell_widget);
Window client = XmuClientWindow(dpy,win);
XMapRaised(dpy,client);
}


If all you want to do is pop the icon to the top, use XRaiseWindow(dpy,client)
instead.

-----------------------------------------------------------------------------
Subject: 269) Why doesn't MWM display an iconify button on my dialog windows?
[Last modified: May 95]

Answer: MWM (and some other window managers) does not allow transient windows
to be iconified. Transients are automatically unmapped when the main shell is
iconified and they are re-mapped when the main shell is restored. If you do
not want this transient behavior, you should use top a TopLevelShell widget
instead of a XmDialogShell widget for your windows.

Ken Lee

-----------------------------------------------------------------------------
Subject: 270) TOPIC: SPECIALIZED WIDGETS
[Last modified: Jan 95]

This section describes a few specialized widgets people have asked about. A
_far_ more comprehensive illustrated list is maintained by Richard Offer
(offer@sgi.com). His list covers these widget categories:

Complete Listing
Composite Widgets
Non-Composite Widgets
Motif 1.1 Compatible
Motif 1.2 Compatible
Athena Compatible
FWF Widget Set
By Author
Shareware Widgets
Commercial Widgets

For Richard Offer's Widget FAQ Home Page, WWW users should see:

http://reality.sgi.com/widgetFAQ/


The Widget FAQ is also available in ASCII as:

ftp://ftp.x.org/contrib/faqs/Widget.FAQ.Z


If you don't have access to the World Wide Web, the Widget FAQ (sans pictures)
can be obtained from ftp.x.org:

/contrib/faqs/Widget.FAQ.Z


-----------------------------------------------------------------------------
Subject: 271) Where can I get ComboBox, SpinBox, or Tree graph widgets?
[Last modified: Apr 98]

Motif 2.0 and later include an XmContainer widget which displays hierarchal
trees. Motif 2.0 also includes XmComboBox and XmSpinBox, which many users
requested.

For Motif 1.x versions of these widgets and listings of other types of
widgets, see the widgets FAQ mentioned in the previous subject.

-----------------------------------------------------------------------------
Subject: 272) How can I create a transparent widget?
[Last modified: Dec 98]

Answer: The simplest way is probably to use the SHAPE protocol extension. The
xeyes, xlogo, and oclock demo programs in X11R5 (and later) are good examples
of using SHAPE with widgets. You should be able to use the same techniques
with your Motif widget subclasses.

Ken Lee

Ken Sall (ksall@cen.com) adds: The official name for this extension is "X11
Nonrectangular Window Shape Extension". If you have X11R5 source, the Shape
extension document is $TOP/mit/hardcopy/extensions/shape.PS or
$TOP/mit/doc/extensions/shape.ms. In X11R6, see
$TOP/xc/doc/hardcopy/Xext/shape.PS or $TOP/xc/doc/specs/Xext/shape.ms. There
is also a terse man page: $TOP/mit/man/Xext/XShape.man (X11R5) and
$TOP/xc/doc/man/Xext/XShape.man (X11R6).

Ken Lee adds: Some graphics-oriented systems (e.g., SGI, HP) include hardware
overlay planes that support transparency directly. The APIs for accessing
these capabilities from Motif programs are non-standard. Read your system's
documentation or contact your vendor for more details.

-----------------------------------------------------------------------------
Subject: 273) TOPIC: CREATING WIDGETS

[This section is for widget writers.]

-----------------------------------------------------------------------------
Subject: 274) What are some good references for creating widgets (subclassing
widgets)?
[Last modified: May 99]

Answer: Ken Sall (ksall@cen.com) writes:

If you have Motif 2.0 or later, see the new document provided by OSF called
"OSF/Motif Widget Writer's Guide" in the directory:
doc/widgetGuide/Output/draft/ps.

If you have Motif 1.*, try these references (details in the BOOKS topic):

Paul Asente, Donna Converse, and Ralph Swick, X Window System Toolkit,
Second Edition, 1998.

Nye, Adrian & O'Reilly, Tim,
X Toolkit Intrinsics Programming Manual.Motif Edition, Volume 4M

Flanagan, David, Editor,
X Toolkit Intrinsics Reference Manual, Volume 5


joe shelby (jshelby@autometric.com) writes:

Alastair Gourlay, a former member of the Motif Development group at OSF, has
written 2 articles for _The X Resource_, published by O'Reilly and Associates.

The first, "Writing Motif Widgets : A Pragmatic Approach" can be found in
Issue 6. It covers writing a XmPrimitive-derived widget, deriving from that
widget, and writing a XmManager-derived widget. Also included are brief
summaries of several _Xm private functions for widget writers, how to use the
Motif 1.2 Representation Type functions, and adding the widgets to Mrm/Uil.

The second, "The One-Minute Manager : Custom Motif Layout Widgets Made Easy"
can be found in Issue 10. It expands and greatly simplifies creating
composite widgets for Motif. Gourlay has created and released a new widget,
the XmpGeometry widget that handles all of the geometry management issues for
you and provides convenience functions for determiningparent and child
widgets' perfered sizes. All the programmer has to do to derive from this
widget is create the new resources and constraints and implement 2 new class
methods to override the XmpGeometry's methods. Included with the XmpGeometry
class are 3 example derived widgets.

Donald L. McMinds and Joseph P. Whitty have written a book, _Writing Your Own
OSF/Motif Widgets_, published by Prentice Hall for Hewlett-Packard
Professional Books. Both authors work at HP's Workstation Systems Division,
and have been involved with Motif developement since its beginnings. The book
(which is mostly code with explanations) gives details on writing
XmPrimitive-derived, XmManager-derived, and XmGadget-derived widgets, with one
example widget for each. In addition, the book provides "man-pages" for
several _Xm private functions for programmer convenience.

-----------------------------------------------------------------------------
Subject: 275) How can I achieve binary compatibility using the
XmResolvePartOffset API?
[Last modified: July 96]

Answer: Daniel Dardailler (daniel@x.org) recently provided the following URL:

http://www.x.org/people/daniel/xmresolve
Achieving Binary Compatibility using the XmResolvePartOffset API

which addresses the problem caused by the fact that many widget writers "never
used the XmResolvePartOffsets API in their subclass code, therefore ensuring
it will break when dynamically relinked with newer version of libXm".

Unfortunately, this URL is no longer valid. Does anyone know of a new
location? Thanks.

-----------------------------------------------------------------------------
Subject: 276) TOPIC: MISCELLANEOUS

-----------------------------------------------------------------------------
Subject: 277) How can an application be informed of signals?
[Last modified: Jun 98]

Answer: The answer differs depending on whether you're using X11R5 or X11R6.
For those using X11R6, Ken Lee (http://www.rahul.net/kenton/) writes: In
X11R6, the Xt library has the new XtAppAddSignal() function. Ken Lee's
December, 1995 *The X Advisor* column has an example:

http://www.rahul.net/kenton/txa/dec95.html

For those using X11R5, these older responses apply:

blackman@hodgkin.med.upenn.edu (David Blackman) writes:

According to comp.windows.x FAQ, you shouldn't make Xt/Xlib calls from a Unix
signal handler:

"You can work around the problem by setting a flag in the interrupt handler
and later checking it with a work procedure or a timer event which has
previously been added."

Kaleb KEITHLEY (fedora.x.org!kaleb) adds:

Xt is not reentrant and it is not safe to call any Xt functions from a signal
handler... I think [the signaling] technique is covered in the [X] FAQ. On
most POSIX-type systems write(2) is guaranteed to be reentrant and atomic. If
you establish a simple pipe with the pipe(2) system call, and add it as an
XtInput with XtAppAddInput(), then you can write to the pipe in the signal
handler. Xt will notice that input is available and call the input-handler
proc. This technique is inherently better than setting the flag because the
write to the pipe will result in XtAppNextEvent returning immediately without
the latency you observe in using the flag technique. In R6 you can use the
XtAppAddSignal function.

Ken Sall (ksall@cen.com) adds: See the "Signal Handling" chapter of "Motif
Programming Manual" by Heller and Ferguson, listed in the BOOKS topic.

Paul Davey (pd@uit.co.uk) adds: The write and XtAppAddInput input method is
often the best - but be warned it does not work on some SVR3 based Unixes,
where a pipe may not be selected on. SCO Unix exhibits this behaviour so here
the external flag method should be used.

-----------------------------------------------------------------------------
Subject: 278) How do I control the repeat rate on a SUN keyboard?

Answer:

[...]

-ar1 milliseconds
This option specifies amount of time in milliseconds
before which a pressed key should begin to
autorepeat.

-ar2 milliseconds
This option specifies the interval in milliseconds
between autorepeats of pressed keys.

Of course this presumes you're using a server based on the MIT sample server.

Thanks to kaleb@x.org (Kaleb Keithley)

-----------------------------------------------------------------------------
Subject: 279) How can I identify the children of a manager widget?

Answer: Use XtGetValues() on XmNchildren (array of widget IDs) and
XmNnumChildren (number of widgets in array).

-----------------------------------------------------------------------------
Subject: 280) What functions can an application use to change the size or
position of a widget?

Answer: Applications should set the values of the XmNx, XmNy, XmNwidth, and
XmNheight resources.

Note that many manager widgets ignore the XmNx and XmNy resources of their
children, relying instead on their internal layout algorithms. If you really
want specific positions, you must use a manager widget that allows them, e.g.,
XmBulletinBoard.

Also note that some manager widgets reject size change requests from their
children when certain resources are set (e.g., XmNresizable on XmForm).
Others allow the the children to resize, but clip the results (e.g.,
XmNallowShellResize on shell widgets). Make sure you have these resources set
to the policy you want.

Due to bugs, some widgets (third party widgets) do not respond to changes in
their width and height. Sometimes, you can get them to respond correctly by
unmanaging them, setting the resources, then managing them again.

Under no circumstances should applications use routines like
XtConfigureWidget() or XtResizeWidget(). These routines are reserved for
widget internals and will seriously confuse many widgets.

Ken Lee

-----------------------------------------------------------------------------
Subject: 281) Can I use XtAddTimeOut, XtAddWorkProc, and XtAddInput with
XtAppMainLoop?

Answer: On many systems, the obsolete XtAdd*() functions are not compatible
with the XtAppMainLoop(). Instead, you should use newer XtAppAddTimeOut(),
XtAppAddWorkProc(), and XtAppAddInput() functions with XtAppMainLoop()

Ken Lee

-----------------------------------------------------------------------------
Subject: 282) Why does XtGetValues for XmNx and XmNwidth return extremely
large values?

Answer: You must use the 16 bit "Dimension" and "Position" data types for your
arguments. If you use 32 bit integers, some implementations will fill the
remaining 16 bits with invalid data, causing incorrect return values. The
*Motif Programmer's Manual* and the widget man pages specify the correct data
type for each resource.

Ken Lee

-----------------------------------------------------------------------------
Subject: 283) Can I use XmGetPixmap() with widgets that have non-default
visual types?

Answer: XmGetPixmap() assumes that you are using the default screen depth. If
you're using a different depth, use XmGetPixmapByDepth() instead.

Ken Lee

-----------------------------------------------------------------------------
Subject: 284) What is the matter with Frame in Motif 1.2?
[Last modified: November 92]

Answer: This announcement has been made by OSF:

"IMPORTANT NOTICE

We have discovered two problems in the new 1.2 child alignment resources in
XmFrame. Because some vendors may have committed, or are soon to commit to
field releases of Motif 1.2 and 1.2.1, OSF's options for fixing them are
limited. We are trying to deal with these in a way that does not cause
hardship for application developers who will develop applications against
various point versions of Motif. OSF's future actions for correction are
summarized.

WHAT YOU SHOULD DO AND KNOW

1. Mark the following change in your documentation.

On page 1-512 of the OSF/Motif Programmer's Reference, change the descriptions
under XmNchildVerticalAlignment as follows (what follows is the CORRECT
wording to match the current implementation):

XmALIGNMENT_WIDGET_TOP
Causes the BOTTOM edge of the title area to align
vertically with the top shadow of the Frame.

XmALIGNMENT_WIDGET_BOTTOM
Causes the TOP edge of the title area to align
vertically with the top shadow of the Frame.

2. Note the following limitation on resource converters for Motif 1.2 and
1.2.1 implementations.

The rep types for XmFrame's XmNentryVerticalAlignment resource were
incorrected implemented, which means that converters will not work properly.
The following resource settings will not work from a resource file in 1.2 and
1.2.1:

*childVerticalAlignment: alignment_baseline_bottom
*childVerticalAlignment: alignment_baseline_top
*childVerticalAlignment: alignment_widget_bottom
*childVerticalAlignment: alignment_widget_top

If you wish to set these values for these resources (note they are new
constraint resources in XmFrame) you will have to set them directly in C or
via uil.

WHAT WE WILL DO

The problem described in note #1 above will not be fixed in the OSF/Motif
implementation until the next MAJOR release of Motif. At that time we will
correct the documentation and modify the code to match those new descriptions,
but we will preserve the existing enumerated values and their behavior for
backward compatibility for that release.

The fix for the problem described in note #2 will be shipped by OSF in Motif
1.2.2.

SUMMARY

We are sorry for any difficulty this causes Motif users. If you have any
questions or flames (I suppose I deserve it) please send them directly to me.
We sincerely hope this proactive response is better for our customers than you
having to figure it out yourselves!

Libby


-----------------------------------------------------------------------------
Subject: 285) What is IMUG and how do I join it?
[Last modified: July 96]

Answer: CAUTION: As of March, 1996, IMUG could not be contacted. If anyone is
aware of the status of IMUG, please send mail to me (kenton@nojunk.rahul.net).
Thanks to Lou Farho (farho@harris.com) for this update.

IMUG is the International Motif User Group founded by Quest Windows
Corporation and co-sponsored by FedUNIX. IMUG is a non-profit organization
working to keep users informed on technical and standards issues, to
strengthen user groups on a local level, to increase communication among users
internationally, and to promote the use of an international conference as a
forum for sharing and learning more about Motif. You can join it by

1. Pay the annual membership fee of $20 USD directly to IMUG. Contact

IMUG
5200 Great America Parkway
Santa Clara, CA 95054
(408) 496-1900
imug@quest.com

2. Register at the International Motif User Conference, and automatically
become an IMUG member.

3. Donate a pd widget, widget tool or widget builder to the IMUG Widget
Depository and receive a free one year IMUG membership.

-----------------------------------------------------------------------------
Subject: 286) How do I set the title of a top level window?
[Last modified: September 92]

Answer: Set XmNtitle (and optionally XmNtitleEncoding) for TopLevelShells.
(Note that this is of type String rather than XmString.) You can also set
XmNiconName if you want its icon to show this title. For XmDialogShells, set
the XmNdialogTitle of its immediate child, assuming it's a BulletinBoard
subclass. These can also be set in resource files.

-----------------------------------------------------------------------------
Subject: 287) How can I disable the color scheme mechanism in CDE or HP VUE?
[Last modified: May 97]

Answer: Put this in your app-defaults file: *useColorObj: False

Ken Lee

-----------------------------------------------------------------------------
Subject: 288) Can I use editres with Motif? Is there an editres tutorial?
[Last modified: Mar 96]

Answer: Editres, part of the MIT delivery, is a powerful widget tree analysis
tool and is highly recommended. There's negligible overhead in making editres
available to an application and many projects keep the editres "hook" active
even for operational programs.

It isn't built in to Motif (at 1.2.*), but you can do this in your
application:

#include
XtAddEventHandler(shell_widget, (EventMask) 0, True,
(XtEventHandler) _XEditResCheckMessages, NULL);

once for each shell widget that you want to react to the "click to select
client" protocol. Then link your client with the R5 libXmu.

Thanks to David Brooks, OSF, for the original answer. Jan Sandquist
(ehsjasa@ehs.ericsson.se) supplied the current code snipet above. Joachim
Fabini (jo@vmars.tuwien.ac.at) suggested that I remove the older use of
"extern void _XEditResCheckMessages()" which resulted in core dumps on some
platforms.

NOTE: Ken Lee has placed his November, 1994 editres tutorial on the Web:

http://www.rahul.net/kenton/editres.html


-----------------------------------------------------------------------------
Subject: 289) Where is the editres protocol documented?
[Last modified: Apr 95]

Answer: In /usr/include/X11/Xmu/EditresP.h.

Ken Lee

-----------------------------------------------------------------------------
Subject: 290) Why does an augment translation appear to act as replace for
some widgets? When I use either augment or override translations in
..Xdefaults it seems to act as replace in both Motif 1.0 and 1.1

Answer: By default, the translation table is NULL. If there is nothing
specified (either in resource file, or in args), the widget's Initialize
finds: Oh, there is NULL in translations, lets use our default ones. If,
however, the translations have become non-NULL, the default translations are
NOT used at all. Thus, using #augment, #override or a new table has identical
effect: defines the new translations. The only way you can augment/override
Motif's default translations is AFTER Initialize, using XtSetValues. Note,
however, that Motif managers do play with translation tables as well ... so
that results are not always easy to predict.

OSF wrote: A number of people have complained about not being able to
augment/override translations from the .Xdefaults. This is due to the
complexity of the menu system/keyboard traversal and the necessary
translations changes required to support the Motif Style Guide in menus. It
cannot be fixed in a simple way. Fixing it requires re-design of the
menus/buttons and it is planned to be fixed in 1.2.

-----------------------------------------------------------------------------
Subject: 291) How do you "grey" out a widget so that it cannot be activated?

Answer: Use XtSetSensitive(widget, False). Do not set the XmNsensitive
resource directly yourself (by XtSetValues) since the widget may need to talk
to parents first.

-----------------------------------------------------------------------------
Subject: 292) Can I change the graphics drawn by insensitive widgets? Some
become very difficult to read.
[Last modified: Aug 97]

Answer: There is no general mechanism for this; each widget chooses its own
insensitive graphics. Some are customizable, however. Label and button
widgets have a XmNlabelInsensitivePixmap resource. Others, such as the text
widgets, have an XmNeditable resource; setting this to false is similar to
insensitive, except tha the graphics do not change.

Other possibilities would be to install an empty translation table to ignore
input or to create an occluding InputOnly window to block input.

-----------------------------------------------------------------------------
END OF PART EIGHT