jan@PANDONIA.CANBERRA.EDU.AU (Jan Newmarch) (02/07/91)
Newsgroups: comp.windows.x.motif Subject: Frequently Asked Questions about Motif Distribution: world Expires: Fri, 01 Mar 91 00:00:00 GMT [Last changed: 06 Feb 91] This article and one following contain the answers to some Frequently Asked Questions (FAQ) often seen in comp.windows.x.motif. It is posted to help reduce volume in this newsgroup and to provide hard-to-find information of general interest. Please redistribute this article! This article includes answers to the following questions. Ones marked with a + indicate questions new to this issue; those with changes of content since the last issue are marked by *: 0) What versions of Motif are there? 1) Where can I get Motif? 2) Where can I get public domain Motif source? 3) Has anyone done a public domain Motif lookalike? 4) Does anyone from OSF pay attention to our questions/suggestions? 5) Does OSF have an application compliance validation service? 6) What books should I read or do I need to program using Motif? 7) What is the diference between Motif and mwm? 8) Does anyone have an alternative set of 3-D defaults for a monochrome screen? 9) What prototyping tools are there to generate Motif code? 10) Why does pressing <return> in a text widget do nothing? 11) When I add text to a scrolling text widget how can I get the new text to show? 12) Does the text widget support 16 bit character fonts? 13) How can I stop the text widget from echoing characters typed? 14) How can I replace characters typed with say a `*'? 15) How can I best add a large piece of text to a scrolled list widget? 16) How do I best put a new set of items into a list? 17)+ Can I get a bitmap to show in a list item like I can in a Label? 18) What can I put inside a menu bar? 19) Can I have a cascade button without a submenu in a pulldown menu? 20) Should I have a cascade button without a submenu in a pulldown menu? 21) How can I direct the keyboard input to a particular widget? 22) How can I have a modal dialog which has to be answered before the application can continue? 23) Why does my application grow in size? 24) Why does my application take a long time to start up? 25)* My application is running too slowly. How can I speed it up? 26) How can I get the Ascii text out of an XmString? 27)+ When can XmStrings used as resources be freed? 28) Why doesn't XmStringGetNextSegment() work properly? 29) How do I stop my dialog disappearing when I press the help button? 30) How do I make my own dialog? 31) What is libPW.a and do I need it? 32) How can tell I if the user has selected the "Close" item on the system menu attached to the top-level shell? 33) Is there a C++ binding for Motif? 34) Why does an augment translation appear to act as replace? 35)* What MIT patches do I use, and when do I use fix-osf? 36) I tried to make shared libraries on a Sun, and got the message "ld.so: Undefined symbol: __XtInherit" when executing UIL. What did I do? 37) How can I set a multiline label in .Xdefaults? 38)* How do you "grey" out a widget so that it cannot be activated? 39)* What is causing the messages "unknown keysym osfDown..."? 40)+ Why doesn't the Help callback work on some widgets? If you have suggestions or corrections for any of these answers or any additional information, please send them directly to jan@ise.canberra.edu.au; the information will be included in the next revision (or possibly the one after that; thanks for the many suggestions which haven't been incorporated yet). The answers in this iteration are acknowledged to be partial. This posting is intended to be distributed at approximately the beginning of each month. The information contained herein has been gathered from a variety of sources. In many cases attribution has been lost; if you would like to claim responsibility for a particular item, please let us know. Conventions used below: telephone numbers tend to be Bell-system unless otherwise noted; prices on items are not included. 1. OSF and Motif Subject: 0) What versions of Motif are there? Answer: Motif 1.0 is based on the R3 toolkit. There are patch releases to 1.0: 1.0.1, 1.0.A, 1.0.2 and 1.0.3. 1.0.A was a fairly major patch, as it involved a complete re-engineering of UIL and Mrm. Almost everyone who has 1.0.x has either 1.0.A or 1.0.3. Motif 1.1 is based on the R4 toolkit. The current version is Motif 1.1.0, plus a couple of patches available to full support contract holders. Motif 1.1.1 has been released as a patch to licensees with Full Support or Technical Update service. Motif 1.2 is not expected until after mid 1991, and will be based on the R5 toolkit. Subject: 1) Where can I get Motif? Answer: [This tries to mirror FAQ of comp.windows.x Send changes to xug@expo.lcs.mit.edu] Various hardware vendors produce developer's toolkits of binaries, header files, and documentation; check your hardware vendor, particularly if that vendor is an OSF member. Systems known to be shipping now: HP (sans UIL), Apollo (sans UIL), SCO, ISC, Mips (RISCwindows=X11R3 + full Motif), IBM, Data General for AViioNs (includes UIL), Bull (?), Concurrent Computer Corporation 5000, 6000, 8000 series machines. In addition, independent binary vendors produce Motif toolkits . ICS makes several binary kits, notably for Sun, DEC, Apple; Quest (408-988-8880) sells kits for Suns, as well; IXI (+44 223 462 131) offers kits for Sun3 (SunOS 3.5 or later, and Sun4 (SunOS 4.0.1 or later). Unipalm XTech (+44 954211862; or Aurora Technologies 617-577-1288 in USA) offers a binary kit for Suns based on Motif 1.1, with shared libraries. NSL (+33 (1) 43 36 77 50; requests@nsl.fr) offers kits for the Sun 3 and Sun 4. The kits include varied levels of bug-fixing and support for shared libraries. BIM (Fax : +32(2)759.47.95) offer Motif 1.1 for Sun-3, Sun-4, Sun-386i. Includes shared libraries. Metrolink Inc. (+1-305-566-9586, sales@metrolink.com; in Europe contact ADNT, (33 1) 3956 5333) ships an implementation of X11R4 and Motif 1.1 for several 386 systems. An OSF/Motif source license must be obtained from OSF before source can be obtained from the Open Software Foundation. Call the Direct Channel Desk at OSF at 617-621-7300 or email direct@osf.org for ordering information. Subject: 2) Where can I get public domain Motif source? Answer: You cannot. Motif source is not publically available. Subject: 3) Has anyone done a public domain Motif lookalike? Answer: Not yet. Subject: 4) Does anyone from OSF pay attention to our questions/suggestions? Answer: Yes, and they quite often post answers too. But they may not respond to *your* problem because they have other things to do as well. This newsgroup is not run by OSF, and has no formal connection with OSF. OSF is a member-driven company. The membership (and anyone can be a member) provides the primary input for future development of Motif. Subject: 5) Does OSF have an application compliance validation service? Answer: They have a checklist and a certification process which you can request from them. Ask for the Level One Certification Checklist. The process is one of self-certification. It tests only the appearance and behavior of the application against Motif style. The product will also be put in the OSF reference listing. There's a one-time fee of $250. According to the master license agreement, you can't use any OSF identifying mark unless you have done a certification. 2. Literature Subject: 6) What books should I read or do I need to program using Motif? Answer: Ken Lee of the DEC Western Software Laboratory (klee@wsl.dec.com) regularly posts to comp.windows.x and ba.windows.x a list of reference books and articles on X and X programming. In FAQ comp.windows.x an extract of his list appears. Specifically for Motif programming, though: OSF/Motif Programmers Guide, Prentice-Hall 13-640525-8 (Motif 1.0) ISBN 0-13- 640681-5 (Motif 1.1) OSF/Motif Programmers Reference Manual, Prentice-Hall 13-640517-17 (Motif 1.0) ISBN 0-13-640616-5 (Motif 1.1) OSF/Motif Style Guide, Prentice-Hall 13-640491-X (Motif 1.0) ISBN 0-13-640673-4 (Motif 1.1) Young, Doug. "The X Window System: Applications and Programming with Xt (Motif Version)," Prentice Hall, 1989 (ISBN 0-13-497074-8). The excellent tutorial "X Window Systems Programming and Applications with Xt," (ISBN 0-13-972167-3) updated for Motif. [The examples from the Motif version are available on expo in ~ftp/contrib/young.motif.tar.Z] Marshall Brain at brain@adm.csc.ncsu.edu posted a set of simple and useful Motif tutorials. You will also need books and references on Xt such as: Asente, Paul J., and Swick, Ralph R., "X Window System Toolkit, The Complete Programmer's Guide and Specification", Digital Press, 1990. The bible on Xt. A treasury of information, excellent and invaluable. Distributed by Digital Press, ISBN 1-55558-051-3, order number EY-E757E-DP; and by Prentice- Hall, ISBN 0-13-972191-6. Nye, Adrian, and Tim O'Reilly, "X Toolkit Programming Manual, Volume 4," O'Reilly and Associates, 1989. The folks at O'Reilly give their comprehensive treatment to programming with the MIT X11R3 Intrinsics; some information on X11R4 is included. O'Reilly, Tim, ed., "X Toolkit Reference Manual, Volume 5," O'Reilly and Associates, 1989. A professional reference manual for the MIT X11R3 Xt; some information on X11R4 is included. Books and reference manuals on Xlib may also be useful. 3. Mwm Subject: 7) What is the diference between Motif and mwm? Answer: mwm is a window manager. Motif itself is made up of four parts: a User- Interface Guideline, an API toolkit of `C' routines which helps in the building of applications which conform to the Guideline, the window manager mwm, and a language UIL which is designed to ease user interface development. In general mwm will run an application built with any X-windows API, and in general an application built using the Motif toolkit will run under any window manager. Subject: 8) Does anyone have an alternative set of 3-D defaults for a monochrome screen? Answer: This is obviously a matter of taste. Some alternatives suggested include !Benjamin Schreiber, bs@osf.osf.org, bs@cs.brandeis.edu Mwm*foreground: black ! Actually, when a window is Mwm*background: white ! deactivated, the background Mwm*backgroundPixmap: 50_foreground ! becomes white, insted of Mwm*topShadowPixmap: white ! 50% foreground (grey) Mwm*activeForeground: black Mwm*activeBackground: white Mwm*activeBackgroundPixmap: 50_foreground Mwm*activeTopShadowPixmap: white Mwm*menu*backgroundPixmap: background Mwm*menu*topShadowPixmap: 50_foreground Mwm*title*foreground: black Mwm*title*background: white Mwm*title*backgroundPixmap: white Mwm*title*topShadowPixmap: 50_foreground Mwm*title*activeForeground: white Mwm*title*activeBackground: black Mwm*title*activeBackgroundPixmap: black Mwm*title*activeBottomShadowPixmap: 50_foreground Mwm*feedback*backgroundPixmap: white or ! From: tsang@isi.com (Kam C. Tsang) Mwm*background: White Mwm*activeBackground: White Mwm*activeBackgroundPixmap: 25_foreground Mwm*foreground: Black Mwm*activeForeground: Black Mwm*menu*background: white Mwm*menu*foreground: black xterm*Foreground: black xterm*Background: white or ! From: ucsd.edu!usc!snorkelwacker!paperboy!yee (Michael K. Yee) Mwm*cleanText: True Mwm*activeBackground: white Mwm*activeForeground: black Mwm*background: white Mwm*foreground: black Mwm*client*activeBackgroundPixmap: 50_foreground Mwm*client*activeTopShadowPixmap: foreground Mwm*client*activeBottomShadowPixmap: background !Mwm*client*background: white !Mwm*client*foreground: black Mwm*client*backgroundPixmap: 75_foreground Mwm*client*topShadowPixmap: foreground Mwm*client*bottomShadowPixmap: background !Mwm*feedback*background: white !Mwm*feedback*foreground: black Mwm*feedback*backgroundPixmap: 50_foreground !Mwm*feedback*topShadowPixmap: 25_foreground !Mwm*feedback*bottomShadowPixmap: background !Mwm*menu*background: white !Mwm*menu*foreground: black Mwm*menu*backgroundPixmap: foreground !Mwm*menu*topShadowPixmap: foreground !Mwm*menu*bottomShadowPixmap: background !Mwm*icon*background: white !Mwm*icon*foreground: black Mwm*icon*activeBackgroundPixmap: 50_foreground Mwm*icon*activeBottomShadowPixmap: foreground Mwm*icon*backgroundPixmap: 75_foreground 4. Motif generators Subject: 9) What prototyping tools are there to generate Motif code? Answer: `Prototyping tools' come in two forms: those that can be used to design the interface only (Interactive Design Tools), and those that go beyond this to give support for application code (User Interface Management Systems). There are a number of commercial and non-commnercial tools of both kinds that will support the Motif interface. They include: IDTs: Builder Xcessory UIMX X Build UIMS: WINTERP Widget Creation Library Serpent TeleUse Some contact addresses are: WINTERP: You may obtain the current source, documentation, and examples via anonymous ftp from host expo.lcs.mit.edu: in directory contrib/winterp you will find the compress(1)'d tar(1) file winterp.tar.Z. If you do not have Internet access you may request the source code to be mailed to you by sending a message to winterp-source%hplnpm@hplabs.hp.com or hplabs!hplnpm!winterp-source. Serpent: The S/W is free (anonymous ftp) from fg.sei.cmu.edu. For more info contact erik/robert at serpent-info@sei.cmu.edu. TeleUse: In the U.K., send mail to xtech@unipalm.co.uk or call +44 954 211862. In the US call Telesoft at (619) 457-2700 or write TeleSoft, 5959 Cornerstone Court West, San Diego, California 92121. Builder Xcessory from ICS. More details are available by sending a request to info@ics.com. 617.547.0510 X-Designer: From Imperial Software Technology in the UK. Email address is sales@ist.co.uk. (+44) 743 587055 X Build: From Nixdorf Computer (Waltham, MA) xbuild@nixdorf.com ExoCode: From EXOC (Chicago, IL) UIMX: Visual Edge Software Limited, 3870 Cote Vertu, St Laurent, Quebec, H4R 1V4, Phone: (514) 332-6430, Fax: (514) 332-5914, or: Visual Edge Software Ltd., 101 First Street, Suite 443, Los Altos, CA 94022, Phone: (415) 948-0753, Fax: (415) 948-0843 The Widget Creation Library: The distribution is available in several ways. The preferred approach it for you to get the compressed tar file using anonymous ftp from either of these ftp servers: devvax.jpl.nasa.gov (128.149.1.143) pub/Wc1_03.tar.Z expo.lcs.mit.edu (18.30.0.212) /contrib/Wcl.1.05Wc1_05.tar.Z 5. Text widget Subject: 10) Why does pressing <return> in a text widget do nothing? This happens using Motif 1.0 when I have a text widget inside a bulletin board (or form) inside a dialog shell. (In Motif 1.1 it is fixed for both text and list widgets.) Answer: In single line mode, pressing the <return> key usually invokes the Activate() action, and in multi-line mode, the newline() action. However, whenever a widget is the child of a bulletin board widget which is the child of a dialog shell, the bulletin board forces all of its children to translate <return> to the bulletin board action Return() which is usually associated with the default button of the dialog. To restore the text actions of Activate() or newline(), you need to overide the Return() action of the bulletin board. /* declarations */ /* for a single line widget */ char newTrans[] = "<Key>Return : Activate()"; /* for a multi line widget */ char newTrans[] = "<Key>Return : newline()"; XtTranslations transTable; /* in executable section */ transTable = XtParseTranslationTable(newTrans); /* after creating but before managing text widget */ XtOverrideTranslations(textWidget, transTable); Subject: 11) When I add text to a scrolling text widget how can I get the new text to show? Answer: Use the call undocumented in Motif 1.0 void XmTextShowPosition(w, position) Widget w; XmTextPosition position; where the position is the number of characters from the beginning of the buffer of the text to be displayed. If you don't know how many characters are in the buffer, use another call undocumented in Motif 1.0 position = XmTextGetLastPosition(w) Subject: 12) Does the text widget support 16 bit character fonts? Answer: R5 will have support for 16 bit character sets, and Motif 1.2 will use that. You will have to wait until then. Subject: 13) How can I stop the text widget from echoing characters typed? I need to turn off echo for password input. Answer: Use the modifyVerifyCallback to tell when input is received. Set the `doit' field in the XmTextVerifyCallbackStruct to False to stop the echo. In Motif 1.0 this will cause a beep per character: Live with it, because at 1.1 you can turn it off. Note that password hiding is inherently insecure in X - someone may have an X grab on the keyboard and be reading all characters typed in anyway. Subject: 14) How can I replace characters typed with say a `*'? I want to replace input for password entry. Answer: In Motif 1.1 set text->ptr in the callback structure to '*'. This does not work under 1.0 because of an oversight in which changes to this are ignored. In Motif 1.0, what you can do is set the doit flag to 'false' so the text is not displayed. Then set a static boolean to True to prevent re-entrance. Next call XmTextReplace() to display your '*'. then reset your re-entrance flag to False. XmTextReplace() will call the XmNmodifyVerify callback. To prevent getting into an infinite loop, you need the re-entrance flag. Subject: 15) How can I best add a large piece of text to a scrolled list widget? It insists on adding the text one line at a time, adjusting the scroll bar each time. It looks awful and is slow. Answer: Unmanage the widget, add the text and then manage it again. 6. Lists Subject: 16) How do I best put a new set of items into a list? Answer: Set the new list count and list by XtSetArgs and install them by XtSetValues. XmString list[SIZE]; int list_size; XtSetArg (args[n], XmNitemCount, list_size); n++; XtSetArg (args[n], XmNitems, list); n++; XtSetValues (w, args, n); Each time the list is reset by this the old contents are freed by the widget and the new supplied list is copied. Do *not* free the old list of items yourself as this would result in the space being freed twice. It is not necessary to remove the items one at a time, nor to "zero" out the list first. Subject: 17)+ Can I get a bitmap to show in a list item like I can in a Label? I want to place a bitmap along with some noraml text in my list items. Answer: No. The workaround is to define your font containing the icons you want. Then you can create a fontlist containing your icon font and the font you want the text in, and then make your items multi-segment XmStrings where the first segment contains the code of the icon you want with a charset that matches the icon font in your fontlist and the second segment with a charset matching the text font. 7. Menus Subject: 18) What can I put inside a menu bar? Answer: You can only put cascade buttons in menu bars. No pushbuttons, toggle buttons or gadgets are allowed. When you create a pulldown menu with parent a menu bar, its real parent is a shell widget. Subject: 19) Can I have a cascade button without a submenu in a pulldown menu? Answer: Yes you can. A cascade button has an activate callback which is called when you click on it and it doesn't have a submenu. It can have a mnemonic, but keyboard traversal using the arrow keys in the menu will skip over it. Subject: 20) Should I have a cascade button without a submenu in a pulldown menu? Answer: No. This is forbidden by the style guide. Technically you can do it (see previous question) but if you do it will not be Motif style compliant. This is unlikely to change - if a "button" is important enough to be in a pulldown menu bar with no pulldown, it should be a button elsewhere. 8. Keyboard traversal Subject: 21) How can I direct the keyboard input to a particular widget? Answer: In Motif 1.1 call XmProcessTraversal(target, XmTRAVERSE_CURRENT). In Motif 1.0 call the undocumented _XmGrabTheFocus(target). Do not use the X or Xt calls such as XtSetKeyboardFocus since this bypasses the Motif traversal layer and can cause it to get confused. This can lead to odd keyboard behaviour elsewhere in your application. Subject: 22) How can I have a modal dialog which has to be answered before the application can continue? Answer: The answer depends on whether you are using the Motif window manager mwm or not. If you are, there is a simple solution. If not (or you don't know whether you are or not), you have to use a slightly harder method. Test for this by XmIsMotifWMRunning. The window manager mwm knows how to control event passing to dialog widgets declared as modal. If the dialog is set to application modal, then no interaction with the rest of the application can occur until the dialog is destroyed or unmanaged. This can be done through one of the callbacks of the dialog: block_dialog(parent) Widget parent; { Arg args[2]; XtSetArg(args[0], XmNmessageString, XmStringCreateLtoR("....", charset)); XtSetArg(args[1], XmNdialogStyle, XmDIALOG_APPLICATION_MODAL); dialog = XmCreateMessageDialog(parent, NULL, args, 2); XtAddCallback(dialog, XmNokCallback, responseCB, NULL); XtAddCallback(dialog, XmNcancelCallback, responseCB, NULL); XtAddCallback(dialog, XmNhelpCallback, responseCB, NULL); XtManageChild(dialog); } void responseCB(w, client_data, reason) Widget w; caddr_t client_data; XmAnyCallbackStruct *reason; { int why = reason->reason; XtUnmanageChild(w); /* if you won't use it again */ XtDestroyWidget(XtParent(w)); switch (why) { case XmCR_OK: /* process ok action */ break; case XmCR_CANCEL: /* process cancel action */ break; case XmCR_HELP: /* process help action */ break; } } Without using mwm, the basic version goes like this: You have to set an Xt grab to the dialog and run your own event processing loop. This loop finishes when the user invokes a callback from a button press. The boolean `keep_grab' is passed to the callback as client data which sets it to false when the callback is executed. Boolean keep_grab = True; XEvent event; Arg args[1]; XtSetArg(args[0], XmNmesssageString, ...); dialog = XmCreateMessageDialog(parent, NULL, args, 1); XtAddCallback(dialog, XmNokCallback, responseCB, &keep_grab); XtAddCallback(dialog, XmNcancelCallback, responseCB, &keep_grab); XtAddCallback(dialog, XmNhelpCallback, responseCB, &keep_grab); XtManageChild(dialog); XtAddGrab(XtParent(dialog), True, False); while (keep_grab || XtPending()) { XtNextEvent(&event); XtDispatchEvent(&event); } The "client_data" for the function (in each case) is &keep_grab. The function sets this to False and unmanages the dialog before continuing to process the callback. void responseCB(w, keep_grab, reason) Widget w; Boolean *keep_grab; XmAnyCallbackStruct *reason; { int why = reason->reason; *keep_grab = False; XtRemoveGrab(XtParent(w)); XtUnmanageChild(w); /* If you don't want to reuse it */ XtDestroyWidget(XtParent(w)); switch (why) { case XmCR_OK: /* process ok action */ break; case XmCR_CANCEL: /* process cancel action */ break; case XmCR_HELP: /* process help action */ break; } } 9. Memory and Speed Subject: 23) Why does my application grow in size? Answer: Motif 1.0 has many memory leaks, particularly in XmString manipulation. Switch to Motif 1.1. Answer: The Intrinsics have a memory leak in accelerator table management, and Motif uses this heavily. Avoid this by mapping/unmapping widgets rather than creating/destroying them, or get X11R4 fix-15/16/17. Answer: The server may grow in size due to its own memory leaks. Switch to a later server. Answer: You are responsible for garbage collection in `C'. Some common cases where a piece of memory becomes garbage are a. Memory is allocated for a character string by Motif in XmStringGetLtoR(). After using the string, XtFree() it. b. If you have set the label in a label, pushbutton, etc widget, free it after calling XtSetValues() or the widget creation routine by XmStringFree(). c. If you have set text in a text widget, reclaim the string afterwards - the text widget makes its own copy. d. If you have set the strings in a list widget, reclaim the space. The list widget makes its own copy. Subject: 24) Why does my application take a long time to start up? Answer: If you have a large .Xdefaults, time may be spent reading and parsing it. Subject: 25)* My application is running too slowly. How can I speed it up? Answer: Use the R4 rather than R3 server. It is much faster. Answer: The standard memory allocator is not well tuned to Motif, and can degrade performance. Use a better allocator. e.g. with SCO Unix, link with libmalloc.a; use the allocator from GNU emacs; use the allocator from Perl. Answer: Avoid lots of widget creation and destruction. It fragments memory and slows everything down. Popup/popdown, manage/unmanage instead. Answer: Get more memory - your application, the server and the Operating System may be spending a lot of time being swapped. Answer: If you are doing much XmString work yourself, such as heavy use of XmStringCompare, speed may deteriorate due to the large amount of internal conversions and malloc'ing. Try using XmStringByteCompare if appropriate or ordinary Ascii strings if you can. 10. XmString Subject: 26) How can I get the Ascii text out of an XmString? Answer: To get the first line of text from a string created left-to-right char *str; XmString xmstr; /* stuff to create xmstr */ ... /* set str to point to the text */ XmStringGetLtoR(xmstr, XmSTRING_DEFAULT_CHARSET, &str); /* use the string */ ... /* and reclaim space */ XtFree(str); Subject: 27)+ When can XmStrings used as resources be freed? Answer: The policy OSF have been trying to enforce is that if you set an XmString or XmStringTable resource, the application is responsible for freeing the XmStrings used because the widget makes a copy. If you get an XmString resource, then the application must free the value gotten. If you get an XmStringTable, then the application should NOT free the value gotten. If the application wants to manipulate it, it should make a copy first. This policy appears to be implemented progressively, so may be less true for Motif 1.0 than 1.1. Subject: 28) Why doesn't XmStringGetNextSegment() work properly? Answer: The documentation in Motif 1.0 is in error. Instead of XmStringGetnextSegment(context, ...) XmStringContext * context; it should be XmStringGetnextSegment(context, ...) XmStringContext context; i.e. with no indirection. 11. Dialogs Subject: 29) How do I stop my dialog disappearing when I press the help button? Answer: Bulletin board has the resource autoUnmanage which defaults to True. This unmanages the widget when any button child is activated - including the help button. Set this to False to stop it disappearing. Note that you then have to unmanage the bulletin board yourself when any other button is activated. Subject: 30) How do I make my own dialog? I want a dialog with my own set of buttons that stretch and shrink like the ones in e.g. PromptDialog and its own contents. Answer: Start off with say a PromptDialog. Unmanage the buttons you don't want or manage the Apply button if you want another. Unmanage the other bits of the selection box you don't want. You can add another WorkArea child to the selection box for any extra stuff you want. /* Copyright 1990, Kee Hinckley and Brian Holt Hawthorne */ /* Permission granted for any use, provided this copyright */ /* notice is maintained. */ /* Create a dialog box */ argcount = setArgs(&args, XmNautoUnmanage, False, NULL); SomeDialog = XmCreatePromptDialog(mainShell, "someDialog", args, argcount); /* Now get rid of the things we don't want */ child = XmSelectionBoxGetChild(SomeDialog, XmDIALOG_SELECTION_LABEL); XtUnmanageChild(child); child = XmSelectionBoxGetChild(SomeDialog, XmDIALOG_TEXT); XtUnmanageChild(child); /* set the callbacks, and make sure the buttons we want are there */ child = XmSelectionBoxGetChild(SomeDialog, XmDIALOG_OK_BUTTON); XtAddCallback(child, XmNactivateCallback, callSomeFunc, someArg); XtAddCallback(child, XmNactivateCallback, unManage, SomeDialog); XtManageChild(child); child = XmSelectionBoxGetChild(SomeDialog, XmDIALOG_APPLY_BUTTON); XtAddCallback(child, XmNactivateCallback, callSomeFunc, someOtherArg); XtManageChild(child); child = XmSelectionBoxGetChild(SomeDialog, XmDIALOG_CANCEL_BUTTON); XtAddCallback(child, XmNactivateCallback, dialogUnmanage, SomeDialog); XtManageChild(child); /* Add a new work area. This can be any manager. */ child = XmCreateForm(SomeDialog, "someForm", NULL, 0); XtManageChild(child); /* and fill it up... */ something = doYourStuff(child); 12. Miscellaneous Subject: 31) What is libPW.a and do I need it? My manual says I need to link in libPW.a to use the File Selection Box. I can't find it on my system. Answer: The libPW.a is the Programers Workbench library which is an ATT product not included in Berkeley based systems, hence it is not found in SunOS or Ultrix, but is found on HP-UX (a Berkeley/ATT hybrid which chose ATT in this case). It contains the regex(3) routines. Some systems which don't have these in the libc.a need to link with -lPW. Some systems which have the regex(3) routines in there also have the libPW.a. If you have regex(3) in libc, and it works, don't link with libPW. If you don't have regex(3) in libc, and you don't have a libPW, then check some sites on the net for public domain replacements (several exist), or call your vendor. Subject: 32) How can tell I if the user has selected the "Close" item on the system menu attached to the top-level shell? I need to do some clean up before exiting. Answer: void FinalCleanupCB(w, client_data, call_data) Widget w; caddr_t client_data, call_data; { /* tidy up stuff here */ ... /* exit if you want to */ exit (0); } main() { Atom wm_delete_window; ... XtRealizeWidget(toplevel); ... wm_delete_window = XmInternAtom(XtDisplay(toplevel), "WM_DELETE_WINDOW", False); XmAddWMProtocolCallback(toplevel, wm_delete_window, FinalCleanupCB, NULL); XtMainLoop(); } Subject: 33) Is there a C++ binding for Motif? Answer: The university of Lowell has a C++ binding. The software is available on any system running X11R3. Currently it is available for both the GNU's C++ compiler g++ v 1.37.1 and the AT&T C++ v 2.0 translator. The software is available through either ftp or a 9 track reel magnetic tape for $250. A license must be purchased first. For additional information and license forms contact : University of Lowell Graphics Research Laboratory/Motif Computer Science Department One University Avenue Lowell, MA 01854 attn : Fran Ward (phone 508-934-3628) Answer: WWL is a library which defines C++ classes around X Toolkit Widgets. It is intended to simplify the task of C++ code writers when using the Toolkit by providing them with C++ objects, methods, type checking and several utility functions and classes. WWL has been tested under SunOs4.0.3 on sun3 and sun4, HPUX version 6.5 and 7.0 and Ultrix 4.0 on DECstation 3100 and 5000. It is expected to work on most other UNIX systems without too many problems. WWL is distributed as a tar file with all the source, documentation and example. The file is available using anonymous ftp from expo.lcs.mit.edu (18.30.0.212 contrib/WWL-1.0.tar.Z lri.lri.fr (129.175.15.1) pub/WWL-1.0.tar.Z Subject: 34) Why does an augment translation appear to act as replace? When I use either augment or override translations in .Xdefaults it seems to act as replace in both Motif 1.0 and 1.1 Answer: By default, the translation table is NULL. If there is nothing specified (either in resource file, or in args), the widget's Initialize finds: Oh, there is NULL in translations, lets use our default ones. If, however, the translations have become non-NULL, the default translations are NOT used at all. Thus, using #augment, #override or a new table has identical effect: defines the new translations. The only way you can augment/override Motif's default translations is AFTER Initialize, using XtSetValues. Note, however, that Motif managers do play with translation tables as well ... so that results are not always easy to predict. Subject: 35)* What MIT patches do I use, and when do I use fix-osf? Answer: The Motif 1.1 tape contains MIT patches 1-14. Apply these and any others you can get. If your MIT patch level only goes up to fix-16, you also need to apply fix-osf. Fix-osf was an emergency patch for a problem that existed when the Motif 1.1 tape was cut, The MIT fix-17 completely superseded osf-fix, so if you have applied fix-17 do not apply fix-osf. Subject: 36) I tried to make shared libraries on a Sun, and got the message "ld.so: Undefined symbol: __XtInherit" when executing UIL. What did I do? Answer: There is a problem in shared library build when you compare a function variable to a routine name, but don't call the routine. Either, you can build the Xt library nonshared, or you can put a reference to XtToolkitInitialize in the UIL main program (or even include a module that references it). The routine doesn't even have to be called; it just has to be there. Subject: 37) How can I set a multiline label in .Xdefaults? Answer: *Label*labelString: Here0s0he2640abel Gives a four line label. Subject: 38)* How do you "grey" out a widget so that it cannot be activated? Answer: Use XtSetSensitive(widget, False). Do not set the XmNsensitive resource directly yourself (by XtSetvalues) since the widget may need to talk to parents first. Subject: 39)* What is causing the messages "unknown keysym osfDown..."? It happens when I run an application under Motif 1.1 Answer: You have to copy (or append) lib/Xm/XKeysymDB into /usr/lib/X11. The file is not copyrighted. It is not clear how to fix the problem if you can't do this. The error comes from Xt translation table parsing and can't be fixed in Motif. Subject: 40)+ Why doesn't the Help callback work on some widgets? 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. 13. Acknowledgements This list was compiled using questions and answers posed to comp.windows.x.motif. Some extracts were also taken from FAQs of comp.windows.x. To all who contributed one way or the other, thanks! I haven't given individual references, but you may recognise contributions. If I have mangled them too much, let me know. That's all folks! +----------------------+---+ 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 +--------------------------+ Local Variables: mode: outline outline-regexp: "Subject: [0-9]+)" eval: (hide-body) End:
jan@PANDONIA.CANBERRA.EDU.AU (Jan Newmarch) (03/20/91)
Newsgroups: comp.windows.x.motif Subject: Frequently Asked Questions about Motif Distribution: world Expires: Fri, 05 Apr 91 00:00:00 GMT [Last changed: 18 Mar 91] [Sorry this is running so late, but I've been away a lot recently. There are a number of things I wanted to put in, but they will have to wait till next month or this thing will never see the light of day! ] This article and one following contain the answers to some Frequently Asked Questions (FAQ) often seen in comp.windows.x.motif. It is posted to help reduce volume in this newsgroup and to provide hard-to-find information of general interest. Please redistribute this article! This article includes answers to the following questions. Ones marked with a + indicate questions new to this issue; those with changes of content since the last issue are marked by *: 0) What versions of Motif are there? 1) Where can I get Motif? 2) Where can I get public domain Motif source? 3) Has anyone done a public domain Motif lookalike? 4) Does anyone from OSF pay attention to our questions/suggestions? 5) Does OSF have an application compliance validation service? 6) What books should I read or do I need to program using Motif? 7) What is the diference between Motif and mwm? 8) Does anyone have an alternative set of 3-D defaults for a monochrome screen? 9) What prototyping tools are there to generate Motif code? 10) Why does pressing <return> in a text widget do nothing? 11) When I add text to a scrolling text widget how can I get the new text to show? 12) Does the text widget support 16 bit character fonts? 13) How can I stop the text widget from echoing characters typed? 14) How can I replace characters typed with say a `*'? 15) How can I best add a large piece of text to a scrolled list widget? 16) How do I best put a new set of items into a list? 17) Can I get a bitmap to show in a list item like I can in a Label? 18) What can I put inside a menu bar? 19) Can I have a cascade button without a submenu in a pulldown menu? 20) Should I have a cascade button without a submenu in a pulldown menu? 21) How can I direct the keyboard input to a particular widget? 22) How can I have a modal dialog which has to be answered before the application can continue? 23) Why does my application grow in size? 24) Why does my application take a long time to start up? 25) My application is running too slowly. How can I speed it up? 26) How can I get the Ascii text out of an XmString? 27) When can XmStrings used as resources be freed? 28) Why doesn't XmStringGetNextSegment() work properly? 29) How do I stop my dialog disappearing when I press the help button? 30) How do I make my own dialog? 31) What is libPW.a and do I need it? 32) How can tell I if the user has selected the "Close" item on the system menu attached to the top-level shell? 33) Is there a C++ binding for Motif? 34)+ Is there a Common Lisp binding for Motif? 35) Why does an augment translation appear to act as replace? 36)* What MIT patches do I use, and when do I use fix-osf? 37) I tried to make shared libraries on a Sun, and got the message "ld.so: Undefined symbol: __XtInherit" when executing UIL. What did I do? 38) How can I set a multiline label in .Xdefaults? 39) How do you "grey" out a widget so that it cannot be activated? 40) What is causing the messages "unknown keysym osfDown..."? 41) Why doesn't the Help callback work on some widgets? 42)+ What's wrong with the Motif 1.0 File Selection Box? 43)+ What is the motif-talk mailing list? If you have suggestions or corrections for any of these answers or any additional information, please send them directly to jan@ise.canberra.edu.au; the information will be included in the next revision (or possibly the one after that; thanks for the many suggestions which haven't been incorporated yet). The answers in this iteration are acknowledged to be partial. This posting is intended to be distributed at approximately the beginning of each month. The information contained herein has been gathered from a variety of sources. In many cases attribution has been lost; if you would like to claim responsibility for a particular item, please let us know. Conventions used below: telephone numbers tend to be Bell-system unless otherwise noted; prices on items are not included. 1. OSF and Motif ------------------------------------------------------------------------------- Subject: 0) What versions of Motif are there? Answer: Motif 1.0 is based on the R3 toolkit. There are patch releases to 1.0: 1.0.1, 1.0.A, 1.0.2 and 1.0.3. 1.0.A was a fairly major patch, as it involved a complete re-engineering of UIL and Mrm. Almost everyone who has 1.0.x has either 1.0.A or 1.0.3. Motif 1.1 is based on the R4 toolkit. The current version is Motif 1.1.0, plus a couple of patches available to full support contract holders. Motif 1.1.1 has been released as a patch to licensees with Full Support or Technical Update service. Motif 1.2 is not expected until after mid 1991, and will be based on the R5 toolkit. ------------------------------------------------------------------------------- Subject: 1) Where can I get Motif? Answer: [This tries to mirror FAQ of comp.windows.x Send changes to xug@expo.lcs.mit.edu] Various hardware vendors produce developer's toolkits of binaries, header files, and documentation; check your hardware vendor, particularly if that vendor is an OSF member. Systems known to be shipping now: HP (sans UIL), Apollo (sans UIL), SCO, ISC, Mips (RISCwindows=X11R3 + full Motif), IBM, Data General for AViioNs (includes UIL), Bull (?), Concurrent Computer Corporation 5000, 6000, 8000 series machines. In addition, independent binary vendors produce Motif toolkits . ICS makes several binary kits, notably for Sun, DEC, Apple; Quest (408-988-8880) sells kits for Suns, as well; IXI (+44 223 462 131) offers kits for Sun3 (SunOS 3.5 or later, and Sun4 (SunOS 4.0.1 or later). Unipalm XTech (+44 954211862; or Aurora Technologies 617-577-1288 in USA) offers a binary kit for Suns based on Motif 1.1, with shared libraries. NSL (+33 (1) 43 36 77 50; requests@nsl.fr) offers kits for the Sun 3 and Sun 4. The kits include varied levels of bug-fixing and support for shared libraries. BIM (Fax : +32(2)759.47.95) offer Motif 1.1 for Sun-3, Sun-4, Sun-386i. Includes shared libraries. Metrolink Inc. (+1-305-566-9586, sales@metrolink.com; in Europe contact ADNT, (33 1) 3956 5333) ships an implementation of X11R4 and Motif 1.1 for several 386 systems. An OSF/Motif source license must be obtained from OSF before source can be obtained from the Open Software Foundation. Call the Direct Channel Desk at OSF at 617-621-7300 or email direct@osf.org for ordering information. ------------------------------------------------------------------------------- Subject: 2) Where can I get public domain Motif source? Answer: You cannot. Motif source is not publically available. Subject: 3) Has anyone done a public domain Motif lookalike? Answer: Not yet. ------------------------------------------------------------------------------- Subject: 4) Does anyone from OSF pay attention to our questions/suggestions? Answer: Yes, and they quite often post answers too. But they may not respond to *your* problem because they have other things to do as well. This newsgroup is not run by OSF, and has no formal connection with OSF. OSF is a member-driven company. The membership (and anyone can be a member) provides the primary input for future development of Motif. ------------------------------------------------------------------------------- Subject: 5) Does OSF have an application compliance validation service? Answer: They have a checklist and a certification process which you can request from them. Ask for the Level One Certification Checklist. The process is one of self-certification. It tests only the appearance and behavior of the application against Motif style. The product will also be put in the OSF reference listing. There's a one-time fee of $250. According to the master license agreement, you can't use any OSF identifying mark unless you have done a certification. 2. Literature ------------------------------------------------------------------------------- Subject: 6) What books should I read or do I need to program using Motif? Answer: Ken Lee of the DEC Western Software Laboratory (klee@wsl.dec.com) regularly posts to comp.windows.x and ba.windows.x a list of reference books and articles on X and X programming. In FAQ comp.windows.x an extract of his list appears. Specifically for Motif programming, though: OSF/Motif Programmers Guide, Prentice-Hall 13-640525-8 (Motif 1.0) ISBN 0-13- 640681-5 (Motif 1.1) OSF/Motif Programmers Reference Manual, Prentice-Hall 13-640517-17 (Motif 1.0) ISBN 0-13-640616-5 (Motif 1.1) OSF/Motif Style Guide, Prentice-Hall 13-640491-X (Motif 1.0) ISBN 0-13-640673-4 (Motif 1.1) Young, Doug. "The X Window System: Applications and Programming with Xt (Motif Version)," Prentice Hall, 1989 (ISBN 0-13-497074-8). The excellent tutorial "X Window Systems Programming and Applications with Xt," (ISBN 0-13-972167-3) updated for Motif. [The examples from the Motif version are available on expo in ~ftp/contrib/young.motif.tar.Z] Marshall Brain at brain@adm.csc.ncsu.edu posted a set of simple and useful Motif tutorials. You will also need books and references on Xt such as: Asente, Paul J., and Swick, Ralph R., "X Window System Toolkit, The Complete Programmer's Guide and Specification", Digital Press, 1990. The bible on Xt. A treasury of information, excellent and invaluable. Distributed by Digital Press, ISBN 1-55558-051-3, order number EY-E757E-DP; and by Prentice- Hall, ISBN 0-13-972191-6. Nye, Adrian, and Tim O'Reilly, "X Toolkit Programming Manual, Volume 4," O'Reilly and Associates, 1989. The folks at O'Reilly give their comprehensive treatment to programming with the MIT X11R3 Intrinsics; some information on X11R4 is included. O'Reilly, Tim, ed., "X Toolkit Reference Manual, Volume 5," O'Reilly and Associates, 1989. A professional reference manual for the MIT X11R3 Xt; some information on X11R4 is included. Books and reference manuals on Xlib may also be useful. 3. Mwm ------------------------------------------------------------------------------- Subject: 7) What is the diference between Motif and mwm? Answer: mwm is a window manager. Motif itself is made up of four parts: a User- Interface Guideline, an API toolkit of `C' routines which helps in the building of applications which conform to the Guideline, the window manager mwm, and a language UIL which is designed to ease user interface development. In general mwm will run an application built with any X-windows API, and in general an application built using the Motif toolkit will run under any window manager. ------------------------------------------------------------------------------- Subject: 8) Does anyone have an alternative set of 3-D defaults for a monochrome screen? Answer: This is obviously a matter of taste. Some alternatives suggested include !Benjamin Schreiber, bs@osf.osf.org, bs@cs.brandeis.edu Mwm*foreground: black ! Actually, when a window is Mwm*background: white ! deactivated, the background Mwm*backgroundPixmap: 50_foreground ! becomes white, insted of Mwm*topShadowPixmap: white ! 50% foreground (grey) Mwm*activeForeground: black Mwm*activeBackground: white Mwm*activeBackgroundPixmap: 50_foreground Mwm*activeTopShadowPixmap: white Mwm*menu*backgroundPixmap: background Mwm*menu*topShadowPixmap: 50_foreground Mwm*title*foreground: black Mwm*title*background: white Mwm*title*backgroundPixmap: white Mwm*title*topShadowPixmap: 50_foreground Mwm*title*activeForeground: white Mwm*title*activeBackground: black Mwm*title*activeBackgroundPixmap: black Mwm*title*activeBottomShadowPixmap: 50_foreground Mwm*feedback*backgroundPixmap: white or ! From: tsang@isi.com (Kam C. Tsang) Mwm*background: White Mwm*activeBackground: White Mwm*activeBackgroundPixmap: 25_foreground Mwm*foreground: Black Mwm*activeForeground: Black Mwm*menu*background: white Mwm*menu*foreground: black xterm*Foreground: black xterm*Background: white or ! From: ucsd.edu!usc!snorkelwacker!paperboy!yee (Michael K. Yee) Mwm*cleanText: True Mwm*activeBackground: white Mwm*activeForeground: black Mwm*background: white Mwm*foreground: black Mwm*client*activeBackgroundPixmap: 50_foreground Mwm*client*activeTopShadowPixmap: foreground Mwm*client*activeBottomShadowPixmap: background !Mwm*client*background: white !Mwm*client*foreground: black Mwm*client*backgroundPixmap: 75_foreground Mwm*client*topShadowPixmap: foreground Mwm*client*bottomShadowPixmap: background !Mwm*feedback*background: white !Mwm*feedback*foreground: black Mwm*feedback*backgroundPixmap: 50_foreground !Mwm*feedback*topShadowPixmap: 25_foreground !Mwm*feedback*bottomShadowPixmap: background !Mwm*menu*background: white !Mwm*menu*foreground: black Mwm*menu*backgroundPixmap: foreground !Mwm*menu*topShadowPixmap: foreground !Mwm*menu*bottomShadowPixmap: background !Mwm*icon*background: white !Mwm*icon*foreground: black Mwm*icon*activeBackgroundPixmap: 50_foreground Mwm*icon*activeBottomShadowPixmap: foreground Mwm*icon*backgroundPixmap: 75_foreground 4. Motif generators ------------------------------------------------------------------------------- Subject: 9) What prototyping tools are there to generate Motif code? Answer: `Prototyping tools' come in two forms: those that can be used to design the interface only (Interactive Design Tools), and those that go beyond this to give support for application code (User Interface Management Systems). There are a number of commercial and non-commnercial tools of both kinds that will support the Motif interface. They include: IDTs: Builder Xcessory UIMX X Build ExoCODE/xm UIMS: WINTERP Widget Creation Library Serpent TeleUse Some contact addresses are: WINTERP: You may obtain the current source, documentation, and examples via anonymous ftp from host expo.lcs.mit.edu: in directory contrib/winterp you will find the compress(1)'d tar(1) file winterp.tar.Z. If you do not have Internet access you may request the source code to be mailed to you by sending a message to winterp-source%hplnpm@hplabs.hp.com or hplabs!hplnpm!winterp-source. Serpent: The S/W is free (anonymous ftp) from fg.sei.cmu.edu. For more info contact erik/robert at serpent-info@sei.cmu.edu. TeleUse: In the U.K., send mail to xtech@unipalm.co.uk or call +44 954 211862. In the US call Telesoft at (619) 457-2700 or write TeleSoft, 5959 Cornerstone Court West, San Diego, California 92121. Builder Xcessory from ICS. More details are available by sending a request to info@ics.com. 617.547.0510 X-Designer: From Imperial Software Technology in the UK. Email address is sales@ist.co.uk. (+44) 743 587055 ExoCODE/xm: From Expert Object Corp., 7250 Cicero Avenue, Lincolnwood, IL 60646 (708)676-5555. X Build: From Nixdorf Computer (Waltham, MA) xbuild@nixdorf.com ExoCode: From EXOC (Chicago, IL) UIMX: Visual Edge Software Limited, 3870 Cote Vertu, St Laurent, Quebec, H4R 1V4, Phone: (514) 332-6430, Fax: (514) 332-5914, or: Visual Edge Software Ltd., 101 First Street, Suite 443, Los Altos, CA 94022, Phone: (415) 948-0753, Fax: (415) 948-0843 The Widget Creation Library: The distribution is available in several ways. The preferred approach it for you to get the compressed tar file using anonymous ftp from either of these ftp servers: devvax.jpl.nasa.gov (128.149.1.143) pub/Wc1_03.tar.Z expo.lcs.mit.edu (18.30.0.212) /contrib/Wcl.1.05Wc1_05.tar.Z 5. Text widget ------------------------------------------------------------------------------- Subject: 10) Why does pressing <return> in a text widget do nothing? This happens using Motif 1.0 when I have a text widget inside a bulletin board (or form) inside a dialog shell. (In Motif 1.1 it is fixed for both text and list widgets.) Answer: In single line mode, pressing the <return> key usually invokes the Activate() action, and in multi-line mode, the newline() action. However, whenever a widget is the child of a bulletin board widget which is the child of a dialog shell, the bulletin board forces all of its children to translate <return> to the bulletin board action Return() which is usually associated with the default button of the dialog. To restore the text actions of Activate() or newline(), you need to overide the Return() action of the bulletin board. /* declarations */ /* for a single line widget */ char newTrans[] = "<Key>Return : Activate()"; /* for a multi line widget */ char newTrans[] = "<Key>Return : newline()"; XtTranslations transTable; /* in executable section */ transTable = XtParseTranslationTable(newTrans); /* after creating but before managing text widget */ XtOverrideTranslations(textWidget, transTable); Subject: 11) When I add text to a scrolling text widget how can I get the new text to show? Answer: Use the call undocumented in Motif 1.0 void XmTextShowPosition(w, position) Widget w; XmTextPosition position; where the position is the number of characters from the beginning of the buffer of the text to be displayed. If you don't know how many characters are in the buffer, use another call undocumented in Motif 1.0 position = XmTextGetLastPosition(w) ------------------------------------------------------------------------------- Subject: 12) Does the text widget support 16 bit character fonts? Answer: R5 will have support for 16 bit character sets, and Motif 1.2 will use that. You will have to wait until then. ------------------------------------------------------------------------------- Subject: 13) How can I stop the text widget from echoing characters typed? I need to turn off echo for password input. Answer: Use the modifyVerifyCallback to tell when input is received. Set the `doit' field in the XmTextVerifyCallbackStruct to False to stop the echo. In Motif 1.0 this will cause a beep per character: Live with it, because at 1.1 you can turn it off. Note that password hiding is inherently insecure in X - someone may have an X grab on the keyboard and be reading all characters typed in anyway. ------------------------------------------------------------------------------- Subject: 14) How can I replace characters typed with say a `*'? I want to replace input for password entry. Answer: In Motif 1.1 set text->ptr in the callback structure to '*'. This does not work under 1.0 because of an oversight in which changes to this are ignored. In Motif 1.0, what you can do is set the doit flag to 'false' so the text is not displayed. Then set a static boolean to True to prevent re-entrance. Next call XmTextReplace() to display your '*'. then reset your re-entrance flag to False. XmTextReplace() will call the XmNmodifyVerify callback. To prevent getting into an infinite loop, you need the re-entrance flag. ------------------------------------------------------------------------------- Subject: 15) How can I best add a large piece of text to a scrolled list widget? It insists on adding the text one line at a time, adjusting the scroll bar each time. It looks awful and is slow. Answer: Unmanage the widget, add the text and then manage it again. 6. Lists ------------------------------------------------------------------------------- Subject: 16) How do I best put a new set of items into a list? Answer: Set the new list count and list by XtSetArgs and install them by XtSetValues. XmString list[SIZE]; int list_size; XtSetArg (args[n], XmNitemCount, list_size); n++; XtSetArg (args[n], XmNitems, list); n++; XtSetValues (w, args, n); Each time the list is reset by this the old contents are freed by the widget and the new supplied list is copied. Do *not* free the old list of items yourself as this would result in the space being freed twice. It is not necessary to remove the items one at a time, nor to "zero" out the list first. ------------------------------------------------------------------------------- Subject: 17) Can I get a bitmap to show in a list item like I can in a Label? I want to place a bitmap along with some noraml text in my list items. Answer: No. The workaround is to define your font containing the icons you want. Then you can create a fontlist containing your icon font and the font you want the text in, and then make your items multi-segment XmStrings where the first segment contains the code of the icon you want with a charset that matches the icon font in your fontlist and the second segment with a charset matching the text font. 7. Menus ------------------------------------------------------------------------------- Subject: 18) What can I put inside a menu bar? Answer: You can only put cascade buttons in menu bars. No pushbuttons, toggle buttons or gadgets are allowed. When you create a pulldown menu with parent a menu bar, its real parent is a shell widget. ------------------------------------------------------------------------------- Subject: 19) Can I have a cascade button without a submenu in a pulldown menu? Answer: Yes you can. A cascade button has an activate callback which is called when you click on it and it doesn't have a submenu. It can have a mnemonic, but keyboard traversal using the arrow keys in the menu will skip over it. ------------------------------------------------------------------------------- Subject: 20) Should I have a cascade button without a submenu in a pulldown menu? Answer: No. This is forbidden by the style guide. Technically you can do it (see previous question) but if you do it will not be Motif style compliant. This is unlikely to change - if a "button" is important enough to be in a pulldown menu bar with no pulldown, it should be a button elsewhere. 8. Keyboard traversal ------------------------------------------------------------------------------- Subject: 21) How can I direct the keyboard input to a particular widget? Answer: In Motif 1.1 call XmProcessTraversal(target, XmTRAVERSE_CURRENT). In Motif 1.0 call the undocumented _XmGrabTheFocus(target). Do not use the X or Xt calls such as XtSetKeyboardFocus since this bypasses the Motif traversal layer and can cause it to get confused. This can lead to odd keyboard behaviour elsewhere in your application. ------------------------------------------------------------------------------- Subject: 22) How can I have a modal dialog which has to be answered before the application can continue? Answer: The answer depends on whether you are using the Motif window manager mwm or not. If you are, there is a simple solution. If not (or you don't know whether you are or not), you have to use a slightly harder method. Test for this by XmIsMotifWMRunning. The window manager mwm knows how to control event passing to dialog widgets declared as modal. If the dialog is set to application modal, then no interaction with the rest of the application can occur until the dialog is destroyed or unmanaged. This can be done through one of the callbacks of the dialog: block_dialog(parent) Widget parent; { Arg args[2]; XtSetArg(args[0], XmNmessageString, XmStringCreateLtoR("....", charset)); XtSetArg(args[1], XmNdialogStyle, XmDIALOG_APPLICATION_MODAL); dialog = XmCreateMessageDialog(parent, NULL, args, 2); XtAddCallback(dialog, XmNokCallback, responseCB, NULL); XtAddCallback(dialog, XmNcancelCallback, responseCB, NULL); XtAddCallback(dialog, XmNhelpCallback, responseCB, NULL); XtManageChild(dialog); } void responseCB(w, client_data, reason) Widget w; caddr_t client_data; XmAnyCallbackStruct *reason; { int why = reason->reason; XtUnmanageChild(w); /* if you won't use it again */ XtDestroyWidget(XtParent(w)); switch (why) { case XmCR_OK: /* process ok action */ break; case XmCR_CANCEL: /* process cancel action */ break; case XmCR_HELP: /* process help action */ break; } } Without using mwm, the basic version goes like this: You have to set an Xt grab to the dialog and run your own event processing loop. This loop finishes when the user invokes a callback from a button press. The boolean `keep_grab' is passed to the callback as client data which sets it to false when the callback is executed. Boolean keep_grab = True; XEvent event; Arg args[1]; XtSetArg(args[0], XmNmesssageString, ...); dialog = XmCreateMessageDialog(parent, NULL, args, 1); XtAddCallback(dialog, XmNokCallback, responseCB, &keep_grab); XtAddCallback(dialog, XmNcancelCallback, responseCB, &keep_grab); XtAddCallback(dialog, XmNhelpCallback, responseCB, &keep_grab); XtManageChild(dialog); XtAddGrab(XtParent(dialog), True, False); while (keep_grab || XtPending()) { XtNextEvent(&event); XtDispatchEvent(&event); } The "client_data" for the function (in each case) is &keep_grab. The function sets this to False and unmanages the dialog before continuing to process the callback. void responseCB(w, keep_grab, reason) Widget w; Boolean *keep_grab; XmAnyCallbackStruct *reason; { int why = reason->reason; *keep_grab = False; XtRemoveGrab(XtParent(w)); XtUnmanageChild(w); /* If you don't want to reuse it */ XtDestroyWidget(XtParent(w)); switch (why) { case XmCR_OK: /* process ok action */ break; case XmCR_CANCEL: /* process cancel action */ break; case XmCR_HELP: /* process help action */ break; } } ------------------------------------------------------------------------------- 9. Memory and Speed Subject: 23) Why does my application grow in size? Answer: Motif 1.0 has many memory leaks, particularly in XmString manipulation. Switch to Motif 1.1. Answer: The Intrinsics have a memory leak in accelerator table management, and Motif uses this heavily. Avoid this by mapping/unmapping widgets rather than creating/destroying them, or get X11R4 fix-15/16/17. Answer: The server may grow in size due to its own memory leaks. Switch to a later server. Answer: You are responsible for garbage collection in `C'. Some common cases where a piece of memory becomes garbage are a. Memory is allocated for a character string by Motif in XmStringGetLtoR(). After using the string, XtFree() it. b. If you have set the label in a label, pushbutton, etc widget, free it after calling XtSetValues() or the widget creation routine by XmStringFree(). c. If you have set text in a text widget, reclaim the string afterwards - the text widget makes its own copy. d. If you have set the strings in a list widget, reclaim the space. The list widget makes its own copy. ------------------------------------------------------------------------------- Subject: 24) Why does my application take a long time to start up? Answer: If you have a large .Xdefaults, time may be spent reading and parsing it. ------------------------------------------------------------------------------- Subject: 25) My application is running too slowly. How can I speed it up? Answer: Use the R4 rather than R3 server. It is much faster. Answer: The standard memory allocator is not well tuned to Motif, and can degrade performance. Use a better allocator. e.g. with SCO Unix, link with libmalloc.a; use the allocator from GNU emacs; use the allocator from Perl. Answer: Avoid lots of widget creation and destruction. It fragments memory and slows everything down. Popup/popdown, manage/unmanage instead. Answer: Get more memory - your application, the server and the Operating System may be spending a lot of time being swapped. Answer: If you are doing much XmString work yourself, such as heavy use of XmStringCompare, speed may deteriorate due to the large amount of internal conversions and malloc'ing. Try using XmStringByteCompare if appropriate or ordinary Ascii strings if you can. 10. XmString ------------------------------------------------------------------------------- Subject: 26) How can I get the Ascii text out of an XmString? Answer: To get the first line of text from a string created left-to-right char *str; XmString xmstr; /* stuff to create xmstr */ ... /* set str to point to the text */ XmStringGetLtoR(xmstr, XmSTRING_DEFAULT_CHARSET, &str); /* use the string */ ... /* and reclaim space */ XtFree(str); ------------------------------------------------------------------------------- Subject: 27) When can XmStrings used as resources be freed? Answer: The policy OSF have been trying to enforce is that if you set an XmString or XmStringTable resource, the application is responsible for freeing the XmStrings used because the widget makes a copy. If you get an XmString resource, then the application must free the value gotten. If you get an XmStringTable, then the application should NOT free the value gotten. If the application wants to manipulate it, it should make a copy first. This policy appears to be implemented progressively, so may be less true for Motif 1.0 than 1.1. ------------------------------------------------------------------------------- Subject: 28) Why doesn't XmStringGetNextSegment() work properly? Answer: The documentation in Motif 1.0 is in error. Instead of XmStringGetnextSegment(context, ...) XmStringContext * context; it should be XmStringGetnextSegment(context, ...) XmStringContext context; i.e. with no indirection. 11. Dialogs ------------------------------------------------------------------------------- Subject: 29) How do I stop my dialog disappearing when I press the help button? Answer: Bulletin board has the resource autoUnmanage which defaults to True. This unmanages the widget when any button child is activated - including the help button. Set this to False to stop it disappearing. Note that you then have to unmanage the bulletin board yourself when any other button is activated. ------------------------------------------------------------------------------- Subject: 30) How do I make my own dialog? I want a dialog with my own set of buttons that stretch and shrink like the ones in e.g. PromptDialog and its own contents. Answer: Start off with say a PromptDialog. Unmanage the buttons you don't want or manage the Apply button if you want another. Unmanage the other bits of the selection box you don't want. You can add another WorkArea child to the selection box for any extra stuff you want. /* Copyright 1990, Kee Hinckley and Brian Holt Hawthorne */ /* Permission granted for any use, provided this copyright */ /* notice is maintained. */ /* Create a dialog box */ argcount = setArgs(&args, XmNautoUnmanage, False, NULL); SomeDialog = XmCreatePromptDialog(mainShell, "someDialog", args, argcount); /* Now get rid of the things we don't want */ child = XmSelectionBoxGetChild(SomeDialog, XmDIALOG_SELECTION_LABEL); XtUnmanageChild(child); child = XmSelectionBoxGetChild(SomeDialog, XmDIALOG_TEXT); XtUnmanageChild(child); /* set the callbacks, and make sure the buttons we want are there */ child = XmSelectionBoxGetChild(SomeDialog, XmDIALOG_OK_BUTTON); XtAddCallback(child, XmNactivateCallback, callSomeFunc, someArg); XtAddCallback(child, XmNactivateCallback, unManage, SomeDialog); XtManageChild(child); child = XmSelectionBoxGetChild(SomeDialog, XmDIALOG_APPLY_BUTTON); XtAddCallback(child, XmNactivateCallback, callSomeFunc, someOtherArg); XtManageChild(child); child = XmSelectionBoxGetChild(SomeDialog, XmDIALOG_CANCEL_BUTTON); XtAddCallback(child, XmNactivateCallback, dialogUnmanage, SomeDialog); XtManageChild(child); /* Add a new work area. This can be any manager. */ child = XmCreateForm(SomeDialog, "someForm", NULL, 0); XtManageChild(child); /* and fill it up... */ something = doYourStuff(child); 12. Miscellaneous ------------------------------------------------------------------------------- Subject: 31) What is libPW.a and do I need it? My manual says I need to link in libPW.a to use the File Selection Box. I can't find it on my system. Answer: The libPW.a is the Programers Workbench library which is an ATT product not included in Berkeley based systems, hence it is not found in SunOS or Ultrix, but is found on HP-UX (a Berkeley/ATT hybrid which chose ATT in this case). It contains the regex(3) routines. Some systems which don't have these in the libc.a need to link with -lPW. Some systems which have the regex(3) routines in there also have the libPW.a. If you have regex(3) in libc, and it works, don't link with libPW. If you don't have regex(3) in libc, and you don't have a libPW, then check some sites on the net for public domain replacements (several exist), or call your vendor. ------------------------------------------------------------------------------- Subject: 32) How can tell I if the user has selected the "Close" item on the system menu attached to the top-level shell? I need to do some clean up before exiting. Answer: void FinalCleanupCB(w, client_data, call_data) Widget w; caddr_t client_data, call_data; { /* tidy up stuff here */ ... /* exit if you want to */ exit (0); } main() { Atom wm_delete_window; ... XtRealizeWidget(toplevel); ... wm_delete_window = XmInternAtom(XtDisplay(toplevel), "WM_DELETE_WINDOW", False); XmAddWMProtocolCallback(toplevel, wm_delete_window, FinalCleanupCB, NULL); XtMainLoop(); } ------------------------------------------------------------------------------- Subject: 33) Is there a C++ binding for Motif? Answer: The university of Lowell has a C++ binding. The software is available on any system running X11R3. Currently it is available for both the GNU's C++ compiler g++ v 1.37.1 and the AT&T C++ v 2.0 translator. The software is available through either ftp or a 9 track reel magnetic tape for $250. A license must be purchased first. For additional information and license forms contact : University of Lowell Graphics Research Laboratory/Motif Computer Science Department One University Avenue Lowell, MA 01854 attn : Fran Ward (phone 508-934-3628) Answer: WWL is a library which defines C++ classes around X Toolkit Widgets. It is intended to simplify the task of C++ code writers when using the Toolkit by providing them with C++ objects, methods, type checking and several utility functions and classes. WWL has been tested under SunOs4.0.3 on sun3 and sun4, HPUX version 6.5 and 7.0 and Ultrix 4.0 on DECstation 3100 and 5000. It is expected to work on most other UNIX systems without too many problems. WWL is distributed as a tar file with all the source, documentation and example. The file is available using anonymous ftp from expo.lcs.mit.edu (18.30.0.212 contrib/WWL-1.0.tar.Z lri.lri.fr (129.175.15.1) pub/WWL-1.0.tar.Z ------------------------------------------------------------------------------- Subject: 34)+ Is there a Common Lisp binding for Motif? Answer: Try CLM. This includes a toolkit demon (in C) that takes a widget description (with callbacks), and forks a new process for each Motif application (which can be just a single menu, or whatever). Lisp can then continue running, with a separate lightweight lisp process handling the connection & callbacks. In North America & net environs, CLM-2.0beta is available from expo.lcs.mit.edu. ------------------------------------------------------------------------------- Subject: 35) Why does an augment translation appear to act as replace? When I use either augment or override translations in .Xdefaults it seems to act as replace in both Motif 1.0 and 1.1 Answer: By default, the translation table is NULL. If there is nothing specified (either in resource file, or in args), the widget's Initialize finds: Oh, there is NULL in translations, lets use our default ones. If, however, the translations have become non-NULL, the default translations are NOT used at all. Thus, using #augment, #override or a new table has identical effect: defines the new translations. The only way you can augment/override Motif's default translations is AFTER Initialize, using XtSetValues. Note, however, that Motif managers do play with translation tables as well ... so that results are not always easy to predict. ------------------------------------------------------------------------------- Subject: 36)* What MIT patches do I use, and when do I use fix-osf? Answer: The Motif 1.1.0 tape contains MIT patches 1-14. Apply these and any others you can get. If your MIT patch level only goes up to fix-16, you also need to apply fix-osf. Fix-osf was an emergency patch for a problem that existed when the Motif 1.1 tape was cut, The MIT fix-17 completely superseded osf-fix, so if you have applied fix-17 do not apply fix-osf. The 1.1.1 tape contains MIT fixes 15-18, as well as an OSF-developed fix that deals with a subtle bug in the Selection mechanism of the Intrinsics. Most people will have fix-15 to 18 by now; if you don't have them: Back out fix-osf if you have applied it Apply fix-15 to 18 Apply fix-osf-1.1.1 The Selection fix was submitted to MIT, who came up with a diferent fix. It will not be made into an R4 fix but should be in R5. The MIT fix was posted to motif-talk. ------------------------------------------------------------------------------- Subject: 37) I tried to make shared libraries on a Sun, and got the message "ld.so: Undefined symbol: __XtInherit" when executing UIL. What did I do? Answer: There is a problem in shared library build when you compare a function variable to a routine name, but don't call the routine. Either, you can build the Xt library nonshared, or you can put a reference to XtToolkitInitialize in the UIL main program (or even include a module that references it). The routine doesn't even have to be called; it just has to be there. ------------------------------------------------------------------------------- Subject: 38) How can I set a multiline label in .Xdefaults? Answer: *Label*labelString: Here0s0he2640abel Gives a four line label, using the escape sequence \n for a newline. ---------- --------------------------------------------------------------------- Subject: 39) How do you "grey" out a widget so that it cannot be activated? Answer: Use XtSetSensitive(widget, False). Do not set the XmNsensitive resource directly yourself (by XtSetvalues) since the widget may need to talk to parents first. ------------------------------------------------------------------------------- Subject: 40) What is causing the messages "unknown keysym osfDown..."? It happens when I run an application under Motif 1.1 Answer: You have to copy (or append) lib/Xm/XKeysymDB into /usr/lib/X11. The file is not copyrighted. It is not clear how to fix the problem if you can't do this. The error comes from Xt translation table parsing and can't be fixed in Motif. ------------------------------------------------------------------------------- Subject: 41) Why doesn't the Help callback work on some widgets? 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. ------------------------------------------------------------------------------- Subject: 42)+ What's wrong with the Motif 1.0 File Selection Box? I can't set the directory, change the directory or get the file mask to work. Answer: The 1.0 File Selection Box is broken, and these don't work. They weren't fixed until Motif 1.04. Switch to Motif 1.1 where it changed a lot. ------------------------------------------------------------------------------- Subject: 43)+ What is the motif-talk mailing list? Answer: The motif-talk mailing list is only for those who have purchased a Motif source code license. You can be placed on this list by emailing to motif-talk- request. 13. Acknowledgements This list was compiled using questions and answers posed to comp.windows.x.motif. Some extracts were also taken from FAQs of comp.windows.x. To all who contributed one way or the other, thanks! I haven't given individual references, but you may recognise contributions. If I have mangled them too much, let me know. That's all folks! +----------------------+---+ 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 +--------------------------+ Local Variables: mode: outline outline-regexp: "Subject: +[0-9]+)" eval: (hide-body) End:
jan@PANDONIA.CANBERRA.EDU.AU (Jan Newmarch) (04/09/91)
Newsgroups: comp.windows.x.motif Subject: Frequently Asked Questions about Motif Distribution: world Expires: Fri, 03 May 91 00:00:00 GMT [Last changed: 09 Apr 91] This article and one following contain the answers to some Frequently Asked Questions (FAQ) often seen in comp.windows.x.motif. It is posted to help reduce volume in this newsgroup and to provide hard-to-find information of general interest. Please redistribute this article! This article includes answers to the following questions. Ones marked with a + indicate questions new to this issue; those with changes of content since the last issue are marked by *: 0)* What versions of Motif are there? 1) Where can I get Motif? 2) Where can I get public domain Motif source? 3)+ Are the Motif examples publically available? 4) Has anyone done a public domain Motif lookalike? 5) Does anyone from OSF pay attention to our questions/suggestions? 6) Does OSF have an application compliance validation service? 7) What is the motif-talk mailing list? 8) What MIT patches do I use, and when do I use fix-osf? 9)* What books should I read or do I need to program using Motif? 10) What is the diference between Motif and mwm? 11) Does anyone have an alternative set of 3-D defaults for a monochrome screen? 12) What prototyping tools are there to generate Motif code? 13) Why does pressing <return> in a text widget do nothing? 14) When I add text to a scrolling text widget how can I get the new text to show? 15) Does the text widget support 16 bit character fonts? 16) How can I stop the text widget from echoing characters typed? 17) How can I replace characters typed with say a `*'? 18) How can I best add a large piece of text to a scrolled list widget? 19) How do I best put a new set of items into a list? 20) Can I get a bitmap to show in a list item like I can in a Label? 21)+ Can I have items with different colours in a list? 22) What can I put inside a menu bar? 23) Can I have a cascade button without a submenu in a pulldown menu? 24) Should I have a cascade button without a submenu in a pulldown menu? 25)* How can I direct the keyboard input to a particular widget? 26) How can I have a modal dialog which has to be answered before the application can continue? 27) Why does my application grow in size? 28) Why does my application take a long time to start up? 29) My application is running too slowly. How can I speed it up? 30) How can I get the Ascii text out of an XmString? 31) When can XmStrings used as resources be freed? 32) Why doesn't XmStringGetNextSegment() work properly? 33) How do I stop my dialog disappearing when I press the help button? 34) How do I make my own dialog? 35) Is there a C++ binding for Motif? 36) Is there a Common Lisp binding for Motif? 37)+ Is there an Ada binding for Motif? 38) What is libPW.a and do I need it? 39)* How can tell I if the user has selected the "Close" item on the system menu attached to the top-level shell? 40)* Why does an augment translation appear to act as replace for some widgets? 41) I tried to make shared libraries on a Sun, and got the message "ld.so: Undefined symbol: __XtInherit" when executing UIL. What did I do? 42)+ Has anyone made shared libraries on an IBM RS/6000? 43) How can I set a multiline label in .Xdefaults? 44) How do you "grey" out a widget so that it cannot be activated? 45)* What is causing the messages "unknown keysym osfDown..."? 46) Why doesn't the Help callback work on some widgets? 47)* What's wrong with the Motif 1.0 File Selection Box? 48)+ Why can't I use accelerators on buttons not in a menu? 49)+ Why don't labels in a Form resize when the label is changed? 50)+ How come the title bars for my dialogs now have "_popup" or "<-popup" concatenated onto the widget name? 51)+ Has anyone done a bar graph widget? 52)+ Does anyone know of a source code of a graph widget If you have suggestions or corrections for any of these answers or any additional information, please send them directly to jan@ise.canberra.edu.au; the information will be included in the next revision (or possibly the one after that; thanks for the many suggestions which haven't been incorporated yet). The answers in this iteration are acknowledged to be partial. This posting is intended to be distributed at approximately the beginning of each month. The information contained herein has been gathered from a variety of sources. In many cases attribution has been lost; if you would like to claim responsibility for a particular item, please let us know. Conventions used below: telephone numbers tend to be Bell-system unless otherwise noted; prices on items are not included. 1. OSF and Motif ------------------------------------------------------------------------------- Subject: 0)* What versions of Motif are there? Answer: Motif 1.0 is based on the R3 toolkit. There are patch releases to 1.0: 1.0.1, 1.0.A, 1.0.2 and 1.0.3. 1.0.A was a fairly major patch, as it involved a complete re-engineering of UIL and Mrm. Almost everyone who has 1.0.x has either 1.0.A or 1.0.3. Motif 1.1 is based on the R4 toolkit. The current version is Motif 1.1.0, plus a couple of patches available to full support contract holders. Motif 1.1.1 has been released as a patch to licensees with Full Support or Technical Update service. Motif 1.1.2 is a patch release which contains the necessary changes to fix over 80 bugs reported against Motif. It will be available to support contract holders (including both full support and update service). Future 1.1 patch releases are tentatively scheduled as follows: 1.1.3 3rd quarter 1991 1.1.4 4th quarter 1991 1.1.5 1st half 1992 Motif 1.2 is not expected until after mid 1991, and will be based on the R5 toolkit. ------------------------------------------------------------------------------- Subject: 1) Where can I get Motif? Answer: [This tries to mirror FAQ of comp.windows.x Send changes to xug@expo.lcs.mit.edu] Various hardware vendors produce developer's toolkits of binaries, header files, and documentation; check your hardware vendor, particularly if that vendor is an OSF member. Systems known to be shipping now: HP (sans UIL), Apollo (sans UIL), SCO, ISC, Mips (RISCwindows=X11R3 + full Motif), IBM, Data General for AViioNs (includes UIL), Bull (?), Concurrent Computer Corporation 5000, 6000, 8000 series machines. In addition, independent binary vendors produce Motif toolkits . ICS makes several binary kits, notably for Sun, DEC, Apple; Quest (408-988-8880) sells kits for Suns, as well; IXI (+44 223 462 131) offers kits for Sun3 (SunOS 3.5 or later, and Sun4 (SunOS 4.0.1 or later). Unipalm XTech (+44 954211862; or Aurora Technologies 617-577-1288 in USA) offers a binary kit for Suns based on Motif 1.1, with shared libraries. NSL (+33 (1) 43 36 77 50; requests@nsl.fr) offers kits for the Sun 3 and Sun 4. The kits include varied levels of bug-fixing and support for shared libraries. BIM (Fax : +32(2)759.47.95) offer Motif 1.1 for Sun-3, Sun-4, Sun-386i. Includes shared libraries. Metrolink Inc. (+1-305-566-9586, sales@metrolink.com; in Europe contact ADNT, (33 1) 3956 5333) ships an implementation of X11R4 and Motif 1.1 for several 386 systems. An OSF/Motif source license must be obtained from OSF before source can be obtained from the Open Software Foundation. Call the Direct Channel Desk at OSF at 617-621-7300 or email direct@osf.org for ordering information. ------------------------------------------------------------------------------- Subject: 2) Where can I get public domain Motif source? Answer: You cannot. Motif source is not publically available. ------------------------------------------------------------------------------- Subject: 3)+ Are the Motif examples publically available? Answer: No. They are subject to the same licensing limitations as Motif source. ------------------------------------------------------------------------------- Subject: 4) Has anyone done a public domain Motif lookalike? Answer: Not yet. ------------------------------------------------------------------------------- Subject: 5) Does anyone from OSF pay attention to our questions/suggestions? Answer: Yes, and they quite often post answers too. But they may not respond to *your* problem because they have other things to do as well. This newsgroup is not run by OSF, and has no formal connection with OSF. OSF is a member-driven company. The membership (and anyone can be a member) provides the primary input for future development of Motif. ------------------------------------------------------------------------------- Subject: 6) Does OSF have an application compliance validation service? Answer: They have a checklist and a certification process which you can request from them. Ask for the Level One Certification Checklist. The process is one of self-certification. It tests only the appearance and behavior of the application against Motif style. The product will also be put in the OSF reference listing. There's a one-time fee of $250. According to the master license agreement, you can't use any OSF identifying mark unless you have done a certification. ------------------------------------------------------------------------------- Subject: 7) What is the motif-talk mailing list? Answer: The motif-talk mailing list is only for those who have purchased a Motif source code license. You can be placed on this list by emailing to motif-talk- request. ------------------------------------------------------------------------------- Subject: 8) What MIT patches do I use, and when do I use fix-osf? Answer: The Motif 1.1.0 tape contains MIT patches 1-14. Apply these and any others you can get. If your MIT patch level only goes up to fix-16, you also need to apply fix-osf. Fix-osf was an emergency patch for a problem that existed when the Motif 1.1 tape was cut, The MIT fix-17 completely superseded osf-fix, so if you have applied fix-17 do not apply fix-osf. The 1.1.1 tape contains MIT fixes 15-18, as well as an OSF-developed fix that deals with a subtle bug in the Selection mechanism of the Intrinsics. Most people will have fix-15 to 18 by now; if you don't have them: Back out fix-osf if you have applied it Apply fix-15 to 18 Apply fix-osf-1.1.1 The Selection fix was submitted to MIT, who came up with a diferent fix. It will not be made into an R4 fix but should be in R5. The MIT fix was posted to motif-talk. 2. Literature ------------------------------------------------------------------------------- Subject: 9)* What books should I read or do I need to program using Motif? Answer: Ken Lee of the DEC Western Software Laboratory (klee@wsl.dec.com) regularly posts to comp.windows.x and ba.windows.x a list of reference books and articles on X and X programming. In FAQ comp.windows.x an extract of his list appears. Specifically for Motif programming, though: OSF/Motif Programmers Guide, Prentice-Hall 13-640525-8 (Motif 1.0) ISBN 0-13- 640681-5 (Motif 1.1) (NB: This makes use of the demo programs that you get with a Motif source license. The programs are not included and may or may not be available on your system.) OSF/Motif Programmers Reference Manual, Prentice-Hall 13-640517-17 (Motif 1.0) ISBN 0-13-640616-5 (Motif 1.1) OSF/Motif Style Guide, Prentice-Hall 13-640491-X (Motif 1.0) ISBN 0-13-640673-4 (Motif 1.1) Young, Doug. "The X Window System: Applications and Programming with Xt (Motif Version)," Prentice Hall, 1989 (ISBN 0-13-497074-8). The excellent tutorial "X Window Systems Programming and Applications with Xt," (ISBN 0-13-972167-3) updated for Motif. [The examples from the Motif version are available on export in ~ftp/contrib/young.motif.tar.Z] Marshall Brain at brain@adm.csc.ncsu.edu posted a set of simple and useful Motif tutorials. You will also need books and references on Xt such as: Asente, Paul J., and Swick, Ralph R., "X Window System Toolkit, The Complete Programmer's Guide and Specification", Digital Press, 1990. The bible on Xt. A treasury of information, excellent and invaluable. Distributed by Digital Press, ISBN 1-55558-051-3, order number EY-E757E-DP; and by Prentice- Hall, ISBN 0-13-972191-6. Nye, Adrian, and Tim O'Reilly, "X Toolkit Programming Manual, Volume 4," O'Reilly and Associates, 1989. The folks at O'Reilly give their comprehensive treatment to programming with the MIT X11R3 Intrinsics; some information on X11R4 is included. O'Reilly, Tim, ed., "X Toolkit Reference Manual, Volume 5," O'Reilly and Associates, 1989. A professional reference manual for the MIT X11R3 Xt; some information on X11R4 is included. Books and reference manuals on Xlib may also be useful. 3. Mwm ------------------------------------------------------------------------------- Subject: 10) What is the diference between Motif and mwm? Answer: mwm is a window manager. Motif itself is made up of four parts: a User- Interface Guideline, an API toolkit of `C' routines which helps in the building of applications which conform to the Guideline, the window manager mwm, and a language UIL which is designed to ease user interface development. In general mwm will run an application built with any X-windows API, and in general an application built using the Motif toolkit will run under any window manager. ------------------------------------------------------------------------------- Subject: 11) Does anyone have an alternative set of 3-D defaults for a monochrome screen? Answer: This is obviously a matter of taste. Some alternatives suggested include !Benjamin Schreiber, bs@osf.osf.org, bs@cs.brandeis.edu Mwm*foreground: black ! Actually, when a window is Mwm*background: white ! deactivated, the background Mwm*backgroundPixmap: 50_foreground ! becomes white, insted of Mwm*topShadowPixmap: white ! 50% foreground (grey) Mwm*activeForeground: black Mwm*activeBackground: white Mwm*activeBackgroundPixmap: 50_foreground Mwm*activeTopShadowPixmap: white Mwm*menu*backgroundPixmap: background Mwm*menu*topShadowPixmap: 50_foreground Mwm*title*foreground: black Mwm*title*background: white Mwm*title*backgroundPixmap: white Mwm*title*topShadowPixmap: 50_foreground Mwm*title*activeForeground: white Mwm*title*activeBackground: black Mwm*title*activeBackgroundPixmap: black Mwm*title*activeBottomShadowPixmap: 50_foreground Mwm*feedback*backgroundPixmap: white or ! From: tsang@isi.com (Kam C. Tsang) Mwm*background: White Mwm*activeBackground: White Mwm*activeBackgroundPixmap: 25_foreground Mwm*foreground: Black Mwm*activeForeground: Black Mwm*menu*background: white Mwm*menu*foreground: black xterm*Foreground: black xterm*Background: white or ! From: ucsd.edu!usc!snorkelwacker!paperboy!yee (Michael K. Yee) Mwm*cleanText: True Mwm*activeBackground: white Mwm*activeForeground: black Mwm*background: white Mwm*foreground: black Mwm*client*activeBackgroundPixmap: 50_foreground Mwm*client*activeTopShadowPixmap: foreground Mwm*client*activeBottomShadowPixmap: background !Mwm*client*background: white !Mwm*client*foreground: black Mwm*client*backgroundPixmap: 75_foreground Mwm*client*topShadowPixmap: foreground Mwm*client*bottomShadowPixmap: background !Mwm*feedback*background: white !Mwm*feedback*foreground: black Mwm*feedback*backgroundPixmap: 50_foreground !Mwm*feedback*topShadowPixmap: 25_foreground !Mwm*feedback*bottomShadowPixmap: background !Mwm*menu*background: white !Mwm*menu*foreground: black Mwm*menu*backgroundPixmap: foreground !Mwm*menu*topShadowPixmap: foreground !Mwm*menu*bottomShadowPixmap: background !Mwm*icon*background: white !Mwm*icon*foreground: black Mwm*icon*activeBackgroundPixmap: 50_foreground Mwm*icon*activeBottomShadowPixmap: foreground Mwm*icon*backgroundPixmap: 75_foreground 4. Motif generators ------------------------------------------------------------------------------- Subject: 12) What prototyping tools are there to generate Motif code? Answer: `Prototyping tools' come in two forms: those that can be used to design the interface only (Interactive Design Tools), and those that go beyond this to give support for application code (User Interface Management Systems). There are a number of commercial and non-commnercial tools of both kinds that will support the Motif interface. They include: IDTs: Builder Xcessory UIMX X Build ExoCODE/xm UIMS: WINTERP Widget Creation Library Serpent TeleUse Some contact addresses are: WINTERP: You may obtain the current source, documentation, and examples via anonymous ftp from host export.lcs.mit.edu: in directory contrib/winterp you will find the compress(1)'d tar(1) file winterp.tar.Z. If you do not have Internet access you may request the source code to be mailed to you by sending a message to winterp-source%hplnpm@hplabs.hp.com or hplabs!hplnpm!winterp-source. Serpent: The S/W is free (anonymous ftp) from fg.sei.cmu.edu. For more info contact erik/robert at serpent-info@sei.cmu.edu. TeleUse: In the U.K., send mail to xtech@unipalm.co.uk or call +44 954 211862. In the US call Telesoft at (619) 457-2700 or write TeleSoft, 5959 Cornerstone Court West, San Diego, California 92121. Builder Xcessory from ICS. More details are available by sending a request to info@ics.com. 617.547.0510 X-Designer: From Imperial Software Technology in the UK. Email address is sales@ist.co.uk. (+44) 743 587055 ExoCODE/xm: From Expert Object Corp., 7250 Cicero Avenue, Lincolnwood, IL 60646 (708)676-5555. X Build: From Nixdorf Computer (Waltham, MA) xbuild@nixdorf.com ExoCode: From EXOC (Chicago, IL) UIMX: Visual Edge Software Limited, 3870 Cote Vertu, St Laurent, Quebec, H4R 1V4, Phone: (514) 332-6430, Fax: (514) 332-5914, or: Visual Edge Software Ltd., 101 First Street, Suite 443, Los Altos, CA 94022, Phone: (415) 948-0753, Fax: (415) 948-0843 The Widget Creation Library: The distribution is available in several ways. The preferred approach it for you to get the compressed tar file using anonymous ftp from either of these ftp servers: devvax.jpl.nasa.gov (128.149.1.143) pub/Wc1_03.tar.Z export.lcs.mit.edu (18.30.0.238) /contrib/Wcl.1.05Wc1_05.tar.Z 5. Text widget ------------------------------------------------------------------------------- Subject: 13) Why does pressing <return> in a text widget do nothing? This happens using Motif 1.0 when I have a text widget inside a bulletin board (or form) inside a dialog shell. (In Motif 1.1 it is fixed for both text and list widgets.) Answer: In single line mode, pressing the <return> key usually invokes the Activate() action, and in multi-line mode, the newline() action. However, whenever a widget is the child of a bulletin board widget which is the child of a dialog shell, the bulletin board forces all of its children to translate <return> to the bulletin board action Return() which is usually associated with the default button of the dialog. To restore the text actions of Activate() or newline(), you need to overide the Return() action of the bulletin board. /* declarations */ /* for a single line widget */ char newTrans[] = "<Key>Return : Activate()"; /* for a multi line widget */ char newTrans[] = "<Key>Return : newline()"; XtTranslations transTable; /* in executable section */ transTable = XtParseTranslationTable(newTrans); /* after creating but before managing text widget */ XtOverrideTranslations(textWidget, transTable); Subject: 14) When I add text to a scrolling text widget how can I get the new text to show? Answer: Use the call undocumented in Motif 1.0 void XmTextShowPosition(w, position) Widget w; XmTextPosition position; where the position is the number of characters from the beginning of the buffer of the text to be displayed. If you don't know how many characters are in the buffer, use another call undocumented in Motif 1.0 position = XmTextGetLastPosition(w) ------------------------------------------------------------------------------- Subject: 15) Does the text widget support 16 bit character fonts? Answer: R5 will have support for 16 bit character sets, and Motif 1.2 will use that. You will have to wait until then. ------------------------------------------------------------------------------- Subject: 16) How can I stop the text widget from echoing characters typed? I need to turn off echo for password input. Answer: Use the modifyVerifyCallback to tell when input is received. Set the `doit' field in the XmTextVerifyCallbackStruct to False to stop the echo. In Motif 1.0 this will cause a beep per character: Live with it, because at 1.1 you can turn it off. Note that password hiding is inherently insecure in X - someone may have an X grab on the keyboard and be reading all characters typed in anyway. ------------------------------------------------------------------------------- Subject: 17) How can I replace characters typed with say a `*'? I want to replace input for password entry. Answer: In Motif 1.1 set text->ptr in the callback structure to '*'. This does not work under 1.0 because of an oversight in which changes to this are ignored. In Motif 1.0, what you can do is set the doit flag to 'false' so the text is not displayed. Then set a static boolean to True to prevent re-entrance. Next call XmTextReplace() to display your '*'. then reset your re-entrance flag to False. XmTextReplace() will call the XmNmodifyVerify callback. To prevent getting into an infinite loop, you need the re-entrance flag. ------------------------------------------------------------------------------- Subject: 18) How can I best add a large piece of text to a scrolled list widget? It insists on adding the text one line at a time, adjusting the scroll bar each time. It looks awful and is slow. Answer: Unmanage the widget, add the text and then manage it again. 6. Lists ------------------------------------------------------------------------------- Subject: 19) How do I best put a new set of items into a list? Answer: Set the new list count and list by XtSetArgs and install them by XtSetValues. XmString list[SIZE]; int list_size; XtSetArg (args[n], XmNitemCount, list_size); n++; XtSetArg (args[n], XmNitems, list); n++; XtSetValues (w, args, n); Each time the list is reset by this the old contents are freed by the widget and the new supplied list is copied. Do *not* free the old list of items yourself as this would result in the space being freed twice. It is not necessary to remove the items one at a time, nor to "zero" out the list first. ------------------------------------------------------------------------------- Subject: 20) Can I get a bitmap to show in a list item like I can in a Label? I want to place a bitmap along with some normal text in my list items. Answer: No. The workaround is to define your font containing the icons you want. Then you can create a fontlist containing your icon font and the font you want the text in, and then make your items multi-segment XmStrings where the first segment contains the code of the icon you want with a charset that matches the icon font in your fontlist and the second segment with a charset matching the text font. ------------------------------------------------------------------------------- Subject: 21)+ Can I have items with different colours in a list? Answer: No. Since the items are XmStrings, you can already change the font of an item by replacing it with an item with the same text and a different charset tag. Adding support for color would require modification of the internal data structure in XmList as well as modification to the drawing routines. 7. Menus ------------------------------------------------------------------------------- Subject: 22) What can I put inside a menu bar? Answer: You can only put cascade buttons in menu bars. No pushbuttons, toggle buttons or gadgets are allowed. When you create a pulldown menu with parent a menu bar, its real parent is a shell widget. ------------------------------------------------------------------------------- Subject: 23) Can I have a cascade button without a submenu in a pulldown menu? Answer: Yes you can. A cascade button has an activate callback which is called when you click on it and it doesn't have a submenu. It can have a mnemonic, but keyboard traversal using the arrow keys in the menu will skip over it. ------------------------------------------------------------------------------- Subject: 24) Should I have a cascade button without a submenu in a pulldown menu? Answer: No. This is forbidden by the style guide. Technically you can do it (see previous question) but if you do it will not be Motif style compliant. This is unlikely to change - if a "button" is important enough to be in a pulldown menu bar with no pulldown, it should be a button elsewhere. 8. Keyboard traversal ------------------------------------------------------------------------------- Subject: 25)* How can I direct the keyboard input to a particular widget? Answer: In Motif 1.1 call XmProcessTraversal(target, XmTRAVERSE_CURRENT). The widget (and all of its ancestors) does need to be realized BEFORE you call this. Otherwise it has no effect. XmProcessTraversal is reported to have many bugs, so it may not work right. In Motif 1.0 call the undocumented _XmGrabTheFocus(target). Do not use the X or Xt calls such as XtSetKeyboardFocus since this bypasses the Motif traversal layer and can cause it to get confused. This can lead to odd keyboard behaviour elsewhere in your application. ------------------------------------------------------------------------------- Subject: 26) How can I have a modal dialog which has to be answered before the application can continue? Answer: The answer depends on whether you are using the Motif window manager mwm or not. If you are, there is a simple solution. If not (or you don't know whether you are or not), you have to use a slightly harder method. Test for this by XmIsMotifWMRunning. The window manager mwm knows how to control event passing to dialog widgets declared as modal. If the dialog is set to application modal, then no interaction with the rest of the application can occur until the dialog is destroyed or unmanaged. This can be done through one of the callbacks of the dialog: block_dialog(parent) Widget parent; { Arg args[2]; XtSetArg(args[0], XmNmessageString, XmStringCreateLtoR("....", charset)); XtSetArg(args[1], XmNdialogStyle, XmDIALOG_APPLICATION_MODAL); dialog = XmCreateMessageDialog(parent, NULL, args, 2); XtAddCallback(dialog, XmNokCallback, responseCB, NULL); XtAddCallback(dialog, XmNcancelCallback, responseCB, NULL); XtAddCallback(dialog, XmNhelpCallback, responseCB, NULL); XtManageChild(dialog); } void responseCB(w, client_data, reason) Widget w; caddr_t client_data; XmAnyCallbackStruct *reason; { int why = reason->reason; XtUnmanageChild(w); /* if you won't use it again */ XtDestroyWidget(XtParent(w)); switch (why) { case XmCR_OK: /* process ok action */ break; case XmCR_CANCEL: /* process cancel action */ break; case XmCR_HELP: /* process help action */ break; } } Without using mwm, the basic version goes like this: You have to set an Xt grab to the dialog and run your own event processing loop. This loop finishes when the user invokes a callback from a button press. The boolean `keep_grab' is passed to the callback as client data which sets it to false when the callback is executed. Boolean keep_grab = True; XEvent event; Arg args[1]; XtSetArg(args[0], XmNmesssageString, ...); dialog = XmCreateMessageDialog(parent, NULL, args, 1); XtAddCallback(dialog, XmNokCallback, responseCB, &keep_grab); XtAddCallback(dialog, XmNcancelCallback, responseCB, &keep_grab); XtAddCallback(dialog, XmNhelpCallback, responseCB, &keep_grab); XtManageChild(dialog); XtAddGrab(XtParent(dialog), True, False); while (keep_grab || XtPending()) { XtNextEvent(&event); XtDispatchEvent(&event); } The "client_data" for the function (in each case) is &keep_grab. The function sets this to False and unmanages the dialog before continuing to process the callback. void responseCB(w, keep_grab, reason) Widget w; Boolean *keep_grab; XmAnyCallbackStruct *reason; { int why = reason->reason; *keep_grab = False; XtRemoveGrab(XtParent(w)); XtUnmanageChild(w); /* If you don't want to reuse it */ XtDestroyWidget(XtParent(w)); switch (why) { case XmCR_OK: /* process ok action */ break; case XmCR_CANCEL: /* process cancel action */ break; case XmCR_HELP: /* process help action */ break; } } ------------------------------------------------------------------------------- 9. Memory and Speed Subject: 27) Why does my application grow in size? Answer: Motif 1.0 has many memory leaks, particularly in XmString manipulation. Switch to Motif 1.1. Answer: The Intrinsics have a memory leak in accelerator table management, and Motif uses this heavily. Avoid this by mapping/unmapping widgets rather than creating/destroying them, or get X11R4 fix-15/16/17. Answer: The server may grow in size due to its own memory leaks. Switch to a later server. Answer: You are responsible for garbage collection in `C'. Some common cases where a piece of memory becomes garbage are a. Memory is allocated for a character string by Motif in XmStringGetLtoR(). After using the string, XtFree() it. b. If you have set the label in a label, pushbutton, etc widget, free it after calling XtSetValues() or the widget creation routine by XmStringFree(). c. If you have set text in a text widget, reclaim the string afterwards - the text widget makes its own copy. d. If you have set the strings in a list widget, reclaim the space. The list widget makes its own copy. ------------------------------------------------------------------------------- Subject: 28) Why does my application take a long time to start up? Answer: If you have a large .Xdefaults, time may be spent reading and parsing it. ------------------------------------------------------------------------------- Subject: 29) My application is running too slowly. How can I speed it up? Answer: Use the R4 rather than R3 server. It is much faster. Answer: The standard memory allocator is not well tuned to Motif, and can degrade performance. Use a better allocator. e.g. with SCO Unix, link with libmalloc.a; use the allocator from GNU emacs; use the allocator from Perl. Answer: Avoid lots of widget creation and destruction. It fragments memory and slows everything down. Popup/popdown, manage/unmanage instead. Answer: Set mappedWhenManaged to FALSE, and then call XtMapWidget() XtUnmapWidget() rather than managing. Answer: Get more memory - your application, the server and the Operating System may be spending a lot of time being swapped. Answer: If you are doing much XmString work yourself, such as heavy use of XmStringCompare, speed may deteriorate due to the large amount of internal conversions and malloc'ing. Try using XmStringByteCompare if appropriate or ordinary Ascii strings if you can. 10. XmString ------------------------------------------------------------------------------- Subject: 30) How can I get the Ascii text out of an XmString? Answer: To get the first line of text from a string created left-to-right char *str; XmString xmstr; /* stuff to create xmstr */ ... /* set str to point to the text */ XmStringGetLtoR(xmstr, XmSTRING_DEFAULT_CHARSET, &str); /* use the string */ ... /* and reclaim space */ XtFree(str); ------------------------------------------------------------------------------- Subject: 31) When can XmStrings used as resources be freed? Answer: The policy OSF have been trying to enforce is that if you set an XmString or XmStringTable resource, the application is responsible for freeing the XmStrings used because the widget makes a copy. If you get an XmString resource, then the application must free the value gotten. If you get an XmStringTable, then the application should NOT free the value gotten. If the application wants to manipulate it, it should make a copy first. This policy appears to be implemented progressively, so may be less true for Motif 1.0 than 1.1. ------------------------------------------------------------------------------- Subject: 32) Why doesn't XmStringGetNextSegment() work properly? Answer: The documentation in Motif 1.0 is in error. Instead of XmStringGetnextSegment(context, ...) XmStringContext * context; it should be XmStringGetnextSegment(context, ...) XmStringContext context; i.e. with no indirection. 11. Dialogs ------------------------------------------------------------------------------- Subject: 33) How do I stop my dialog disappearing when I press the help button? Answer: Bulletin board has the resource autoUnmanage which defaults to True. This unmanages the widget when any button child is activated - including the help button. Set this to False to stop it disappearing. Note that you then have to unmanage the bulletin board yourself when any other button is activated. ------------------------------------------------------------------------------- Subject: 34) How do I make my own dialog? I want a dialog with my own set of buttons that stretch and shrink like the ones in e.g. PromptDialog and its own contents. Answer: Start off with say a PromptDialog. Unmanage the buttons you don't want or manage the Apply button if you want another. Unmanage the other bits of the selection box you don't want. You can add another WorkArea child to the selection box for any extra stuff you want. /* Copyright 1990, Kee Hinckley and Brian Holt Hawthorne */ /* Permission granted for any use, provided this copyright */ /* notice is maintained. */ /* Create a dialog box */ argcount = setArgs(&args, XmNautoUnmanage, False, NULL); SomeDialog = XmCreatePromptDialog(mainShell, "someDialog", args, argcount); /* Now get rid of the things we don't want */ child = XmSelectionBoxGetChild(SomeDialog, XmDIALOG_SELECTION_LABEL); XtUnmanageChild(child); child = XmSelectionBoxGetChild(SomeDialog, XmDIALOG_TEXT); XtUnmanageChild(child); /* set the callbacks, and make sure the buttons we want are there */ child = XmSelectionBoxGetChild(SomeDialog, XmDIALOG_OK_BUTTON); XtAddCallback(child, XmNactivateCallback, callSomeFunc, someArg); XtAddCallback(child, XmNactivateCallback, unManage, SomeDialog); XtManageChild(child); child = XmSelectionBoxGetChild(SomeDialog, XmDIALOG_APPLY_BUTTON); XtAddCallback(child, XmNactivateCallback, callSomeFunc, someOtherArg); XtManageChild(child); child = XmSelectionBoxGetChild(SomeDialog, XmDIALOG_CANCEL_BUTTON); XtAddCallback(child, XmNactivateCallback, dialogUnmanage, SomeDialog); XtManageChild(child); /* Add a new work area. This can be any manager. */ child = XmCreateForm(SomeDialog, "someForm", NULL, 0); XtManageChild(child); /* and fill it up... */ something = doYourStuff(child); 12. Language bindings ------------------------------------------------------------------------------- Subject: 35) Is there a C++ binding for Motif? Answer: The university of Lowell has a C++ binding. The software is available on any system running X11R3. Currently it is available for both the GNU's C++ compiler g++ v 1.37.1 and the AT&T C++ v 2.0 translator. The software is available through either ftp or a 9 track reel magnetic tape for $250. A license must be purchased first. For additional information and license forms contact : University of Lowell Graphics Research Laboratory/Motif Computer Science Department One University Avenue Lowell, MA 01854 attn : Fran Ward (phone 508-934-3628) Answer: WWL is a library which defines C++ classes around X Toolkit Widgets. It is intended to simplify the task of C++ code writers when using the Toolkit by providing them with C++ objects, methods, type checking and several utility functions and classes. WWL has been tested under SunOs4.0.3 on sun3 and sun4, HPUX version 6.5 and 7.0 and Ultrix 4.0 on DECstation 3100 and 5000. It is expected to work on most other UNIX systems without too many problems. WWL is distributed as a tar file with all the source, documentation and example. The file is available using anonymous ftp from export.lcs.mit.edu (18.30.0.238 contrib/WWL-1.0.tar.Z lri.lri.fr (129.175.15.1) pub/WWL-1.0.tar.Z ------------------------------------------------------------------------------- Subject: 36) Is there a Common Lisp binding for Motif? Answer: Try CLM. This includes a toolkit demon (in C) that takes a widget description (with callbacks), and forks a new process for each Motif application (which can be just a single menu, or whatever). Lisp can then continue running, with a separate lightweight lisp process handling the connection & callbacks. In North America & net environs, CLM-2.0beta is available from export.lcs.mit.edu. ------------------------------------------------------------------------------- Subject: 37)+ Is there an Ada binding for Motif? Answer: The situation is not good at the moment. From Todd W. Lainhart: Take a look at THINGS, a VAPI with Ada bindings that was written by the US Air Force (SAC). It's in the public domain, and available from export or gatekeeper.dec.com. It implements Motif or OL look-and-feel. [I had a look and it seemed to be missing documentation - Jan] From David Lewis: A company called Rational appears to be making an Xm implementation. Also GHG in Texas has most other Xlib and Xt bindings for Ada. 13. Miscellaneous ------------------------------------------------------------------------------- Subject: 38) What is libPW.a and do I need it? My manual says I need to link in libPW.a to use the File Selection Box. I can't find it on my system. Answer: The libPW.a is the Programers Workbench library which is an ATT product not included in Berkeley based systems, hence it is not found in SunOS or Ultrix, but is found on HP-UX (a Berkeley/ATT hybrid which chose ATT in this case). It contains the regex(3) routines. Some systems which don't have these in the libc.a need to link with -lPW. Some systems which have the regex(3) routines in there also have the libPW.a. If you have regex(3) in libc, and it works, don't link with libPW. If you don't have regex(3) in libc, and you don't have a libPW, then check some sites on the net for public domain replacements (several exist), or call your vendor. ------------------------------------------------------------------------------- Subject: 39)* How can tell I if the user has selected the "Close" item on the system menu attached to the top-level shell? I need to do some clean up before exiting. Answer: void FinalCleanupCB(w, client_data, call_data) Widget w; caddr_t client_data, call_data; { /* tidy up stuff here */ ... /* exit if you want to */ exit (0); } main() { Atom wm_delete_window; ... XtRealizeWidget(toplevel); ... wm_delete_window = XmInternAtom(XtDisplay(toplevel), "WM_DELETE_WINDOW", False); XmAddWMProtocolCallback(toplevel, wm_delete_window, FinalCleanupCB, NULL); XtMainLoop(); } To just turn the close option off, set the shell resource XmNdeleteResponse to XmDO_NOTHING. This means that users cannot kill your application via the system menu, and may be a bad thing. ------------------------------------------------------------------------------- Subject: 40)* Why does an augment translation appear to act as replace for some widgets? When I use either augment or override translations in .Xdefaults it seems to act as replace in both Motif 1.0 and 1.1 Answer: By default, the translation table is NULL. If there is nothing specified (either in resource file, or in args), the widget's Initialize finds: Oh, there is NULL in translations, lets use our default ones. If, however, the translations have become non-NULL, the default translations are NOT used at all. Thus, using #augment, #override or a new table has identical effect: defines the new translations. The only way you can augment/override Motif's default translations is AFTER Initialize, using XtSetValues. Note, however, that Motif managers do play with translation tables as well ... so that results are not always easy to predict. From OSF: A number of people have complained about not being able to augment/override translations from the .Xdefaults. This is due to the complexity of the menu system/keyboard traversal and the necessary translations changes required to support the Motif Style Guide in menus. It cannot be fixed in a simple way. Fixing it requires re-design of the menus/buttons and it is planned to be fixed in 1.2. ------------------------------------------------------------------------------- Subject: 41) I tried to make shared libraries on a Sun, and got the message "ld.so: Undefined symbol: __XtInherit" when executing UIL. What did I do? Answer: There is a problem in shared library build when you compare a function variable to a routine name, but don't call the routine. Either, you can build the Xt library nonshared, or you can put a reference to XtToolkitInitialize in the UIL main program (or even include a module that references it). The routine doesn't even have to be called; it just has to be there. ------------------------------------------------------------------------------- Subject: 42)+ Has anyone made shared libraries on an IBM RS/6000? Answer: From Sakari Jalovaara: There is a problem: Xm redefines VendorShell and the AIX linker put _both_ Xm's and Xt's VendorShell into programs. When an AIX shared library is created as many references inside the library are resolved as possible. If the symbol vendorShellClassRec is defined in libXt and referenced, say, from a function XtFoo() also in libXt, the "ld" run that creates the shared library resolves the reference: XtFoo() -> vendorShellClassRec Then I create the Motif library that has its own vendorShellClassRec and an XmBar() function that uses it; libXm will also contain a resolved reference to vendorShellClassRec: XmBar() -> vendorShellClassRec Finally, I link a program that uses both XtFoo() and XmBar() and the program will end up with _two_ independent "vendorShellClassRec"s: XtFoo() -> vendorShellClassRec [Xt version] XmBar() -> vendorShellClassRec [Xm version] Instand schizo zaphod mode. In reality, vendorShellClassRec is not referenced from functions but from other widget class records. I can't just pull Vendor.o out from the shared Xt (Vendor.o appears to define the only external symbols redefined by libXm) because AIX shared libraries apparently can't contain unresolved external references. If I take out Vendor.o I have to take out every other file that uses symbols defined there - and then files that need those files, etc. I tried it and ended up with three or four object files in libXt and the res non-sharable. I kludged around this by putting all of libXt (minus Vendor.o) into the shared libXm. It isn't a pretty solution but it works - and beats having a statically linked two-megabyte "periodic" demo... ------------------------------------------------------------------------------- Subject: 43) How can I set a multiline label in .Xdefaults? Answer: *Label*labelString: Here\nis\nthe\nLabel Gives a four line label, using the escape sequence \n for a newline. ---------- --------------------------------------------------------------------- Subject: 44) How do you "grey" out a widget so that it cannot be activated? Answer: Use XtSetSensitive(widget, False). Do not set the XmNsensitive resource directly yourself (by XtSetvalues) since the widget may need to talk to parents first. ------------------------------------------------------------------------------- Subject: 45)* What is causing the messages "unknown keysym osfDown..."? It happens when I run an application under Motif 1.1 Answer: There is an OSF supplied addition to the /usr/lib/X11/XKeysymDB file. It is found on the release tape and should have been automatically installed if the installation procedure was followed in the Release Notes. You have to copy (or append) lib/Xm/XKeysymDB into /usr/lib/X11. This may require root permission. It is not clear how to fix the problem if you can't do this. The error comes from Xt translation table parsing and can't be fixed in Motif, so if you can't get root permission you may be stuck. The file is not copyrighted so you can install it on other systems. ------------------------------------------------------------------------------- Subject: 46) Why doesn't the Help callback work on some widgets? 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. ------------------------------------------------------------------------------- Subject: 47)* What's wrong with the Motif 1.0 File Selection Box? I can't set the directory, change the directory or get the file mask to work. Answer: The 1.0 File Selection Box is broken, and these don't work. They weren't fixed until Motif 1.04. Use these later versions of 1.0 or switch to Motif 1.1 where it changed a lot. Joe Hildebrand has a work-around for some of this: Before popping up an XmFileSelectionDialog, change to the directory you want. When a file is selected, check if it is a directory, so that we can change to it. i.e. static void show_file_box_CB(w, client_data, call_data) Widget w; Widget client_data; XmAnyCallbackStruct *call_data; { chdir("/users/hildjj/files"); XtManageChild(client_data); } static void val_save(w, client_data, call_data) Widget w; Widget client_data; XmSelectionBoxCallbackStruct *call_data; { struct stat buf; /* struct stat is defined in stat.h */ char *filename; /* get the file name from the FileSelectionBox */ filename = SmX(call_data->value); /* get the status of the file named filename, and put it into buf */ if (!stat(filename, &buf)) { /* if it's a directory */ /* if it's a directory */ if(S_ISDIR(buf.st_mode)) { /* change to that directory, and update the FileSelectionBox */ chdir(filename); XmFileSelectionDoSearch(w, NULL); } else /* if it's a regualr file */ if(S_ISREG(buf.st_mode)) /* ask if it should be overwritten */ XtManageChild(valbox); else /* it's another kind of file. What type, i can't think of, but it might happen */ pop_up_error_box(client_data, "Error saving file"); } else /* we couldn't get the file status */ { /* if it's because the file doesn't exist, we're golden */ if (errno == ENOENT) save_file(); else /* there is some other problem getting the status. e.g. bad path */ pop_up_error_box(client_data, "Error saving file"); } } this still doesn't implement the file masking stuff. ------------------------------------------------------------------------------- Subject: 48)+ Why can't I use accelerators on buttons not in a menu? Answer: It is apparently a difficult feature to implement, but OSF are considering this for the future. It is problematic trying to use the Xt accelerators since the Motif method interferes with this. The workaround suggested so far is to duplicate your non-menu button by a button in a menu somewhere, which does have a menu-accelerator installed. When the user invokes what they think is the accelerator for the button they can see Motif actually invokes the button on the menu that they can't see at the time. ------------------------------------------------------------------------------- Subject: 49)+ Why don't labels in a Form resize when the label is changed? I've got some labels in a form. The labels don't resize whenever the label string resource is changed. As a result, the operator has to resize the window to see the new label contents. I am using Motif 1.1. Answer: This problem may happen to any widget inside a Form widget. The problem was that the Form will resize itself when it gets geometry requests from its children. If its preferred size is not allowed, the Form will disallow all geometry requests from its children. The workaround is that you should set any ancestor of the Form to be resizable. For the shell which contains the Form you should set the shell resource XmNallowShellResize to be True (by default, it is set to FALSE). There is currently an inconsistency on how resizing is being done, and it may get fixed in Motif 1.2. ------------------------------------------------------------------------------- Subject: 50)+ How come the title bars for my dialogs now have "_popup" or "<- popup" concatenated onto the widget name? Answer: Motif 1.0.3 (?) "fixed" things such that title bars without an explicit dialogTitle setting use the widget name with "_popup" or whatever added on. Set the dialogTitle resource explicitly if you don't want this new default naming scheme. ------------------------------------------------------------------------------- Subject: 51)+ Has anyone done a bar graph widget? Answer: You can fake one by using for each bar a scroll bar or even a label which changes in size, put inside a container of some kind. Try the StripChart widget in the Athena widget set. Set the XtNupdate resource to 0 to keep it from automatically updating. ------------------------------------------------------------------------------- Subject: 52)+ Does anyone know of a source code of a graph widget where you can add vertices and edges and get an automated updating? Answer: No Motif one has been reported. The XUG FAQ in comp.windows.x includes information on graph display widgets. There is also an implementation in the Asente/Swick book. From Martin Janzen: Well, it's not a widget set, but have you looked at DataViews? This package lets you create a wide variety of graphs, which can display information received from data sources such as files, processes (through pipes), or devices. The graphs can be made to change in real time as new data arrives. There's also a function library which lets you work with graphs under program control. X drivers are included. From Craig Timmerman: Just wanted others to know that there is a third competitor in what may be come a big market for generic APIs. The product is called Open Interface and Neuron Data is the vendor. Neuron has added some extra, more complex widgets to their set. The two most notable are a table and network widget. [...] I believe that the network widget got its name from its ability to display expert system networks that Neuron's AI tools needed. It would be more aptly named the graph widget. It can display and manipulate graphs of various types (trees, directed graphs, etc). Contact is Neuron Data 156 University Avenue Palo Alto, CA 94301 (415) 321-4488 14. Acknowledgements This list was compiled using questions and answers posed to comp.windows.x.motif. Some extracts were also taken from FAQs of comp.windows.x. To all who contributed one way or the other, thanks! I haven't given individual references, but you may recognise contributions. If I have mangled them too much, let me know. That's all folks! +----------------------+---+ 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 +--------------------------+ Local Variables: mode: outline outline-regexp: "Subject: +[0-9]+)" eval: (hide-body) End:
jan@PANDONIA.CANBERRA.EDU.AU (Jan Newmarch) (06/08/91)
Newsgroups: comp.windows.x.motif Subject: Frequently Asked Questions about Motif Distribution: world Expires: Fri, 05 Jul 91 00:00:00 GMT [Last changed: 07 Jun 91] This article contain the answers to some Frequently Asked Questions (FAQ) often seen in comp.windows.x.motif. It is posted to help reduce volume in this newsgroup and to provide hard-to-find information of general interest. Please redistribute this article! This article includes answers to the following questions. Ones marked with a + indicate questions new to this issue; those with changes of content since the last issue are marked by *: 0)+ TOPIC: WHAT ARE OTHER RELEVANT NEWSGROUPS? 1) TOPIC: FTP ARCHIVES 2)+ Is the FAQ list available for FTP anywhere? 3)+ Is this newsgroup archived? 4)+ Is the mail list motif-talk archived? 5) TOPIC: OSF AND MOTIF 6)* What versions of Motif are there? 7)* Where can I get Motif? 8) Where can I get public domain Motif source? 9)* Are the Motif examples publically available? 10)* Has anyone done a public domain Motif lookalike? 11) Does anyone from OSF pay attention to our questions/suggestions? 12) Does OSF have an application compliance validation service? 13)* What is the motif-talk mailing list? 14) What MIT patches do I use, and when do I use fix-osf? 15) TOPIC: LITERATURE 16)* What books should I read or do I need to program using Motif? 17) TOPIC: MWM 18) What is the diference between Motif and mwm? 19) Does anyone have an alternative set of 3-D defaults for a monochrome screen? 20) TOPIC: MOTIF GENERATORS 21)* What prototyping tools are there to generate Motif code? 22) TOPIC: TEXT WIDGET 23)* Why does pressing <return> in a text widget do nothing? 24) When I add text to a scrolling text widget how can I get the new text to show? 25) Does the text widget support 16 bit character fonts? 26) How can I stop the text widget from echoing characters typed? 27) How can I replace characters typed with say a `*'? 28) How can I best add a large piece of text to a scrolled list widget? 29)+ How can I highlight text in the Text widget? 30)+ How can I change colours of text in the Text widget? 31)+ How can I change the font of text in the Text widget? 32)+ Is there an emacs binding for the text widget? 33) TOPIC: LIST WIDGET 34) How do I best put a new set of items into a list? 35) Can I get a bitmap to show in a list item like I can in a Label? 36) Can I have items with different colours in a list? 37)+ Can I grey out an item in a list? 38) TOPIC: FILE SELECTION BOX WIDGET 39) What is libPW.a and do I need it? 40) What's wrong with the Motif 1.0 File Selection Box? 41) TOPIC: FORM WIDGET 42) Why don't labels in a Form resize when the label is changed? 43) TOPIC: PUSHBUTTON WIDGET 44) Why can't I use accelerators on buttons not in a menu? 45) TOPIC: LABEL WIDGET 46)+ How can I align the text in a label widget? 47) How can I set a multiline label in .Xdefaults? 48) TOPIC: DRAWING AREA WIDGET 49)+ How can I send an expose event to a Drawing Area widget? 50) TOPIC: MENUS 51) What can I put inside a menu bar? 52) Can I have a cascade button without a submenu in a pulldown menu? 53)* Should I have a cascade button without a submenu in a pulldown menu? 54) TOPIC: INPUT FOCUS 55) How can I direct the keyboard input to a particular widget? 56) How can I have a modal dialog which has to be answered before the application can continue? 57) TOPIC: MEMORY AND SPEED 58) Why does my application grow in size? 59) Why does my application take a long time to start up? 60) My application is running too slowly. How can I speed it up? 61) TOPIC: XMSTRING 62) How can I get the Ascii text out of an XmString? 63) When can XmStrings used as resources be freed? 64) Why doesn't XmStringGetNextSegment() work properly? 65) TOPIC: DIALOGS 66) How do I stop my dialog disappearing when I press the help button? 67) How do I make my own dialog? 68) How come the title bars for my dialogs now have "_popup" or "<-popup" concatenated onto the widget name? 69) TOPIC: LANGUAGE BINDINGS 70)* Is there a C++ binding for Motif? 71) Is there a Common Lisp binding for Motif? 72)* Is there an Ada binding for Motif? 73) TOPIC: SPECIFIC PLATFORMS 74) Is it easy to build Motif for a Sun? 75) I tried to make shared libraries on a Sun, and got the message "ld.so: Undefined symbol: __XtInherit" when executing UIL. What did I do? 76) Has anyone made shared libraries on an IBM RS/6000? 77) TOPIC: KEYSYMS 78)* What is causing the messages "unknown keysym osfDown..."? 79)+ What happens if I can't install Motif Keysyms? 80)+ Why has OSF introduced Keysyms into Motif 1.1? 81) TOPIC: MISCELLANEOUS 82) How can tell I if the user has selected the "Close" item on the system menu attached to the top-level shell? 83) Why does an augment translation appear to act as replace for some widgets? 84) How do you "grey" out a widget so that it cannot be activated? 85) Why doesn't the Help callback work on some widgets? 86)+ Where can I get the Table widget? 87)* Has anyone done a bar graph widget? 88) Does anyone know of a source code of a graph widget 89)+ Is there a help system available, such as in Windows 3? 90)+ Can I specify a widget in a resource file? 91)+ Why are only some of my translations are being installed? 92) TOPIC: ACKNOWLEDGEMENTS If you have suggestions or corrections for any of these answers or any additional information, please send them directly to jan@ise.canberra.edu.au; the information will be included in the next revision (or possibly the one after that; thanks for the many suggestions which haven't been incorporated yet). The answers in this iteration are acknowledged to be partial. This posting is intended to be distributed at approximately the beginning of each month. The information contained herein has been gathered from a variety of sources. In many cases attribution has been lost; if you would like to claim responsibility for a particular item, please let us know. Conventions used below: telephone numbers tend to be Bell-system unless otherwise noted; prices on items are not included. ------------------------------------------------------------------------------- Subject: 0)+ TOPIC: WHAT ARE OTHER RELEVANT NEWSGROUPS? Answer: This newsgroup is comp.windows.x.motif. The nearest related group is comp.windows.x. It also maintains an FAQ, which deals in all sorts of X, Xlib and Xt questions. Look there for answers to questions such as "How do I get a screendump of my application?", "where do I get X11R4", etc. Other groups which may have relevant information are comp.windows.news, comp.windows.misc and comp.windows.open-look. ------------------------------------------------------------------------------- Subject: 1) TOPIC: FTP ARCHIVES ------------------------------------------------------------------------------- Subject: 2)+ Is the FAQ list available for FTP anywhere? Answer: A number of FAQ's (including this one) are archived at pit- manager.mit.edu, 18.72.1.58 under the directory pub/usenet. [Sorry, forgot to note who is doing it or on what basis!] ------------------------------------------------------------------------------- Subject: 3)+ Is this newsgroup archived? Answer: A number of individuals are archiving the group for their own records, but no-one has set up an FTP-able archive yet. [Does anyone have a free 10Meg or so?] ------------------------------------------------------------------------------- Subject: 4)+ Is the mail list motif-talk archived? Answer: If you have purchased support from OSF then you have access to their archive server for motif-talk. ------------------------------------------------------------------------------- Subject: 5) TOPIC: OSF AND MOTIF ------------------------------------------------------------------------------- Subject: 6)* What versions of Motif are there? Answer: Motif 1.0 is based on the R3 toolkit. There are patch releases to 1.0: 1.0.1, 1.0.A, 1.0.2 and 1.0.3, 1.0.4, 1.0.5. 1.0.A was a fairly major patch, as it involved a complete re-engineering of UIL and Mrm. Almost everyone who has 1.0.x has either 1.0.A or 1.0.3. There are not expected to be further patches to 1.0. Motif 1.1 is based on the R4 toolkit. The current version is Motif 1.1.0, plus a couple of patches available to full support contract holders. Motif 1.1.1 has been released as a patch to licensees with Full Support or Technical Update service. Motif 1.1.2 is a patch release which contains the necessary changes to fix over 80 bugs reported against Motif. It is be available to support contract holders (including both full support and update service). Future 1.1 patch releases are tentatively scheduled as follows: 1.1.3 3rd quarter 1991 1.1.4 4th quarter 1991 1.1.5 1st half 1992 Motif 1.2 is not expected until after mid 1991, and will be based on the R5 toolkit. ------------------------------------------------------------------------------- Subject: 7)* Where can I get Motif? Answer: Various hardware vendors produce developer's toolkits of binaries, header files, and documentation; check your hardware vendor, particularly if that vendor is an OSF member. Systems known to be shipping now: HP (sans UIL), Apollo (sans UIL), SCO, ISC, Mips (RISCwindows=X11R3 + full Motif), IBM, Data General for AViioNs (includes UIL), Bull (?), Concurrent Computer Corporation 5000, 6000, 8000 series machines, Convex. In addition, independent binary vendors produce Motif toolkits . ICS makes several binary kits, notably for Sun, DEC, Apple; Quest (408-988-8880) sells kits for Suns, as well; IXI (+44 223 462 131) offers kits for Sun3 (SunOS 3.5 or later, and Sun4 (SunOS 4.0.1 or later). Unipalm XTech (+44 954211862; or Aurora Technologies 617-577-1288 in USA) offers a binary kit for Suns based on Motif 1.1, with shared libraries. NSL (+33 (1) 43 36 77 50; requests@nsl.fr) offers kits for the Sun 3 and Sun 4. [An FAQ is for "personal opinions" on these toolkits. I don't think it is appropriate to give such opinions through this particular posting, so I haven't included any.] The kits include varied levels of bug-fixing and support for shared libraries. BIM (Fax : +32(2)759.47.95) offer Motif 1.1 for Sun-3, Sun-4, Sun-386i. Includes shared libraries. Metrolink Inc. (+1-305-566-9586, sales@metrolink.com; in Europe contact ADNT, (33 1) 3956 5333) ships an implementation of X11R4 and Motif 1.1 for several 386 systems. An OSF/Motif source license must be obtained from OSF before source can be obtained from the Open Software Foundation. Call the Direct Channel Desk at OSF at 617-621-7300 or email direct@osf.org for ordering information. ------------------------------------------------------------------------------- Subject: 8) Where can I get public domain Motif source? Answer: You cannot. Motif source is not publically available. ------------------------------------------------------------------------------- Subject: 9)* Are the Motif examples publically available? Answer: No. They are subject to the same licensing limitations as Motif source. OSF has produced a list of which of the example programs can be distributed. Call OSF Direct for a copy of it. ------------------------------------------------------------------------------- Subject: 10)* Has anyone done a public domain Motif lookalike? Answer: Not yet. The specification is available (AES), and the validation suite can be bought, but no-one has taken up the challenge. ------------------------------------------------------------------------------- Subject: 11) Does anyone from OSF pay attention to our questions/suggestions? Answer: Yes, and they quite often post answers too. But they may not respond to *your* problem because they have other things to do as well. This newsgroup is not run by OSF, and has no formal connection with OSF. OSF is a member-driven company. The membership (and anyone can be a member) provides the primary input for future development of Motif. ------------------------------------------------------------------------------- Subject: 12) Does OSF have an application compliance validation service? Answer: They have a checklist and a certification process which you can request from them. Ask for the Level One Certification Checklist. The process is one of self-certification. It tests only the appearance and behavior of the application against Motif style. The product will also be put in the OSF reference listing. There's a one-time fee of $250. According to the master license agreement, you can't use any OSF identifying mark unless you have done a certification. ------------------------------------------------------------------------------- Subject: 13)* What is the motif-talk mailing list? Answer: The motif-talk mailing list is only for those who have purchased a Motif source code license. You can be placed on this list by emailing to motif-talk- request, citing your Company name and source license number. ------------------------------------------------------------------------------- Subject: 14) What MIT patches do I use, and when do I use fix-osf? Answer: The Motif 1.1.0 tape contains MIT patches 1-14. Apply these and any others you can get. If your MIT patch level only goes up to fix-16, you also need to apply fix-osf. Fix-osf was an emergency patch for a problem that existed when the Motif 1.1 tape was cut, The MIT fix-17 completely superseded osf-fix, so if you have applied fix-17 do not apply fix-osf. The 1.1.1 tape contains MIT fixes 15-18, as well as an OSF-developed fix that deals with a subtle bug in the Selection mechanism of the Intrinsics. Most people will have fix-15 to 18 by now; if you don't have them: Back out fix-osf if you have applied it Apply fix-15 to 18 Apply fix-osf-1.1.1 The Selection fix was submitted to MIT, who came up with a diferent fix. It will not be made into an R4 fix but should be in R5. The MIT fix was posted to motif-talk. ------------------------------------------------------------------------------- Subject: 15) TOPIC: LITERATURE ------------------------------------------------------------------------------- Subject: 16)* What books should I read or do I need to program using Motif? Answer: Ken Lee of the DEC Western Software Laboratory (klee@wsl.dec.com) regularly posts to comp.windows.x and ba.windows.x a list of reference books and articles on X and X programming. In FAQ comp.windows.x an extract of his list appears. Specifically for Motif programming, though: OSF/Motif Programmers Guide, Prentice-Hall 13-640525-8 (Motif 1.0) ISBN 0-13- 640681-5 (Motif 1.1) (NB: This makes use of the demo programs that you get with a Motif source license. The programs are not included and may or may not be available on your system.) OSF/Motif Programmers Reference Manual, Prentice-Hall 13-640517-17 (Motif 1.0) ISBN 0-13-640616-5 (Motif 1.1) You will need this for the system calls. OSF/Motif Style Guide, Prentice-Hall 13-640491-X (Motif 1.0) ISBN 0-13-640673-4 (Motif 1.1) You will need this to get some idea of how to write programs with the correct `look and feel'. You should read at least one of the the non-OSF books on Motif: Young, Doug. "The X Window System: Applications and Programming with Xt (Motif Version)," Prentice Hall, 1989 (ISBN 0-13-497074-8). The excellent tutorial "X Window Systems Programming and Applications with Xt," (ISBN 0-13-972167-3) updated for Motif. [The examples from the Motif version are available on export in ~ftp/contrib/young.motif.tar.Z] Marshall Brain at brain@adm.csc.ncsu.edu posted a set of simple and useful Motif tutorials. Berlage, Thomas Berlage, OSF/Motif: Concepts and Programming, Addison-Wesley, UK, 1991. ISBN 0-201-55792-4. Johnson, Eric F. and Kevin Reichard, Power Programming Motif, MIS: Press, Portland, OR, 1991. ISBN 1-55828-059-6. Book with disk, ISBN 1-55828-061-8. You will also need books and references on Xt such as: Asente, Paul J., and Swick, Ralph R., "X Window System Toolkit, The Complete Programmer's Guide and Specification", Digital Press, 1990. The bible on Xt. A treasury of information, excellent and invaluable. Distributed by Digital Press, ISBN 1-55558-051-3, order number EY-E757E-DP; and by Prentice- Hall, ISBN 0-13-972191-6. Nye, Adrian, and Tim O'Reilly, "X Toolkit Programming Manual, Volume 4," O'Reilly and Associates, 1989. The folks at O'Reilly give their comprehensive treatment to programming with the MIT Intrinsics; R4 versions are now available, as is a Motif 1.1 version (Volume 4M). O'Reilly, Tim, ed., "X Toolkit Reference Manual, Volume 5," O'Reilly and Associates, 1989. A professional reference manual for the MIT X11R3 Xt; some information on X11R4 is included. Books and reference manuals on Xlib may also be useful. ------------------------------------------------------------------------------- Subject: 17) TOPIC: MWM ------------------------------------------------------------------------------- Subject: 18) What is the diference between Motif and mwm? Answer: mwm is a window manager. Motif itself is made up of four parts: a User- Interface Guideline, an API toolkit of `C' routines which helps in the building of applications which conform to the Guideline, the window manager mwm, and a language UIL which is designed to ease user interface development. In general mwm will run an application built with any X-windows API, and in general an application built using the Motif toolkit will run under any window manager. ------------------------------------------------------------------------------- Subject: 19) Does anyone have an alternative set of 3-D defaults for a monochrome screen? Answer: This is obviously a matter of taste. Some alternatives suggested include !Benjamin Schreiber, bs@osf.osf.org, bs@cs.brandeis.edu Mwm*foreground: black ! Actually, when a window is Mwm*background: white ! deactivated, the background Mwm*backgroundPixmap: 50_foreground ! becomes white, insted of Mwm*topShadowPixmap: white ! 50% foreground (grey) Mwm*activeForeground: black Mwm*activeBackground: white Mwm*activeBackgroundPixmap: 50_foreground Mwm*activeTopShadowPixmap: white Mwm*menu*backgroundPixmap: background Mwm*menu*topShadowPixmap: 50_foreground Mwm*title*foreground: black Mwm*title*background: white Mwm*title*backgroundPixmap: white Mwm*title*topShadowPixmap: 50_foreground Mwm*title*activeForeground: white Mwm*title*activeBackground: black Mwm*title*activeBackgroundPixmap: black Mwm*title*activeBottomShadowPixmap: 50_foreground Mwm*feedback*backgroundPixmap: white or ! From: tsang@isi.com (Kam C. Tsang) Mwm*background: White Mwm*activeBackground: White Mwm*activeBackgroundPixmap: 25_foreground Mwm*foreground: Black Mwm*activeForeground: Black Mwm*menu*background: white Mwm*menu*foreground: black xterm*Foreground: black xterm*Background: white or ! From: ucsd.edu!usc!snorkelwacker!paperboy!yee (Michael K. Yee) Mwm*cleanText: True Mwm*activeBackground: white Mwm*activeForeground: black Mwm*background: white Mwm*foreground: black Mwm*client*activeBackgroundPixmap: 50_foreground Mwm*client*activeTopShadowPixmap: foreground Mwm*client*activeBottomShadowPixmap: background !Mwm*client*background: white !Mwm*client*foreground: black Mwm*client*backgroundPixmap: 75_foreground Mwm*client*topShadowPixmap: foreground Mwm*client*bottomShadowPixmap: background !Mwm*feedback*background: white !Mwm*feedback*foreground: black Mwm*feedback*backgroundPixmap: 50_foreground !Mwm*feedback*topShadowPixmap: 25_foreground !Mwm*feedback*bottomShadowPixmap: background !Mwm*menu*background: white !Mwm*menu*foreground: black Mwm*menu*backgroundPixmap: foreground !Mwm*menu*topShadowPixmap: foreground !Mwm*menu*bottomShadowPixmap: background !Mwm*icon*background: white !Mwm*icon*foreground: black Mwm*icon*activeBackgroundPixmap: 50_foreground Mwm*icon*activeBottomShadowPixmap: foreground Mwm*icon*backgroundPixmap: 75_foreground ------------------------------------------------------------------------------- Subject: 20) TOPIC: MOTIF GENERATORS ------------------------------------------------------------------------------- Subject: 21)* What prototyping tools are there to generate Motif code? Answer: [An FAQ is for "personal opinions" on these tools. I don't think it is appropriate to give such opinions through this particular posting, so I haven't included any.] `Prototyping tools' come in two forms: those that can be used to design the interface only (Interactive Design Tools), and those that go beyond this to give support for application code (User Interface Management Systems). There are a number of commercial and non-commnercial tools of both kinds that will support the Motif interface. They include: IDTs: Builder Xcessory UIMX X Build ExoCODE/xm UIMS: Widget Creation Library Serpent TeleUse X-Designer Some contact addresses are: WINTERP: You may obtain the current source, documentation, and examples via anonymous ftp from host export.lcs.mit.edu: in directory contrib/winterp you will find the compress(1)'d tar(1) file winterp.tar.Z. If you do not have Internet access you may request the source code to be mailed to you by sending a message to winterp-source%hplnpm@hplabs.hp.com or hplabs!hplnpm!winterp-source. Serpent: The S/W is free (anonymous ftp) from fg.sei.cmu.edu. For more info contact erik/robert at serpent-info@sei.cmu.edu. TeleUse: In the U.K., send mail to xtech@unipalm.co.uk or call +44 954 211862. In the US call Telesoft at (619) 457-2700 or write TeleSoft, 5959 Cornerstone Court West, San Diego, California 92121. Builder Xcessory from ICS. More details are available by sending a request to info@ics.com. 617.547.0510 X-Designer: From Imperial Software Technology in the UK. Email address is sales@ist.co.uk. (+44) 743 587055 ExoCODE/xm: From Expert Object Corp., 7250 Cicero Avenue, Lincolnwood, IL 60646 (708)676-5555. X Build: From Nixdorf Computer (Waltham, MA) xbuild@nixdorf.com ExoCode: From EXOC (Chicago, IL) UIMX: Visual Edge Software Limited, 3870 Cote Vertu, St Laurent, Quebec, H4R 1V4, Phone: (514) 332-6430, Fax: (514) 332-5914, or: Visual Edge Software Ltd., 101 First Street, Suite 443, Los Altos, CA 94022, Phone: (415) 948-0753, Fax: (415) 948-0843 The Widget Creation Library: The distribution is available in several ways. The preferred approach it for you to get the compressed tar file using anonymous ftp from either of these ftp servers: devvax.jpl.nasa.gov (128.149.1.143) pub/Wc1_03.tar.Z export.lcs.mit.edu (18.30.0.238) /contrib/Wcl.1.05Wc1_05.tar.Z ------------------------------------------------------------------------------- Subject: 22) TOPIC: TEXT WIDGET ------------------------------------------------------------------------------- Subject: 23)* Why does pressing <return> in a text widget do nothing? This happens using Motif 1.0 when I have a text widget inside a bulletin board (or form) inside a dialog shell. (In Motif 1.1 it is fixed for both text and list widgets.) Answer: In single line mode, pressing the <return> key usually invokes the activate() action, and in multi-line mode, the newline() action. However, whenever a widget is the child of a bulletin board widget which is the child of a dialog shell, the bulletin board forces all of its children to translate <return> to the bulletin board action Return() which is usually associated with the default button of the dialog. To restore the text actions of activate() or newline(), you need to overide the Return() action of the bulletin board. /* declarations */ /* for a single line widget */ char newTrans[] = "<Key>Return : activate()"; /* for a multi line widget */ char newTrans[] = "<Key>Return : newline()"; XtTranslations transTable; /* in executable section */ transTable = XtParseTranslationTable(newTrans); /* after creating but before managing text widget */ XtOverrideTranslations(textWidget, transTable); Subject: 24) When I add text to a scrolling text widget how can I get the new text to show? Answer: Use the call undocumented in Motif 1.0 void XmTextShowPosition(w, position) Widget w; XmTextPosition position; where the position is the number of characters from the beginning of the buffer of the text to be displayed. If you don't know how many characters are in the buffer, use another call undocumented in Motif 1.0 position = XmTextGetLastPosition(w) ------------------------------------------------------------------------------- Subject: 25) Does the text widget support 16 bit character fonts? Answer: R5 will have support for 16 bit character sets, and Motif 1.2 will use that. You will have to wait until then. ------------------------------------------------------------------------------- Subject: 26) How can I stop the text widget from echoing characters typed? I need to turn off echo for password input. Answer: Use the modifyVerifyCallback to tell when input is received. Set the `doit' field in the XmTextVerifyCallbackStruct to False to stop the echo. In Motif 1.0 this will cause a beep per character: Live with it, because at 1.1 you can turn it off. Note that password hiding is inherently insecure in X - someone may have an X grab on the keyboard and be reading all characters typed in anyway. ------------------------------------------------------------------------------- Subject: 27) How can I replace characters typed with say a `*'? I want to replace input for password entry. Answer: In Motif 1.1 set text->ptr in the callback structure to '*'. This does not work under 1.0 because of an oversight in which changes to this are ignored. In Motif 1.0, what you can do is set the doit flag to 'false' so the text is not displayed. Then set a static boolean to True to prevent re-entrance. Next call XmTextReplace() to display your '*'. then reset your re-entrance flag to False. XmTextReplace() will call the XmNmodifyVerify callback. To prevent getting into an infinite loop, you need the re-entrance flag. ------------------------------------------------------------------------------- Subject: 28) How can I best add a large piece of text to a scrolled list widget? It insists on adding the text one line at a time, adjusting the scroll bar each time. It looks awful and is slow. Answer: Unmanage the widget, add the text and then manage it again. ------------------------------------------------------------------------------- Subject: 29)+ How can I highlight text in the Text widget? Answer: From: argv@zipcode.com (Dan Heller) If you don't need font or color changes, you can do all this using a Text widget very easily [in Motif 1.1, anyway]. loop() { pos = offset_of_pattern_in_text_widget(pattern, text_w); search_len = strlen(pattern); XmTextSetHighlight(text_w, pos, pos+search_len, XmHIGHLIGHT_SELECTED); } ------------------------------------------------------------------------------- Subject: 30)+ How can I change colours of text in the Text widget? I want some of the text in one colour, some in another. Answer: You can't. ------------------------------------------------------------------------------- Subject: 31)+ How can I change the font of text in the Text widget? I want some of the text in one font, some in another. Answer: You can't in Text. If you wanted readonly text, you could do it by using a label instead. ------------------------------------------------------------------------------- Subject: 32)+ Is there an emacs binding for the text widget? Answer: This set is due to Kee Hinkley (nazgul@alfalfa.com): *XmText.translations: #override\n\ Ctrl <Key>b: backward-character()\n\ Alt <Key>b: backward-word()\n\ Meta <Key>b: backward-word()\n\ Shift Alt <Key>b: backward-word(extend)\n\ Shift Meta <Key>b: backward-word(extend)\n\ Alt <Key>[: backward-paragraph()\n\ Meta <Key>[: backward-paragraph()\n\ Shift Alt <Key>[: backward-paragraph(extend)\n\ Shift Meta <Key>[: backward-paragraph(extend)\n\ Alt <Key><: beginning-of-file()\n\ Meta <Key><: beginning-of-file()\n\ Ctrl <Key>a: beginning-of-line()\n\ Shift Ctrl <Key>a: beginning-of-line(extend)\n\ Ctrl <Key>osfInsert: copy-clipboard()\n\ Shift <Key>osfDelete: cut-clipboard()\n\ Shift <Key>osfInsert: paste-clipboard()\n\ Alt <Key>>: end-of-file()\n\ Meta <Key>>: end-of-file()\n\ Ctrl <Key>e: end-of-line()\n\ Shift Ctrl <Key>e: end-of-line(extend)\n\ Ctrl <Key>f: forward-character()\n\ Alt <Key>]: forward-paragraph()\n\ Meta <Key>]: forward-paragraph()\n\ Shift Alt <Key>]: forward-paragraph(extend)\n\ Shift Meta <Key>]: forward-paragraph(extend)\n\ Ctrl Alt <Key>f: forward-word()\n\ Ctrl Meta <Key>f: forward-word()\n\ Ctrl <Key>d: kill-next-character()\n\ Alt <Key>BackSpace: kill-previous-word()\n\ Meta <Key>BackSpace: kill-previous-word()\n\ Ctrl <Key>w: key-select() kill-selection()\n\ Ctrl <Key>y: unkill()\n\ Ctrl <Key>k: kill-to-end-of-line()\n\ Alt <Key>Delete: kill-to-start-of-line()\n\ Meta <Key>Delete: kill-to-start-of-line()\n\ Ctrl <Key>o: newline-and-backup()\n\ Ctrl <Key>j: newline-and-indent()\n\ Ctrl <Key>n: next-line()\n\ Ctrl <Key>osfLeft: page-left()\n\ Ctrl <Key>osfRight: page-right()\n\ Ctrl <Key>p: previous-line()\n\ Ctrl <Key>g: process-cancel()\n\ Ctrl <Key>l: redraw-display()\n\ Ctrl <Key>osfDown: next-page()\n\ Ctrl <Key>osfUp: previous-page()\n\ Ctrl <Key>space: set-anchor()\n ! If you'd like the Delete key to work like backspace instead of deleting ! backwards, add the following definition to the lines above. ! <Key>osfDelete: delete-previous-character()\n\ ! These aren't included because they could intefere with menu accelerators (or vice versa) ! Alt <Key>p: backward-paragraph()\n\ ! Meta <Key>p: backward-paragraph()\n\ ! Shift Alt<Key>p: backward-paragraph(extend)\n\ ! Shift Meta<Key>p: backward-paragraph(extend)\n\ ! Alt <Key>w: copy-clipboard()\n\ ! Meta <Key>w: copy-clipboard()\n\ ! Ctrl Alt <Key>w: cut-clipboard()\n\ ! Ctrl Meta <Key>w: cut-clipboard()\n\ ! Alt <Key>y: paste-clipboard()\n\ ! Meta <Key>y: paste-clipboard()\n\ ! Alt <Key>f: forward-word()\n\ ! Meta <Key>f: forward-word()\n\ ! Alt <Key>n: forward-paragraph()\n\ ! Meta <Key>n: forward-paragraph()\n\ ! Shift Alt <Key>n: forward-paragraph(extend)\n\ ! Shift Meta <Key>n: forward-paragraph(extend)\n\ ! Shift Alt <Key>f: forward-word(extend)\n\ ! Shift Meta <Key>f: forward-word(extend)\n\ ! Alt <Key>d: kill-next-word()\n\ ! Meta <Key>d: kill-next-word()\n\ ! Alt <Key>h: select-all()\n\ ! Meta <Key>h: select-all()\n\ Similar sets of translations have been suggested by others. ------------------------------------------------------------------------------- Subject: 33) TOPIC: LIST WIDGET ------------------------------------------------------------------------------- Subject: 34) How do I best put a new set of items into a list? Answer: Set the new list count and list by XtSetArgs and install them by XtSetValues. XmString list[SIZE]; int list_size; XtSetArg (args[n], XmNitemCount, list_size); n++; XtSetArg (args[n], XmNitems, list); n++; XtSetValues (w, args, n); Each time the list is reset by this the old contents are freed by the widget and the new supplied list is copied. Do *not* free the old list of items yourself as this would result in the space being freed twice. It is not necessary to remove the items one at a time, nor to "zero" out the list first. ------------------------------------------------------------------------------- Subject: 35) Can I get a bitmap to show in a list item like I can in a Label? I want to place a bitmap along with some normal text in my list items. Answer: No. The workaround is to define your font containing the icons you want. Then you can create a fontlist containing your icon font and the font you want the text in, and then make your items multi-segment XmStrings where the first segment contains the code of the icon you want with a charset that matches the icon font in your fontlist and the second segment with a charset matching the text font. ------------------------------------------------------------------------------- Subject: 36) Can I have items with different colours in a list? Answer: No. Since the items are XmStrings, you can already change the font of an item by replacing it with an item with the same text and a different charset tag. Adding support for color would require modification of the internal data structure in XmList as well as modification to the drawing routines. ------------------------------------------------------------------------------- Subject: 37)+ Can I grey out an item in a list? I want to make insensitive items in a list so that they cannot be selected. Answer: From W. Scott Meeks of OSF: Unfortunately, you can't do it directly since the list items aren't individual widgets. We've had other requests for this technology, but it didn't make the cut for 1.2; it should be in some future release. However, you can probably fake it in your application with some difficulty. First, a list item is an XmString, so you can specify a different charset for the item than for other items in the list and then specify a font in the list's fontlist that matches the charset and gives you the visual you want. The next problem is making the item unselectable. One idea would be to have the application keep track of the insensitive items and the items currently selected. Then you would set up a selection callback that when called would check the item selected against the list of insensitive items and if the selected item matched would deselect that item and reselect the previously selected items. Otherwise it would just update the application's list of selected items. The major drawback with this approach is that you'll get flashing whenever the list selects an item and your application immediately de- selects. Unfortunately I can't think of a way around this without mucking with the list internals. Another alternative suggested is to use instead a column of say read only text widgets which you can make insensitive. ------------------------------------------------------------------------------- Subject: 38) TOPIC: FILE SELECTION BOX WIDGET ------------------------------------------------------------------------------- Subject: 39) What is libPW.a and do I need it? My manual says I need to link in libPW.a to use the File Selection Box. I can't find it on my system. Answer: The libPW.a is the Programers Workbench library which is an ATT product not included in Berkeley based systems, hence it is not found in SunOS or Ultrix, but is found on HP-UX (a Berkeley/ATT hybrid which chose ATT in this case). It contains the regex(3) routines. Some systems which don't have these in the libc.a need to link with -lPW. Some systems which have the regex(3) routines in there also have the libPW.a. If you have regex(3) in libc, and it works, don't link with libPW. If you don't have regex(3) in libc, and you don't have a libPW, then check some sites on the net for public domain replacements (several exist), or call your vendor. ------------------------------------------------------------------------------- Subject: 40) What's wrong with the Motif 1.0 File Selection Box? I can't set the directory, change the directory or get the file mask to work. Answer: The 1.0 File Selection Box is broken, and these don't work. They weren't fixed until Motif 1.04. Use these later versions of 1.0 or switch to Motif 1.1 where it changed a lot. Joe Hildebrand has a work-around for some of this: Before popping up an XmFileSelectionDialog, change to the directory you want. When a file is selected, check if it is a directory, so that we can change to it. i.e. static void show_file_box_CB(w, client_data, call_data) Widget w; Widget client_data; XmAnyCallbackStruct *call_data; { chdir("/users/hildjj/files"); XtManageChild(client_data); } static void val_save(w, client_data, call_data) Widget w; Widget client_data; XmSelectionBoxCallbackStruct *call_data; { struct stat buf; /* struct stat is defined in stat.h */ char *filename; /* get the file name from the FileSelectionBox */ filename = SmX(call_data->value); /* get the status of the file named filename, and put it into buf */ if (!stat(filename, &buf)) { /* if it's a directory */ /* if it's a directory */ if(S_ISDIR(buf.st_mode)) { /* change to that directory, and update the FileSelectionBox */ chdir(filename); XmFileSelectionDoSearch(w, NULL); } else /* if it's a regualr file */ if(S_ISREG(buf.st_mode)) /* ask if it should be overwritten */ XtManageChild(valbox); else /* it's another kind of file. What type, i can't think of, but it might happen */ pop_up_error_box(client_data, "Error saving file"); } else /* we couldn't get the file status */ { /* if it's because the file doesn't exist, we're golden */ if (errno == ENOENT) save_file(); else /* there is some other problem getting the status. e.g. bad path */ pop_up_error_box(client_data, "Error saving file"); } } this still doesn't implement the file masking stuff. ------------------------------------------------------------------------------- Subject: 41) TOPIC: FORM WIDGET ------------------------------------------------------------------------------- Subject: 42) Why don't labels in a Form resize when the label is changed? I've got some labels in a form. The labels don't resize whenever the label string resource is changed. As a result, the operator has to resize the window to see the new label contents. I am using Motif 1.1. Answer: This problem may happen to any widget inside a Form widget. The problem was that the Form will resize itself when it gets geometry requests from its children. If its preferred size is not allowed, the Form will disallow all geometry requests from its children. The workaround is that you should set any ancestor of the Form to be resizable. For the shell which contains the Form you should set the shell resource XmNallowShellResize to be True (by default, it is set to FALSE). There is currently an inconsistency on how resizing is being done, and it may get fixed in Motif 1.2. ------------------------------------------------------------------------------- Subject: 43) TOPIC: PUSHBUTTON WIDGET ------------------------------------------------------------------------------- Subject: 44) Why can't I use accelerators on buttons not in a menu? Answer: It is apparently a difficult feature to implement, but OSF are considering this for the future. It is problematic trying to use the Xt accelerators since the Motif method interferes with this. The workaround suggested so far is to duplicate your non-menu button by a button in a menu somewhere, which does have a menu-accelerator installed. When the user invokes what they think is the accelerator for the button they can see Motif actually invokes the button on the menu that they can't see at the time. ------------------------------------------------------------------------------- Subject: 45) TOPIC: LABEL WIDGET ------------------------------------------------------------------------------- Subject: 46)+ How can I align the text in a label widget? Answer: The alignment for the label widget is controlled by the resource XmNalignment, and the default centers the text. Use this resource to change it to left or right alignment. However, when the label (or any descendant) is in a row column, and XmNisAligned is True (the default), the row column aligns text using its resource XmNentryAlignment. If you want simultaneous control over all widgets use this, but otherwise turn XmNisAligned off and do it individually. ------------------------------------------------------------------------------- Subject: 47) How can I set a multiline label in .Xdefaults? Answer: *Label*labelString: Here\nis\nthe\nLabel Gives a four line label, using the escape sequence \n for a newline. ------------------------------------------------------------------------------- Subject: 48) TOPIC: DRAWING AREA WIDGET ------------------------------------------------------------------------------- Subject: 49)+ How can I send an expose event to a Drawing Area widget? (or any other, come to that). I want to send an expose event so that it will redraw itself. Answer: Use the Xlib call XClearArea(XtWindow(w), 0, 0, 0, 0, True) This clears the widget's window and generates an expose event in doing so. The widgets expose action will then redraw it. This uses a round trip request. An alternative, without the round trip is From schulert@alfalfa.com Mon Apr 29 17:31:55 1991 Widget da; XmDrawingAreaCallbackStruct da_struct; da_struct.reason = XmCR_EXPOSE; da_struct.event = (XEvent *) NULL; da_struct.window = XtWindow(da); XtCallCallbacks(da, XmNexposeCallback, (XtPointer) da_struct); ------------------------------------------------------------------------------- Subject: 50) TOPIC: MENUS ------------------------------------------------------------------------------- Subject: 51) What can I put inside a menu bar? Answer: You can only put cascade buttons in menu bars. No pushbuttons, toggle buttons or gadgets are allowed. When you create a pulldown menu with parent a menu bar, its real parent is a shell widget. ------------------------------------------------------------------------------- Subject: 52) Can I have a cascade button without a submenu in a pulldown menu? Answer: Yes you can. A cascade button has an activate callback which is called when you click on it and it doesn't have a submenu. It can have a mnemonic, but keyboard traversal using the arrow keys in the menu will skip over it. ------------------------------------------------------------------------------- Subject: 53)* Should I have a cascade button without a submenu in a pulldown menu? Answer: No. This is forbidden by the style guide. Technically you can do it (see previous question) but if you do it will not be Motif style compliant. This is unlikely to change - if a "button" is important enough to be in a pulldown menu bar with no pulldown, it should be a button elsewhere. (Mind you, you won't be able to put accelerators on it elsewhere though.) ------------------------------------------------------------------------------- Subject: 54) TOPIC: INPUT FOCUS ------------------------------------------------------------------------------- Subject: 55) How can I direct the keyboard input to a particular widget? Answer: In Motif 1.1 call XmProcessTraversal(target, XmTRAVERSE_CURRENT). The widget (and all of its ancestors) does need to be realized BEFORE you call this. Otherwise it has no effect. XmProcessTraversal is reported to have many bugs, so it may not work right. In Motif 1.0 call the undocumented _XmGrabTheFocus(target). Do not use the X or Xt calls such as XtSetKeyboardFocus since this bypasses the Motif traversal layer and can cause it to get confused. This can lead to odd keyboard behaviour elsewhere in your application. ------------------------------------------------------------------------------- Subject: 56) How can I have a modal dialog which has to be answered before the application can continue? Answer: The answer depends on whether you are using the Motif window manager mwm or not. If you are, there is a simple solution. If not (or you don't know whether you are or not), you have to use a slightly harder method. Test for this by XmIsMotifWMRunning. The window manager mwm knows how to control event passing to dialog widgets declared as modal. If the dialog is set to application modal, then no interaction with the rest of the application can occur until the dialog is destroyed or unmanaged. This can be done through one of the callbacks of the dialog: block_dialog(parent) Widget parent; { Arg args[2]; XtSetArg(args[0], XmNmessageString, XmStringCreateLtoR("....", charset)); XtSetArg(args[1], XmNdialogStyle, XmDIALOG_APPLICATION_MODAL); dialog = XmCreateMessageDialog(parent, NULL, args, 2); XtAddCallback(dialog, XmNokCallback, responseCB, NULL); XtAddCallback(dialog, XmNcancelCallback, responseCB, NULL); XtAddCallback(dialog, XmNhelpCallback, responseCB, NULL); XtManageChild(dialog); } void responseCB(w, client_data, reason) Widget w; caddr_t client_data; XmAnyCallbackStruct *reason; { int why = reason->reason; XtUnmanageChild(w); /* if you won't use it again */ XtDestroyWidget(XtParent(w)); switch (why) { case XmCR_OK: /* process ok action */ break; case XmCR_CANCEL: /* process cancel action */ break; case XmCR_HELP: /* process help action */ break; } } Without using mwm, the basic version goes like this: You have to set an Xt grab to the dialog and run your own event processing loop. This loop finishes when the user invokes a callback from a button press. The boolean `keep_grab' is passed to the callback as client data which sets it to false when the callback is executed. Boolean keep_grab = True; XEvent event; Arg args[1]; XtSetArg(args[0], XmNmesssageString, ...); dialog = XmCreateMessageDialog(parent, NULL, args, 1); XtAddCallback(dialog, XmNokCallback, responseCB, &keep_grab); XtAddCallback(dialog, XmNcancelCallback, responseCB, &keep_grab); XtAddCallback(dialog, XmNhelpCallback, responseCB, &keep_grab); XtManageChild(dialog); XtAddGrab(XtParent(dialog), True, False); while (keep_grab || XtPending()) { XtNextEvent(&event); XtDispatchEvent(&event); } The "client_data" for the function (in each case) is &keep_grab. The function sets this to False and unmanages the dialog before continuing to process the callback. void responseCB(w, keep_grab, reason) Widget w; Boolean *keep_grab; XmAnyCallbackStruct *reason; { int why = reason->reason; *keep_grab = False; XtRemoveGrab(XtParent(w)); XtUnmanageChild(w); /* If you don't want to reuse it */ XtDestroyWidget(XtParent(w)); switch (why) { case XmCR_OK: /* process ok action */ break; case XmCR_CANCEL: /* process cancel action */ break; case XmCR_HELP: /* process help action */ break; } } ------------------------------------------------------------------------------- Subject: 57) TOPIC: MEMORY AND SPEED ------------------------------------------------------------------------------- Subject: 58) Why does my application grow in size? Answer: Motif 1.0 has many memory leaks, particularly in XmString manipulation. Switch to Motif 1.1. Answer: The Intrinsics have a memory leak in accelerator table management, and Motif uses this heavily. Avoid this by mapping/unmapping widgets rather than creating/destroying them, or get X11R4 fix-15/16/17. Answer: The server may grow in size due to its own memory leaks. Switch to a later server. Answer: You are responsible for garbage collection in `C'. Some common cases where a piece of memory becomes garbage are a. Memory is allocated for a character string by Motif in XmStringGetLtoR(). After using the string, XtFree() it. b. If you have set the label in a label, pushbutton, etc widget, free it after calling XtSetValues() or the widget creation routine by XmStringFree(). c. If you have set text in a text widget, reclaim the string afterwards - the text widget makes its own copy. d. If you have set the strings in a list widget, reclaim the space. The list widget makes its own copy. ------------------------------------------------------------------------------- Subject: 59) Why does my application take a long time to start up? Answer: If you have a large .Xdefaults, time may be spent reading and parsing it. ------------------------------------------------------------------------------- Subject: 60) My application is running too slowly. How can I speed it up? Answer: Use the R4 rather than R3 server. It is much faster. Answer: The standard memory allocator is not well tuned to Motif, and can degrade performance. Use a better allocator. e.g. with SCO Unix, link with libmalloc.a; use the allocator from GNU emacs; use the allocator from Perl. Answer: Avoid lots of widget creation and destruction. It fragments memory and slows everything down. Popup/popdown, manage/unmanage instead. Answer: Set mappedWhenManaged to FALSE, and then call XtMapWidget() XtUnmapWidget() rather than managing. Answer: Get more memory - your application, the server and the Operating System may be spending a lot of time being swapped. Answer: If you are doing much XmString work yourself, such as heavy use of XmStringCompare, speed may deteriorate due to the large amount of internal conversions and malloc'ing. Try using XmStringByteCompare if appropriate or ordinary Ascii strings if you can. ------------------------------------------------------------------------------- Subject: 61) TOPIC: XMSTRING ------------------------------------------------------------------------------- Subject: 62) How can I get the Ascii text out of an XmString? Answer: To get the first line of text from a string created left-to-right char *str; XmString xmstr; /* stuff to create xmstr */ ... /* set str to point to the text */ XmStringGetLtoR(xmstr, XmSTRING_DEFAULT_CHARSET, &str); /* use the string */ ... /* and reclaim space */ XtFree(str); ------------------------------------------------------------------------------- Subject: 63) When can XmStrings used as resources be freed? Answer: The policy OSF have been trying to enforce is that if you set an XmString or XmStringTable resource, the application is responsible for freeing the XmStrings used because the widget makes a copy. If you get an XmString resource, then the application must free the value gotten. If you get an XmStringTable, then the application should NOT free the value gotten. If the application wants to manipulate it, it should make a copy first. This policy appears to be implemented progressively, so may be less true for Motif 1.0 than 1.1. ------------------------------------------------------------------------------- Subject: 64) Why doesn't XmStringGetNextSegment() work properly? Answer: The documentation in Motif 1.0 is in error. Instead of XmStringGetnextSegment(context, ...) XmStringContext * context; it should be XmStringGetnextSegment(context, ...) XmStringContext context; i.e. with no indirection. ------------------------------------------------------------------------------- Subject: 65) TOPIC: DIALOGS ------------------------------------------------------------------------------- Subject: 66) How do I stop my dialog disappearing when I press the help button? Answer: Bulletin board has the resource autoUnmanage which defaults to True. This unmanages the widget when any button child is activated - including the help button. Set this to False to stop it disappearing. Note that you then have to unmanage the bulletin board yourself when any other button is activated. ------------------------------------------------------------------------------- Subject: 67) How do I make my own dialog? I want a dialog with my own set of buttons that stretch and shrink like the ones in e.g. PromptDialog and its own contents. Answer: Start off with say a PromptDialog. Unmanage the buttons you don't want or manage the Apply button if you want another. Unmanage the other bits of the selection box you don't want. You can add another WorkArea child to the selection box for any extra stuff you want. /* Copyright 1990, Kee Hinckley and Brian Holt Hawthorne */ /* Permission granted for any use, provided this copyright */ /* notice is maintained. */ /* Create a dialog box */ argcount = setArgs(&args, XmNautoUnmanage, False, NULL); SomeDialog = XmCreatePromptDialog(mainShell, "someDialog", args, argcount); /* Now get rid of the things we don't want */ child = XmSelectionBoxGetChild(SomeDialog, XmDIALOG_SELECTION_LABEL); XtUnmanageChild(child); child = XmSelectionBoxGetChild(SomeDialog, XmDIALOG_TEXT); XtUnmanageChild(child); /* set the callbacks, and make sure the buttons we want are there */ child = XmSelectionBoxGetChild(SomeDialog, XmDIALOG_OK_BUTTON); XtAddCallback(child, XmNactivateCallback, callSomeFunc, someArg); XtAddCallback(child, XmNactivateCallback, unManage, SomeDialog); XtManageChild(child); child = XmSelectionBoxGetChild(SomeDialog, XmDIALOG_APPLY_BUTTON); XtAddCallback(child, XmNactivateCallback, callSomeFunc, someOtherArg); XtManageChild(child); child = XmSelectionBoxGetChild(SomeDialog, XmDIALOG_CANCEL_BUTTON); XtAddCallback(child, XmNactivateCallback, dialogUnmanage, SomeDialog); XtManageChild(child); /* Add a new work area. This can be any manager. */ child = XmCreateForm(SomeDialog, "someForm", NULL, 0); XtManageChild(child); /* and fill it up... */ something = doYourStuff(child); ------------------------------------------------------------------------------- Subject: 68) How come the title bars for my dialogs now have "_popup" or "<- popup" concatenated onto the widget name? Answer: Motif 1.0.3 (?) "fixed" things such that title bars without an explicit dialogTitle setting use the widget name with "_popup" or whatever added on. Set the dialogTitle resource explicitly if you don't want this new default naming scheme. --------- ---------------------------------------------------------------------- Subject: 69) TOPIC: LANGUAGE BINDINGS ------------------------------------------------------------------------------- Subject: 70)* Is there a C++ binding for Motif? Answer: The University of Lowell has a C++ binding. The software is available on any system running X11R3. Currently it is available for both the GNU's C++ compiler g++ v 1.37.1 and the AT&T C++ v 2.0 translator. The software is available through either ftp or a 9 track reel magnetic tape for $250. A license must be purchased first. For additional information and license forms contact : University of Lowell Graphics Research Laboratory/Motif Computer Science Department One University Avenue Lowell, MA 01854 attn : Fran Ward (phone 508-934-3628) Once you have the license you can legitimately ftp it from 129.63.1.1 in file graphics/MotifC++/Motif1.1-g++.tar.Z Answer: WWL is a library which defines C++ classes around X Toolkit Widgets. It is intended to simplify the task of C++ code writers when using the Toolkit by providing them with C++ objects, methods, type checking and several utility functions and classes. WWL has been tested under SunOs4.0.3 on sun3 and sun4, HPUX version 6.5 and 7.0 and Ultrix 4.0 on DECstation 3100 and 5000. It is expected to work on most other UNIX systems without too many problems. WWL is distributed as a tar file with all the source, documentation and example. The file is available using anonymous ftp from export.lcs.mit.edu (18.30.0.238 contrib/WWL-1.0.tar.Z lri.lri.fr (129.175.15.1) pub/WWL-1.0.tar.Z ------------------------------------------------------------------------------- Subject: 71) Is there a Common Lisp binding for Motif? Answer: Try CLM. This includes a toolkit demon (in C) that takes a widget description (with callbacks), and forks a new process for each Motif application (which can be just a single menu, or whatever). Lisp can then continue running, with a separate lightweight lisp process handling the connection & callbacks. In North America & net environs, CLM-2.0beta is available from export.lcs.mit.edu. ------------------------------------------------------------------------------- Subject: 72)* Is there an Ada binding for Motif? Answer: The situation is getting better. From Todd W. Lainhart: Take a look at THINGS, a VAPI with Ada bindings that was written by the US Air Force (SAC). It's in the public domain, and available from export or gatekeeper.dec.com. It implements Motif or OL look-and-feel. [I had a look and it seemed to be missing documentation - Jan] From David Lewis: A company called Rational appears to be making an Xm implementation. Also GHG in Texas has most other Xlib and Xt bindings for Ada. From comp.windows.x FAQ: Ada bindings to Motif, explicitly, will eventually be made available by the Jet Propulsion Laboratories, probably through the normal electronic means. Advance information can be obtained from dsouleles@dsfvax.jpl.nasa.gov, who may respond as time permits. Another set of bindings for Motif is being done by the University of Lowell; information is available from osfri@osf.org.[11/90] Telesoft is reported to be in the process of negotiating an agreement to license and distribute OSF/Motif Ada bindings with delivieries beginning in June (anticipated). The person to contact is: Bruce Sherman Vice President Corporate Communications for Telesoft 5959 Conerstone Court West San Diego, CA 92121-9891 (619)457-2700 Fax (619)452-1334 email: ucsd!telesoft!bds ------------------------------------------------------------------------------- Subject: 73) TOPIC: SPECIFIC PLATFORMS ------------------------------------------------------------------------------- Subject: 74) Is it easy to build Motif for a Sun? Answer: No pattern has emerged to problems about compiling Motif on the Sun (although people seem to have a lot of different minor problems), and many reports are that it is straightforward. Read the Motif install instructions (which often have specific reference to Sun installation), light the blue touch paper and just standback. [My experience was that I had to add -D_NO_PROTO for 1.1 on a Sparc OS 4.1, and that was all]. ------------------------------------------------------------------------------- Subject: 75) I tried to make shared libraries on a Sun, and got the message "ld.so: Undefined symbol: __XtInherit" when executing UIL. What did I do? Answer: There is a problem in shared library build when you compare a function variable to a routine name, but don't call the routine. Either, you can build the Xt library nonshared, or you can put a reference to XtToolkitInitialize in the UIL main program (or even include a module that references it). The routine doesn't even have to be called; it just has to be there. ------------------------------------------------------------------------------- Subject: 76) Has anyone made shared libraries on an IBM RS/6000? Answer: From Sakari Jalovaara: There is a problem: Xm redefines VendorShell and the AIX linker put _both_ Xm's and Xt's VendorShell into programs. When an AIX shared library is created as many references inside the library are resolved as possible. If the symbol vendorShellClassRec is defined in libXt and referenced, say, from a function XtFoo() also in libXt, the "ld" run that creates the shared library resolves the reference: XtFoo() -> vendorShellClassRec Then I create the Motif library that has its own vendorShellClassRec and an XmBar() function that uses it; libXm will also contain a resolved reference to vendorShellClassRec: XmBar() -> vendorShellClassRec Finally, I link a program that uses both XtFoo() and XmBar() and the program will end up with _two_ independent "vendorShellClassRec"s: XtFoo() -> vendorShellClassRec [Xt version] XmBar() -> vendorShellClassRec [Xm version] Instand schizo zaphod mode. In reality, vendorShellClassRec is not referenced from functions but from other widget class records. I can't just pull Vendor.o out from the shared Xt (Vendor.o appears to define the only external symbols redefined by libXm) because AIX shared libraries apparently can't contain unresolved external references. If I take out Vendor.o I have to take out every other file that uses symbols defined there - and then files that need those files, etc. I tried it and ended up with three or four object files in libXt and the res non-sharable. I kludged around this by putting all of libXt (minus Vendor.o) into the shared libXm. It isn't a pretty solution but it works - and beats having a statically linked two-megabyte "periodic" demo... ------------------------------------------------------------------------------- Subject: 77) TOPIC: KEYSYMS ------------------------------------------------------------------------------- Subject: 78)* What is causing the messages "unknown keysym osfDown..."? It happens when I run an application under Motif 1.1 Answer: There is an OSF supplied addition to the /usr/lib/X11/XKeysymDB file. It is found on the release tape and should have been automatically installed if the installation procedure was followed in the Release Notes. You have to copy (or append) lib/Xm/XKeysymDB into /usr/lib/X11. This may require root permission. It is not clear how to fix the problem if you can't do this. The error comes from Xt translation table parsing and can't be fixed in Motif, so if you can't get root permission you may be stuck. The file is not copyrighted so you can install it on other systems. XKeysymDB simply contains the registered keysym values for the OSF keysyms. The OSF values are server-independent. And, all registered keysyms will be included in an XKeysymDB file to be shipped with X11R5. In the meantime (till all systems are X11R5+), a list of the registered keysyms can be found in the X11R4 release in mit/doc/Registry/Xregistry. ------------------------------------------------------------------------------- Subject: 79)+ What happens if I can't install Motif Keysyms? From: tessi!george@nosun.West.Sun.COM (George Mitchell) Here's what appears to happen if you don't have XKeysymDB in place to define OSF's virtual keysyms: 1. At class initialize time, for a widget (such as XmText) that uses virtual keysyms in its event translation table, all entries which refer to those keysyms fail to parse correctly. In the case of XmText, instead of ending up with a translation table with roughly 90 entries, you end up with one that has 29. 2. XKeysymDB doesn't exist, so you'd assume that KeyPress events will get translated to plain vanilla keysyms, right? WRONG! All Motif widgets install a virtual keysym translator ANYWAY! Consequently, the backspace key (for example) gets translated to the keysym osfBackSpace. 3. Therefore, if you augment or override your widget's translations with translations that refer to plain vanilla BackSpace, they will never be triggered, because you will NEVER see plain vanilla BackSpace, only osfBackSpace. 4. But you can't use osfBackSpace in an event translation entry, because you don't have XKeysymDB installed! Here's how I'm "dealing" with the problem right now: Motif installs its virtual keysym translator by calling XtSetKeyTranslator every time a VendorShell (or subclass) widget is created. So every time I create a shell, I immediately call XtSetKeyTranslator (display, XtTranslateKey) to restore the default translator. No more funny virtual keysyms! Now I can reinstall non-osfKeySym translations and have them work the way I expect. ------------------------------------------------------------------------------- Subject: 80)+ Why has OSF introduced Keysyms into Motif 1.1? They weren't there in Motif 1.0. Answer: From: ellis@osf.org Virtual Keysyms are meant to provide a consistent keyboard model for Motif applications running in a heterogeneous environment in which proprietary (i.e. vendor specific) non-Motif applications may also be running. First of all, for the sake of the rest of the readers, let's explain why this is an issue: It would be lovely if Motif's translation tables could just use the obvious keysyms predefined by X. For example, there are keysyms for XK_BackSpace, XK_Delete, XK_Left, XK_Right, etc. Shouldn't these be the ones that are used in our translations? Unfortunately, the problem is not so simple. Some specific examples: While most vendors bind XK_BackSpace to the key at the top right of the standard keyboard (often engraved with a leftwards pointing arrow), not all do. In fact, some vendors (including DEC) bind that key to XK_Delete. While most vendors bind the arrow keys to XK_Up, etc, a number of vendors (including Sun, on some servers) bind them to function key keysyms. A simplistic solution would require the use of xmodmap to change the offending bindings. That would work swell in an all Motif environment. However, OSF's goal (not always pefectly achieved) is interoperability. That is, we'd like to make sure that both Motif and non-Motif programs can happily run in the same environment. It is expected that a vendor may have a wide variety of existing X-based software that uses the keysyms as established by that vendor for specific purposes. It is expected that these applications may run at the same time as Motif-based software. Using xmodmap to change keysyms on the server side could "break" the existing applications (or at the very least their documentation) by making some keys unavailable, or by moving the location. So, we chose not to use xmodmap. By the way, though OpenLook uses a different implementation (they recompile their virtual translation tables into actual translation tables), they basically adopted the same approach, presumably for similar reasons. To work properly, the virtual keysym model we implemented depends on Xlib finding XKeysymDB installed appropriately (which standard Motif installation does). This simply defines the keysyms (not the key they are bound to). This unfortunate piece of stupidity is necessary because MIT only includes standard keysyms in keysymdef.h. It should be said that our lives would be made easier if MIT would also see fit to include registered keysyms in keysymdef.h as well. Motif applications determine how to bind virtual to actual keys by looking for either a resource or a property on the root window which describes what to do. Note that this information is on the server side, so that all applications use the same virtual bindings regrdless of where they are running. Mwm will happily create the property if it finds a .motifbind file in your home directory when it starts up. (Actually, things generally work even if none of this is done, since if all else fails, the Motif toolkit chooses a virtual bindings table to use based on the identification of the server). The actual implmentation of virtual keys is made possible by a hook in the Intrinsics. Undoubtably, the implementation would be simpler and cleaner if virtual key support was more directly supported by the Intrinsics. We will be exploring this possibility in the future. -- Ellis ------------------------------------------------------------------------------- Subject: 81) TOPIC: MISCELLANEOUS ------------------------------------------------------------------------------- Subject: 82) How can tell I if the user has selected the "Close" item on the system menu attached to the top-level shell? I need to do some clean up before exiting. Answer: void FinalCleanupCB(w, client_data, call_data) Widget w; caddr_t client_data, call_data; { /* tidy up stuff here */ ... /* exit if you want to */ exit (0); } main() { Atom wm_delete_window; ... XtRealizeWidget(toplevel); ... wm_delete_window = XmInternAtom(XtDisplay(toplevel), "WM_DELETE_WINDOW", False); XmAddWMProtocolCallback(toplevel, wm_delete_window, FinalCleanupCB, NULL); XtMainLoop(); } To just turn the close option off, set the shell resource XmNdeleteResponse to XmDO_NOTHING. This means that users cannot kill your application via the system menu, and may be a bad thing. ------------------------------------------------------------------------------- Subject: 83) Why does an augment translation appear to act as replace for some widgets? When I use either augment or override translations in .Xdefaults it seems to act as replace in both Motif 1.0 and 1.1 Answer: By default, the translation table is NULL. If there is nothing specified (either in resource file, or in args), the widget's Initialize finds: Oh, there is NULL in translations, lets use our default ones. If, however, the translations have become non-NULL, the default translations are NOT used at all. Thus, using #augment, #override or a new table has identical effect: defines the new translations. The only way you can augment/override Motif's default translations is AFTER Initialize, using XtSetValues. Note, however, that Motif managers do play with translation tables as well ... so that results are not always easy to predict. From OSF: A number of people have complained about not being able to augment/override translations from the .Xdefaults. This is due to the complexity of the menu system/keyboard traversal and the necessary translations changes required to support the Motif Style Guide in menus. It cannot be fixed in a simple way. Fixing it requires re-design of the menus/buttons and it is planned to be fixed in 1.2. ------------------------------------------------------------------------------- Subject: 84) How do you "grey" out a widget so that it cannot be activated? Answer: Use XtSetSensitive(widget, False). Do not set the XmNsensitive resource directly yourself (by XtSetvalues) since the widget may need to talk to parents first. ------------------------------------------------------------------------------- Subject: 85) Why doesn't the Help callback work on some widgets? 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. ------------------------------------------------------------------------------- Subject: 86)+ Where can I get the Table widget? Answer: Send email to Kee Hinkley (nazgul@alfalfa.com) asking for a copy of his table widget. ------------------------------------------------------------------------------- Subject: 87)* Has anyone done a bar graph widget? Answer: You can fake one by using for each bar a scroll bar or even a label which changes in size, put inside a container of some kind. Try the StripChart widget in the Athena widget set. Set the XtNupdate resource to 0 to keep it from automatically updating. The comp.windows.x FAQ mentions a bar graph widget. ------------------------------------------------------------------------------- Subject: 88) Does anyone know of a source code of a graph widget where you can add vertices and edges and get an automated updating? Answer: No Motif one has been reported. The XUG FAQ in comp.windows.x includes information on graph display widgets. There is also an implementation in the Asente/Swick book. From Martin Janzen: Well, it's not a widget set, but have you looked at DataViews? This package lets you create a wide variety of graphs, which can display information received from data sources such as files, processes (through pipes), or devices. The graphs can be made to change in real time as new data arrives. There's also a function library which lets you work with graphs under program control. X drivers are included. From Craig Timmerman: Just wanted others to know that there is a third competitor in what may be come a big market for generic APIs. The product is called Open Interface and Neuron Data is the vendor. Neuron has added some extra, more complex widgets to their set. The two most notable are a table and network widget. [...] I believe that the network widget got its name from its ability to display expert system networks that Neuron's AI tools needed. It would be more aptly named the graph widget. It can display and manipulate graphs of various types (trees, directed graphs, etc). Contact is Neuron Data 156 University Avenue Palo Alto, CA 94301 (415) 321-4488 ------------------------------------------------------------------------------- Subject: 89)+ Is there a help system available, such as in Windows 3? Or any Motif based hypertext system. Answer: None reported as yet. ------------------------------------------------------------------------------- Subject: 90)+ 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, XmRWidget, XmuCvtStringToWidget, parentCvtArgs, XtNumber(parentCvtArgs)); } ------------------------------------------------------------------------------- Subject: 91)+ 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: 92) TOPIC: ACKNOWLEDGEMENTS This list was compiled using questions and answers posed to comp.windows.x.motif and motif-talk. Some extracts were also taken from FAQs of comp.windows.x. To all who contributed one way or the other, thanks! I haven't often given individual references, but you may recognise contributions. If I have mangled them too much, let me know. That's all folks! +----------------------+---+ 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 +--------------------------+ Local Variables: mode: outline outline-regexp: "Subject: +[0-9]+)" eval: (hide-body) End: