home *** CD-ROM | disk | FTP | other *** search
/ ftp.uv.es / 2014.11.ftp.uv.es.tar / ftp.uv.es / doc / FAQ-Motif < prev    next >
Internet Message Format  |  1992-02-11  |  114KB

  1. From: jan@PANDONIA.CANBERRA.EDU.AU (Jan Newmarch)
  2. Newsgroups: comp.windows.x.motif
  3. Subject: (none)
  4. Message-ID: <9201312205.AA26286@pandonia.canberra.edu.au>
  5. Date: 1 Feb 92 14:05:04 GMT
  6. Sender: daemon@ucbvax.BERKELEY.EDU
  7. Distribution: inet
  8. Organization: The Internet
  9. Lines: 968
  10.  
  11. Subject: Frequently Asked Questions about Motif
  12. Expires: Fri, 6 Mar 92 00:00:00 GMT
  13.  
  14. [Last changed: 11 Nov 91]
  15.  
  16. This article contain the answers to some Frequently Asked Questions (FAQ) 
  17. often seen in comp.windows.x.motif. It is posted to help reduce volume in 
  18. this newsgroup and to provide hard-to-find information of general interest.
  19.  
  20.         Please redistribute this article!
  21.  
  22. This article includes answers to the following questions. Ones marked with
  23. a + indicate questions new to this issue; those with changes of content since
  24. the last issue are marked by *:
  25.  
  26.  0) TOPIC: WHAT ARE OTHER RELEVANT NEWSGROUPS?
  27.  1) TOPIC: FTP ARCHIVES
  28.  2) Is the FAQ list available for FTP anywhere?
  29.  3) Is this newsgroup archived?
  30.  4) Is the mail list motif-talk archived?
  31.  5) TOPIC: OSF AND MOTIF
  32.  6) What versions of Motif are there?
  33.  7) Where can I get Motif?
  34.  8) Where can I get public domain Motif source?
  35.  9) Are the Motif examples publically available?
  36. 10) Has anyone done a public domain Motif lookalike?
  37. 11) Does anyone from OSF pay attention to our questions/suggestions?
  38. 12) Does OSF have an application compliance validation service?  
  39. 13) What is the motif-talk mailing list?
  40. 14) What MIT patches do I use, and when do I use fix-osf?
  41. 15) How does Motif work with X11R5?
  42. 16) TOPIC: LITERATURE
  43. 17) What books should I read or do I need to program using Motif?
  44. 18) TOPIC: MWM
  45. 19) What is the difference between Motif and mwm?
  46. 20) Does anyone have an alternative set of 3-D defaults for a monochrome screen?
  47. 21)+ How can I modify the window manager decorations?
  48. 22) TOPIC: MOTIF GENERATORS
  49. 23)* What prototyping tools are there to generate Motif code?
  50. 24) TOPIC: TEXT WIDGET
  51. 25) Why does  pressing  <return> in a text widget do nothing?
  52. 26) When I add text to a scrolling text widget how can I get the new text to show?
  53. 27) Does the text widget support 16 bit character fonts?
  54. 28) How can I stop the text widget from echoing characters typed?
  55. 29) How can I replace characters typed with say a `*'?
  56. 30) How can I best add a large piece of text to a scrolled text widget?
  57. 31) How can I highlight text in the Text widget?
  58. 32)+ How can I select all of the text in a widget programmatically?
  59. 33) How can I change colours of text in the Text widget?
  60. 34) How can I change the font of text in the Text widget?
  61. 35) Is there an emacs binding for the text widget?
  62. 36) How can I use a file as the text source for a Text widget?
  63. 37) How can put Text in overstrike mode instead of insert?
  64. 38) How can make the Delete key do a backspace?
  65. 39) TOPIC: LIST WIDGET
  66. 40) How do I best put a new set of items into a list?
  67. 41)+ Can I have strings with different fonts in a list?
  68. 42) Can I get a bitmap to show in a list item like I can in a Label?
  69. 43) Can I have items with different colours in a list?
  70. 44) Can I grey out an item in a list?
  71. 45) TOPIC: FILE SELECTION BOX WIDGET
  72. 46) What is libPW.a and do I need it?
  73. 47) What's wrong with the Motif 1.0 File Selection Box?
  74. 48) TOPIC: FORM WIDGET
  75. 49) Why don't labels in a Form resize when the label is changed?
  76. 50) How can I center a widget in a form?
  77. 51) How do I line up two columns of widgets of different types?
  78. 52) TOPIC: PUSHBUTTON WIDGET
  79. 53) Why can't I use accelerators on buttons not in a menu?
  80. 54) TOPIC: LABEL WIDGET
  81. 55) How can I align the text in a label (button, etc) widget?
  82. 56) Why doesn't label alignment work in a RowColumn?
  83. 57) How can I set a multiline label?
  84. 58)+ How can I have a vertical label?
  85. 59) TOPIC: DRAWING AREA WIDGET    
  86. 60) How can I send an expose event to a Drawing Area widget?
  87. 61) TOPIC: MENUS
  88. 62) What can I put inside a menu bar?
  89. 63) Can I have a cascade button without a submenu in a pulldown menu?
  90. 64) Should I have a cascade button without a submenu in a pulldown menu?
  91. 65) TOPIC: INPUT FOCUS
  92. 66) How can I direct the keyboard input to a particular widget?
  93. 67) How can I have a modal dialog which has to be answered before the application can continue?
  94. 68) TOPIC: MEMORY AND SPEED
  95. 69) Why does my application grow in size?
  96. 70) Why does my application take a long time to start up?
  97. 71) My application is running too slowly. How can I speed it up?
  98. 72) TOPIC: XMSTRING
  99. 73) How can I get the Ascii text out of an XmString?
  100. 74) When can XmStrings used as resources be freed?
  101. 75) Why doesn't XmStringGetNextSegment() work properly?
  102. 76) TOPIC: DIALOGS
  103. 77) How do I stop my dialog disappearing when I press the help button?
  104. 78) How do I make my own dialog?
  105. 79) How come the title bars for my dialogs now have "_popup" or "<-popup" concatenated onto the widget name?
  106. 80) How can I force a dialog window to display?
  107. 81) How can I control placement of a popup widget?
  108. 82) TOPIC: LANGUAGE BINDINGS
  109. 83) Is there a C++ binding for Motif?
  110. 84) Is there a Common Lisp binding for Motif?
  111. 85) Is there an Ada binding for Motif?
  112. 86) TOPIC: SPECIFIC PLATFORMS
  113. 87) Is it easy to build Motif for a Sun?
  114. 88) What compile errors/warnings might I get in both Sun 3 and Sun 4?
  115. 89) On a Sun 3, what are the mwm startup error messages about?
  116. 90) Are there problems making shared libraries on a Sun?
  117. 91) Has anyone made shared libraries on an IBM RS/6000?
  118. 92) TOPIC: KEYSYMS
  119. 93) What is causing the messages "unknown keysym osfDown..."?
  120. 94) What happens if I can't install Motif Keysyms?
  121. 95) Why has OSF introduced Keysyms into Motif 1.1?
  122. 96) TOPIC: ICONS
  123. 97) How can I keep track of changes to iconic/normal window state?
  124. 98) How can I check if my application has come up iconic?
  125. 99) How can I start my application in iconic state?
  126. 100) How can an application iconify itself?
  127. 101) How can an application de-iconify itself?
  128. 102) TOPIC: MISCELLANEOUS
  129. 103)* How can tell I if the user has selected the "Close" item on the system menu attached to the top-level shell?
  130. 104) Why does an augment translation appear to act as replace for some widgets?
  131. 105) How do you "grey" out a widget so that it cannot be activated?
  132. 106) Why doesn't the Help callback work on some widgets?
  133. 107) Where can I get a Table widget?
  134. 108) Has anyone done a bar graph widget?
  135. 109) Does anyone know of a source code of a graph widget
  136. 110)* Is there a help system available, such as in Windows 3?
  137. 111) Can I specify a widget in a resource file?
  138. 112) Why are only some of my translations are being installed?
  139. 113) Where can I get the PanHandler code?
  140. 114) What are these passive grab warnings?
  141. 115) How do I have more buttons than three in a box?
  142. 116) TOPIC: ACKNOWLEDGEMENTS
  143.  
  144. If you have suggestions or corrections for any of these answers or any 
  145. additional information, please send them directly to jan@ise.canberra.edu.au;
  146. the information will be included in the next revision (or possibly the one 
  147. after that; thanks for the many suggestions which haven't been incorporated 
  148. yet).  The answers in this iteration are acknowledged to be partial.
  149.  
  150. This posting is intended to be distributed at approximately the beginning of 
  151. each month.
  152.  
  153. The information contained herein has been gathered from a variety of sources. In
  154. many cases attribution has been lost; if you would like to claim responsibility
  155. for a particular item, please let us know. 
  156.  
  157. Conventions used below: telephone numbers tend to be Bell-system unless 
  158. otherwise noted; prices on items are not included.
  159.  
  160.  
  161.  
  162.  
  163.  
  164.  
  165.  
  166. -------------------------------------------------------------------------------
  167. Subject:  0) TOPIC: WHAT ARE OTHER RELEVANT NEWSGROUPS?
  168.  
  169. Answer: This newsgroup is comp.windows.x.motif.  The nearest related group is
  170. comp.windows.x.  It also maintains an FAQ, which deals in all sorts of X, Xlib
  171. and Xt questions. Look there for answers to questions such as "How do I get a
  172. screendump of my application?", "where do I get X11R4", etc.  Other groups which
  173. may have relevant information are comp.windows.news, comp.windows.misc and
  174. comp.windows.open-look.
  175.  
  176. -------------------------------------------------------------------------------
  177. Subject:  1) TOPIC: FTP ARCHIVES
  178.  
  179. -------------------------------------------------------------------------------
  180. Subject:  2) Is the FAQ list available for FTP anywhere?
  181.  
  182. Answer: A number of FAQ's (including this one) are available for anonymous ftp
  183. at pit-manager.mit.edu, 18.72.1.58 under the directory pub/usenet.  (Motif is
  184. under pub/usenet/comp.windows.x.motif) There is also a mail server called mail-
  185. server@pit-manager.mit.edu.  To retrieve a file send mail to the server with a
  186. subject or body similar to
  187.  
  188.         send usenet/comp.windows.x.motif/Frequently_Asked_Questions_About_Motif_(Part_1_of_3)
  189.  
  190. This service is looked after by Jonathan Kamens (jik@pit-manager.mit.edu).
  191.  
  192. It has also been placed in contrib/Motif-FAQ at export.lcs.mit.edu.
  193.  
  194. -------------------------------------------------------------------------------
  195. Subject:  3) Is this newsgroup archived?
  196.  
  197. Answer: A number of individuals are archiving the group for their own records,
  198. but no-one has set up an FTP-able archive yet.
  199. [Does anyone have a free 10Meg or so?]
  200.  
  201.  
  202. -------------------------------------------------------------------------------
  203. Subject:  4) Is the mail list motif-talk archived?
  204.  
  205. Answer: If you have purchased support from OSF then you have access to their
  206. archive server for motif-talk.
  207.  
  208. -------------------------------------------------------------------------------
  209. Subject:  5) TOPIC: OSF AND MOTIF
  210.  
  211. -------------------------------------------------------------------------------
  212. Subject:  6) What versions of Motif are there?
  213.  
  214. Answer: Motif 1.0 is based on the R3 toolkit.  There are patch releases to 1.0:
  215. 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
  216. it involved a complete re-engineering of UIL and Mrm.  Almost everyone who has
  217. 1.0.x has either 1.0.A or 1.0.3.  There are not expected to be further patches
  218. to 1.0.
  219.  
  220. Motif 1.1 is based on the R4 toolkit.  The current version is Motif 1.1.0, plus
  221. a couple of patches available to full support contract holders. Motif 1.1.1 has
  222. been released as a patch to licensees with Full Support or Technical Update
  223. service.  Motif 1.1.2 is a patch release which contains the necessary changes to
  224. fix over 80 bugs reported against Motif. It is available to support contract
  225. holders (including both full support and update service).  The 1.1.3 release
  226. fixes a further 150 bugs and is available from August 1991 to support contract
  227. holders (including both full support and update service).  Future 1.1 patch
  228. releases are tentatively scheduled as follows:
  229.  
  230.  
  231.  
  232.         1.1.4   4th quarter 1991
  233.         1.1.5   1st half 1992
  234.  
  235.  
  236. Motif 1.2 is not expected until early 1992, and will be based on the R5 toolkit.
  237.  
  238. -------------------------------------------------------------------------------
  239. Subject:  7) Where can I get Motif?
  240.  
  241. Answer:
  242.     Various hardware vendors produce developer's toolkits of binaries, header
  243. files, and documentation; check your hardware vendor, particularly if that
  244. vendor is an OSF member. Systems known to be shipping now: HP (sans UIL), Apollo
  245. (sans UIL), SCO, ISC, Mips (RISCwindows=X11R3 + full Motif), IBM, Data General
  246. for AViioNs (includes UIL), Bull (?), Concurrent Computer Corporation 5000,
  247. 6000, 8000 series machines, Convex, Sequent.
  248.  
  249.     In addition, independent binary vendors produce Motif toolkits . ICS makes
  250. several binary kits, notably for Sun, DEC, Apple; Quest (408-988-8880) sells
  251. kits for Suns, as well; IXI (+44 223 462 131) offers kits for Sun3 (SunOS 3.5 or
  252. later, and Sun4 (SunOS 4.0.1 or later). Unipalm XTech (+44 954211862; or Aurora
  253. Technologies 617-577-1288 in USA) offers a binary kit for Suns based on Motif
  254. 1.1, with shared libraries.  NSL (+33 (1) 43 36 77 50; requests@nsl.fr) offers
  255. kits for the Sun 3 and Sun 4.  [An FAQ is for "personal opinions" on these
  256. toolkits.  I don't think it is appropriate to give such opinions through this
  257. particular posting, so I haven't included any.] In Australia, Information
  258. Technology Consultants Pty Ltd has Motif 1.1.2 for Sun Sparc 4.1 ( phone on (02)
  259. 360 6999, fax on (02) 360 6695 or e-mail to motif@itcsyd.itc.oz.au)
  260.  
  261.  
  262.   The kits include varied levels of bug-fixing and support for shared libraries.
  263. BIM (Fax : +32(2)759.47.95) offer Motif 1.1 for Sun-3, Sun-4, Sun-386i. Includes
  264. shared libraries.  Metrolink Inc. (+1-305-566-9586, sales@metrolink.com; in
  265. Europe contact ADNT, (33 1) 3956 5333) ships an implementation of X11R4 and
  266. Motif 1.1 for several 386 systems.
  267.  
  268.     An OSF/Motif source license must be obtained from OSF before source can be
  269. obtained from the Open Software Foundation. Call the Direct Channel Desk at OSF
  270. at 617-621-7300 or email direct@osf.org for ordering information.  In addition
  271. to the full Motif source, "option C" allows you to purchase source for the
  272. window manager mwm to run on X terminals.
  273.  
  274.  
  275.  
  276.  
  277. -------------------------------------------------------------------------------
  278. Subject:  8) Where can I get public domain Motif source?
  279.  
  280. Answer: You cannot.  Motif source is not publically available.
  281.  
  282. -------------------------------------------------------------------------------
  283. Subject:  9) Are the Motif examples publically available?
  284.  
  285. Answer: OSF has produced a list of which of the example programs can be
  286. distributed. Call OSF Direct for a copy of it.  Most of the example programs
  287. have been freed from distribution limitations so should be available.
  288.  
  289.  
  290. -------------------------------------------------------------------------------
  291. Subject: 10) Has anyone done a public domain Motif lookalike?
  292.  
  293. Answer: Not yet.  The specification is available (AES), and the validation suite
  294. can be bought, but no-one has taken up the challenge.  There are some commercial
  295. lookalikes (Looking Glass and Neuron Data), but no workalikes.
  296.  
  297. -------------------------------------------------------------------------------
  298. Subject: 11) Does anyone from OSF pay attention to our questions/suggestions?
  299.  
  300. Answer: Yes, and they quite often post answers too. But they may not respond to
  301. *your* problem because they have other things to do as well.  This newsgroup is
  302. not run by OSF, and has no formal connection with OSF.  OSF is a member-driven
  303. company.  The membership (and anyone can be a member) provides the primary input
  304. for future development of Motif.
  305.  
  306. -------------------------------------------------------------------------------
  307. Subject: 12) Does OSF have an application compliance validation service?
  308.  
  309. Answer: They have a checklist and a certification process which you can request
  310. from them.  Ask for the Level One Certification Checklist.  The process is one
  311. of self-certification.  It tests only the appearance and behavior of the
  312. application against Motif style.  The product will also be put in the OSF
  313. reference listing.  There's a one-time fee of $250.  According to the master
  314. license agreement, you can't use any OSF identifying mark unless you have done a
  315. certification.
  316.  
  317.  
  318. -------------------------------------------------------------------------------
  319. Subject: 13) What is the motif-talk mailing list?
  320.  
  321. Answer: The motif-talk mailing list is only for those who have purchased a Motif
  322. source code license. You can be placed on this list by emailing to motif-talk-
  323. request, citing your Company name and source license number.
  324.  
  325.  
  326.  
  327. -------------------------------------------------------------------------------
  328. Subject: 14) What MIT patches do I use, and when do I use fix-osf?
  329.  
  330. Answer: The Motif 1.1.0 tape contains MIT patches 1-14. Apply these and any
  331. others you can get.  If your MIT patch level only goes up to fix-16, you also
  332. need to apply fix-osf.  Fix-osf was an emergency patch for a problem that
  333. existed when the Motif 1.1 tape was cut, The MIT fix-17 completely superseded
  334. osf-fix, so if you have applied fix-17 do not apply fix-osf.  The 1.1.1 tape
  335. contains MIT fixes 15-18, as well as an OSF-developed fix that deals with a
  336. subtle bug in the Selection mechanism of the Intrinsics.  Most people will have
  337. fix-15 to 18 by now; if you don't have them:
  338.  
  339.         Back out fix-osf if you have applied it
  340.         Apply fix-15 to 18
  341.         Apply fix-osf-1.1.1
  342.  
  343. The Selection fix was submitted to MIT, who came up with a diferent fix.  It
  344. will not be made into an R4 fix but should be in R5. The MIT fix was posted to
  345. motif-talk.
  346.  
  347.  
  348. -------------------------------------------------------------------------------
  349. Subject: 15) How does Motif work with X11R5?
  350.  
  351. Answer: Motif 1.1.X is only intended to be built with X11R4.  Motif 1.2.X is for
  352. X11R5.  however, Motif 1.1.4 has been set to also work with X11R5.
  353.  
  354. For versions of Motif before this you will need to compile Xlib and Xt with a
  355. MOTIF_BC flag set to YES (page 8, section 3.3 of the R5 release notes), or
  356. you'll also have a link problem (LowerCase) and a fatal run time problem
  357. (XContext manager).  If your applications come up with "Unknown keysym name:
  358. osfActivate" errors, check the variable ProjectRoot. The name
  359. /$PROJECTROOT/lib/XKeysymDB will have been wired into your Xlib.
  360.  
  361. Mrm won't work at all (can't link since it uses an X private variable that has
  362. disappeared in R5).  Thre is an MIT patch that may fix this??  [I confess
  363. ignorance of Mrm and UIL].
  364.  
  365. In Motif 1.1, XtCallCallback uses NULL as the first argument instead of a widget
  366. ID. This was ok under R4, but must be changed in the source for R5. It was
  367. changed by OSF from Motif 1.1.1 onward.
  368.  
  369.  
  370. -------------------------------------------------------------------------------
  371. Subject: 16) TOPIC: LITERATURE
  372.  
  373. -------------------------------------------------------------------------------
  374. Subject: 17) What books should I read or do I need to program using Motif?
  375.  
  376. Answer: Ken Lee of the DEC Western Software Laboratory (klee@wsl.dec.com)
  377. regularly posts to comp.windows.x and ba.windows.x a list of reference books and
  378. articles on X and X programming.  In FAQ comp.windows.x an extract of his list
  379. appears. Specifically for Motif programming, though:
  380.  
  381. OSF/Motif Programmers Guide, Prentice-Hall 13-640525-8 (Motif 1.0) ISBN 0-13-
  382. 640681-5 (Motif 1.1) (NB: This makes use of the demo programs that you get with
  383. a Motif source license.  The programs are not included and may or may not be
  384. available on your system.)
  385.  
  386. OSF/Motif Programmers Reference Manual, Prentice-Hall 13-640517-17 (Motif 1.0)
  387.  ISBN 0-13-640616-5 (Motif 1.1) You will need this for the system calls.
  388.  
  389. OSF/Motif Style Guide, Prentice-Hall 13-640491-X (Motif 1.0) ISBN 0-13-640673-4
  390. (Motif 1.1) You will need this to get some idea of how to write programs with
  391. the correct `look and feel'.
  392.  
  393. You should read at least one of the the non-OSF books on Motif:
  394.  
  395. Young, Doug. "The X Window System: Applications and Programming with Xt (Motif
  396. Version)," Prentice Hall, 1989 (ISBN 0-13-497074-8). The excellent tutorial "X
  397. Window Systems Programming and Applications with Xt," (ISBN 0-13-972167-3)
  398. updated for Motif. [The examples from the Motif version are available on export
  399. in ~ftp/contrib/young.motif.tar.Z]
  400.  
  401. Marshall Brain at brain@adm.csc.ncsu.edu posted a set of simple and useful Motif
  402. tutorials.
  403.  
  404. Berlage, Thomas Berlage, OSF/Motif: Concepts and Programming, Addison-Wesley,
  405. UK, 1991. ISBN 0-201-55792-4.
  406.  
  407. Johnson, Eric F. and Kevin Reichard, Power Programming Motif, MIS: Press,
  408. Portland, OR, 1991. ISBN 1-55828-059-6. Book with disk, ISBN 1-55828-061-8.
  409.  
  410. You will also need books and references on Xt such as:
  411.  
  412. Asente, Paul J., and Swick, Ralph R., "X Window System Toolkit, The Complete
  413. Programmer's Guide and Specification", Digital Press, 1990.  The bible on Xt. A
  414. treasury of information, excellent and invaluable.  Distributed by Digital
  415. Press, ISBN 1-55558-051-3, order number EY-E757E-DP; and by Prentice- Hall, ISBN
  416. 0-13-972191-6.
  417.  
  418. Nye, Adrian, and Tim O'Reilly, "X Toolkit Programming Manual, Volume 4,"
  419. O'Reilly and Associates, 1989. The folks at O'Reilly give their comprehensive
  420. treatment to programming with the MIT Intrinsics; R4 versions are now available,
  421. as is a Motif 1.1 version (Volume 4M).
  422.  
  423.  
  424. O'Reilly, Tim, ed.,  "X Toolkit Reference Manual, Volume 5," O'Reilly and
  425. Associates, 1989.  A professional reference manual for the MIT X11R3 Xt; some
  426. information on X11R4 is included.
  427.  
  428. Books and reference manuals on Xlib may also be useful.
  429.  
  430.  
  431.  
  432. -------------------------------------------------------------------------------
  433. Subject: 18) TOPIC: MWM
  434.  
  435. -------------------------------------------------------------------------------
  436. Subject: 19) What is the difference between Motif and mwm?
  437.  
  438. Answer: mwm is a window manager. Motif itself is made up of four parts: a User-
  439. Interface Guideline, an API toolkit of `C' routines which helps in the building
  440. of applications which conform to the Guideline, the window manager mwm, and a
  441. language UIL which is designed to ease user interface development.  In general
  442. mwm will run an application built with any X-windows API, and in general an
  443. application built using the Motif toolkit will run under any window manager.
  444.  
  445.  
  446. -------------------------------------------------------------------------------
  447. Subject: 20) Does anyone have an alternative set of 3-D defaults for a
  448. monochrome screen?
  449.  
  450. Answer: This is obviously a matter of taste. Some alternatives suggested include
  451.  
  452. !Benjamin Schreiber, bs@osf.osf.org, bs@cs.brandeis.edu
  453. Mwm*foreground:                 black           ! Actually, when a window is
  454. Mwm*background:                 white           ! deactivated, the background
  455. Mwm*backgroundPixmap:           50_foreground   ! becomes white, insted of
  456. Mwm*topShadowPixmap:            white           ! 50% foreground (grey)
  457.  
  458. Mwm*activeForeground:           black
  459. Mwm*activeBackground:           white
  460. Mwm*activeBackgroundPixmap:     50_foreground
  461. Mwm*activeTopShadowPixmap:      white
  462.  
  463. Mwm*menu*backgroundPixmap:      background
  464. Mwm*menu*topShadowPixmap:       50_foreground
  465.  
  466. Mwm*title*foreground:                   black
  467. Mwm*title*background:                   white
  468. Mwm*title*backgroundPixmap:             white
  469. Mwm*title*topShadowPixmap:              50_foreground
  470. Mwm*title*activeForeground:             white
  471. Mwm*title*activeBackground:             black
  472. Mwm*title*activeBackgroundPixmap:       black
  473. Mwm*title*activeBottomShadowPixmap:     50_foreground
  474.  
  475. Mwm*feedback*backgroundPixmap:          white
  476.  
  477. or
  478.  
  479. ! From: tsang@isi.com (Kam C. Tsang)
  480. Mwm*background:                      White
  481. Mwm*activeBackground:                White
  482. Mwm*activeBackgroundPixmap:          25_foreground
  483. Mwm*foreground:                      Black
  484. Mwm*activeForeground:                Black
  485. Mwm*menu*background:                 white
  486. Mwm*menu*foreground:                 black
  487. xterm*Foreground:                    black
  488. xterm*Background:                    white
  489.  
  490.  
  491. or
  492.  
  493. ! From: ucsd.edu!usc!snorkelwacker!paperboy!yee  (Michael K. Yee)
  494. Mwm*cleanText:                          True
  495.  
  496. Mwm*activeBackground:           white
  497. Mwm*activeForeground:           black
  498. Mwm*background:                 white
  499. Mwm*foreground:                 black
  500.  
  501. Mwm*client*activeBackgroundPixmap:      50_foreground
  502. Mwm*client*activeTopShadowPixmap:       foreground
  503. Mwm*client*activeBottomShadowPixmap:    background
  504.  
  505. !Mwm*client*background:                 white
  506. !Mwm*client*foreground:                 black
  507. Mwm*client*backgroundPixmap:            75_foreground
  508. Mwm*client*topShadowPixmap:             foreground
  509. Mwm*client*bottomShadowPixmap:          background
  510.  
  511. !Mwm*feedback*background:               white
  512. !Mwm*feedback*foreground:               black
  513. Mwm*feedback*backgroundPixmap:          50_foreground
  514. !Mwm*feedback*topShadowPixmap:          25_foreground
  515. !Mwm*feedback*bottomShadowPixmap:       background
  516.  
  517. !Mwm*menu*background:                   white
  518. !Mwm*menu*foreground:                   black
  519. Mwm*menu*backgroundPixmap:              foreground
  520. !Mwm*menu*topShadowPixmap:              foreground
  521. !Mwm*menu*bottomShadowPixmap:           background
  522.  
  523. !Mwm*icon*background:                   white
  524. !Mwm*icon*foreground:                   black
  525. Mwm*icon*activeBackgroundPixmap:        50_foreground
  526. Mwm*icon*activeBottomShadowPixmap:      foreground
  527. Mwm*icon*backgroundPixmap:              75_foreground
  528.  
  529.  
  530.  
  531. -------------------------------------------------------------------------------
  532. Subject: 21)+ How can I modify the window manager decorations?
  533.  
  534. Answer: In resource files, use the window manager's client resource (which is
  535. the application) and the resource clientDecoration:
  536.  
  537. Mwm*XClock.clientDecoration:   none
  538.  
  539. turns off all clock decorations.  See the mwm(1) entry for other possibilites.
  540.  
  541. Programmatically, set the VendorShell resource XmNmwmDecorations to appropriate
  542. values: MWM_DECOR_NONE (or a bitwise or of values).
  543.  
  544. -------------------------------------------------------------------------------
  545. Subject: 22) TOPIC: MOTIF GENERATORS
  546.  
  547. -------------------------------------------------------------------------------
  548. Subject: 23)* What prototyping tools are there to generate Motif code?
  549.  
  550.  
  551. Answer: [An FAQ is for "personal opinions" on these tools.  I don't think it is
  552. appropriate to give such opinions through this particular posting, so I haven't
  553. included any.]
  554.  
  555. `Prototyping tools' come in two forms: those that can be used to design the
  556. interface only (GUI builder), and those that go beyond this to give support for
  557. application code (User Interface Management Systems).  There are a number of
  558. commercial and non-commnercial tools of both kinds that will support the Motif
  559. interface.  They include:
  560.  
  561. GUI builders:
  562.  
  563. Builder Xcessory
  564. X Build
  565. ExoCODE/xm
  566.  
  567.  
  568. UIMS:
  569.  
  570. WINTERP
  571. Widget Creation Library
  572. UIMX
  573. Serpent
  574. TeleUse
  575. X-Designer
  576. XFaceMaker2
  577. MOTIFATION
  578.  
  579.  
  580. Some contact addresses are:
  581.  
  582. WINTERP: You may obtain the current source, documentation, and examples via
  583. anonymous ftp from host export.lcs.mit.edu: in directory contrib/winterp you
  584. will find the compress(1)'d tar(1) file winterp.tar.Z. If you do not have
  585. Internet access you may request the source code to be mailed to you by sending a
  586. message to winterp-source%hplnpm@hplabs.hp.com or hplabs!hplnpm!winterp-source.
  587.  
  588. Serpent: The S/W is free (anonymous ftp) from fg.sei.cmu.edu.  For more info
  589. contact erik/robert at serpent-info@sei.cmu.edu.
  590.  
  591. TeleUse: In the U.K., send mail to xtech@unipalm.co.uk or call +44 954 211862.
  592. In the US call Telesoft at (619) 457-2700 or write TeleSoft, 5959 Cornerstone
  593. Court West, San Diego, California 92121.
  594.  
  595. Builder Xcessory from ICS.  More details are available by sending a request to
  596. info@ics.com.  617.547.0510
  597.  
  598. X-Designer: From Imperial Software Technology in the UK.  Email address is
  599. sales@ist.co.uk.  (+44) 743 587055
  600.  
  601. ExoCODE/xm: From Expert Object Corp., 7250 Cicero Avenue, Lincolnwood, IL 60646
  602. (708)676-5555.
  603.  
  604. X Build: From Nixdorf Computer (Waltham, MA) xbuild@nixdorf.com
  605.  
  606.  
  607. ExoCode: From EXOC (Chicago, IL)
  608.  
  609. UIMX: Visual Edge Software Limited, 3870 Cote Vertu, St Laurent, Quebec, H4R
  610. 1V4, Phone: (514) 332-6430, Fax:   (514) 332-5914, or: Visual Edge Software
  611. Ltd., 101 First Street, Suite 443, Los Altos, CA 94022, Phone: (415) 948-0753,
  612. Fax:   (415) 948-0843
  613.  
  614. The Widget Creation Library: The distribution is available in several ways.  The
  615. preferred approach it for you to get the compressed tar file using anonymous ftp
  616. from:
  617.  
  618.     export.lcs.mit.edu    (18.30.0.238) /contrib/Wcl.1.06.tar.Z
  619.  
  620.  
  621. XFaceMaker2: NSL -  Non Standard Logics S.A., 57-59, rue Lhomond, 75005  Paris -
  622. France, Phone: +33 (1) 43.36.77.50, Fax:   +33 (1) 43.36.59.78 email:
  623. requests@nsl.fr or requests%nsl.fr@inria.fr for information.
  624.  
  625. Their North American office: Non Standard Logics, Inc., 4141 State Street, Suite
  626. B-11, Santa Barbara CA 93110, Tel: 805 964 9599, Fax: 805 964 4367
  627.  
  628.  
  629. MOTIFATION: AKA EDV, Universitaetsstrasse 125, 4630 Bochum, Germany, Tel: +49
  630. (0) 234 / 33397-0, Fax: +49 (0) 234 / 33397-40
  631.  
  632.  
  633.  
  634. -------------------------------------------------------------------------------
  635. Subject: 24) TOPIC: TEXT WIDGET
  636.  
  637. -------------------------------------------------------------------------------
  638. Subject: 25) Why does  pressing  <return> in a text widget do nothing?  This
  639. happens using Motif 1.0 when I have a text widget inside a bulletin board (or
  640. form) inside a dialog shell. (In Motif 1.1 it is fixed for both text and list
  641. widgets.)
  642.  
  643. Answer: In single line mode, pressing the <return> key usually invokes the
  644. activate() action, and in multi-line mode, the newline() action.  However,
  645. whenever a widget is the child of a bulletin board widget which is the child of
  646. a dialog shell, the bulletin board forces all of its children to translate
  647. <return> to the bulletin board action Return() which is usually associated with
  648. the default button of the dialog.  To restore the text actions of activate() or
  649. newline(), you need to overide the Return() action of the bulletin board.
  650.  
  651.  
  652.         /* declarations */
  653.         /* for a single line widget */
  654.         char newTrans[] = "<Key>Return : activate()";
  655.         /* for a multi line widget */
  656.         char newTrans[] = "<Key>Return : newline()";
  657.         XtTranslations transTable;
  658.  
  659.         /* in executable section */
  660.  
  661.         transTable = XtParseTranslationTable(newTrans);
  662.  
  663.         /* after creating but before managing text widget */
  664.  
  665.         XtOverrideTranslations(textWidget, transTable);
  666.  
  667.  
  668. -------------------------------------------------------------------------------
  669. Subject: 26) When I add text to a scrolling text widget how can I get the new
  670. text to show?
  671.  
  672. Answer: Use the call undocumented in Motif 1.0
  673.  
  674.         void XmTextShowPosition(w, position)
  675.         Widget w;
  676.         XmTextPosition position;
  677.  
  678. where the position is the number of characters from the beginning of the buffer
  679. of the text to be displayed. If you don't know how many characters are in the
  680. buffer, use another call undocumented in Motif 1.0
  681.  
  682.         position = XmTextGetLastPosition(w)
  683.  
  684.  
  685. -------------------------------------------------------------------------------
  686. Subject: 27) Does the text widget support 16 bit character fonts?
  687.  
  688. Answer: R5 will have support for 16 bit character sets, and Motif 1.2 will use
  689. that. You will have to wait until then.
  690.  
  691. -------------------------------------------------------------------------------
  692. Subject: 28) How can I stop the text widget from echoing characters typed?  I
  693. need to turn off echo for password input.
  694.  
  695. Answer: Use the modifyVerifyCallback to tell when input is received. Set the
  696. `doit' field in the XmTextVerifyCallbackStruct to False to stop the echo. In
  697. Motif 1.0 this will cause a beep per character: Live with it, because at 1.1 you
  698. can turn it off.  Note that password hiding is inherently insecure in X -
  699. someone may have an X grab on the keyboard and be reading all characters typed
  700. in anyway.
  701.  
  702. Another solution often proposed is to set the foreground and background colours
  703. to be the same, effectively hiding the text.  This has a major flaw: someone may
  704. select the text (triple click the mouse to get the line), and then paste the
  705. password into say an xterm with *different* foreground and background colours.
  706. This immediately shows the password.
  707.  
  708. -------------------------------------------------------------------------------
  709. Subject: 29) How can I replace characters typed with say a `*'?  I want to
  710. replace input for password entry.
  711.  
  712. Answer: In Motif 1.1  set text->ptr in the callback structure to '*'. This does
  713. not work under 1.0 because of an oversight in which changes to this are ignored.
  714. In Motif 1.0, what you can do is set the doit flag to 'false' so the text is not
  715. displayed. Then set a static boolean to True to prevent re-entrance.  Next call
  716. XmTextReplace() to display your '*'.  then reset your re-entrance flag to False.
  717. XmTextReplace() will call the XmNmodifyVerify callback.  To prevent getting into
  718. an infinite loop, you need the re-entrance flag.
  719.  
  720. -------------------------------------------------------------------------------
  721. Subject: 30) How can I best add a large piece of text to a scrolled text widget?
  722. It insists on adding the text one line at a time, adjusting the scroll bar each
  723. time. It looks awful and is slow.
  724.  
  725. Answer: Unmanage the widget, add the text and then manage it again.
  726.  
  727. -------------------------------------------------------------------------------
  728. Subject: 31) How can I highlight text in the Text widget?
  729.  
  730. Answer: From: argv@zipcode.com (Dan Heller)
  731.  
  732. If you don't need font or color changes, you can do all this using a Text widget
  733. very easily [in Motif 1.1, anyway].
  734.  
  735.         loop() {
  736.             pos = offset_of_pattern_in_text_widget(pattern, text_w);
  737.             search_len = strlen(pattern);
  738.             XmTextSetHighlight(text_w, pos, pos+search_len,
  739.                         XmHIGHLIGHT_SELECTED);
  740.         }
  741.  
  742.  
  743. There are two choices for highlighting: reverse video (HIGHLIGHT_SELECTED) and
  744. underlined (HIGHLIGHT_SECONDARY_SELECTED).  Be careful that your users won't
  745. confuse your highlights with actual selections!
  746.  
  747. -------------------------------------------------------------------------------
  748. Subject: 32)+ How can I select all of the text in a widget programmatically?  So
  749. that some initial text is displayed, but anything typed replaces it.
  750.  
  751. Answer: XmTextSetSelection(Text1, 0, XmTextGetLastPosition(Text1), event-
  752. >xbutton.time);
  753.  
  754. where Text1 is the widget in question (obviously) and event is some event that
  755. triggered this call.
  756.  
  757.  
  758. -------------------------------------------------------------------------------
  759. Subject: 33) How can I change colours of text in the Text widget?  I want some
  760. of the text in one colour, some in another.
  761.  
  762. Answer: You can't.  Text stores an ordinary string, and points where
  763. `highlights' of various types begin and end.  These highlights are all the
  764. control you have over components of the text.  See the previous question.
  765.  
  766.  
  767. -------------------------------------------------------------------------------
  768. Subject: 34) How can I change the font of text in the Text widget?  I want some
  769. of the text in one font, some in another.
  770.  
  771. Answer: You can't in Text (see the previous question).  If you wanted readonly
  772. text, you could do it by using a label instead.  Label uses XmStrings, which can
  773. contain multiple character sets in the one string.
  774.  
  775. -------------------------------------------------------------------------------
  776. Subject: 35) Is there an emacs binding for the text widget?
  777.  
  778. Answer: This set is due to Kee Hinckley (nazgul@alfalfa.com):
  779.  
  780. *XmText.translations: #override\n\
  781.         Ctrl <Key>b:            backward-character()\n\
  782.         Alt <Key>b:             backward-word()\n\
  783.         Meta <Key>b:            backward-word()\n\
  784.         Shift Alt <Key>b:       backward-word(extend)\n\
  785.         Shift Meta <Key>b:      backward-word(extend)\n\
  786.         Alt <Key>[:             backward-paragraph()\n\
  787.         Meta <Key>[:            backward-paragraph()\n\
  788.         Shift Alt <Key>[:       backward-paragraph(extend)\n\
  789.         Shift Meta <Key>[:      backward-paragraph(extend)\n\
  790.         Alt <Key><:             beginning-of-file()\n\
  791.         Meta <Key><:            beginning-of-file()\n\
  792.         Ctrl <Key>a:            beginning-of-line()\n\
  793.         Shift Ctrl <Key>a:      beginning-of-line(extend)\n\
  794.         Ctrl <Key>osfInsert:    copy-clipboard()\n\
  795.         Shift <Key>osfDelete:   cut-clipboard()\n\
  796.         Shift <Key>osfInsert:   paste-clipboard()\n\
  797.         Alt <Key>>:             end-of-file()\n\
  798.         Meta <Key>>:            end-of-file()\n\
  799.         Ctrl <Key>e:            end-of-line()\n\
  800.         Shift Ctrl <Key>e:      end-of-line(extend)\n\
  801.         Ctrl <Key>f:            forward-character()\n\
  802.         Alt <Key>]:             forward-paragraph()\n\
  803.         Meta <Key>]:            forward-paragraph()\n\
  804.         Shift Alt <Key>]:       forward-paragraph(extend)\n\
  805.         Shift Meta <Key>]:      forward-paragraph(extend)\n\
  806.         Ctrl Alt <Key>f:        forward-word()\n\
  807.         Ctrl Meta <Key>f:       forward-word()\n\
  808.         Ctrl <Key>d:            kill-next-character()\n\
  809.         Alt <Key>BackSpace:     kill-previous-word()\n\
  810.         Meta <Key>BackSpace:    kill-previous-word()\n\
  811.         Ctrl <Key>w:            key-select() kill-selection()\n\
  812.         Ctrl <Key>y:            unkill()\n\
  813.         Ctrl <Key>k:            kill-to-end-of-line()\n\
  814.         Alt <Key>Delete:        kill-to-start-of-line()\n\
  815.         Meta <Key>Delete:       kill-to-start-of-line()\n\
  816.         Ctrl <Key>o:            newline-and-backup()\n\
  817.         Ctrl <Key>j:            newline-and-indent()\n\
  818.         Ctrl <Key>n:            next-line()\n\
  819.         Ctrl <Key>osfLeft:      page-left()\n\
  820.         Ctrl <Key>osfRight:     page-right()\n\
  821.         Ctrl <Key>p:            previous-line()\n\
  822.         Ctrl <Key>g:            process-cancel()\n\
  823.         Ctrl <Key>l:            redraw-display()\n\
  824.         Ctrl <Key>osfDown:      next-page()\n\
  825.         Ctrl <Key>osfUp:        previous-page()\n\
  826.         Ctrl <Key>space:        set-anchor()\n
  827.  
  828.  
  829. ! If you'd like the Delete key to work like backspace instead of deleting
  830. ! backwards, add the following definition to the lines above.
  831. !       <Key>osfDelete: delete-previous-character()\n\
  832.  
  833. ! These aren't included because they could intefere with menu accelerators (or vice versa)
  834. !       Alt <Key>p:             backward-paragraph()\n\
  835. !       Meta <Key>p:            backward-paragraph()\n\
  836. !       Shift Alt<Key>p:        backward-paragraph(extend)\n\
  837. !       Shift Meta<Key>p:       backward-paragraph(extend)\n\
  838. !       Alt <Key>w:             copy-clipboard()\n\
  839. !       Meta <Key>w:            copy-clipboard()\n\
  840. !       Ctrl Alt <Key>w:        cut-clipboard()\n\
  841. !       Ctrl Meta <Key>w:       cut-clipboard()\n\
  842. !       Alt <Key>y:             paste-clipboard()\n\
  843. !       Meta <Key>y:            paste-clipboard()\n\
  844. !       Alt <Key>f:             forward-word()\n\
  845. !       Meta <Key>f:            forward-word()\n\
  846. !       Alt <Key>n:             forward-paragraph()\n\
  847. !       Meta <Key>n:            forward-paragraph()\n\
  848. !       Shift Alt <Key>n:       forward-paragraph(extend)\n\
  849. !       Shift Meta <Key>n:      forward-paragraph(extend)\n\
  850. !       Shift Alt <Key>f:       forward-word(extend)\n\
  851. !       Shift Meta <Key>f:      forward-word(extend)\n\
  852. !       Alt <Key>d:             kill-next-word()\n\
  853. !       Meta <Key>d:            kill-next-word()\n\
  854. !       Alt <Key>h:             select-all()\n\
  855. !       Meta <Key>h:            select-all()\n\
  856.  
  857. Similar sets of translations have been suggested by others.
  858.  
  859. -------------------------------------------------------------------------------
  860. Subject: 36) How can I use a file as the text source for a Text widget?
  861.  
  862. Answer: You can't do it directly like you can with the Athena Text widget.
  863. Instead, read the text from the file into a string (all of it!) and then use
  864. XmTextSetString.  Alternatively, read blocks of characters and add them at the
  865. end of the text using XmTextInsertString.
  866.  
  867.  
  868. -------------------------------------------------------------------------------
  869. Subject: 37) How can put Text in overstrike mode instead of insert?
  870.  
  871. Answer: There is no direct way. This was posted by Edmond Pitt
  872. (ejp@bohra.cpg.oz) The correct answer to the question is to put the following in
  873. a modifyVerify callback, where 'mvcb' is the XmTextVerifyCallbackStruct, and
  874. 'overstriking' is defined by you:
  875.  
  876.     if (overstriking && mvcb->text->length == 1)
  877.     {
  878.         _XmTextDisableRedisplay(w,FALSE);
  879.         XtCallActionProc(w,"delete-next-character",mvcb->event,0);
  880.         _XmTextEnableRedisplay(w);
  881.     }
  882.  
  883. _XmText{Dis,En}ableRedisplay() are XmText{Dis,En}ableRedisplay() in 1.0, but
  884. X11R3 has no XtCallActionProc() anyway. For this environment you need my 1.0.3
  885. Text widget patches posted last year & available on request.
  886.  
  887.  
  888. -------------------------------------------------------------------------------
  889. Subject: 38) How can make the Delete key do a backspace?
  890.  
  891. Answer: Put this in your .Xdefaults
  892.  
  893.     *XmText.translations: #override <Key>osfDelete: delete-previous-character()
  894.  
  895.  
  896. -------------------------------------------------------------------------------
  897. Subject: 39) TOPIC: LIST WIDGET
  898.  
  899. -------------------------------------------------------------------------------
  900. Subject: 40) How do I best put a new set of items into a list?
  901.  
  902. Answer: Set the new list count and list by XtSetArgs and install them by
  903. XtSetValues.
  904.  
  905.     XmString list[SIZE];
  906.     int list_size;
  907.  
  908.     XtSetArg (args[n], XmNitemCount, list_size); n++;
  909.     XtSetArg (args[n], XmNitems, list); n++;
  910.     XtSetValues (w, args, n);
  911.  
  912. Each time the list is reset by this the old contents are freed by the widget and
  913. the new supplied list is copied.  Do *not* free the old list of items yourself
  914. as this would result in the space being freed twice.  It is not necessary to
  915. remove the items one at a time, nor to "zero" out the list first.
  916.  
  917. -------------------------------------------------------------------------------
  918. Subject: 41)+ Can I have strings with different fonts in a list?
  919.  
  920. Answer: Yes. The strings are XmStrings. Each one can be created using a
  921. different character set using a different font.
  922.  
  923.  
  924. -------------------------------------------------------------------------------
  925. Subject: 42) Can I get a bitmap to show in a list item like I can in a Label?  I
  926. want to place a bitmap along with some normal text in my list items.
  927.  
  928. Answer: No. The list contains XmStrings, and these only allow text in various
  929. character sets. The workaround is to define your font containing the icons you
  930. want. Then you can create a fontlist containing your icon font and the font you
  931. want the text in, and then make your items multi-segment XmStrings where the
  932. first segment contains the code of the icon you want with a charset that matches
  933. the icon font in your fontlist and the second segment with a charset matching
  934. the text font.
  935.  
  936.  
  937. -------------------------------------------------------------------------------
  938. Subject: 43) Can I have items with different colours in a list?
  939.  
  940. Answer: No.  The list contains XmStrings, and these only allow text in various
  941. character sets. Since the items are XmStrings, you can already change the font
  942. of an item by replacing it with an item with the same text and a different
  943. charset tag.  Adding support for color would require modification of the
  944. internal data structure in XmList as well as modification to the drawing
  945. routines.  A possible workaround is to use a rowcolumn of buttons which can be
  946. individually set.  However, you would have to do all list functionality
  947. yourself.
  948.  
  949.  
  950. -------------------------------------------------------------------------------
  951. Subject: 44) Can I grey out an item in a list?  I want to make insensitive items
  952. in a list so that they cannot be selected.
  953.  
  954. Answer:
  955.  
  956. From W. Scott Meeks of OSF:
  957.  
  958. Unfortunately, you can't do it directly since the list items aren't individual
  959. widgets.  We've had other requests for this technology, but it didn't make the
  960. cut for 1.2; it should be in some future release.
  961.  
  962. However, you can probably fake it in your application with some difficulty.
  963. First, a list item is an XmString, so you can specify a different charset for
  964. the item than for other items in the list and then specify a font in the list's
  965. fontlist that matches the charset and gives you the visual you want.  The next
  966. problem is making the item unselectable.  One idea would be to have the
  967. application keep track of the insensitive items and the items currently
  968. selected.  Then you would set up a selection callback that when called would
  969. check the item selected against the list of insensitive items and if the
  970. selected item matched would deselect that item and reselect the previously
  971. selected items.  Otherwise it would just update the application's list of
  972. selected items.  The major drawback with this approach is that you'll get
  973. flashing whenever the list selects an item and your application immediately de-
  974. selects.  Unfortunately I can't think of a way around this without mucking with
  975. the list internals.
  976.  
  977. Another alternative suggested is to use instead a column of say read only text
  978. widgets which you can make insensitive.
  979.  
  980. -------------------------------------------------------------------------------
  981. Subject: 45) TOPIC: FILE SELECTION BOX WIDGET
  982.  
  983. -------------------------------------------------------------------------------
  984. Subject: 46) What is libPW.a and do I need it?  My manual says I need to link in
  985. libPW.a to use the File Selection Box.  I can't find it on my system.
  986.  
  987. Answer: The libPW.a is the Programers Workbench library which is an ATT product
  988. not included in Berkeley based systems, hence it is not found in SunOS or
  989. Ultrix, but is found on HP-UX (a Berkeley/ATT hybrid which chose ATT in this
  990. case).  It contains the regex(3) routines.  Some systems which don't have these
  991. in the libc.a need to link with -lPW.  Some systems which have the regex(3)
  992. routines in there also have the libPW.a.  If you have regex(3) in libc, and it
  993. works, don't link with libPW.  If you don't have regex(3) in libc, and you don't
  994. have a libPW, then check some sites on the net for public domain replacements
  995. (several exist), or call your vendor.
  996.  
  997. In most versions of Motif (see the doco), you can compile FileSB.c with
  998. -DNO_REGEX if you don't have it.
  999.  
  1000. -------------------------------------------------------------------------------
  1001. Subject: 47) What's wrong with the Motif 1.0 File Selection Box?  I can't set
  1002. the directory, change the directory or get the file mask to work.
  1003.  
  1004. Answer: The 1.0 File Selection Box is broken, and these don't work.  They
  1005. weren't fixed until Motif 1.04.  Use these later versions of 1.0 or switch to
  1006. Motif 1.1 where it changed a lot.
  1007.  
  1008. Joe Hildebrand has a work-around for some of this: Before popping up an
  1009. XmFileSelectionDialog, change to the directory you want.  When a file is
  1010. selected, check if it is a directory, so that we can change to it.  i.e.
  1011.  
  1012. static void show_file_box_CB(w, client_data, call_data)
  1013.    Widget               w;
  1014.    Widget               client_data;
  1015.    XmAnyCallbackStruct  *call_data;
  1016. {
  1017.    chdir("/users/hildjj/files");
  1018.    XtManageChild(client_data);
  1019. }
  1020.  
  1021. static void val_save(w, client_data, call_data)
  1022.    Widget       w;
  1023.    Widget       client_data;
  1024.    XmSelectionBoxCallbackStruct *call_data;
  1025. {
  1026.    struct stat buf;  /* struct stat is defined in stat.h */
  1027.    char *filename;
  1028.  
  1029.    /* get the file name from the FileSelectionBox */
  1030.    filename = SmX(call_data->value);
  1031.  
  1032.    /* get the status of the file named filename, and put it into buf */
  1033.    if (!stat(filename, &buf))
  1034.    {
  1035.       /* if it's a directory */
  1036.       /* if it's a directory */
  1037.       if(S_ISDIR(buf.st_mode))
  1038.       {
  1039.          /* change to that directory, and update the FileSelectionBox */
  1040.         chdir(filename);
  1041.         XmFileSelectionDoSearch(w, NULL);
  1042.       }
  1043.       else
  1044.          /* if it's a regualr file */
  1045.          if(S_ISREG(buf.st_mode))
  1046.             /* ask if it should be overwritten */
  1047.             XtManageChild(valbox);
  1048.          else
  1049.             /* it's another kind of file.  What type, i can't think of,
  1050.                but it might happen */
  1051.             pop_up_error_box(client_data, "Error saving file");
  1052.    }
  1053.    else  /* we couldn't get the file status */
  1054.    {
  1055.       /* if it's because the file doesn't exist, we're golden */
  1056.       if (errno == ENOENT)
  1057.          save_file();
  1058.       else   /* there is some other problem getting the status.
  1059.                 e.g. bad path */
  1060.          pop_up_error_box(client_data, "Error saving file");
  1061.    }
  1062. }
  1063.  
  1064. this still doesn't implement the file masking stuff.
  1065.  
  1066.  
  1067. -------------------------------------------------------------------------------
  1068. Subject: 48) TOPIC: FORM WIDGET
  1069.  
  1070.  
  1071. -------------------------------------------------------------------------------
  1072. Subject: 49) Why don't labels in a Form resize when the label is changed?  I've
  1073. got some labels in a form. The labels don't resize whenever the label string
  1074. resource is changed. As a result, the operator has to resize the window to see
  1075. the new label contents. I am using Motif 1.1.
  1076.  
  1077. Answer: This problem may happen to any widget inside a Form widget. The problem
  1078. was that the Form will resize itself when it gets geometry requests from its
  1079. children. If its preferred size is not allowed, the Form will disallow all
  1080. geometry requests from its children. The workaround is that you should set any
  1081. ancestor of the Form to be resizable. For the shell which contains the Form you
  1082. should set the shell resource XmNallowShellResize to be True (by default, it is
  1083. set to FALSE).  There is currently an inconsistency on how resizing is being
  1084. done, and it may get fixed in Motif 1.2.
  1085.  
  1086. -------------------------------------------------------------------------------
  1087. Subject: 50) How can I center a widget in a form?
  1088.  
  1089. Answer: One of Motif's trickier questions.  The problems are that: Form gives no
  1090. support for centering, only for edge attachments, and the widget must stay in
  1091. the center if the form or the widget is resized.  Just looking at horizontal
  1092. centering (vertical is similar) some solutions are:
  1093.  
  1094.  a.  Use the table widget instead of Form.
  1095.  
  1096.  b.  This is complex, but can be used for arbitrary placement.  It is an amalgam
  1097.      of several suggestions, and all bits seem to be needed.  Create an `anchor'
  1098.      in the middle of the form.  Use a widget of zero width and height for this
  1099.      (e.g. a separator).  Place this anchor in the form where you want it to
  1100.      stay (attach position to 50 for centering).  You want the middle of the
  1101.      widget to be over the anchor (and stay there even if the form is resized).
  1102.      You don't know where the middle of the widget is until you know its size,
  1103.      and you won't know that until you manage it.  So create and manage the
  1104.      widget and use XtGetValues to find its width.  Then attach its left
  1105.      position to half the width from the anchor.  Doing this will move the
  1106.      widget.  Depending upon the order in which widgets are managed and realized
  1107.      the widget may be visible after it has been managed and so will `flicker'
  1108.      when it is moved.  If this happens, set mappedWhenManaged to False so that
  1109.      it doesn't show until you map it yourself.
  1110.  
  1111.               n = 0;
  1112.               XtSetArg (args[n], XmNseparatorType, XmNO_LINE); n++;
  1113.               XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
  1114.               XtSetArg (args[n], XmNleftPosition, 50); n++;
  1115.               anchor = XmCreateSeparator (form, "anchor", args, n);
  1116.               XtManageChild (anchor);
  1117.  
  1118.               n = 0;
  1119.               XtSetArg (args[n], XmNmappedWhenManaged, False); n++;
  1120.               button = XmCreatePushButton (form, "Center Button", args, n);
  1121.               XtManageChild (button);
  1122.  
  1123.               n = 0;
  1124.               XtSetArg (args[n], XmNwidth, (Dimension *) &width); n++;
  1125.               XtGetValues (button, args, n);
  1126.  
  1127.               n = 0;
  1128.               XtSetArg (args[n], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); n++;
  1129.               XtSetArg (args[n], XmNleftWidget, anchor); n++;
  1130.               XtSetArg (args[n], XmNleftOffset, -width/2); n++;
  1131.               XtSetValues (button, args, n);
  1132.               XtMapWidget (button);
  1133.  
  1134.      This does not center the widget correctly if it is resized by the
  1135.      application (say by changing its label) - you have to fix it up yourself by
  1136.      resetting the left offset.
  1137.  
  1138.  c.  Attach the things you want centered to the middle of the form (attach
  1139.      position to 50%), and then set the offest to half the width or height
  1140.      (calculated as in the previous solution).  The documentation for Form
  1141.      states that this will not work.  I can't get it to work (Motif 1.1.0), but
  1142.      some people say that it works just fine (Motif 1.1.1, 1.1.2).
  1143.  
  1144.  d.  No uil solution has been suggested, because of the wieget size problem
  1145.  
  1146. -------------------------------------------------------------------------------
  1147. Subject: 51) How do I line up two columns of widgets of different types?  I have
  1148. a column of say label widgets, and a column of text widgets and I want to have
  1149. them lined up horizontally. The problem is that they are of different heights.
  1150. Just putting them in a form or rowcolumn doesn't line them up properly because
  1151. the label and text widgets are of different height.  I also want the labels to
  1152. be right adjusted e.g.
  1153.  
  1154.          -------------------------------------
  1155.         |                    ---------------- |
  1156.         |          a label  |Some text       ||
  1157.         |                    ---------------- |
  1158.                              ---------------- |
  1159.         |   a longer label  |Some more text  ||
  1160.         |                    ---------------- |
  1161.         |                    ---------------- |
  1162.         |a very long label  |Even more text  ||
  1163.         |                    ---------------- |
  1164.          -------------------------------------
  1165.  
  1166.  
  1167.  
  1168. Answer: To get the widgets lined up horizontally, use a form but place the
  1169. widgets using XmATTACH_POSITION.  In the example, attach the top of the first
  1170. label to the form, the bottomPosition to 33 (33% of the height).  Attach the
  1171. topPosition of the second label to 33 and the bottomPosition to 66.  Attach the
  1172. topPosition of the third label to 66 and the bottom of the label to the form.
  1173. Do the same with the text widgets.
  1174.  
  1175. To get the label widgets lined up vertically, use the right attachment of
  1176. XmATTACH_OPPOSITE_WIDGET: starting from the one with the longest label, attach
  1177. widgets on the right to each other. In the example, attach the 2nd label to the
  1178. third, and the first to the second.  To get the text widgets lined up, just
  1179. attach them on the left to the labels.  To get the text in the labels aligned
  1180. correctly, use XmALIGNMENT_END for the XmNalignment resource.
  1181.  
  1182.         /* geometry for label 2
  1183.         */
  1184.         n = 0;
  1185.         XtSetArg (args[n], XmNalignment, XmALIGNMENT_END); n++;
  1186.         XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
  1187.         XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
  1188.         XtSetArg (args[n], XmNtopAttachment, XmATTACH_POSITION); n++;
  1189.         XtSetArg (args[n], XmNtopPosition, 66); n++;
  1190.         XtSetValues (label[2], args, n);
  1191.  
  1192.         /* geometry for label 1
  1193.         */
  1194.         n = 0;
  1195.         XtSetArg (args[n], XmNalignment, XmALIGNMENT_END); n++;
  1196.         XtSetArg (args[n], XmNbottomAttachment, XmATTACH_POSITION); n++;
  1197.         XtSetArg (args[n], XmNbottomPosition, 66); n++;
  1198.         XtSetArg (args[n], XmNtopAttachment, XmATTACH_POSITION); n++;
  1199.         XtSetArg (args[n], XmNtopPosition, 33); n++;
  1200.         XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
  1201.         XtSetArg (args[n], XmNrightAttachment, XmATTACH_OPPOSITE_WIDGET); n++;
  1202.         XtSetArg (args[n], XmNrightWidget, label[2]); n++;
  1203.         XtSetValues (label[1], args, n);
  1204.  
  1205.         /* geometry for label 0
  1206.         */
  1207.         n = 0;
  1208.         XtSetArg (args[n], XmNalignment, XmALIGNMENT_END); n++;
  1209.         XtSetArg (args[n], XmNbottomAttachment, XmATTACH_POSITION); n++;
  1210.         XtSetArg (args[n], XmNbottomPosition, 33); n++;
  1211.         XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
  1212.         XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
  1213.         XtSetArg (args[n], XmNrightAttachment, XmATTACH_OPPOSITE_WIDGET); n++;
  1214.         XtSetArg (args[n], XmNrightWidget, label[1]); n++;
  1215.         XtSetValues (label[0], args, n);
  1216.  
  1217.         /* geometry for text 0
  1218.         */
  1219.         n = 0;
  1220.         XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
  1221.         XtSetArg (args[n], XmNbottomAttachment, XmATTACH_POSITION); n++;
  1222.         XtSetArg (args[n], XmNbottomPosition, 33); n++;
  1223.         XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
  1224.         XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
  1225.         XtSetArg (args[n], XmNleftWidget, label[0]); n++;
  1226.         XtSetValues (text[0], args, n);
  1227.  
  1228.         /* geometry for text 1
  1229.         */
  1230.         XtSetArg (args[n], XmNtopAttachment, XmATTACH_POSITION); n++;
  1231.         XtSetArg (args[n], XmNtopPosition, 33); n++;
  1232.         XtSetArg (args[n], XmNbottomAttachment, XmATTACH_POSITION); n++;
  1233.         XtSetArg (args[n], XmNbottomPosition, 66); n++;
  1234.         XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
  1235.         XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
  1236.         XtSetArg (args[n], XmNleftWidget, label[1]); n++;
  1237.         XtSetValues (text[1], args, n);
  1238.  
  1239.         /* geometry for text 2
  1240.         */
  1241.         XtSetArg (args[n], XmNtopAttachment, XmATTACH_POSITION); n++;
  1242.         XtSetArg (args[n], XmNtopPosition, 66); n++;
  1243.         XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
  1244.         XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
  1245.         XtSetArg (args[n], XmNleftWidget, label[2]); n++;
  1246.         XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
  1247.         XtSetValues (text[2], args, n);
  1248.  
  1249.  
  1250. -------------------------------------------------------------------------------
  1251. Subject: 52) TOPIC: PUSHBUTTON WIDGET
  1252.  
  1253. -------------------------------------------------------------------------------
  1254. Subject: 53) Why can't I use accelerators on buttons not in a menu?
  1255.  
  1256. Answer: It is apparently a difficult feature to implement, but OSF are
  1257. considering this for the future. It is problematic trying to use the Xt
  1258. accelerators since the Motif method interferes with this.  The workaround
  1259. suggested so far is to duplicate your non-menu button by a button in a menu
  1260. somewhere, which does have a menu-accelerator installed.  When the user invokes
  1261. what they think is the accelerator for the button they can see Motif actually
  1262. invokes the button on the menu that they can't see at the time.
  1263.  
  1264.  
  1265. -------------------------------------------------------------------------------
  1266. Subject: 54) TOPIC: LABEL WIDGET
  1267.  
  1268. -------------------------------------------------------------------------------
  1269. Subject: 55) How can I align the text in a label (button, etc) widget?
  1270.  
  1271. Answer: The alignment for the label widget is controlled by the resource
  1272. XmNalignment, and the default centers the text. Use this resource to change it
  1273. to left or right alignment.  However, when the label (or any descendant) is in a
  1274. row column, and XmNisAligned is True (the default), the row column aligns text
  1275. using its resource XmNentryAlignment. If you want simultaneous control over all
  1276. widgets use this, but otherwise turn XmNisAligned off and do it individually.
  1277.  
  1278.  
  1279.  
  1280. -------------------------------------------------------------------------------
  1281. Subject: 56) Why doesn't label alignment work in a RowColumn?
  1282.  
  1283. Answer: RowColumn has a  resource XmNisAligned (default True) and and
  1284. XmNentryAlignment (default XmALIGNMENT_BEGINNING).  These control alignment of
  1285. the labelString in Labels and descendants. Set XmNisAligned to False to turn
  1286. this off.
  1287.  
  1288. -------------------------------------------------------------------------------
  1289. Subject: 57) How can I set a multiline label?
  1290.  
  1291. Answer: In .Xdefaults
  1292.  
  1293.       *Label*labelString:             Here\nis\nthe\nLabel
  1294.  
  1295. In code,
  1296.  
  1297.       char buf[128];
  1298.       XmString msg;
  1299.       sprintf(buf, "Here\nis\nthe\nLabel");
  1300.       msg = XmStringCreateLtoR(buf, XmSTRING_DEFAULT_CHARSET);
  1301.       XtSetArg (args[n], XmNlabelString, msg);
  1302.  
  1303. Gives a four line label, using the escape sequence \n for a newline.
  1304.  
  1305. -------------------------------------------------------------------------------
  1306. Subject: 58)+ How can I have a vertical label?
  1307.  
  1308. Answer: Make a multiline label with one character per line, as in the last
  1309. question. There is no way to make the text rotated by 90 degrees though.
  1310.  
  1311.  
  1312. -------------------------------------------------------------------------------
  1313. Subject: 59) TOPIC: DRAWING AREA WIDGET
  1314.  
  1315. -------------------------------------------------------------------------------
  1316. Subject: 60) How can I send an expose event to a Drawing Area widget?  (or any
  1317. other, come to that). I want to send an expose event so that it will redraw
  1318. itself.
  1319.  
  1320. Answer: Use the Xlib call
  1321.  
  1322.         XClearArea(XtDisplay(w), XtWindow(w), 0, 0, 0, 0, True)
  1323.  
  1324. This clears the widget's window and generates an expose event in doing so.  The
  1325. widgets expose action will then redraw it.  This uses a round trip request.  An
  1326. alternative, without the round trip is
  1327.  
  1328. From schulert@alfalfa.com Mon Apr 29 17:31:55 1991
  1329.  
  1330.     Widget da;
  1331.     XmDrawingAreaCallbackStruct da_struct;
  1332.  
  1333.     da_struct.reason = XmCR_EXPOSE;
  1334.     da_struct.event = (XEvent *) NULL;
  1335.     da_struct.window = XtWindow(da);
  1336.  
  1337.     XtCallCallbacks(da, XmNexposeCallback, (XtPointer) da_struct);
  1338.  
  1339.  
  1340. -------------------------------------------------------------------------------
  1341. Subject: 61) TOPIC: MENUS
  1342.  
  1343. -------------------------------------------------------------------------------
  1344. Subject: 62) What can I put inside a menu bar?
  1345.  
  1346. Answer: You can only put cascade buttons in menu bars. No pushbuttons, toggle
  1347. buttons or gadgets are allowed. When you create a pulldown menu with parent a
  1348. menu bar, its real parent is a shell widget.
  1349.  
  1350. -------------------------------------------------------------------------------
  1351. Subject: 63) Can I have a cascade button without a submenu in a pulldown menu?
  1352.  
  1353. Answer: Yes you can. A cascade button has an activate callback which is called
  1354. when you click on it and it doesn't have a submenu. It can have a mnemonic, but
  1355. keyboard traversal using the arrow keys in the menu will skip over it.
  1356.  
  1357. -------------------------------------------------------------------------------
  1358. Subject: 64) Should I have a cascade button without a submenu in a pulldown
  1359. menu?
  1360.  
  1361. Answer: No. This is forbidden by the style guide. Technically you can do it (see
  1362. previous question) but if you do it will not be Motif style compliant. This is
  1363. unlikely to change - if a "button" is important enough to be in a pulldown menu
  1364. bar with no pulldown, it should be a button elsewhere.  (Mind you, you won't be
  1365. able to put accelerators on it elsewhere though.)
  1366.  
  1367. -------------------------------------------------------------------------------
  1368. Subject: 65) TOPIC: INPUT FOCUS
  1369.  
  1370. -------------------------------------------------------------------------------
  1371. Subject: 66) How can I direct the keyboard input to a particular widget?
  1372.  
  1373. Answer: In Motif 1.1 call XmProcessTraversal(target, XmTRAVERSE_CURRENT).  The
  1374. widget (and all of its ancestors) does need to be realized BEFORE you call this.
  1375. Otherwise it has no effect.  XmProcessTraversal is reported to have many bugs,
  1376. so it may not work right.  A common occurrence is that it doesn't move to the
  1377. widget, but if you call XmProcessTraversal *twice* in a row, it will.  If you
  1378. can't get it to work, try this from Kee Hinckley:
  1379.  
  1380.     // This insane sequence is as follows:
  1381.     //      On manage set up a focus callback
  1382.     //      On focus callback set up a timer (and get rid of focus callback!)
  1383.     //      On timer set the focus (which only works if the parent
  1384.     //      has the focus,
  1385.     //      which is why we went through all of this garbage)
  1386.     // There may be a better way, but I haven't time to try it now.
  1387.     //
  1388.     static void focusTO(void *data, XtIntervalId *) {
  1389.         XmProcessTraversal((Widget) data, XmTRAVERSE_CURRENT);
  1390.     }
  1391.  
  1392.     static void focusCB(Widget w, XtPointer data, XtPointer) {
  1393.         XtRemoveCallback(w, XmNfocusCallback, focusCB, data);
  1394.         XtAppAddTimeOut(XtWidgetToApplicationContext(w), 0, focusTO, data);
  1395.     }
  1396.  
  1397.     void OmXSetFocus(Widget parent, Widget w) {
  1398.         XtAddCallback(parent, XmNfocusCallback, focusCB, w);
  1399.     }
  1400.  
  1401.  
  1402. In Motif 1.0 call the undocumented _XmGrabTheFocus(target).
  1403.  
  1404. Do not use the X or Xt calls such as XtSetKeyboardFocus since this bypasses the
  1405. Motif traversal layer and can cause it to get confused.  This can lead to odd
  1406. keyboard behaviour elsewhere in your application.
  1407.  
  1408. -------------------------------------------------------------------------------
  1409. Subject: 67) How can I have a modal dialog which has to be answered before the
  1410. application can continue?
  1411.  
  1412. Answer: The answer depends on whether you are using the Motif window manager mwm
  1413. or not.  If you are, there is a simple solution. If not (or you don't know
  1414. whether you are or not), you have to use a slightly harder method.  Test for
  1415. this by XmIsMotifWMRunning.
  1416.  
  1417. The window manager mwm knows how to control event passing to dialog widgets
  1418. declared as modal. If the dialog is set to application modal, then no
  1419. interaction with the rest of the application can occur until the dialog is
  1420. destroyed or unmanaged. This can be done through one of the callbacks of the
  1421. dialog:
  1422.  
  1423.  
  1424. block_dialog(parent)
  1425. Widget parent;
  1426. {
  1427.         Arg args[2];
  1428.  
  1429.         XtSetArg(args[0], XmNmessageString,
  1430.                 XmStringCreateLtoR("....", charset));
  1431.         XtSetArg(args[1], XmNdialogStyle,
  1432.                 XmDIALOG_APPLICATION_MODAL);
  1433.         dialog = XmCreateMessageDialog(parent, NULL, args, 2);
  1434.         XtAddCallback(dialog, XmNokCallback, responseCB, NULL);
  1435.         XtAddCallback(dialog, XmNcancelCallback, responseCB, NULL);
  1436.         XtAddCallback(dialog, XmNhelpCallback, responseCB, NULL);
  1437.  
  1438.         XtManageChild(dialog);
  1439. }
  1440.  
  1441. void responseCB(w, client_data, reason)
  1442. Widget w;
  1443. caddr_t client_data;
  1444. XmAnyCallbackStruct *reason;
  1445. {       int why = reason->reason;
  1446.  
  1447.         XtUnmanageChild(w);
  1448.         /* if you won't use it again */
  1449.         XtDestroyWidget(XtParent(w));
  1450.  
  1451.         switch (why) {
  1452.              case XmCR_OK:
  1453.                  /* process ok action */
  1454.                  break;
  1455.              case XmCR_CANCEL:
  1456.                  /* process cancel action */
  1457.                  break;
  1458.              case XmCR_HELP:
  1459.                  /* process help action */
  1460.                  break;
  1461.         }
  1462. }
  1463.  
  1464.  
  1465. Without using mwm, the basic version goes like this: You have to set an Xt grab
  1466. to the dialog and run your own event processing loop. This loop finishes when
  1467. the user invokes a callback from a button press. The boolean `keep_grab' is
  1468. passed to the callback as client data which sets it to false when the callback
  1469. is executed.
  1470.  
  1471.         static Boolean keep_grab; /* static required to stop some optimisers
  1472.                                      discarding it as unused */
  1473.         XEvent event;
  1474.         Arg args[1];
  1475.  
  1476.         keep_grab = True;
  1477.         XtSetArg(args[0], XmNmesssageString, ...);
  1478.         dialog = XmCreateMessageDialog(parent, NULL, args, 1);
  1479.         XtAddCallback(dialog, XmNokCallback, responseCB, &keep_grab);
  1480.         XtAddCallback(dialog, XmNcancelCallback, responseCB, &keep_grab);
  1481.         XtAddCallback(dialog, XmNhelpCallback, responseCB, &keep_grab);
  1482.  
  1483.         XtManageChild(dialog);
  1484.         XtAddGrab(XtParent(dialog), True, False);
  1485.  
  1486.         while (keep_grab || XtPending()) {
  1487.                 XtNextEvent(&event);
  1488.                 XtDispatchEvent(&event);
  1489.          }
  1490.  
  1491. The "client_data" for the function (in each case) is &keep_grab.  The function
  1492. sets this to  False and unmanages the dialog before continuing to process the
  1493. callback.
  1494.  
  1495.         void
  1496.         responseCB(w, keep_grab, reason)
  1497.         Widget w;
  1498.         Boolean *keep_grab;
  1499.         XmAnyCallbackStruct *reason;
  1500.         {   int why = reason->reason;
  1501.  
  1502.             *keep_grab = False;
  1503.             XtRemoveGrab(XtParent(w));
  1504.             XtUnmanageChild(w);
  1505.             /* If you don't want to reuse it */
  1506.             XtDestroyWidget(XtParent(w));
  1507.  
  1508.             switch (why) {
  1509.              case XmCR_OK:
  1510.                  /* process ok action */
  1511.                  break;
  1512.              case XmCR_CANCEL:
  1513.                  /* process cancel action */
  1514.                  break;
  1515.              case XmCR_HELP:
  1516.                  /* process help action */
  1517.                  break;
  1518.             }
  1519.         }
  1520.  
  1521.  
  1522. -------------------------------------------------------------------------------
  1523. Subject: 68) TOPIC: MEMORY AND SPEED
  1524.  
  1525. -------------------------------------------------------------------------------
  1526. Subject: 69) Why does my application grow in size?
  1527.  
  1528. Answer: Motif 1.0 has many memory leaks, particularly in XmString manipulation.
  1529. Switch to Motif 1.1.
  1530.  
  1531. Answer: The Intrinsics have a memory leak in accelerator table management, and
  1532. Motif uses this heavily.  Avoid this by mapping/unmapping widgets rather than
  1533. creating/destroying them, or get  X11R4 fix-15/16/17.
  1534.  
  1535. Answer: The server may grow in size due to its own memory leaks.  Switch to a
  1536. later server.
  1537.  
  1538. Answer: You are responsible for garbage collection in `C'.  Some common cases
  1539. where a piece of memory becomes garbage are
  1540.  
  1541.  a.  Memory is allocated for a character string by Motif in XmStringGetLtoR().
  1542.      After using the string, XtFree() it.
  1543.  
  1544.  b.  If you have set the label in a label, pushbutton, etc widget, free it after
  1545.      calling XtSetValues() or the widget creation routine by XmStringFree().
  1546.  
  1547.  c.  If you have set text in a text widget, reclaim the string afterwards - the
  1548.      text widget makes its own copy.
  1549.  
  1550.  d.  If you have set the strings in a list widget, reclaim the space.  The list
  1551.      widget makes its own copy.
  1552.  
  1553. -------------------------------------------------------------------------------
  1554. Subject: 70) Why does my application take a long time to start up?
  1555.  
  1556. Answer: If you have a large .Xdefaults, time may be spent reading and parsing
  1557. it.
  1558.  
  1559. -------------------------------------------------------------------------------
  1560. Subject: 71) My application is running too slowly. How can I speed it up?
  1561.  
  1562. Answer: Use the R4 rather than R3 server.  It is much faster.
  1563.  
  1564. Answer: The standard memory allocator is not well tuned to Motif, and can
  1565. degrade performance.  Use a better allocator.  e.g. with SCO Unix, link with
  1566. libmalloc.a; use the allocator from GNU emacs; use the allocator from Perl.
  1567.  
  1568. Answer: Avoid lots of widget creation and destruction.  It fragments memory and
  1569. slows everything down.  Popup/popdown, manage/unmanage instead.
  1570.  
  1571. Answer: Set mappedWhenManaged to FALSE, and then call XtMapWidget()
  1572. XtUnmapWidget() rather than managing.
  1573.  
  1574. Answer: Get more memory - your application, the server and the Operating System
  1575. may be spending a lot of time being swapped.
  1576.  
  1577. Answer: If you are doing much XmString work yourself, such as heavy use of
  1578. XmStringCompare, speed may deteriorate due to the large amount of internal
  1579. conversions and malloc'ing.  Try using XmStringByteCompare if appropriate or
  1580. ordinary Ascii strings if you can.
  1581.  
  1582.  
  1583.  
  1584. -------------------------------------------------------------------------------
  1585. Subject: 72) TOPIC: XMSTRING
  1586.  
  1587. -------------------------------------------------------------------------------
  1588. Subject: 73) How can I get the Ascii text out of an XmString?
  1589.  
  1590. Answer: To get the first line of text from a string created left-to-right
  1591.  
  1592.  
  1593.         char *str;
  1594.         XmString xmstr;
  1595.  
  1596.         /* stuff to create xmstr */
  1597.         ...
  1598.  
  1599.         /* set str to point to the text */
  1600.         XmStringGetLtoR(xmstr, XmSTRING_DEFAULT_CHARSET, &str);
  1601.         /* use the string */
  1602.         ...
  1603.  
  1604.         /* and reclaim space */
  1605.         XtFree(str);
  1606.  
  1607.  
  1608. -------------------------------------------------------------------------------
  1609. Subject: 74) When can XmStrings used as resources be freed?
  1610.  
  1611. Answer: The policy OSF have been trying to enforce is that if you set an
  1612. XmString or XmStringTable resource, the application is responsible for freeing
  1613. the XmStrings used because the widget makes a copy.  If you get an XmString
  1614. resource, then the application must free the value gotten.  If you get an
  1615. XmStringTable, then the application should NOT free the value gotten.  If the
  1616. application wants to manipulate it, it should make a copy first. This policy
  1617. appears to be implemented progressively, so may be less true for Motif 1.0 than
  1618. 1.1.
  1619.  
  1620. -------------------------------------------------------------------------------
  1621. Subject: 75) Why doesn't XmStringGetNextSegment() work properly?
  1622.  
  1623. Answer: The documentation in Motif 1.0 is in error. Instead of
  1624.  
  1625.         XmStringGetnextSegment(context, ...)
  1626.         XmStringContext * context;
  1627.  
  1628. it should be
  1629.  
  1630.         XmStringGetnextSegment(context, ...)
  1631.         XmStringContext context;
  1632.  
  1633. i.e. with no indirection.
  1634.  
  1635. -------------------------------------------------------------------------------
  1636. Subject: 76) TOPIC: DIALOGS
  1637.  
  1638. -------------------------------------------------------------------------------
  1639. Subject: 77) How do I stop my dialog disappearing when I press the help button?
  1640.  
  1641. Answer: Bulletin board has the resource autoUnmanage which defaults to True.
  1642. This unmanages the widget when any button child is activated - including the
  1643. help button.  Set this to False to stop it disappearing. Note that you then have
  1644. to unmanage the bulletin board yourself when any other button is activated.
  1645.  
  1646. -------------------------------------------------------------------------------
  1647. Subject: 78) How do I make my own dialog?  I want a dialog with my own set of
  1648. buttons that stretch and shrink like the ones in e.g. PromptDialog and its own
  1649. contents.
  1650.  
  1651. Answer: Start off with say a PromptDialog. Unmanage the buttons you don't want
  1652. or manage the Apply button if you want another. Unmanage the other bits of the
  1653. selection box you don't want. You can add another WorkArea child to the
  1654. selection box for any extra stuff you want.
  1655.  
  1656.     /* Copyright 1990, Kee Hinckley and Brian Holt Hawthorne */
  1657.     /* Permission granted for any use, provided this copyright */
  1658.     /* notice is maintained. */
  1659.  
  1660.     /* Create a dialog box */
  1661.     argcount = setArgs(&args, XmNautoUnmanage, False, NULL);
  1662.     SomeDialog = XmCreatePromptDialog(mainShell, "someDialog", args, argcount);
  1663.  
  1664.     /* Now get rid of the things we don't want */
  1665.     child = XmSelectionBoxGetChild(SomeDialog, XmDIALOG_SELECTION_LABEL);
  1666.     XtUnmanageChild(child);
  1667.     child = XmSelectionBoxGetChild(SomeDialog, XmDIALOG_TEXT);
  1668.     XtUnmanageChild(child);
  1669.  
  1670.     /* set the callbacks, and make sure the buttons we want are there */
  1671.     child = XmSelectionBoxGetChild(SomeDialog, XmDIALOG_OK_BUTTON);
  1672.     XtAddCallback(child, XmNactivateCallback, callSomeFunc, someArg);
  1673.     XtAddCallback(child, XmNactivateCallback, unManage, SomeDialog);
  1674.     XtManageChild(child);
  1675.     child = XmSelectionBoxGetChild(SomeDialog, XmDIALOG_APPLY_BUTTON);
  1676.     XtAddCallback(child, XmNactivateCallback, callSomeFunc, someOtherArg);
  1677.     XtManageChild(child);
  1678.     child = XmSelectionBoxGetChild(SomeDialog, XmDIALOG_CANCEL_BUTTON);
  1679.     XtAddCallback(child, XmNactivateCallback, dialogUnmanage, SomeDialog);
  1680.     XtManageChild(child);
  1681.  
  1682.     /* Add a new work area. This can be any manager. */
  1683.     child = XmCreateForm(SomeDialog, "someForm", NULL, 0);
  1684.     XtManageChild(child);
  1685.  
  1686.     /* and fill it up... */
  1687.     something = doYourStuff(child);
  1688.  
  1689.  
  1690.  
  1691. -------------------------------------------------------------------------------
  1692. Subject: 79) How come the title bars for my dialogs now have "_popup" or "<-
  1693. popup" concatenated onto the widget name?
  1694.  
  1695.  
  1696. Answer: Motif 1.0.3 (?) "fixed" things such that title bars without an explicit
  1697. dialogTitle setting use the widget name with "_popup" or whatever added on.  Set
  1698. the dialogTitle resource explicitly if you don't want this new default naming
  1699. scheme.
  1700.  
  1701. -------------------------------------------------------------------------------
  1702. Subject: 80) How can I force a dialog window to display?  I manage a "working"
  1703. dialog, and do some computing, but the dialog window appears blank until the
  1704. work has finished.  How can I force it to be displayed?
  1705.  
  1706. Answer: Use this.  (David Brooks, Systems Engineering, Open Software Foundation)
  1707.  
  1708. /*
  1709.  * This procedure will ensure that, if a dialog window is being mapped,
  1710.  * its contents become visible before returning.  It is intended to be
  1711.  * used just before a bout of computing that doesn't service the display.
  1712.  * You should still call XmUpdateDisplay() at intervals during this
  1713.  * computing if possible.
  1714.  *
  1715.  * The monitoring of window states is necessary because attempts to map
  1716.  * the dialog are redirected to the window manager (if there is one) and
  1717.  * this introduces a significant delay before the window is actually mapped
  1718.  * and exposed.  This code works under mwm, twm, uwm, and no-wm.  It
  1719.  * doesn't work (but doesn't hang) with olwm if the mainwindow is iconified.
  1720.  *
  1721.  * The argument to ForceDialog is any widget in the dialog (often it
  1722.  * will be the BulletinBoard child of a DialogShell).
  1723.  */
  1724.  
  1725. ForceDialog(w)
  1726.      Widget w;
  1727. {
  1728.   Widget diashell, topshell;
  1729.   Window diawindow, topwindow;
  1730.   Display *dpy;
  1731.   XWindowAttributes xwa;
  1732.   XEvent event;
  1733.   XtAppContext cxt;
  1734.  
  1735. /* Locate the shell we are interested in.  In a particular instance, you
  1736.  * may know these shells already.
  1737.  */
  1738.  
  1739.   for (diashell = w;
  1740.        !XtIsShell(diashell);
  1741.        diashell = XtParent(diashell))
  1742.     ;
  1743.  
  1744. /* Locate its primary window's shell (which may be the same) */
  1745.  
  1746.   for (topshell = diashell;
  1747.        !XtIsTopLevelShell(topshell);
  1748.        topshell = XtParent(topshell))
  1749.     ;
  1750.  
  1751.   if (XtIsRealized(diashell) && XtIsRealized(topshell)) {
  1752.     dpy = XtDisplay(topshell);
  1753.     diawindow = XtWindow(diashell);
  1754.     topwindow = XtWindow(topshell);
  1755.     cxt = XtWidgetToApplicationContext(diashell);
  1756.  
  1757. /* Wait for the dialog to be mapped.  It's guaranteed to become so unless... */
  1758.  
  1759.     while (XGetWindowAttributes(dpy, diawindow, &xwa),
  1760.            xwa.map_state != IsViewable) {
  1761.  
  1762. /* ...if the primary is (or becomes) unviewable or unmapped, it's
  1763.    probably iconified, and nothing will happen. */
  1764.  
  1765.       if (XGetWindowAttributes(dpy, topwindow, &xwa),
  1766.           xwa.map_state != IsViewable)
  1767.         break;
  1768.  
  1769. /* At this stage, we are guaranteed there will be an event of some kind.
  1770.    Beware; we are presumably in a callback, so this can recurse. */
  1771.  
  1772.       XtAppNextEvent(cxt, &event);
  1773.       XtDispatchEvent(&event);
  1774.     }
  1775.   }
  1776.  
  1777. /* The next XSync() will get an expose event if the dialog was unmapped. */
  1778.  
  1779.   XmUpdateDisplay(topshell);
  1780. }
  1781.  
  1782.  
  1783. -------------------------------------------------------------------------------
  1784. Subject: 81) How can I control placement of a popup widget?  Each time a popup
  1785. is created, it is placed in or over the middle of its parent.  How can I make it
  1786. obey the XmNx and XmNy values?
  1787.  
  1788. Answer: Set the resource XmNdefaultPosition for the popup to False.  Set the
  1789. position of the popup by the resource values of XmNx and XmNy.  Do not use
  1790. XtMoveWidget, as this is for widget writers only.
  1791.  
  1792. -------------------------------------------------------------------------------
  1793. Subject: 82) TOPIC: LANGUAGE BINDINGS
  1794.  
  1795. -------------------------------------------------------------------------------
  1796. Subject: 83) Is there a C++ binding for Motif?
  1797.  
  1798. Answer: The University of Lowell has a C++ binding.  The software is available
  1799. on any system running X11R3. Currently it is available for both the GNU's C++
  1800. compiler g++ v 1.37.1 and the AT&T C++ v 2.0 translator. The software is
  1801. available through either ftp or a 9 track reel magnetic tape for $250. A license
  1802. must be purchased first.  For additional information and license forms contact :
  1803.  
  1804.      University of Lowell
  1805.      Graphics Research Laboratory/Motif
  1806.      Computer Science Department
  1807.      One University Avenue
  1808.      Lowell, MA 01854
  1809.      attn : Fran Ward
  1810.      (phone 508-934-3628)
  1811.  
  1812. Once you have the license you can legitimately ftp it from 129.63.1.1 in file
  1813. graphics/MotifC++/Motif1.1-g++.tar.Z
  1814.  
  1815.  
  1816. Answer: WWL is a library which defines C++ classes around X Toolkit Widgets.  It
  1817. is intended to simplify the task of C++ code writers when using the Toolkit by
  1818. providing them with C++ objects, methods, type checking and several utility
  1819. functions and classes.
  1820.  
  1821. WWL has been tested under SunOs4.0.3 on sun3 and sun4, HPUX version 6.5 and 7.0
  1822. and Ultrix 4.0 on DECstation 3100 and 5000. It is expected to work on most other
  1823. UNIX systems without too many problems.
  1824.  
  1825. WWL is distributed as a tar file with all the source, documentation and example.
  1826. The file is available using anonymous ftp from
  1827.  
  1828.         export.lcs.mit.edu (18.30.0.238   contrib/WWL-1.0.tar.Z
  1829.         lri.lri.fr (129.175.15.1)      pub/WWL-1.0.tar.Z
  1830.  
  1831.  
  1832. -------------------------------------------------------------------------------
  1833. Subject: 84) Is there a Common Lisp binding for Motif?  Answer: Try CLM. This
  1834. includes a toolkit demon (in C) that takes a widget description (with
  1835. callbacks), and forks a new process for each Motif application (which can be
  1836. just a single menu, or whatever).  Lisp can then continue running, with a
  1837. separate lightweight lisp process handling the connection & callbacks.  In North
  1838. America & net environs, CLM-2.0beta is available from export.lcs.mit.edu.
  1839.  
  1840. -------------------------------------------------------------------------------
  1841. Subject: 85) Is there an Ada binding for Motif?
  1842.  
  1843. Answer: The situation is getting better.
  1844.  
  1845. From Todd W. Lainhart: Take a look at THINGS, a VAPI with Ada bindings that was
  1846. written by the US Air Force (SAC).  It's in the public domain, and available
  1847. from export or gatekeeper.dec.com.  It implements Motif or OL look-and-feel. [I
  1848. had a look and it seemed to be missing documentation - Jan]
  1849.  
  1850. From David Lewis: A company called Rational appears to be making an Xm
  1851. implementation.  Also GHG in Texas has most other Xlib and Xt bindings for Ada.
  1852.  
  1853. From comp.windows.x FAQ: Ada bindings to Motif, explicitly, will eventually be
  1854. made available by the Jet Propulsion Laboratories, probably through the normal
  1855. electronic means.  Advance information can be obtained from
  1856. dsouleles@dsfvax.jpl.nasa.gov, who may respond as time permits.  Another set of
  1857. bindings for Motif is being done by the University of Lowell; information is
  1858. available from osfri@osf.org.[11/90]
  1859.  
  1860. Telesoft is reported to be in the process of negotiating an agreement to license
  1861. and distribute OSF/Motif Ada bindings with delivieries beginning in June
  1862. (anticipated). The person to contact is:
  1863.  
  1864.       Bruce Sherman
  1865.       Vice President
  1866.       Corporate Communications for Telesoft
  1867.       5959 Conerstone Court West
  1868.       San Diego, CA  92121-9891
  1869.       (619)457-2700
  1870.       Fax (619)452-1334
  1871.       email: ucsd!telesoft!bds
  1872.  
  1873.  
  1874. TAE Plus will generate either Ada or C. Contact
  1875.  
  1876.         Goddard Space Flight Center
  1877.         TAE Suppport Office
  1878.         Code 522
  1879.         Attn: Arleen Yeager
  1880.         Greenbelt, MD  20771
  1881.         301-286-6034
  1882.         FTS 888-6034
  1883.  
  1884.         e-mail:  taeso@postman.gsfc.nasa.gov
  1885.  
  1886.         TELEMAIL from a NASA facility:      TELEMAIL outside of NASA:
  1887.         [TAESO/GSFCMAIL]GSFC                [TAESO/GSFCMAIL]GSFC/USA
  1888.         SPAN is 6162::TAESO
  1889.  
  1890.  
  1891. -------------------------------------------------------------------------------
  1892. Subject: 86) TOPIC: SPECIFIC PLATFORMS
  1893.  
  1894. -------------------------------------------------------------------------------
  1895. Subject: 87) Is it easy to build Motif for a Sun?
  1896.  
  1897. Answer: No pattern has emerged to problems about compiling Motif on the Sun
  1898. (although people seem to have a lot of different minor problems), and many
  1899. reports are that it is straightforward. Read the Motif install instructions
  1900. (which often have specific reference to Sun installation), light the blue touch
  1901. paper and just standback. [My experience was that I had to add -D_NO_PROTO for
  1902. 1.1 on a Sparc OS 4.1, and that was all].
  1903.  
  1904.  
  1905. -------------------------------------------------------------------------------
  1906. Subject: 88) What compile errors/warnings might I get in both Sun 3 and Sun 4?
  1907.  
  1908. Answer:
  1909.  
  1910.  
  1911. make: Warning: Too many rules defined for target
  1912. make: Warning: Too many rules defined for target
  1913. "callbacks.c", line 1530: warning: illegal combination of pointer
  1914. and integer, op =
  1915. "callbacks.c", line 1531: warning: illegal combination of pointer
  1916. and integer, op =
  1917. "callbacks.c", line 1532: warning: illegal combination of pointer
  1918. and integer, op =
  1919. "utils.c", line 73: warning: illegal combination of pointer and integer, op =
  1920. "utils.c", line 74: warning: illegal combination of pointer and integer, op =
  1921. "utils.c", line 122: warning: illegal combination of pointer and integer, op =
  1922. "utils.c", line 123: warning: illegal combination of pointer and integer, op =
  1923. "utils.c", line 191: warning: illegal combination of pointer and integer, op =
  1924. "utils.c", line 194: warning: illegal combination of pointer and integer, op =
  1925. "utils.c", line 195: warning: illegal combination of pointer and integer, op =
  1926. "utils.c", line 196: warning: illegal combination of pointer and integer, op =
  1927. "utils.c", line 316: warning: illegal combination of pointer and integer, op =
  1928. "utils.c", line 334: warning: illegal combination of pointer and integer, op =
  1929. "utils.c", line 338: warning: illegal combination of pointer and integer, op =
  1930. "utils.c", line 341: warning: illegal combination of pointer and integer, op =
  1931. "xmdialogs.c", line 838: warning: illegal combination of pointer
  1932. and integer, op =
  1933. "xmeditor.c", line 1152: warning: illegal combination of pointer
  1934. and integer, op =
  1935.  
  1936. These warning messages can be ignored. OSF is aware of these warnings.
  1937.  
  1938.  
  1939. -------------------------------------------------------------------------------
  1940. Subject: 89) On a Sun 3, what are the mwm startup error messages about?  I get
  1941.  
  1942. mwm: Invalid accelerator specification on line 7 of
  1943.      specification string
  1944. mwm: Invalid accelerator specification on line 31 of
  1945.       configuration file
  1946.  
  1947.  
  1948. Answer: This is because some Sun keyboards do not have an F10 key and some sun
  1949. workstations which have an F10 key do not have X-servers which recognize it.
  1950. The F10 key is used by mwm.  If the machine does have an F10 key, the user
  1951. should use xmodmap to tell the server it exists.  Otherwise, change the
  1952. definition of the DefaultWindowMenu in /usr/lib/X11/system.mwmrc (after
  1953. installation) or in /lib/clients/mwm/system.mwmrc (before installation). Change
  1954. the accelerator of "Maximize" (it is "Alt<Key>F10)" to something else. Also, you
  1955. should change the definition of DEFAULTSYSTEMMENU in the file
  1956. /clients/mwm/WmResource.c in a similar fashion.  There is as yet no standard
  1957. redefinition for F10.
  1958.  
  1959.  
  1960.  
  1961. -------------------------------------------------------------------------------
  1962. Subject: 90) Are there problems making shared libraries on a Sun?
  1963.  
  1964. Answer: If you use the -pic option you may run out of offset table space.  use
  1965. the -PIC option instead.
  1966.  
  1967. You may get the message "ld.so: Undefined symbol: __XtInherit" when executing
  1968. UIL. There is a problem in shared library build when you compare a function
  1969. variable to a routine name, but don't call the routine.  Either, you can build
  1970. the Xt library nonshared, or you can put a reference to XtToolkitInitialize in
  1971. the UIL main program (or even include a module that references it).  The routine
  1972. doesn't even have to be called; it just has to be there.
  1973.  
  1974.  
  1975. -------------------------------------------------------------------------------
  1976. Subject: 91) Has anyone made shared libraries on an IBM RS/6000?
  1977.  
  1978. Answer: From Sakari Jalovaara: There is a problem: Xm redefines VendorShell and
  1979. the AIX linker put _both_ Xm's and Xt's VendorShell into programs.  When an AIX
  1980. shared library is created as many references inside the library are resolved as
  1981. possible.  If the symbol vendorShellClassRec is defined in libXt and referenced,
  1982. say, from a function XtFoo() also in libXt, the "ld" run that creates the shared
  1983. library resolves the reference:
  1984.  
  1985.         XtFoo() -> vendorShellClassRec
  1986.  
  1987. Then I create the Motif library that has its own vendorShellClassRec and an
  1988. XmBar() function that uses it; libXm will also contain a resolved reference to
  1989. vendorShellClassRec:
  1990.  
  1991.         XmBar() -> vendorShellClassRec
  1992.  
  1993. Finally, I link a program that uses both XtFoo() and XmBar() and the program
  1994. will end up with _two_ independent "vendorShellClassRec"s:
  1995.  
  1996.         XtFoo() -> vendorShellClassRec [Xt version]
  1997.         XmBar() -> vendorShellClassRec [Xm version]
  1998.  
  1999. Instand schizo zaphod mode.  In reality, vendorShellClassRec is not referenced
  2000. from functions but from other widget class records.
  2001.  
  2002. I can't just pull Vendor.o out from the shared Xt (Vendor.o appears to define
  2003. the only external symbols redefined by libXm) because AIX shared libraries
  2004. apparently can't contain unresolved external references.  If I take out Vendor.o
  2005. I have to take out every other file that uses symbols defined there - and then
  2006. files that need those files, etc.  I tried it and ended up with three or four
  2007. object files in libXt and the res non-sharable.
  2008.  
  2009. I kludged around this by putting all of libXt (minus Vendor.o) into the shared
  2010. libXm.  It isn't a pretty solution but it works - and beats having a statically
  2011. linked two-megabyte "periodic" demo...
  2012.  
  2013.  
  2014. -------------------------------------------------------------------------------
  2015. Subject: 92) TOPIC: KEYSYMS
  2016.  
  2017. -------------------------------------------------------------------------------
  2018. Subject: 93) What is causing the messages "unknown keysym osfDown..."?  It
  2019. happens when I run an application under Motif 1.1
  2020.  
  2021. Answer: There is an OSF supplied addition to the /usr/lib/X11/XKeysymDB file.
  2022. It is found on the release tape and should have been automatically installed if
  2023. the installation procedure was followed in the Release Notes.
  2024.  
  2025. You have to copy (or append) lib/Xm/XKeysymDB into /usr/lib/X11.  This may
  2026. require root permission.  It is not clear how to fix the problem if you can't do
  2027. this.  The error comes from Xt translation table parsing and can't be fixed in
  2028. Motif, so if you can't get root permission you may be stuck.  The file is not
  2029. copyrighted so you can install it on other systems.
  2030.  
  2031. XKeysymDB simply contains the registered keysym values for the OSF keysyms.  The
  2032. OSF values are server-independent.  And, all registered keysyms will be included
  2033. in an XKeysymDB file to be shipped with X11R5.
  2034.  
  2035. In the meantime (till all systems are X11R5+), a list of the registered keysyms
  2036. can be found in the X11R4 release in mit/doc/Registry/Xregistry.
  2037.  
  2038.  
  2039.  
  2040. -------------------------------------------------------------------------------
  2041. Subject: 94) What happens if I can't install Motif Keysyms?
  2042.  
  2043. From: tessi!george@nosun.West.Sun.COM (George Mitchell)
  2044.  
  2045. Here's what appears to happen if you don't have XKeysymDB in place to define
  2046. OSF's virtual keysyms:
  2047.  
  2048. 1. At class initialize time, for a widget (such as XmText) that uses virtual
  2049. keysyms in its event translation table, all entries which refer to those keysyms
  2050. fail to parse correctly.  In the case of XmText, instead of ending up with a
  2051. translation table with roughly 90 entries, you end up with one that has 29.
  2052.  
  2053. 2. XKeysymDB doesn't exist, so you'd assume that KeyPress events will get
  2054. translated to plain vanilla keysyms, right?  WRONG!  All Motif widgets install a
  2055. virtual keysym translator ANYWAY!  Consequently, the backspace key (for example)
  2056. gets translated to the keysym osfBackSpace.
  2057.  
  2058. 3. Therefore, if you augment or override your widget's translations with
  2059. translations that refer to plain vanilla BackSpace, they will never be
  2060. triggered, because you will NEVER see plain vanilla BackSpace, only
  2061. osfBackSpace.
  2062.  
  2063. 4. But you can't use osfBackSpace in an event translation entry, because you
  2064. don't have XKeysymDB installed!
  2065.  
  2066. Here's how I'm "dealing" with the problem right now: Motif installs its virtual
  2067. keysym translator by calling XtSetKeyTranslator every time a VendorShell (or
  2068. subclass) widget is created.  So every time I create a shell, I immediately call
  2069. XtSetKeyTranslator (display, XtTranslateKey) to restore the default translator.
  2070. No more funny virtual keysyms!  Now I can reinstall non-osfKeySym translations
  2071. and have them work the way I expect.
  2072.  
  2073.  
  2074. -------------------------------------------------------------------------------
  2075. Subject: 95) Why has OSF introduced Keysyms into Motif 1.1?  They weren't there
  2076. in Motif 1.0.
  2077.  
  2078. Answer: From: ellis@osf.org
  2079.  
  2080. Virtual Keysyms are meant to provide a consistent keyboard model for Motif
  2081. applications running in a heterogeneous environment in which proprietary (i.e.
  2082. vendor specific) non-Motif applications may also be running.
  2083.  
  2084. First of all, for the sake of the rest of the readers, let's explain why this is
  2085. an issue:
  2086.  
  2087. It would be lovely if Motif's translation tables could just use the obvious
  2088. keysyms predefined by X.  For example, there are keysyms for XK_BackSpace,
  2089. XK_Delete, XK_Left, XK_Right, etc.  Shouldn't these be the ones that are used in
  2090. our translations?  Unfortunately, the problem is not so simple.  Some specific
  2091. examples:
  2092.  
  2093.    While most vendors bind XK_BackSpace to the key at the top right
  2094.    of the standard keyboard (often engraved with a leftwards
  2095.    pointing arrow), not all do.  In fact, some vendors (including DEC)
  2096.    bind that key to XK_Delete.
  2097.  
  2098.    While most vendors bind the arrow keys to XK_Up, etc, a number of
  2099.    vendors (including Sun, on some servers) bind them to function key
  2100.    keysyms.
  2101.  
  2102. A simplistic solution would require the use of xmodmap to change the offending
  2103. bindings.  That would work swell in an all Motif environment.  However, OSF's
  2104. goal (not always pefectly achieved) is interoperability.  That is, we'd like to
  2105. make sure that both Motif and non-Motif programs can happily run in the same
  2106. environment.
  2107.  
  2108. It is expected that a vendor may have a wide variety of existing X-based
  2109. software that uses the keysyms as established by that vendor for specific
  2110. purposes.  It is expected that these applications may run at the same time as
  2111. Motif-based software.  Using xmodmap to change keysyms on the server side could
  2112. "break" the existing applications (or at the very least their documentation) by
  2113. making some keys unavailable, or by moving the location.
  2114.  
  2115. So, we chose not to use xmodmap.  By the way, though OpenLook uses a different
  2116. implementation (they recompile their virtual translation tables into actual
  2117. translation tables), they basically adopted the same approach, presumably for
  2118. similar reasons.
  2119.  
  2120. To work properly, the virtual keysym model we implemented depends on Xlib
  2121. finding XKeysymDB installed appropriately (which standard Motif installation
  2122. does).  This simply defines the keysyms (not the key they are bound to).  This
  2123. unfortunate piece of stupidity is necessary because MIT only includes standard
  2124. keysyms in keysymdef.h.  It should be said that our lives would be made easier
  2125. if MIT would also see fit to include registered keysyms in keysymdef.h as well.
  2126.  
  2127. Motif applications determine how to bind virtual to actual keys by looking for
  2128. either a resource or a property on the root window which describes what to do.
  2129. Note that this information is on the server side, so that all applications use
  2130. the same virtual bindings regrdless of where they are running.  Mwm will happily
  2131. create the property if it finds a .motifbind file in your home directory when it
  2132. starts up.  (Actually, things generally work even if none of this is done, since
  2133. if all else fails, the Motif toolkit chooses a virtual bindings table to use
  2134. based on the identification of the server).
  2135.  
  2136. The actual implmentation of virtual keys is made possible by a hook in the
  2137. Intrinsics.  Undoubtably, the implementation would be simpler and cleaner if
  2138. virtual key support was more directly supported by the Intrinsics.  We will be
  2139. exploring this possibility in the future.
  2140.  
  2141.   -- Ellis
  2142.  
  2143. -------------------------------------------------------------------------------
  2144. Subject: 96) TOPIC: ICONS
  2145.  
  2146. Iconification/de-iconification is a co-operative process between a client and a
  2147. window manager.  The relevant standards are set by ICCCM.  Mwm is ICCCM
  2148. compliant.  The toplevel (non-override-redirect) windows of an application may
  2149. be in three states: WithdrawnState (neither the window nor icon visible),
  2150. NormalState (the window visible) or IconicState (the icon window or pixmap
  2151. visible).  This information is contained in the WM_STATE property but ordinary
  2152. clients are not supposed to look at that.  Movement between the three states is
  2153. standardised by ICCCM.
  2154.  
  2155. -------------------------------------------------------------------------------
  2156. Subject: 97) How can I keep track of changes to iconic/normal window state?
  2157.  
  2158. Answer: You can look at the WM_STATE property, but this breaks ICCCM guidelines.
  2159. ICCCM compliant window managers will map windows in changing them to normal
  2160. state and unmap them in changing them to iconic state. Look for StructureNotify
  2161. events and check the event type:
  2162.  
  2163.         XtAddEventHandler (toplevel_widget,
  2164.                         StructureNotifyMask,
  2165.                         False,
  2166.                         StateWatcher,
  2167.                         (Opaque) NULL);
  2168.         ....
  2169.         void StateWatcher (w, unused, event)
  2170.         Widget w;
  2171.         caddr_t unused;
  2172.         XEvent *event;
  2173.         {
  2174.                 if (event->type == MapNotify)
  2175.                         printf ("normal0);
  2176.                 else if (event->type == UnmapNotify)
  2177.                         printf ("iconified0);
  2178.                 else    printf ("other event0);
  2179.         }
  2180.  
  2181. If you insist on looking at WM_STATE, here is some code (from Ken Sall) to do
  2182. it:
  2183.  
  2184.         /*
  2185.         ------------------------------------------------------------------
  2186.         Try a function such as CheckWinMgrState below which returns one of
  2187.         IconicState | NormalState | WithdrawnState | NULL :
  2188.         ------------------------------------------------------------------
  2189.         */
  2190.         #define WM_STATE_ELEMENTS 1
  2191.  
  2192.         unsigned long *CheckWinMgrState (dpy, window)
  2193.         Display *dpy;
  2194.         Window window;
  2195.         {
  2196.           unsigned long *property = NULL;
  2197.           unsigned long nitems;
  2198.           unsigned long leftover;
  2199.           Atom xa_WM_STATE, actual_type;
  2200.           int actual_format;
  2201.           int status;
  2202.  
  2203.             xa_WM_STATE = XInternAtom (dpy, "WM_STATE", False);
  2204.  
  2205.             status = XGetWindowProperty (dpy, window,
  2206.                           xa_WM_STATE, 0L, WM_STATE_ELEMENTS,
  2207.                           False, xa_WM_STATE, &actual_type, &actual_format,
  2208.                           &nitems, &leftover, (unsigned char **)&property);
  2209.  
  2210.             if ( ! ((status == Success) &&
  2211.                         (actual_type == xa_WM_STATE) &&
  2212.                         (nitems == WM_STATE_ELEMENTS)))
  2213.                 {
  2214.                 if (property)
  2215.                     {
  2216.                     XFree ((char *)property);
  2217.                     property = NULL;
  2218.                     }
  2219.                 }
  2220.             return (property);
  2221.         } /* end CheckWinMgrState */
  2222.  
  2223.  
  2224. -------------------------------------------------------------------------------
  2225. Subject: 98) How can I check if my application has come up iconic?  I want to
  2226. delay initialisation code and other processing.
  2227.  
  2228. Answer: According to ICCCM, a client window starts up with WM_STATE set to
  2229. WithdrawnState and then will move to IconicState.  No specific events are
  2230. generated (not even an UnmapNotify).  Ordinary clients aren't supposed to look
  2231. at WM_STATE so there seems to be no way of catching this change of state.
  2232. However, if what you really want is to do nothing while in the initial iconic
  2233. state, set a global variable `doInitialise' set to True and do no other
  2234. initialisation.  Look for MapNotify events which will occur when the client is
  2235. de-iconified, perform initialisation stuff only when the variable is True, and
  2236. then set the variable to False.
  2237.  
  2238.  
  2239. -------------------------------------------------------------------------------
  2240. Subject: 99) How can I start my application in iconic state?
  2241.  
  2242. Answer: From the command line
  2243.  
  2244.         application -iconic
  2245.  
  2246. Using the resource mechanism, set the resource XmNinitialState to IconicState of
  2247. the toplevel shell widget (the one returned from XtInitialise).
  2248.  
  2249. -------------------------------------------------------------------------------
  2250. Subject: 100) How can an application iconify itself?
  2251.  
  2252. Answer: Send an event to the root window with a type of WM_CHANGE_STATE and data
  2253. IconicState.
  2254.  
  2255.         void
  2256.         IconifyMe (dpy, win)
  2257.         Display *dpy;
  2258.         Window win;     /* toplevel window to iconify */
  2259.         {
  2260.                 Atom xa_WM_CHANGE_STATE;
  2261.                 XClientMessageEvent ev;
  2262.  
  2263.                 xa_WM_CHANGE_STATE = XInternAtom (dpy,
  2264.                                         "WM_CHANGE_STATE", False);
  2265.  
  2266.                 ev.type = ClientMessage;
  2267.                 ev.display = dpy;
  2268.                 ev.message_type = xa_WM_CHANGE_STATE;
  2269.                 ev.format = 32;
  2270.                 ev.data.l[0] = IconicState;
  2271.                 ev.window = win;
  2272.  
  2273.                 XSendEvent (dpy,
  2274.                         RootWindow (dpy, DefaultScreen(dpy)),
  2275.                         True,
  2276.                         (SubstructureRedirectMask | SubstructureNotifyMask),
  2277.                         &ev);
  2278.                 XFlush (dpy);
  2279.         }
  2280.  
  2281.  
  2282. -------------------------------------------------------------------------------
  2283. Subject: 101) How can an application de-iconify itself?
  2284.  
  2285. Answer: XMapWindow (XtWindow (toplevel_widget)).
  2286.  
  2287. -------------------------------------------------------------------------------
  2288. Subject: 102) TOPIC: MISCELLANEOUS
  2289.  
  2290. -------------------------------------------------------------------------------
  2291. Subject: 103)* How can tell I if the user has selected the "Close" item on the
  2292. system menu attached to the top-level shell?  I need to do some clean up before
  2293. exiting.
  2294.  
  2295. Answer:          This works with R4 Intrinsics
  2296.  
  2297.         void FinalCleanupCB(w, client_data, call_data)
  2298.         Widget   w;
  2299.         caddr_t  client_data, call_data;
  2300.         {
  2301.                 /* tidy up stuff here */
  2302.                 ...
  2303.                 /* exit if you want to */
  2304.                 exit (0);
  2305.         }
  2306.  
  2307.         main()
  2308.         {
  2309.                 Atom wm_delete_window;
  2310.  
  2311.                 ...
  2312.                 XtRealizeWidget(toplevel);
  2313.                 ...
  2314.                 wm_delete_window =
  2315.                         XmInternAtom(XtDisplay(toplevel),
  2316.                                 "WM_DELETE_WINDOW", False);
  2317.                 XmAddWMProtocolCallback(toplevel, wm_delete_window,
  2318.                         FinalCleanupCB, NULL);
  2319.                 XtMainLoop();
  2320.         }
  2321.  
  2322. This will still kill the application.  To turn this behaviour off so that the
  2323. application is not killed, set the shell resource XmNdeleteResponse to
  2324. XmDO_NOTHING.  This means that users cannot kill your application via the system
  2325. menu, and may be a bad thing.
  2326.  
  2327. If you are running R3, Bob Hays (bobhays@spss.com) has suggested this: "Trapping
  2328. on the delete window atom does not work as I cannot force my action routine to
  2329. the top of the action list for the activity desired, so the window manager kills
  2330. my window anyway BEFORE I can do anything about it.  And, to make matters worse,
  2331. the window manager (Motif in this case) tacks its atoms and handlers onto the
  2332. window at some unknown point down the line after the creation of the shell
  2333. widget as far as I can tell.  So....
  2334.  
  2335. I have a procedure as an action routine for ClientMessage.  Then, if I get a
  2336. property change event on the window manager protocols, I then tack on
  2337. WM_SAVE_YOURSELF.  If I get this request, I clean up (it seems to happen on
  2338. WM_DELETE_WINDOW, BTW, if you remove WM_DELETE_WINDOW from the WM protocols
  2339. atom) and exit.  Works great and is less filling overall:-)."
  2340.  
  2341.  
  2342.  
  2343. -------------------------------------------------------------------------------
  2344. Subject: 104) Why does an augment translation appear to act as replace for some
  2345. widgets?  When I use either augment or override translations in .Xdefaults it
  2346. seems to act as replace in both Motif 1.0 and 1.1
  2347.  
  2348. Answer: By default, the translation table is NULL.  If there is nothing
  2349. specified (either in resource file, or in args), the widget's Initialize finds:
  2350. Oh, there is NULL in translations, lets use our default ones.  If, however, the
  2351. translations have become non-NULL, the default translations are NOT used at all.
  2352. Thus, using #augment, #override or a new table has identical effect: defines the
  2353. new translations. The only way you can augment/override Motif's default
  2354. translations is AFTER Initialize, using XtSetValues.  Note, however, that Motif
  2355. managers do play with translation tables as well ... so that results are not
  2356. always easy to predict.
  2357.  
  2358. From OSF: A number of people have complained about not being able to
  2359. augment/override translations from the .Xdefaults.  This is due to the
  2360. complexity of the menu system/keyboard traversal and the necessary translations
  2361. changes required to support the Motif Style Guide in menus.  It cannot be fixed
  2362. in a simple way. Fixing it requires re-design of the menus/buttons and it is
  2363. planned to be fixed in 1.2.
  2364.  
  2365.  
  2366.  
  2367.  
  2368.  
  2369. -------------------------------------------------------------------------------
  2370. Subject: 105) How do you "grey" out a widget so that it cannot be activated?
  2371.  
  2372. Answer: Use XtSetSensitive(widget, False). Do not set the XmNsensitive resource
  2373. directly yourself (by XtSetvalues) since the widget may need to talk to parents
  2374. first.
  2375.  
  2376.  
  2377. -------------------------------------------------------------------------------
  2378. Subject: 106) Why doesn't the Help callback work on some widgets?
  2379.  
  2380. Answer: If you press the help key the help callback of the widget with the
  2381. keyboard focus is called (not the one containing the mouse).  You can't get the
  2382. help callback of a non-keyboard-selectable widget called. To get `context
  2383. sensitive' help on these, you have to find the mouse, associate its position
  2384. with a widget and then do the help.
  2385.  
  2386.  
  2387.  
  2388. -------------------------------------------------------------------------------
  2389. Subject: 107) Where can I get a Table widget?
  2390.  
  2391. Answer: Send email to Kee Hinckley (nazgul@alfalfa.com) asking for a copy of his
  2392. table widget.  The Widget Creation Library also has one.  See under Motif
  2393. protyping tools for the contact.
  2394.  
  2395.  
  2396. -------------------------------------------------------------------------------
  2397. Subject: 108) Has anyone done a bar graph widget?
  2398.  
  2399. Answer: You can fake one by using for each bar a scroll bar or even a label
  2400. which changes in size, put inside a container of some kind.
  2401.  
  2402. Try the StripChart widget in the Athena widget set. Set the XtNupdate resource
  2403. to 0 to keep it from automatically updating.
  2404.  
  2405. The comp.windows.x FAQ mentions a bar graph widget.
  2406.  
  2407. -------------------------------------------------------------------------------
  2408. Subject: 109) Does anyone know of a source code of a graph widget where you can
  2409. add vertices and edges and get an automated updating?
  2410.  
  2411. Answer: No Motif one has been reported.  The XUG FAQ in comp.windows.x includes
  2412. information on graph display widgets.  There is also an implementation in the
  2413. Asente/Swick book.
  2414.  
  2415.   From Martin Janzen: "You could have a look at DataViews, from V.I.
  2416.    Corporation.  This package is used mainly to display a variety of graph
  2417.    drawings (eg. bar, line, pie, high/low, and other charts), and to update
  2418.    the graphs as information is received from "data sources" such as files,
  2419.    processes (through pipes), or devices.
  2420.  
  2421.    However, it also provides "node" and "edge" objects which can be used
  2422.    when working with network graphs.  The DV-Tools function library
  2423.    provides routines which traverse a graph, count visits to each node or
  2424.    edge, mark nodes or edges of interest, and so on.  A node or edge object
  2425.    can have an associated "geometry object" (such as a symbol or a line),
  2426.    which represents that node or edge.
  2427.  
  2428.    Drawbacks: There's no automatic positioning algorithm; when you add a
  2429.    node or edge, you have to create and position its geometry object
  2430.    yourself.  Also, this isn't a set of add-on widgets; you can either have
  2431.    DataViews create an X window (ie. a separate shell), or you can create
  2432.    your own XmDrawingArea and use DataViews to update its window when
  2433.    expose events are received.  Finally, the package is quite expensive,
  2434.    and there is a run-time charge.
  2435.  
  2436.    The vendor's address is:
  2437.      V.I. Corporation,
  2438.      47 Pleasant Street,
  2439.      Northampton, MA  01060,
  2440.             Email: vi@vicorp.com, Phone: (413) 586-4144, Fax:   (413) 584-2649
  2441.  
  2442.    or
  2443.  
  2444.      V.I. Corporation (Europe) Ltd.,
  2445.      First Base, Beacontree Plaza,
  2446.      Gillette Way,                      Email: viesales@eurovi.uucp
  2447.      Reading, Berkshire  RG2 0BP"
  2448.    Phone: +44 734 756010,      Fax:   +44 734 756104
  2449.  
  2450. From Craig Timmerman: Just wanted others to know that there is a third
  2451. competitor in what may be come a big market for generic APIs.  The product is
  2452. called Open Interface and Neuron Data is the vendor.  Neuron has added some
  2453. extra, more complex widgets to their set.  The two most notable are a table and
  2454. network widget.  [...] I believe that the network widget got its name from its
  2455. ability to display expert system networks that Neuron's AI tools needed.  It
  2456. would be more aptly named the graph widget.  It can display and manipulate
  2457. graphs of various types (trees, directed graphs, etc).  Contact is
  2458.  
  2459.         Neuron Data
  2460.         156 University Avenue
  2461.         Palo Alto,  CA  94301
  2462.         (415) 321-4488
  2463.  
  2464.  
  2465.  
  2466. -------------------------------------------------------------------------------
  2467. Subject: 110)* Is there a help system available, such as in Windows 3?  Or any
  2468. Motif based hypertext system.
  2469.  
  2470. Answer: % Dave Brennan (brennan@dg-rtp.dg.com) has written a Motif based %
  2471. hypertext document viewing system for Data General software products.
  2472.  
  2473. Bristol Technology have a hypertext system with the look-and-feel of either
  2474. Motif or OpenLook. It should be available from january 31, 1992. Contact
  2475.  
  2476.         Bristol Technology Inc.
  2477.         898 Ethan Allen Highway
  2478.         Ridgefield, CT  06877
  2479.         203-438-6969 (phone)
  2480.         203-438-5013 (fax)
  2481.         uunet.uu.net!bristol!keith
  2482.  
  2483.  
  2484.  
  2485. -------------------------------------------------------------------------------
  2486. Subject: 111) Can I specify a widget in a resource file?
  2487.  
  2488. Answer: This answer, which uses the Xmu library, is due to David Elliott.  If
  2489. the converter is added, then the name of a widget (a string) can be used in
  2490. resource files, and will be converted to the appropriate widget.
  2491.  
  2492. This code, which was basically stolen from the Athena Form widget, adds a String
  2493. to Widget converter.  I wrote it as a general routine that I call at the
  2494. beginning of all of my programs, and made it so I could add other converters as
  2495. needed (like String to Unit Type ;-).
  2496.  
  2497.         #include <X11/Intrinsic.h>
  2498.         #include <X11/StringDefs.h>
  2499.         #include <Xm/Xm.h>
  2500.         #include <X11/Xmu/Converters.h>
  2501.         #include <X11/IntrinsicP.h>
  2502.         #include <X11/CoreP.h>
  2503.  
  2504.         void
  2505.         setupConverters()
  2506.         {
  2507.                 static XtConvertArgRec parentCvtArgs[] = {
  2508.                         {XtBaseOffset, (caddr_t)XtOffset(Widget, core.parent),
  2509.                                 sizeof(Widget)}
  2510.                 };
  2511.  
  2512.                 XtAddConverter(XmRString, XmRWindow, XmuCvtStringToWidget,
  2513.                         parentCvtArgs, XtNumber(parentCvtArgs));
  2514.         }
  2515.  
  2516.  
  2517.  
  2518. -------------------------------------------------------------------------------
  2519. Subject: 112) Why are only some of my translations are being installed?  I have
  2520. a translation table like the following, but only the first ones are getting
  2521. installed and the rest are ignored.
  2522.  
  2523.  *Text.translations:    #override \
  2524.      Ctrl<Key>a:    beginning-of-line() \n\
  2525.      Ctrl<Key>e:    end-of-line() \n\
  2526.      Ctrl<Key>f:    forward-character() \n\
  2527.  
  2528.  
  2529. Answer: Most likely, you have a space at the end of one of the lines (the first
  2530. in this case).
  2531.  
  2532.      Ctrl<Key>a:    beginning-of-line() \n\
  2533.                                            ^ space here
  2534.  
  2535. The second backslash in each line is there to protect the real newline character
  2536. and so you must not follow it with anything other than the newline itself.
  2537. Otherwise it acts as the end of the resource definition and the remaining lines
  2538. are not added.
  2539.  
  2540.  
  2541. -------------------------------------------------------------------------------
  2542. Subject: 113) Where can I get the PanHandler code?
  2543.  
  2544. Answer: It is available by email from Chuck Ocheret: chuck@fid.Morgan.COM.
  2545.  
  2546. -------------------------------------------------------------------------------
  2547. Subject: 114) What are these passive grab warnings?  When I destroy certain
  2548. widgets I get a stream of messages
  2549.  
  2550.     Warning: Attempt to remove non-existant passive grab
  2551.  
  2552.  
  2553. Answer: They are meaningless, and you want to ignore them.  Do this (from Kee
  2554. Hinckley) by installing an XtWarning handler that explicitly looks for them and
  2555. discards them:
  2556.  
  2557.         static void xtWarnCB(String message) {
  2558.            if (asi_strstr(message, "non-existant passive grab", TRUE)) return;
  2559.            ...
  2560.  
  2561. They come from Xt, and (W. Scott Meeks): "it's something that the designers of
  2562. Xt decided the toolkit should do. Unfortunately, Motif winds up putting passive
  2563. grabs all over the place for the menu system.  On the one hand, we want to
  2564. remove all these grabs when menus get destroyed so that they don't leak memory;
  2565. on the other hand, it's almost impossible to keep track of all the grabs, so we
  2566. have a conservative strategy of ungrabbing any place where a grab could have
  2567. been made and we don't explicitly know that there is no grab.  The unfortunate
  2568. side effect is the little passive grab warning messages.  We're trying to clean
  2569. these up where possible, but there are some new places where the warning is
  2570. generated.  Until we get this completely cleaned up (1.2 maybe), your best bet
  2571. is probably to use a warning handler."
  2572.  
  2573. -------------------------------------------------------------------------------
  2574. Subject: 115) How do I have more buttons than three in a box?  I want to have
  2575. something like a MessageBox (or other widget) with more than three buttons, but
  2576. with the same nice appearance.
  2577.  
  2578. Answer: A SelectionBox is created with four buttons, but the fourth (the Apply
  2579. button) is unmanaged. To manage it get its widget ID via
  2580. XmSelectionBoxGetChild(parent, XmDIALOG_APPLY_BUTTON) and then XtManage it.
  2581. Unmanage all of the other bits in the SelectionBox that you don't want.  If you
  2582. want more than four buttons, try two SelectionBoxes (or similar) together in a
  2583. container, where all of the unwanted parts of the widgets are unmanaged.
  2584.  
  2585.  
  2586. -------------------------------------------------------------------------------
  2587. Subject: 116) TOPIC: ACKNOWLEDGEMENTS
  2588.  
  2589. This list was compiled using questions and answers posed to comp.windows.x.motif
  2590. and motif-talk. Some extracts were also taken from FAQs of comp.windows.x.  To
  2591. all who contributed one way or the other, thanks! I haven't often given
  2592. individual references, but  you may recognise contributions. If I have mangled
  2593. them too much, let me know.
  2594.  
  2595.  
  2596.  
  2597. That's all folks!
  2598.  
  2599.  
  2600. +----------------------+---+
  2601.   Jan Newmarch, Information Science and Engineering,
  2602.   University of Canberra, PO Box 1, Belconnen, Act 2616
  2603.   Australia. Tel: (Aust) 6-2522422. Fax: (Aust) 6-2522999
  2604.  
  2605.   ACSnet: jan@ise.canberra.edu.au
  2606.   ARPA:   jan%ise.canberra.edu.au@uunet.uu.net
  2607.   UUCP:   {uunet,ukc}!munnari!ise.canberra.edu.au!jan
  2608.   JANET:  jan%au.edu.canberra.ise@EAN-RELAY
  2609.  
  2610. +--------------------------+
  2611.