home *** CD-ROM | disk | FTP | other *** search
Text File | 2004-05-05 | 60.4 KB | 1,734 lines |
- Path: senator-bedfellow.mit.edu!dreaderd!not-for-mail
- Message-ID: <motif-faq/part9_1083675484@rtfm.mit.edu>
- Supersedes: <motif-faq/part9_1082292761@rtfm.mit.edu>
- Expires: 17 Jun 2004 12:58:04 GMT
- References: <motif-faq/part1_1083675484@rtfm.mit.edu>
- X-Last-Updated: 2002/01/31
- Organization: none
- Subject: Motif FAQ (Part 9 of 9)
- Newsgroups: comp.windows.x.motif,comp.answers,news.answers
- Keywords: FAQ question answer
- From: kenton@rahul.net (Ken Lee)
- Reply-To: kenton@rahul.net (Ken Lee)
- Approved: news-answers-request@MIT.EDU
- Followup-To: poster
- Summary: Motif Frequently Asked Questions (with answers).
- Originator: faqserv@penguin-lust.MIT.EDU
- Date: 04 May 2004 12:59:13 GMT
- Lines: 1713
- NNTP-Posting-Host: penguin-lust.mit.edu
- X-Trace: 1083675553 senator-bedfellow.mit.edu 568 18.181.0.29
- Xref: senator-bedfellow.mit.edu comp.windows.x.motif:75192 comp.answers:57057 news.answers:270861
-
- Archive-name: motif-faq/part9
- 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: 293) Why doesn't the Help callback work on some widgets?
- [Last modified: May 95]
-
- Answer: If you press the help key the help callback of the widget with the
- keyboard focus is called (not the one containing the mouse). You can't get
- the help callback of a non-keyboard-selectable widget called. To get `context
- sensitive' help on these, you have to find the mouse, associate its position
- with a widget and then do the help.
-
- The X Resource, Issue 6, has an article on implementing context help in Motif
- in this manner, that is, using the mouse position to indicate the widget for
- which context help is desired, as well as using resources to specify the help.
-
- The demo program lets you toggle between using the method described in the
- article and XmTrackingLocate() for comparision purposes.
-
- Contributed by: Jay Schmidgall jay@vnet.ibm.com (author of the article
- mentioned above). Thanks to chen@adi.com (Franklin Chen) for correcting the
- URL.
-
- -----------------------------------------------------------------------------
- Subject: 294)* How can I implement "bubble help" or "tool tips" with Motif?
- [Last modified: Jan 02]
-
- Answer: Open Motif 2.2 includes a built-in ToolTips feature. The following
- material may be of interest to users of earlier versions of Motif.
-
- Gary Aviv (gary@compgen.com) informed this maintainer about the free LiteClue
- widget from Computer Generation, Inc. (http://www.compgen.com/). LiteClue is
- a widget which pops a one line help message when the user passes the pointer
- over another "watched" widget. This is known by various names in the industry
- such as hints, clues, tips, bubble help and balloon help. Technical
- documentation and source for the LiteClue widget are available from:
-
- http://www.compgen.com/widgets/LiteClue.html
- ftp://ftp.compgen.com/pub/widgets/LiteClue.tar.Z
-
-
- Ken Lee (http://www.rahul.net/kenton/) writes: A simple technique is to popup
- a shell containing your message whenever an enter event occurs (possibly
- delayed by a timer) and pop it down again after a leave event.
-
- David Lewis (dbl@ics.com) writes: To those resources I should add that the
- XmHTML sources (HTML parser, browser, etc) have this ToolTip/bubble-help/popup
- feature, in readily-usable code. In addition, the ICS EnhancementPak widget
- set (http://www.ics.com) has both a toolbar with built-in popups for its
- entries and a small library which adds popup capabilities to any widget.
-
- -----------------------------------------------------------------------------
- Subject: 295) Can I specify a widget in a resource file?
-
- Answer: This answer, which uses the Xmu library, is due to David Elliott. If
- the converter is added, then the name of a widget (a string) can be used in
- resource files, and will be converted to the appropriate widget.
-
- This code, which was basically stolen from the Athena Form widget, adds a
- String to Widget converter. I wrote it as a general routine that I call at
- the beginning of all of my programs, and made it so I could add other
- converters as needed (like String to Unit Type ;-).
-
- #include <X11/Intrinsic.h>
- #include <X11/StringDefs.h>
- #include <Xm/Xm.h>
- #include <X11/Xmu/Converters.h>
- #include <X11/IntrinsicP.h>
- #include <X11/CoreP.h>
-
- void
- setupConverters()
- {
- static XtConvertArgRec parentCvtArgs[] = {
- {XtBaseOffset, (caddr_t)XtOffset(Widget, core.parent),
- sizeof(Widget)}
- };
- XtAddConverter(XmRString, XmRWindow, XmuCvtStringToWidget,
- parentCvtArgs, XtNumber(parentCvtArgs));
- }
-
-
- -----------------------------------------------------------------------------
- Subject: 296) Why are only some of my translations are being installed? I
- have a translation table like the following, but only the first ones are
- getting installed and the rest are ignored.
-
- *Text.translations: #override \
- Ctrl<Key>a: beginning-of-line() \n\
- Ctrl<Key>e: end-of-line() \n\
- Ctrl<Key>f: forward-character() \n\
-
- Answer: Most likely, you have a space at the end of one of the lines (the
- first in this case).
-
- Ctrl<Key>a: beginning-of-line() \n\
- ^ space here
-
- The second backslash in each line is there to protect the real newline
- character and so you must not follow it with anything other than the newline
- itself. Otherwise it acts as the end of the resource definition and the
- remaining lines are not added.
-
- -----------------------------------------------------------------------------
- Subject: 297) Can I have separate translations for shifted and unshifted
- keys?
- [Last modified: Jan 99]
-
- Answer: Alec Flett <alecf@netscape.com> writes:
-
- I've got an addition for the motif FAQ that just solved a problem I've been
- wrestling with for a month - it's really an addition to #303 "Why are only
- some of my translations being installed?"
-
- On certain platforms you cannot use an upper-case key in combination with the
- Shift modifier. For example,
-
- Meta Shift <Key>F: find-in-list()
-
- will not always work because the F is capitalized.
-
- The reason for this is because some platforms (such as IRIX) distinguish upper
- case and lowercase keysyms. Using Jamie Zawinski's xkeycaps program
- (http://www.jwz.org/xkeycaps/), you will see that on Solaris the "F" key just
- has one keysym: "F" On IRIX they same key has two: "f" and "F".
-
- -----------------------------------------------------------------------------
- Subject: 298) What are these "non-existant passive grab" warnings? When I
- destroy certain widgets I get a stream of messages
-
- Warning: Attempt to remove non-existant passive grab
-
-
- Answer: They are meaningless, and you want to ignore them. Do this (from Kee
- Hinckley) by installing an XtWarning handler that explicitly looks for them
- and discards them:
-
- static void xtWarnCB(String message) {
- if (asi_strstr(message, "non-existant passive grab", TRUE)) return;
- ...
-
- They come from Xt, and (W. Scott Meeks): "it's something that the designers of
- Xt decided the toolkit should do. Unfortunately, Motif winds up putting
- passive grabs all over the place for the menu system. On the one hand, we
- want to remove all these grabs when menus get destroyed so that they don't
- leak memory; on the other hand, it's almost impossible to keep track of all
- the grabs, so we have a conservative strategy of ungrabbing any place where a
- grab could have been made and we don't explicitly know that there is no grab.
- The unfortunate side effect is the little passive grab warning messages.
- We're trying to clean these up where possible, but there are some new places
- where the warning is generated. Until we get this completely cleaned up (1.2
- maybe), your best bet is probably to use a warning handler."
-
- -----------------------------------------------------------------------------
- Subject: 299) How do I have more buttons than three in a MessageBox? I want
- to have something like a MessageBox (or other widget) with more than three
-
-
- buttons, but with the same nice appearance.
- [Last modified: Feb 95]
-
- Answer: The Motif 1.2 MessageBox widget allows extra buttons to be added after
- the OK button. Just create the extra buttons as children of the MessageBox.
- Similarly with the SelectionBox.
-
- Pre-Motif 1.2, you have to do one of the following methods.
-
- A SelectionBox is created with four buttons, but the fourth (the Apply button)
- is unmanaged. To manage it get its widget ID via
- XmSelectionBoxGetChild(parent, XmDIALOG_APPLY_BUTTON) and then XtManage it.
- Unmanage all of the other bits in the SelectionBox that you don't want. If
- you want more than four buttons, try two SelectionBoxes (or similar) together
- in a container, where all of the unwanted parts of the widgets are unmanaged.
-
- Alternatively, build your own dialog:
-
- /* Written by Dan Heller. Copyright 1991, O'Reilly && Associates.
- * This program is freely distributable without licensing fees and
- * is provided without guarantee or warranty expressed or implied.
- * This program is -not- in the public domain. This program is
- * taken from the Motif Programming Manual, O'Reilly Volume 6.
- */
-
- /* action_area.c -- demonstrate how CreateActionArea() can be used
- * in a real application. Create what would otherwise be identified
- * as a PromptDialog, only this is of our own creation. As such,
- * we provide a TextField widget for input. When the user presses
- * Return, the Ok button is activated.
- */
- #include <Xm/DialogS.h>
- #include <Xm/PushBG.h>
- #include <Xm/PushB.h>
- #include <Xm/LabelG.h>
- #include <Xm/PanedW.h>
- #include <Xm/Form.h>
- #include <Xm/RowColumn.h>
- #include <Xm/TextF.h>
-
- typedef struct {
- char *label;
- void (*callback)();
- caddr_t data;
- } ActionAreaItem;
-
- static void
- do_dialog(), close_dialog(), activate_cb(),
- ok_pushed(), cancel_pushed(), help();
-
- main(argc, argv)
- int argc;
- char *argv[];
- {
- Widget toplevel, button;
- XtAppContext app;
-
- toplevel = XtVaAppInitialize(&app, "Demos",
- NULL, 0, &argc, argv, NULL, NULL);
-
- button = XtVaCreateManagedWidget("Push Me",
- xmPushButtonWidgetClass, toplevel, NULL);
- XtAddCallback(button, XmNactivateCallback, do_dialog, NULL);
-
- XtRealizeWidget(toplevel);
- XtAppMainLoop(app);
- }
-
- /* callback routine for "Push Me" button. Actually, this represents
- * a function that could be invoked by any arbitrary callback. Here,
- * we demonstrate how one can build a standard customized dialog box.
- * The control area is created here and the action area is created in
- * a separate, generic routine: CreateActionArea().
- */
- static void
- do_dialog(w, file)
- Widget w; /* will act as dialog's parent */
- char *file;
- {
- Widget dialog, pane, rc, label, text_w, action_a;
- XmString string;
- extern Widget CreateActionArea();
- Arg args[10];
- static ActionAreaItem action_items[] = {
- { "Ok", ok_pushed, NULL },
- { "Cancel", cancel_pushed, NULL },
- { "Close", close_dialog, NULL },
- { "Help", help, "Help Button" },
- };
-
- /* The DialogShell is the Shell for this dialog. Set it up so
- * that the "Close" button in the window manager's system menu
- * destroys the shell (it only unmaps it by default).
- */
- dialog = XtVaCreatePopupShell("dialog",
- xmDialogShellWidgetClass, XtParent(w),
- XmNtitle, "Dialog Shell", /* give arbitrary title in wm */
- XmNdeleteResponse, XmDESTROY, /* system menu "Close" action */
- NULL);
-
- /* now that the dialog is created, set the Close button's
- * client data, so close_dialog() will know what to destroy.
- */
- action_items[2].data = (caddr_t)dialog;
-
- /* Create the paned window as a child of the dialog. This will
- * contain the control area (a Form widget) and the action area
- * (created by CreateActionArea() using the action_items above).
- */
- pane = XtVaCreateWidget("pane", xmPanedWindowWidgetClass, dialog,
- XmNsashWidth, 1,
- XmNsashHeight, 1,
- NULL);
-
- /* create the control area (Form) which contains a
- * Label gadget and a List widget.
- */
- rc = XtVaCreateWidget("control_area", xmRowColumnWidgetClass, pane, NULL);
- string = XmStringCreateLocalized("Type Something:");
- XtVaCreateManagedWidget("label", xmLabelGadgetClass, rc,
- XmNlabelString, string,
- XmNleftAttachment, XmATTACH_FORM,
- XmNtopAttachment, XmATTACH_FORM,
- NULL);
- XmStringFree(string);
-
- text_w = XtVaCreateManagedWidget("text-field",
- xmTextFieldWidgetClass, rc, NULL);
-
- /* RowColumn is full -- now manage */
- XtManageChild(rc);
-
- /* Set the client data "Ok" and "Cancel" button's callbacks. */
- action_items[0].data = (caddr_t)text_w;
- action_items[1].data = (caddr_t)text_w;
-
- /* Create the action area -- we don't need the widget it returns. */
- action_a = CreateActionArea(pane, action_items, XtNumber(action_items));
-
- /* callback for Return in TextField. Use action_a as client data */
- XtAddCallback(text_w, XmNactivateCallback, activate_cb, action_a);
-
- XtManageChild(pane);
- XtPopup(dialog, XtGrabNone);
- }
-
- /*--------------*/
- /* The next four functions are the callback routines for the buttons
- * in the action area for the dialog created above. Again, they are
- * simple examples, yet they demonstrate the fundamental design approach.
- */
- static void
- close_dialog(w, shell)
- Widget w, shell;
- {
- XtDestroyWidget(shell);
- }
-
- /* The "ok" button was pushed or the user pressed Return */
- static void
- ok_pushed(w, text_w, cbs)
- Widget w, text_w; /* the text widget is the client data */
- XmAnyCallbackStruct *cbs;
- {
- char *text = XmTextFieldGetString(text_w);
-
- printf("String = %s0, text);
- XtFree(text);
- }
-
- static void
- cancel_pushed(w, text_w, cbs)
- Widget w, text_w; /* the text field is the client data */
- XmAnyCallbackStruct *cbs;
- {
- /* cancel the whole operation; reset to NULL. */
- XmTextFieldSetString(text_w, "");
- }
-
- static void
- help(w, string)
- Widget w;
- String string;
- {
- puts(string);
- }
- /*--------------*/
-
- /* When Return is pressed in TextField widget, respond by getting
- * the designated "default button" in the action area and activate
- * it as if the user had selected it.
- */
- static void
- activate_cb(text_w, client_data, cbs)
- Widget text_w; /* user pressed Return in this widget */
- XtPointer client_data; /* action_area passed as client data */
- XmAnyCallbackStruct *cbs; /* borrow the "event" field from this */
- {
- Widget dflt, action_area = (Widget)client_data;
-
- XtVaGetValues(action_area, XmNdefaultButton, &dflt, NULL);
- if (dflt) /* sanity check -- this better work */
- /* make the default button think it got pushed. This causes
- * "ok_pushed" to be called, but XtCallActionProc() causes
- * the button appear to be activated as if the user selected it.
- */
- XtCallActionProc(dflt, "ArmAndActivate", cbs->event, NULL, 0);
- }
-
- #define TIGHTNESS 20
-
- Widget
- CreateActionArea(parent, actions, num_actions)
- Widget parent;
- ActionAreaItem *actions;
- int num_actions;
- {
- Widget action_area, widget;
- int i;
-
- action_area = XtVaCreateWidget("action_area", xmFormWidgetClass, parent,
- XmNfractionBase, TIGHTNESS*num_actions - 1,
- XmNleftOffset, 10,
- XmNrightOffset, 10,
- NULL);
-
- for (i = 0; i < num_actions; i++) {
- widget = XtVaCreateManagedWidget(actions[i].label,
- xmPushButtonWidgetClass, action_area,
- XmNleftAttachment, i? XmATTACH_POSITION : XmATTACH_FORM,
- XmNleftPosition, TIGHTNESS*i,
- XmNtopAttachment, XmATTACH_FORM,
- XmNbottomAttachment, XmATTACH_FORM,
- XmNrightAttachment,
- i != num_actions-1? XmATTACH_POSITION : XmATTACH_FORM,
- XmNrightPosition, TIGHTNESS*i + (TIGHTNESS-1),
- XmNshowAsDefault, i == 0,
- XmNdefaultButtonShadowThickness, 1,
- NULL);
- if (actions[i].callback)
- XtAddCallback(widget, XmNactivateCallback,
- actions[i].callback, actions[i].data);
- if (i == 0) {
- /* Set the action_area's default button to the first widget
- * created (or, make the index a parameter to the function
- * or have it be part of the data structure). Also, set the
- * pane window constraint for max and min heights so this
- * particular pane in the PanedWindow is not resizable.
- */
- Dimension height, h;
- XtVaGetValues(action_area, XmNmarginHeight, &h, NULL);
- XtVaGetValues(widget, XmNheight, &height, NULL);
- height += 2 * h;
- XtVaSetValues(action_area,
- XmNdefaultButton, widget,
- XmNpaneMaximum, height,
- XmNpaneMinimum, height,
- NULL);
- }
- }
-
- XtManageChild(action_area);
-
- return action_area;
- }
-
-
- -----------------------------------------------------------------------------
- Subject: 300) How do I create a "busy working cursor"?
- [Last modified: Feb 95]
-
- Answer: - in Baudouin's code (following), the idea is to keep in an array an
- up-to-date list of all shells used in the application, and set for all of them
- the cursor to a watch or to the default cursor, with the 2 functions provided.
-
- - in Dan Heller's code (later), the idea is to turn on the watch cursor for
- the top-level shell only, popup a working window to possibly abort the
- callback, and manage some expose events during the callback.
-
- - in the FAQ for comp.windows.x, the idea is to bring a large window on top of
- the application, hide all windows below it, and turn on the watch cursor on
- this large window. Unmapping the large window resets the default cursor,
- mapping it turns on the watch cursor.
-
- Baudouin Raoult (mab@ecmwf.int) wrote:
-
- void my_SetWatchCursor(w)
- Widget w;
- {
- static Cursor watch = NULL;
-
- if(!watch)
- watch = XCreateFontCursor(XtDisplay(w),XC_watch);
-
- XDefineCursor(XtDisplay(w),XtWindow(w),watch);
- XmUpdateDisplay(w);
- }
-
- void my_ResetCursor(w)
- Widget w;
- {
- XUndefineCursor(XtDisplay(w),XtWindow(w));
- XmUpdateDisplay(w);
- }
-
-
- Answer: A solution with lots of bells and whistles is
-
- /* Written by Dan Heller. Copyright 1991, O'Reilly && Associates.
- * This program is freely distributable without licensing fees and
- * is provided without guarantee or warrantee expressed or implied.
- * This program is -not- in the public domain.
- */
-
- /* busy.c -- demonstrate how to use a WorkingDialog and to process
- * only "important" events. e.g., those that may interrupt the
- * task or to repaint widgets for exposure. Set up a simple shell
- * and a widget that, when pressed, immediately goes into its own
- * loop. First, "lock" the shell so that a timeout cursor is set on
- * the shell and pop up a WorkingDialog. Then enter loop ... sleep
- * for one second ten times, checking between each interval to see
- * if the user clicked the Stop button or if any widgets need to be
- * refreshed. Ignore all other events.
- *
- * main() and get_busy() are stubs that would be replaced by a real
- * application; all other functions can be used "as is."
- */
- #include <Xm/MessageB.h>
- #include <Xm/PushB.h>
- #include <X11/cursorfont.h>
-
- Widget shell;
- void TimeoutCursors();
- Boolean CheckForInterrupt();
-
- main(argc, argv)
- int argc;
- char *argv[];
- {
- XtAppContext app;
- Widget button;
- XmString label;
- void get_busy();
-
- shell = XtVaAppInitialize(&app, "Demos",
- NULL, 0, &argc, argv, NULL, NULL);
-
- label = XmStringCreateLocalized(
- "Boy, is *this* going to take a long time.");
- button = XtVaCreateManagedWidget("button",
- xmPushButtonWidgetClass, shell,
- XmNlabelString, label,
- NULL);
- XmStringFree(label);
- XtAddCallback(button, XmNactivateCallback, get_busy, argv[1]);
-
- XtRealizeWidget(shell);
- XtAppMainLoop(app);
- }
-
- void
- get_busy(widget)
- Widget widget;
- {
- int n;
-
- TimeoutCursors(True, True);
- for (n = 0; n < 10; n++) {
- sleep(1);
- if (CheckForInterrupt()) {
- puts("Interrupt!");
- break;
- }
- }
- if (n == 10)
- puts("done.");
- TimeoutCursors(False, NULL);
- }
-
- /* The interesting part of the program -- extract and use at will */
- static Boolean stopped; /* True when user wants to stop processing */
- static Widget dialog; /* WorkingDialog displayed when timed out */
-
- /* timeout_cursors() turns on the "watch" cursor over the application
- * to provide feedback for the user that he's going to be waiting
- * a while before he can interact with the appliation again.
- */
- void
- TimeoutCursors(on, interruptable)
- int on, interruptable;
- {
- static int locked;
- static Cursor cursor;
- extern Widget shell;
- XSetWindowAttributes attrs;
- Display *dpy = XtDisplay(shell);
- XEvent event;
- Arg args[1];
- XmString str;
- extern void stop();
-
- /* "locked" keeps track if we've already called the function.
- * This allows recursion and is necessary for most situations.
- */
- on? locked++ : locked--;
- if (locked > 1 || locked == 1 && on == 0)
- return; /* already locked and we're not unlocking */
-
- stopped = False; /* doesn't matter at this point; initialize */
- if (!cursor) /* make sure the timeout cursor is initialized */
- cursor = XCreateFontCursor(dpy, XC_watch);
-
- /* if "on" is true, then turn on watch cursor, otherwise, return
- * the shell's cursor to normal.
- */
- attrs.cursor = on? cursor : None;
-
- /* change the main application shell's cursor to be the timeout
- * cursor (or to reset it to normal). If other shells exist in
- * this application, they will have to be listed here in order
- * for them to have timeout cursors too.
- */
- XChangeWindowAttributes(dpy, XtWindow(shell), CWCursor, &attrs);
-
- XFlush(dpy);
-
- if (on) {
- /* we're timing out, put up a WorkingDialog. If the process
- * is interruptable, allow a "Stop" button. Otherwise, remove
- * all actions so the user can't stop the processing.
- */
- str = XmStringCreateLocalized("Busy. Please Wait.");
- XtSetArg(args[0], XmNmessageString, str);
- dialog = XmCreateWorkingDialog(shell, "Busy", args, 1);
- XmStringFree(str);
- XtUnmanageChild(
- XmMessageBoxGetChild(dialog, XmDIALOG_OK_BUTTON));
- if (interruptable) {
- str = XmStringCreateLocalized("Stop");
- XtVaSetValues(dialog, XmNcancelLabelString, str, NULL);
- XmStringFree(str);
- XtAddCallback(dialog, XmNcancelCallback, stop, NULL);
- } else
- XtUnmanageChild(
- XmMessageBoxGetChild(dialog, XmDIALOG_CANCEL_BUTTON));
- XtUnmanageChild(
- XmMessageBoxGetChild(dialog, XmDIALOG_HELP_BUTTON));
- XtManageChild(dialog);
- } else {
- /* get rid of all button and keyboard events that occured
- * during the time out. The user shouldn't have done anything
- * during this time, so flush for button and keypress events.
- * KeyRelease events are not discarded because accelerators
- * require the corresponding release event before normal input
- * can continue.
- */
- while (XCheckMaskEvent(dpy,
- ButtonPressMask | ButtonReleaseMask | ButtonMotionMask
- | PointerMotionMask | KeyPressMask, &event)) {
- /* do nothing */;
- }
- XtDestroyWidget(dialog);
- }
- }
-
- /* User Pressed the "Stop" button in dialog. */
- void
- stop(dialog)
- Widget dialog;
- {
- stopped = True;
- }
-
- Boolean
- CheckForInterrupt()
- {
- extern Widget shell;
- Display *dpy = XtDisplay(shell);
- Window win = XtWindow(dialog);
- XEvent event;
-
- /* Make sure all our requests get to the server */
- XFlush(dpy);
-
- /* Let motif process all pending exposure events for us. */
- XmUpdateDisplay(shell);
-
- /* Check the event loop for events in the dialog ("Stop"?) */
- while (XCheckMaskEvent(dpy,
- ButtonPressMask | ButtonReleaseMask | ButtonMotionMask |
- PointerMotionMask | KeyPressMask | KeyReleaseMask,
- &event)) {
- /* got an "interesting" event. */
- if (event.xany.window == win)
- XtDispatchEvent(&event); /* it's in our dialog.. */
- else /* uninteresting event--throw it away and sound bell */
- XBell(dpy, 50);
- }
- return stopped;
- }
-
-
- -----------------------------------------------------------------------------
- Subject: 301) Can I use the hourglass that mwm uses?
- [Last modified: March 93]
-
- Answer: The hourglass used by mwm is hard-coded into code that is subject to
- OSF copyright. In Motif 1.2 though, the bitmaps for this and other things
- (information, no_enter, question, warning, working) were made available. The
- install process will probably add them to /usr/include/X11/bitmaps.
- Otherwise, just use the watch cursor XC_watch of the previous question,
- because that has the same semantics.
-
- -----------------------------------------------------------------------------
- Subject: 302) What order should the libraries be linked in?
- [Last modified: August 92]
-
- Answer: At link time, use the library order -lXm -lXt -lX11. There are two
- reasons for this (dbrooks@osf.org):
-
- On most systems, the order matters because the linker won't re-scan a library
- once it is done with it. Thus any references to Xlib calls from Xm will
- probably be unresolved.
-
- The [other] problem is that there are two VendorShell widgets. A dummy is
- provided in the Xt library, but a widget set will rely on its own being
- referenced. If you mention Xt first, the linker will choose the wrong one.
-
- Motif code will wrongly assume the Motif VendorShell has been class-
- initialized [and will probably crash]. Xaw has a similar problem, but a
- softer landing; it only complains about unregistered converters.
-
-
- -----------------------------------------------------------------------------
- Subject: 303) How do I use xmkmf for Motif clients?
- [Last modified: July 96]
-
- Answer: This advice comes from dbrooks@osf.org. For another answer, see the
- question immediately following this one ("How do I use imake with Motif
- 2.0?").
-
- There are a number of intractable problems with using X configuration files
- and xmkmf, while trying to make it easy to build Motif. Not the least of
- these, but one I've never heard mentioned yet, is that the rules for
- contructing the names of shared library macros are machine-dependent, and in
- the various xxxLib.tmpl files. Do we edit all those files to add definitions
- for XMLIB, DEPXMLIB, etc., or do we put a maze of #ifdefs into the Motif.tmpl
- file?
-
- Please note that, if you install Motif, it overwrites your installed
- Imake.tmpl with one that includes Motif.tmpl and Motif.rules.
-
- With those caveats, I think the following guidelines will help.
-
- David Brooks OSF
-
- Clients in the X11R5 release use the xmkmf command to build Makefiles. In
- general, the xmkmf command cannot be used for Motif clients, because of the
- need to consider the UseInstalledMotif flag separately. Since xmkmf is a
- simple script that calls imake, it is easy to construct the proper call to
- imake using the following rules.
-
- In the following, replace {MTOP} by the toplevel directory with the Motif
- source tree, and {XTOP} by the toplevel ("mit") directory with the X source.
- It is assumed that the directory containing your installed imake is in your
- PATH.
-
- When needed, the imake variables XTop and MTop are normally set in your
- site.def (to {XTOP} amd {MTOP} respectively); however they may also be set
- with additional -D arguments to imake.
-
- 1. With both X and Motif in their source trees, ensure the imake variables
- XTop and MTop are set, and use:
-
- ${XTOP}/config/imake -I{MTOP}/config
-
- 2. With Motif in its source tree, and X installed, ensure MTop is set, and
- use:
-
- imake -I{MTOP}/config -DUseInstalled
-
- 3. With both Motif and X installed, and a nonstandard ProjectRoot (see
- site.def for an explanation of this), use:
-
- imake -DUseInstalled -DUseInstalledMotif -I{ProjectRoot}/lib/X11/config
-
- or, if the configuration files are in /usr/lib/X11/config:
-
- imake -DUseInstalled -DUseInstalledMotif -I/usr/lib/X11/config
-
- [Thanks to Paul DuBois (dubois@primate.wisc.edu) for correcting this.]
-
- To build a simple Imakefile, remember to include lines like this:
-
- LOCAL_LIBRARIES = XmClientLibs
- DEPLIBS = XmClientDepLibs
-
- Or, for a client that uses uil/mrm, replace these by MrmClientLibs and
- MrmClientDepLibs, and also use:
-
- MSimpleUilTarget(program)
-
- to build the client and uid file. Look at the demos for more examples.
-
-
- And Paul Howell <grue@engin.umich.edu> added:
-
- i did this, calling the new script "xmmkmf". It passes both -DUseInstalled
- and -DUseInstalledMotif.
-
- and i modified the stock R5 Imake.tmpl to do this:
-
- #include <Project.tmpl>
- #ifdef UseInstalledMotif
- #include <Motif.tmpl>
- #endif
-
- #include <Imake.rules>
- #ifdef UseInstalledMotif
- #include <Motif.rules>
- #endif
-
- the result was something that does both athena and motif rules. and it really
- works, just that easy!
-
- -----------------------------------------------------------------------------
- Subject: 304) How do I use imake with Motif 2.0?
- [Last modified: July 96]
-
- Answer: Paul DuBois (dubois@primate.wisc.edu), the author of the O'Reilly and
- Associates book, Software Portability with imake, recently wrote some notes on
- the use of imake to configure Motif (2.0). It has some discussion on the roles
- of UseInstalled and UseInstalledMotif, for instance, which seem to be murky to
- many people. The document is available at:
-
- http://www.primate.wisc.edu/software/imake-stuff
-
- -----------------------------------------------------------------------------
- Subject: 305) How do I make context sensitive help? The Motif Style Guide
- says that an application must initiate context-sensitive help by changing the
- shape of the pointer to the question pointer. When the user moves the pointer
- to the component help is wanted on and presses BSelect, any available context
- sensitive help for the component must be presented, and the pointer reverts
- from the question pointer.
- [Last modified: August 92]
-
- Answer: A widget that gives context sensitive help would place this help in
- the XmNhelpCallback function. To trigger this function: (from Martin G C
- Davies, mgcd@se.alcbel.be)
-
- I use the following callback that is called when the "On Context" help
- pulldown menu is selected. It does the arrow bit and calls the help callbacks
- for the widget. It also zips up the widget tree looking for help if needs be.
- I don't restrict the arrows motion so I can get help on dialog boxes. No
- prizes for guessing what "popup_message" does.
-
-
- static void ContextHelp(
- Widget w ,
- Opaque * tag ,
- XmAnyCallbackStruct * callback_struct
- )
- {
- static Cursor context_cursor = NULL ;
- Widget context_widget ;
-
- if ( context_cursor == NULL )
- context_cursor = XCreateFontCursor( display, XC_question_arrow ) ;
-
- context_widget = XmTrackingLocate( top_level_widget,
- context_cursor, FALSE ) ;
-
- if ( context_widget != NULL ) /* otherwise its not a widget */
- {
- XmAnyCallbackStruct cb ;
-
- cb.reason = XmCR_HELP ;
- cb.event = callback_struct->event ;
-
- /*
- * If there's no help at this widget we'll track back
- up the hierarchy trying to find some.
- */
-
- do
- {
- if ( ( XtHasCallbacks( context_widget, XmNhelpCallback ) ==
- XtCallbackHasSome ) )
- {
- XtCallCallbacks( context_widget, XmNhelpCallback, & cb ) ;
- return ;
- }
- else
- context_widget = XtParent( context_widget ) ;
- } while ( context_widget != NULL ) ;
- }
-
- popup_message( "No context-sensitive help found0or the selected object." ) ;
- }
-
-
- Dave Bonnett suggested, to use the following translations for XmText (and
- XmTextField) widgets to get the same help with key strokes, and to provide an
- accelerator label in the Context help menu entry.
-
- MyApp*XmText*translations: #override\n\
- <Key>F1: Help()
-
- MyApp*Help_menu*Contextual Help.acceleratorText: F1
-
- MyApp*defaultVirtualBindings: osfBackSpace : <Key>Delete\n\
- osfRight : <Key>Right\n\
- osfLeft : <Key>Left\n\
- osfUp : <Key>Up\n\
- osfHelp : <Key>F1\n\
- osfDown : <Key>Down
-
-
- -----------------------------------------------------------------------------
- Subject: 306) How do I debug a modal interaction?
-
- When an application crashes in a modal section (such as in a modal dialog, a
- menu or when a drag and drop is in action), I cannot access the debugger.
- [Last modified: January 1993]
-
- Answer: Run the debugger on one display while the application writes to
- another display.
-
- -----------------------------------------------------------------------------
- Subject: 307) Why can't I install my own colormap using XInstallColormap?
- [Last modified: Nov 96]
-
- Answer: You shouldn't install the colormap yourself using XInstallColormap.
- See the ICCCM document for all the reasons. Instead put the colormap as an
- argument on the Shell widget and the window manager will take care of this.
-
- When the colormap is installed, unless you have a display with multiple
- colormaps, the other windows will go "technicolor" and there is no way around
- this problem.
-
- Thanks to Doug Rand (drand@sgi.com)
-
- Kenton Lee (http://www.rahul.net/kenton/) adds: Use XtSetWMColormapWindows()
- to specify non-default colormaps.
-
- -----------------------------------------------------------------------------
- Subject: 308) How do I install a private colormap?
- [Last modified: Jan 96]
-
- Answer: Mark Buser (buser@tartan.com) writes: If you find that your
- XAllocNamedColor is failing or XpmCreatePixmapFromData is dieing from
- XpmColorFaileds, you may have exhausted the number of colormap entries. One
- way to install a new colormap is the following:
-
-
- Toplevel = XtVaAppInitialize ( &app, ...
- dpy = XtDisplay (Toplevel);
- cmap = DefaultColormapOfScreen ( XtScreen( Toplevel) );
- /* Detect color errors due to colormap depletion */
- if (colors_depleted) {
- cmap = XCopyColormapAndFree ( dpy, cmap );
-
- /* Run through color allocation again to see if ok now */
- }
-
- /* Install colormap into toplevel widget. This must be done
- ** before any child widgets are created.
- */
- XtVaSetValues ( Toplevel, XmNcolormap, cmap, NULL);
-
- /* Create any children of toplevel, they will inherit new colormap */
-
-
- This is only one way to go, there are other possibilities, but this seems to
- be the simplest.
-
- -----------------------------------------------------------------------------
- Subject: 309) How do I get correct shadow colors to match other color
- changes?
- [Last modified: Sept 95]
-
- Answer: Thanks to Craig MacFarlane (craigm@chateau-rouge.ICS.UCI.EDU) for the
- following explanation and code:
-
- You have to make a call to calculate the new shadow colors. The trick is
- actually getting a value of type Pixel when all you have is the string "Blue".
- I use the XtConvertAndStore() function to convert from a char * to a Pixel.
- For example:
-
-
- char *color = "blue";
- XrmValue color_value, pixel_value;
- Pixel background;
-
- color_value.size = strlen(color);
- color_value.addr = (XtPointer) color;
- pixel_value.size = sizeof(Pixel);
- pixel_value.addr = (XtPointer) 0;
-
- result = XtConvertAndStore(widget,
- XtRString, &color_value,
- XtRPixel, &pixel_value);
-
- background = (*(Pixel *)pixel_value.addr);
-
-
- You can then use the pixel value obtained by XtConvertAndStore() in the
- XmGetColors call. XmGetColors calculates appropriate foreground, topshadow,
- bottomshadow, and select colors for the given background. e.g.
-
-
- XmGetColors(screen,
- DefaultColormap(display_id, DefaultScreen(display_id)),
- background,
- &foreground, &topshadow, &bottomshadow, &select);
-
-
- Then it's trivial to set the shadow colors at the same time you set the
- foreground and background colors. For example:
-
-
- XtVaSetValues(widget,
- XmNforeground, foreground,
- XmNbackground, background,
- XmNarmColor, select,
- XmNtopShadowColor, topshadow,
- XmNbottomShadowColor, bottomshadow,
- NULL);
-
-
- You'll get asthetically pleasing colors every time. :)
-
- Wolfram Gries <1gries@informatik.uni-hamburg.de> adds:
-
- The function XmChangeColor() takes a Widget and a Pixel-value for the new
- background-color and does the calculation of the new shadow-colors on its own.
- But it seems to me that this function is rather slow, so if you often change
- the color of your widgets, the XmGetColors()/XmSetColors() approach might be
- better.
-
- -----------------------------------------------------------------------------
- Subject: 310) What color algorithm does Motif use? I am told that Motif uses
- some sort of algorithm that will take a single color that is defined for the
- "background" and scale it so that the widget remains discriminable from the
- background, etc. What is the algorithm?
- [Last modified: Oct 94]
-
- Answer: Chris Flatters (cflatter@nrao.edu) writes: Shiz Kobara's book "Visual
- Design with OSF/Motif", Addison Wesley, 1991, ISBN 0-201-56320-7) is a good
- source for information of this sort. I haven't seen it in bookshops for a
- while so it may have gone out of print (which would be a pity). In essence
- each widget has 4 colours which, to first order, are
-
- background
- select (background * 85%)
- top shadow (background * 150%)
- bottom shadow (background * 50%)
-
- An additional correction may be applied to the hues of the calculated colours
- if any of the RGB values saturates. The algorithm works best if the brightest
- of the RGB components lies in the range 155-175 (on a scale of 0-255). The
- top shadow becomes darker than the background for light background colours
- which does not lead to a particularly pleasing effect.
-
- -----------------------------------------------------------------------------
- Subject: 311) How can you access the superclass widget from which Motif
- convenience dialogs are subclassed?
- [Last modified: Oct 94]
-
- Answer: Kim Frei (uunet!ask.uniras.dk!kimf) wrote: If you are using Motif 1.2,
- read about XmTemplateDialog.
-
- -----------------------------------------------------------------------------
- Subject: 312) Can the Motif 2.0 Notebook widget display non-rectangular "file
- tabs"? Is it possible to use the Shape extension to fiddle with the shape of
- the major tabs (XmPushButtons right now) to get non-rectangular buttons, going
- for that "file tab" look?
- [Last modified: May 95]
-
- Answer: Vania Joloboff <uunet!gr.osf.org!vania> wrote:
-
- On the Motif 2.0* CD-ROM, in the demos directory, there is a library of
- additional widgets lib/Exm. Among the widgets, there is a ExmTabButton
- especially designed to fit within a Notebook. It has a smooth shape like real
- tabs in folders.
-
-
- It also a good example on how to use the new traits and the Xme API for widget
- writers.
-
- (Thanks to Ken Lee, http://www.rahul.net/kenton/, for a correction here.)
-
- -----------------------------------------------------------------------------
- Subject: 313) How does the clipboard mechanism work?
- [Last modified: Dec 94]
-
- A. Doug Rand <drand@sgi.com> writes:
-
- Basically there are two selections CLIPBOARD_MANAGER and CLIPBOARD which are
- used. The Motif clipboard is not a clipboard manager, but xclipboard, or a
- more functional clipboard client would be. The newest ICCCM (2.0) spells this
- out.
-
- The basic process is that the clipboard manager:
-
- 1) Check to see if CLIPBOARD_MANAGER is owned by anyone, abort if it is.
-
- 2) Assert ownership of CLIPBOARD_MANAGER and CLIPBOARD
-
- 3) When the CLIPBOARD selection is lost, query new owner for data and then
- retake ownership of CLIPBOARD
-
- #3 is done until the application exists. What you do with the data is up to
- the application.
-
- -----------------------------------------------------------------------------
- Subject: 314) Why does the xyz application core dump when I cut and paste?
-
- Answer: Application crashes when text is cut and pasted into an XmText widget
- may occur with statically linked executables linked with X11R5 libraries under
- SunOS. For example, a Netscape README file says:
-
- The SunOS 4.1 [Netscape 0.94] distribution also includes a directory called
- "nls". This directory is a standard part of the MIT X11R5 distribution, but
- is not included with OpenWindows 3.0 or earlier. We have linked Netscape
- against the MIT R5 libraries because they are less buggy in general; however,
- they have one rather serious bug, which is that if this "nls" directory does
- not exist, the program will dump core any time you try to paste into a text
- field!
-
- So, if you don't have the "nls" directory on your system, you will need to
- install it first. The usual place is /usr/lib/X11/nls, but you can put it
- anywhere: just point the $XNLSPATH environment variable at it.
-
- Some sites don't have their X libraries installed in /usr/lib/X11/. This
- doesn't matter. You either need to put the nls directory in /usr/lib/X11/, or
- every user will need to set this environment variable.
-
- So, for example, we do:
-
- setenv XNLSPATH /usr/local/x11r5/lib/X11/nls
-
- since our X11R5 is not installed in the default location.
-
- -----------------------------------------------------------------------------
- Subject: 315) Why is XtWindow(widget) == 0?
- [Last modified: Oct 95]
-
- Answer: The window is not created (and is NULL) until the widget is realized.
- In general, using XtWindow() is a bad idea. In most cases, you can create
- more robust code by subclassing the widget and putting your window code in new
- wiget class methods.
-
- Ken Lee
-
- -----------------------------------------------------------------------------
- Subject: 316) How do I debug X protocol errors (e.g., BadWindow, BadMatch) in
- Motif applications?
-
- [Last modified: Jun 98]
- Answer: For a general tutorial on X protocol errors, see:
-
- http://www.rahul.net/kenton/perrors.html
-
-
- Here are two common problems. First, if you get a BadWindow error showing a
- 0x0 window ID, you're probably calling XtWindow() on a widget that is not
- realized. See the previous subject.
-
- Second, a BadMatch error often indicates that the depth of a window or a
- pixmap is not correct. You could be using a depth 1 pixmap when you should be
- using a pixmap with the depth of the associated window. Or, you could be
- creating a new shell with a depth that does not match its visual type or
- colormap.
-
- Ken Lee
-
- -----------------------------------------------------------------------------
- Subject: 317) Why doesn't XtNameToWidget (widget, "MyName") work?
- [Last modified: Apr 95]
-
- Answer: The second argument must be a qualified specification (like a resource
- specification). In most cases, you'll use something like "*MyName". The
- leading '*' is required.
-
- Ken Lee
-
- -----------------------------------------------------------------------------
- Subject: 318) Why does my callback's client data structure contain incorrect
- values when the callback is called? I created a structure and used a pointer
- to it as callback client data.
- [Last modified: Apr 95]
-
- Answer: If your structure is declared as automatic, the callback will probably
- not be executed within the structure's scope, so the pointer to the structure
- will become invalid. You can avoid this problem by declaring your structure
- external or by allocating with malloc or (in C++) new.
-
- Ken Lee
-
- -----------------------------------------------------------------------------
- Subject: 319) How can an application manage events on multiple displays?
- [Last modified: May 95]
-
- Answer: Just put multiple display pointers into one application context. (You
- normally specify which application context as an argument to XtOpenDisplay()).
- XtAppNextEvent() and XtAppMainLoop() automatically poll all displays in the
- application context.
-
- Ken Lee
-
- -----------------------------------------------------------------------------
- Subject: 320) Can a Motif application create windows on mutiple screens (on a
- multi-screen workstation)?
- [Last modified: Sep 97]
-
- Answer: Multiple screens is simpler than multiple displays, since one X server
- controls all of the screens. Simply specify the XmNscreen resource when you
- create your top level (or other) shell widget and the X Toolkit will create
- the shell on that screen. You should generally also explicitly set your
- XmNcolormap, XmNdepth, and XmNvisual resources for the new shell, since the
- defaults may not be valid on the second screen.
-
- Ken Lee
-
- -----------------------------------------------------------------------------
- Subject: 321) Why do I get "Error: attempt to add non-widget child "dsm" to
- parent"?
- [Last modified: May 95]
-
- Answer: Most likely, you are linking your libraries in the wrong order. You
- must link -lXm *before* -lXt.
-
- Ken Lee
-
- Ken Sall (ksall@cen.com) adds: This same error occurs if you combine Motif and
- Athena widgets in the same application. If you link with "-lXaw" before "-
- lXm", you get the runtime error. However, if you switch the order of the two
- libraries, there is no problem. For example:
-
- cc mothena.c -o mothena -lXm -lXaw -lXt -lXmu -lX11
-
-
- -----------------------------------------------------------------------------
- Subject: 322) Why do I get link errors about "XShape" symbols?
- [Last modified: May 95]
-
- Answer: You must link with the X extensions library, -lXext, after any widget
- libraries. For example,
-
- cc -o myapp myapp.o -lXm -lXt -lXext -lX11
-
- Ken Lee
-
- -----------------------------------------------------------------------------
- Subject: 323) Why do I get link errors about "ICE" and "SM" symbols?
- [Last modified: Sep 97]
-
- Answer: You must link with the the X ICE and/or SM libraries. For example,
-
- cc -o myapp myapp.o -lXm -lXt -lXext -lICE -lSM -lX11
-
- Ken Lee
-
- -----------------------------------------------------------------------------
- Subject: 324) Why does my X11R6 program crash with undefined symbol
- "LowerCase"?
- [Last modified: May 95]
-
- Answer: If you are using Motif version 1.1.[123], then the problem may be a
- failure to set MotifBC to YES in your site.def.
-
- Thanks to Geoffrey Leach, geoff@netcom.com
-
- -----------------------------------------------------------------------------
- Subject: 325) How do I programatically control xwd to dump a specific window?
- I need a non-interactive way to tell xwd what X window to make an image of...
- NOT by the traditional point-and-click method.
- [Last modified: July 95]
-
- Answer: Ken Sall (ksall@cen.com) wrote:
-
- 1. Get the window id of the toplevel shell widget using the "XtWindow"
- function.
- 2. Invoke "xwd" from the program that has access to the window id, such as:
-
- Window dumpId; /* returned from XtWindow */
- sprintf (cmd_string, "xwd -frame -out tmp.xwd -id 0x%x", dumpId);
- system (cmd_string);
-
-
- -----------------------------------------------------------------------------
- Subject: 326) How can I display an xwd in a window (without using xwud)?
- [Last modified: Sept 95]
-
- Answer:
-
- 1. read the xwd file into an XImage
- 2. create a pixmap and XPutImage the image into the pixmap
- 3. use the pixmap as the XmNlabelPixmap of a label widget
-
- Ken Lee
-
- -----------------------------------------------------------------------------
- Subject: 327) Can I write a multi-threaded Motif application?
- [Last modified: May 97]
-
- Answer: Motif 2.1 can be compiled to be thread-safe (if libX11 and libXt are
- also compiled to be thread-safe).
-
- Motif releases prior to Motif 2.1 were not thread-safe. In these releases,
- you can use Motif from one thread and do other things in other threads but you
- cannot call Motif functions from more than one thread.
-
- Try looking in the X FAQ for information on threads:
-
- http://www.cis.ohio-state.edu/hypertext/faq/usenet/x-faq/top.html
- ftp://ftp.x.org/contrib/faqs/FAQ
-
- Ken Lee
-
- -----------------------------------------------------------------------------
- Subject: 328) How can I dump my widget instance tree in a way that reflects
- the hierarchy?
- [Last modified: July 97]
-
- Answer: Jeremy Jameson (jameson@drmail.dr.att.com) posted this code to c.w.x.m
- in 5/95.
-
- [Note: this code does not consider popup children, which are not listed in
- the XmNchildren array. To find those, you have to peek at the popup_list in
- core widget record. - K.Lee 7/97]
-
-
- /*******************************************************************************
- * dumpWidgetTree( Widget w )
- *
- * This function will recursively descend throught the Widget tree
- * and print the children and their pointer addresses.
- *
- * Jeremy Jameson 5/17/95
- *
- *******************************************************************************/
-
- static void dumpWidgetTree( Widget w )
- {
- WidgetList list = NULL;
- Cardinal num_children = 0;
- int i;
- static int n = 0;
- Widget child;
- static char* indent =
- "-----------------------------------------------------------------------------";
- char tmp[256];
-
- *tmp = ' ';
-
- if ( n >= strlen( indent ) +1 )
- {
- printf(
- "ERROR:Widget tree is too deep, not enough indent string ( < %d )!\n",
- n );
- n = 0;
- return;
- }
-
- strncpy( tmp, indent, n );
- tmp[n] = ' ';
-
- printf( "%s> Dumping widget tree of %s - %#x \n", tmp, XtName( w ), w );
-
- if ( ! XtIsComposite( w ) )
- {
- printf(
- "%s> %s is not a subclass of Composite and therefore has no children\n",
- tmp, XtName( w ) );
- return;
- }
-
- XtVaGetValues( w,
- XmNchildren, &list,
- XmNnumChildren, &num_children,
- NULL );
-
- printf( "%s> %s has %d %s\n", tmp, XtName( w ),
- num_children, num_children == 1 ? "child" : "children" );
-
- for ( i = 1; i <= num_children; i++ )
- {
- child = list[i-1];
- printf( "%s> child %2d %20s \t (%#x)\n", tmp, i, XtName( child ), child );
- }
-
- printf( "\n" );
-
- for ( i = 1; i <= num_children; i++ )
- {
- child = list[i-1];
- n += 3;
- dumpWidgetTree( child );
-
- n -= 3;
- }
- printf( "\n" );
- }
-
-
- -----------------------------------------------------------------------------
- Subject: 329) How do I get the events for gadgets? Or the name of the gadget?
- [Last modified: July 96]
-
- Answer: Get events from the gadget's parent. Ken Lee
-
- A related question is "How the name of a gadget an event is directed to?"
- Daniel Dardailler (daniel@x.org) writes:
-
- Motif 2.0 provides a XmObjectAtPoint public function that support this
- functionality. For earlier version, something like the undocumented
- _XmInputInGadget( wid, x, y ) should do it.
-
- _XmInputInGadget
- Given a composite widget and an (x, y) coordinate, see if the
- (x, y) lies within one of the gadgets contained within the
- composite. Return the gadget if found, otherwise return NULL.
-
-
- -----------------------------------------------------------------------------
- Subject: 330) Can I set the foreground and background colors of gadgets
- (e.g., convenience dialog buttons)?
- [Last modified: Nov 96]
-
- Answer: Not in Motif 1.x. Gadgets don't have their own colors, they use those
- of their parents. Notice that Motif's convenience dialogs generally use label
- gadgets, not widgets, so you cannot customize the colors of individual
- buttons.
-
- Beginning in Motif 2.0, gadgets do have their own color resources.
-
- Ken Lee
-
- -----------------------------------------------------------------------------
- Subject: 331) Can I use a gadget as the parent of a dialog shell?
- [Last modified: Dec 97]
-
- Answer: No. The Core widget class contains the functionality for popup
- children. Since the Gadget class is not a subclass of Core, gadgets cannot
- have popup children (like dialogs).
-
- -----------------------------------------------------------------------------
- Subject: 332) Which other widget features do gadgets lack?
- [Last modified: Dec 97]
-
- Answer: Here's a list from Asente & Swick (p. 397). Note that many of these
- restrictions are primarily of interest to widget (and gadget) writers, not to
- application writers.
-
- 1. gadgets have no background or border colors or pixmaps
- 2. gadgets cannot have event handlers
- 3. gadgets have no translations, accelerators, or actions
- 4. gadgets cannot have pop-up children
- 5. gadgets cannot do grabs
- 6. gadgets cannot redirect the Intrincis keyboard focus or take the X focus
- 7. gadgets cannot own or request selections
- 8. gadgets do not need to be and cannot be realized
- 9. gadgets cannot have their window, display, or screen queried (but
- there are separate functions for computing these)
- 10. gadgets have no stacking order
-
-
- -----------------------------------------------------------------------------
- Subject: 333) Where can I get the xmon or xscope programs to trace my X
- protocol?
- [Last modified: Mar 96]
-
- Answer: Both are included in the contrib section of X11R5:
- ftp://ftp.x.org/pub/R5/
-
- Xmon is also available at: ftp://ftp.x.org/contrib/devel_tools/ and
- ftp://ftp.crl.research.digital.com/pub/X11/contrib/devel_tools/
-
- Ken Lee
-
- -----------------------------------------------------------------------------
- Subject: 334) What does the error "Couldn't find per display information"
- mean?
- [Last modified: Mar 96]
-
- Answer: Xt often needs information about the current X display. It generates
- this error when it couldn't find the display pointer. Common causes
- applications accidentally destroying widgets twice or trying to generate fake,
- incomplete events with XSendEvent().
-
- Ken Lee
-
- -----------------------------------------------------------------------------
- Subject: 335) Can I set widget fallback resources after I've called
- XtAppInitialize()?
- [Last modified: Mar 96]
-
- Answer: No. Fallbacks are only checked when displays are initialized.
-
- Ken Lee
-
- -----------------------------------------------------------------------------
- Subject: 336) Can I use the newline character in widget names?
- [Last modified: Mar 96]
-
- Answer: No. Widget names are designed to be used in resource specifications.
- The Xlib resource file syntax says the only alphanumeric characters (plus '-'
- and '_') may be used in a resource component name. If you want more than one
- line of text in a label widget, set the XmNlabelString resource.
-
- Ken Lee
-
- -----------------------------------------------------------------------------
- Subject: 337) Is anybody out there selling Windows95 look-alike widgets? Why
- isn't there a Widget builder for Motif/X yet? Something like OCX (I believe on
- Windows95).
- [Last modified: Mar 96]
-
- Answer: David B. Lewis (dbl%craft@uunet.uu.net) writes:
-
- None that I know of. There are similar widgets available in Motif 2.0. There
- are similar widgets available in the ICS EnhancementPak.
-
- [For the second part of the question...] Because it's very hard to do. I don't
- know what OCX is, but I can't imagine that the technology is so much better
- than that used in Xt that it's possible to write something to generate real
- code. It's trivial, of course, to generate the framework for a widget given
- only its name, superclass, and resources; but everything else is real code.
-
- -----------------------------------------------------------------------------
- Subject: 338) How can I convert my OLIT programs to the Motif look & feel?
- [Last modified: July 96]
-
- Answer: Mark Fresolone (mjf@mjm.com) writes: There are a number of translator
- products on the market which translate OLIT source code or DevGuide builder
- files into Motif source code and builder files.
-
- In 1995, MJM Software (Melillo Consulting Inc.) released the MoOLIT 5.1
- toolkit, which allows one to simply re-compile Sun or UnixWare OLIT programs,
- and have them be switchable between the OPENLOOK and Motif look and feels.
- MoOLIT 5.1 is available on most popular UNIX platforms. More information is
- available at:
-
- http://www.mjm.com/Products/MoOLIT
-
- -----------------------------------------------------------------------------
- Subject: 339) What does this mean: Warning: Cannot find callback list in
- XtAddCallback?
- [Last modified: July 96]
-
- Answer: It means that you gave an invalid callback name to XtAddCallback,
- e.g., using XmNactivateCallback when the widget does not have a callback with
- that name.
-
- Ken Lee
-
- -----------------------------------------------------------------------------
- Subject: 340) If a single widget has multiple callback functions, are they
- all executed? If so, in what order?
- [Last modified: Nov 96]
-
- Answer: Yes, they are all executed. The order, however, is not defined by the
- X Toolkit specifications. If you really want a certain order, you should
- register a single callback function and have it call your other functions in
- the order you want.
-
- Ken Lee
-
- -----------------------------------------------------------------------------
- Subject: 341) Why are some widgets still visible after I call
- XtDestroyWidget() on them?
- [Last modified: Nov 96]
-
- Answer: To avoid memory corruption problems, the X Toolkit uses a 2 phase
- destroy process. When you call XtDestroyWidget(), the widgets are not really
- destroyed until after you return to the Xt main loop. Until then, the widget
- will behave (mostly) as if they were not destroyed. If this is a problem, you
- should unmanage them as well (you can safely unmanage them after you destroy
- them and before you return to the main loop).
-
- Ken Lee
-
- Note: The details of the two-phase destruction are described on the
- XtCreateWidget(3Xt)/XtDestroyWidget(3Xt) man page. - ksall@cen.com
-
- -----------------------------------------------------------------------------
- Subject: 342) If I call XtGetValues on a resource that does not exist for a
- given widget, what value is returned?
- [Last modified: Nov 96]
-
- Answer: No value is returned. Your return variable is not modified. If it
- was uninitialized (i.e., garbage) before the call to XtGetValues, it will
- remain uninitialized.
-
- Ken Lee
-
- -----------------------------------------------------------------------------
- Subject: 343) Can I reparent a widget (change its parent)?
- [Last modified: Aug 97]
-
- Answer: Xt does not support reparenting of widgets within the widget
- hierarchy. This would complicate the hierarchical resource model. You can
- destroy the old hierarchy and create a new one. On most systems, this is
- pretty fast for reasonably sized widget hierarchies.
-
- Note, however, that X11R6.3 provides an "application group" extension that
- allows one X client to act as the root of another X client's window hierarchy.
- See the X11R6.3 documentation for more details.
-
- Ken Lee
-
- -----------------------------------------------------------------------------
- Subject: 344) Are there any "year 2000" issues within Motif?
- [Last modified: Jun 98]
-
- Answer: According to
-
- http://www.camb.opengroup.org/tech/desktop/faq/y2k.htm
-
-
- Dear Customer:
-
- The Open Group has completed a review of Motif (OSF/Motif) and the X Window
- System with regard to Year 2000 issues, and has determined that Motif
- (versions 1.0 through 2.1) and X Window System (X11 Releases 5 through 6.4)
- source code, as provided directly by The Open Group (or, previously provided
- by Open Software Foundation, Inc.; or X Consortium in the case of X Window
- System) does not contain any date-dependent source code. The arrival of the
- year 2000 should have no effect on the operation of Motif or X Window System
- source code.
-
- Please note, however, that Motif & X Window System object code or
- applications, or derivative works thereof, which would have been provided to
- you by a third party, are not covered by the above statement. You are hereby
- referred to your supplier for statements regarding Year 2000 issues for such
- third-party products.
-
- Very truly yours,
-
- The Open Group
-
- -----------------------------------------------------------------------------
- Subject: 345) Can I suppress or customize Motif warning and error messages?
- [Last modified: Aug 97]
-
- Answer: A better idea is usually to fix problems indicated by the messages.
- If you must, Motif justs uses Xt's message system which can be customized with
- XtAppSetWarningHandler and XtAppSetErrorHandler.
-
- -----------------------------------------------------------------------------
- Subject: 346) TOPIC: Motif FAQ HISTORY and ACKNOWLEDGEMENTS
- [Last modified: April 97]
-
- Answer:
-
- History:
- -------
- November 89 to July 93: FAQ was maintained by Jan Newmarch
- (jan@ise.canberra.edu.au)
-
- July 93 to August 94: FAQ was maintained by Brian Dealy
- (dealy@c3i.saic.com)
-
- Sept. 94 to April 97: FAQ was maintained by Ken Sall
- (ksall@cen.com)
-
- beginning April 97: FAQ was maintained by Kenton Lee
- (http://www.rahul.net/kenton/)
-
- Acknowledgments:
- ----------------
- This list was compiled using questions and answers posed to
- comp.windows.x.motif and motif-talk. Some information was excerpted from the
- comp.windows.x FAQ. To all who contributed one way or the other, thanks! We
- try to give individual references, but you may recognize something
- (jan@ise.canberra.edu.au)
-
- July 93 to August 94: FAQ was maintained by Brian Dealy
- (dealy@c3i.saic.com)
-
- Sept. 94 to April 97: FAQ was maintained by Ken Sall
- (ksall@cen.com)
-
- beginning April 97: FAQ was maintained by Kenton Lee
- (http://www.rahul.net/kenton/)
-
- Acknowledgments:
- ----------------
- This list was compiled using questions and answers posed to
- comp.windows.x.motif and motif-talk. Some information was excerpted from the
- comp.windows.x FAQ. To all who contributed one way or the other, thanks! We
- try to give individual references, but you may recognize something uncredited
- as your contribution. If we've mangled the words (or, heaven forbid, the code)
- too much, let the current maintainer know.
-
- NOTE: If you are a two-or-more-time contributor to this FAQ and you have a WWW
- personal home page which you'd like to have listed, see the subject: "Which X
- and Motif developers have their own home page URLs?"
-
- Jan Newmarch, Information Science and Engineering,
- University of Canberra, PO Box 1, Belconnen, Act 2616
- Australia. Tel: (Aust) 6-2522422. Fax: (Aust) 6-2522999
-
- ACSnet: jan@ise.canberra.edu.au
- ARPA: jan%ise.canberra.edu.au@uunet.uu.net
- UUCP: {uunet,ukc}!munnari!ise.canberra.edu.au!jan
- JANET: jan%au.edu.canberra.ise@EAN-RELAY
-
-
- Jan Newmarch maintained this FAQ for a long time and has really helped a great
- many of us by providing this valuable service. He deserves a big round of
- applause for his efforts. I use this resource all the time and it has saved
- me countless hours with manuals and source code trying to relearn what others
- have already discovered. Jan`s efforts are gratefully acknowledged here.
-
- Brian Dealy, SAIC
- dealy@c3i.saic.com
-
-
- Likewise, Brian Dealy of SAIC did an admirable job taking over the Motif FAQ
- from Jan. A considerable amount of information was added during his tenure and
- we greatly appreciate Brian's work on the FAQ, as well as his efforts in
- maintaining the comp.windows.x.motif newsgroup reflector, for the good of all
- Motif-dom.
-
- Ken Sall
- ksall@cen.com
- Tel: (301) 953-3330 FAX: (301) 953-2368
- Century Computing, Inc.
- http://www.cen.com/
-
-
- My thanks to Ken Sall for maintaining the FAQ for 1994-1997. During Ken's
- tenure the FAQ more than doubled in size. Ken was one of the first FAQ
- maintainers to change all ftp references to URLs and to incorporate http URLs
- thoroughout the FAQ.
-
- Kenton Lee
- X/Motif Consultant
- kenton@nojunk.rahul.net
- http://www.rahul.net/kenton/
-
-
- The end.
-
-
-