home *** CD-ROM | disk | FTP | other *** search
- Path: senator-bedfellow.mit.edu!faqserv
- From: kenton@rahul.net (Ken Lee)
- Newsgroups: comp.windows.x.motif,comp.answers,news.answers
- Subject: Motif FAQ (Part 9 of 9)
- Supersedes: <motif-faq/part9_875789459@rtfm.mit.edu>
- Followup-To: poster
- Date: 18 Oct 1997 10:15:46 GMT
- Organization: none
- Lines: 1744
- Approved: news-answers-request@MIT.EDU
- Distribution: inet
- Expires: 1 Dec 1997 10:06:58 GMT
- Message-ID: <motif-faq/part9_877169218@rtfm.mit.edu>
- References: <motif-faq/part1_877169218@rtfm.mit.edu>
- Reply-To: kenton@rahul.net (Ken Lee)
- NNTP-Posting-Host: penguin-lust.mit.edu
- Summary: Motif Frequently Asked Questions (with answers).
- Keywords: FAQ question answer
- X-Last-Updated: 1997/08/27
- Originator: faqserv@penguin-lust.MIT.EDU
- Xref: senator-bedfellow.mit.edu comp.windows.x.motif:60057 comp.answers:28585 news.answers:114857
-
- Archive-name: motif-faq/part9
- Last-modified: SEP 1, 1997
- Posting-Frequency: irregular
- Organization: Kenton Lee, X/Motif Consultant, http://www.rahul.net/kenton/
- URL: http://www.rahul.net/kenton/faqs/mfaq_index.html
- Version: 6.3
-
- -----------------------------------------------------------------------------
- Subject: 295) 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. Example source code is available at
-
- ftp://ftp.ora.com/pub/examples/xresource/issue6/helpdemo.tar.Z
-
- 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: 296) How can I implement "bubble help" or "tool tips" with Motif?
-
- [Last modified: Nov 96]
-
- Answer: 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 when enter/leave events occur. Rick Evans wrote a tutorialfor the
- July, 1995 issue of *The X Advisor*:
-
- http://www.unx.com/DD/advisor/docs/jul95/jul95.evans.shtml
-
- Morris Hirsch (hirsch@cs.umass.edu) has another approach and contributed a
- code example which is over 1000 lines, so I've put the code on our web site:
-
- http://www.cen.com/mw3/bubbleHelp.txt
-
- -----------------------------------------------------------------------------
- Subject: 297) 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: 298) 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: 299) Where can I get the PanHandler code?
-
- [Last modified: Nov 96]
-
- Answer: It is available by email from Chuck Ocheret: chuck@NYC.Thinkbank.COM
- (email change).
-
- -----------------------------------------------------------------------------
- Subject: 300) What are these 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: 301) 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: 302) 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
-
-
- - 13 -
-
-
- 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: 303) 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: 304) 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: 305) 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: 306) 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: 307) 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: 308) 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: 309) 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: 310) 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: 311) 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: 312) 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: 313) 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: 314) Can the 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: 315) 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: 316) 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: 317) Why is XtWindow(widget) == 0?
-
- [Last modified: Oct 95]
-
- Answer: The window is not created 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, http://www.rahul.net/kenton/
-
- -----------------------------------------------------------------------------
- Subject: 318) 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, http://www.rahul.net/kenton/
-
- -----------------------------------------------------------------------------
- Subject: 319) 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, http://www.rahul.net/kenton/
-
- -----------------------------------------------------------------------------
- Subject: 320) 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, http://www.rahul.net/kenton/
-
- -----------------------------------------------------------------------------
- Subject: 321)+ 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, http://www.rahul.net/kenton/
-
- -----------------------------------------------------------------------------
- Subject: 322) 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, http://www.rahul.net/kenton/
-
- 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: 323) 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, http://www.rahul.net/kenton/
-
- -----------------------------------------------------------------------------
- Subject: 324)+ 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, http://www.rahul.net/kenton/
-
- -----------------------------------------------------------------------------
- Subject: 325) 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: 326) 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: 327) How can I display an xwd in a window (without using xwud)?
-
- [Last modified: Sept 95]
-
- Answer: Ken Lee (http://www.rahul.net/kenton/) writes:
-
- 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
-
- -----------------------------------------------------------------------------
- Subject: 328) 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, http://www.rahul.net/kenton/
-
- -----------------------------------------------------------------------------
- Subject: 329) 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]
-
-
- - 14 -
-
-
- /*******************************************************************************
- * 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: 330) How do I convert my xpm file into a Pixmap? (The xpm file is
- basically a C variable which I can #include.)
-
- [Last modified: Sept 95]
-
- Answer: Use XpmCreatePixmapFromData() See the XPM library documentation for
- full examples and details.
-
- Ken Lee, http://www.rahul.net/kenton/
-
- -----------------------------------------------------------------------------
- Subject: 331) How can I display a gif/jpeg/tiff picture in a widget?
-
- [Last modified: Sept 95]
-
- Answer: Get the Xpm library and read the documentation. Get xpaint from
- ftp.x.org, also get the jpeg and tiff libraries on the internet. From these
- you can easily create the code to read in gif, jpeg, and tiff.
-
- Read the images into and XpmImage format. Then use one of the Xpm conveneince
- functions to create wither an XImage or a Pixmap from your data. The xpm lib
- will take care of the color allocation and Pixmap/XImage creation, then you
- can just use expose routines to copy the Pixmap into a dialog or any
- window....
-
- Thanks to Ramiro Estrugo (restrugo@fateware.com)
-
- -----------------------------------------------------------------------------
- Subject: 332) 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,
- http://www.rahul.net/kenton/
-
- 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: 333) Can I set the foreground and background colors of gadgets?
-
- [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, http://www.rahul.net/kenton/
-
- -----------------------------------------------------------------------------
- Subject: 334) 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, http://www.rahul.net/kenton/
-
- -----------------------------------------------------------------------------
- Subject: 335) 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, http://www.rahul.net/kenton/
-
- -----------------------------------------------------------------------------
- Subject: 336) 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, http://www.rahul.net/kenton/
-
- -----------------------------------------------------------------------------
- Subject: 337) 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, http://www.rahul.net/kenton/
-
- -----------------------------------------------------------------------------
- Subject: 338) 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: 339) 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: 340)* Where can I obtain X and Motif applications?
-
- [Last modified: Sep 97]
-
- Answer: Several product lists are available from "MW3: Motif on the World
- Wide Web":
-
- http://www.cen.com/mw3/commercial.html
- MW3: Commercial Products and Vendors
-
- http://www.cen.com/mw3/non-commercial.html
- MW3: Non-Commercial Applications and Shareware
-
- http://www.cen.com/mw3/vendors.html
- MW3: Motif Vendor List
-
- Brandon Harris has an impressive collection of apps (commercial and non-
- commercial) in various categories:
-
- http://www.gaijin.com/X/x.apps.html
- X Applications:
- DateBooks, Development, Editors, File Management, Games,
- Graphics, Mail, Miscellaneous, Office and Finance, Utilities,
- WebBrowsers, Window Managers.
-
- The Open Group Open maintains a list of products at:
-
- Open Software Registry
- http://www.opensoftware.com/
-
- Two other comp.windows.x.* FAQs have long lists of available tools:
-
- http://www.ee.ryerson.ca:8080/~elf/xapps/faq.html
- comp.windows.x.apps FAQ
-
- and the topic "OBTAINING X AND RELATED SOFTWARE AND HARDWARE" in the X FAQ:
-
- http://www.cs.ruu.nl/wais/html/na-dir/x-faq/part3.html
-
- -----------------------------------------------------------------------------
- Subject: 341) 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, http://www.rahul.net/kenton/
-
- -----------------------------------------------------------------------------
- Subject: 342) 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, http://www.rahul.net/kenton/
-
- -----------------------------------------------------------------------------
- Subject: 343) 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, http://www.rahul.net/kenton/
-
- Note: The details of the two-phase destruction are described on the
- XtCreateWidget(3Xt)/XtDestroyWidget(3Xt) man page. - ksall@cen.com
-
- -----------------------------------------------------------------------------
- Subject: 344) 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, http://www.rahul.net/kenton/
- -----------------------------------------------------------------------------
- Subject: 345) 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, http://www.rahul.net/kenton/
- -----------------------------------------------------------------------------
- Subject: 346) Are there any "year 2000" issues within Motif?
-
- [Last modified: May 97]
-
- Answer: We believe that the Motif and X11 sources have no Y2K difficulties
- when they leave these doors. What implementors do to them while producing
- binaries is not under our control.
-
- David Brooks, QA Manager, Desktop Engineering dbrooks@opengroup.org The
- Open Group <URL:http://www.opengroup.org/~dbrooks/>
-
- -----------------------------------------------------------------------------
- Subject: 347) 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: 348) TOPIC: 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 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/
-
-
- And thanks to Ken Sall for maintaining the FAQ for the last 3 years. 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. This effort motivated him to create the Motif on the
- World Wide Web site (http://www.cen.com/mw3/) which contains hundreds of Motif
- links.
-
-
- Kenton Lee
- X/Motif Consultant
- kenton@rahul.net
- http://www.rahul.net/kenton/
-
-
-