home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1997 December / Internet_Info_CD-ROM_Walnut_Creek_December_1997.iso / faqs / comp / answers / motif-faq / part3 < prev    next >
Internet Message Format  |  1997-10-19  |  64KB

  1. Path: senator-bedfellow.mit.edu!faqserv
  2. From: kenton@rahul.net (Ken Lee)
  3. Newsgroups: comp.windows.x.motif,comp.answers,news.answers
  4. Subject: Motif FAQ (Part 3 of 9)
  5. Supersedes: <motif-faq/part3_875789459@rtfm.mit.edu>
  6. Followup-To: poster
  7. Date: 18 Oct 1997 10:15:23 GMT
  8. Organization: none
  9. Lines: 1561
  10. Approved: news-answers-request@MIT.EDU
  11. Distribution: inet
  12. Expires: 1 Dec 1997 10:06:58 GMT
  13. Message-ID: <motif-faq/part3_877169218@rtfm.mit.edu>
  14. References: <motif-faq/part1_877169218@rtfm.mit.edu>
  15. Reply-To: kenton@rahul.net (Ken Lee)
  16. NNTP-Posting-Host: penguin-lust.mit.edu
  17. Summary: Motif Frequently Asked Questions (with answers).
  18. Keywords: FAQ question answer
  19. X-Last-Updated: 1997/08/27
  20. Originator: faqserv@penguin-lust.MIT.EDU
  21. Xref: senator-bedfellow.mit.edu comp.windows.x.motif:60051 comp.answers:28579 news.answers:114851
  22.  
  23. Archive-name: motif-faq/part3
  24. Last-modified: SEP 1, 1997
  25. Posting-Frequency: irregular
  26. Organization: Kenton Lee, X/Motif Consultant, http://www.rahul.net/kenton/
  27. URL:  http://www.rahul.net/kenton/faqs/mfaq_index.html
  28. Version: 6.3
  29.  
  30. -----------------------------------------------------------------------------
  31. Subject: 45)  TOPIC: X and MOTIF on the WORLD WIDE WEB (WWW)
  32.  
  33. -----------------------------------------------------------------------------
  34. Subject: 46)  Is there a central location for Motif information on the WWW? Is
  35. there a home page for Motif developers?
  36.  
  37. [Last modified: Nov 96]
  38.  
  39. Answer:  On March 31, 1995, Ken Sall announced a Web page called:
  40.  
  41.                 "MW3: Motif on the World Wide Web"
  42.                 http://www.cen.com/mw3/
  43.  
  44. MW3 is a meta reference intended to connect you to a wealth of resources for
  45. Motif and X Window System development. MW3 presently contains over 700 links!
  46. The current Table of Contents follows:
  47.  
  48.         FAQs: Frequently Asked Questions
  49.         Widgets, Toolkits, Libraries, and GUIs
  50.         Organizations
  51.         Motif Providers
  52.         Non-Commercial Applications and Shareware
  53.         Multimedia
  54.         Commercial Products and Vendors
  55.         Publications and References
  56.         Code Examples and Tutorials
  57.         Tips and Pointers
  58.         Security
  59.         Internationalization
  60.         Usenet Newsgroups
  61.         Conferences
  62.         Personal Home Pages
  63.  
  64.  
  65. MW3 is sponsored by Century Computing, Inc.
  66. -----------------------------------------------------------------------------
  67. Subject: 47)  Where can I find X technical info on the WWW?
  68.  
  69. [Last modified: Mar 96]
  70.  
  71. Answer:  If you couldn't find what you were looking for in "MW3: Motif on the
  72. WWW" (http://www.cen.com/mw3/), then check Ken Lee's excellent page:
  73.  
  74.  
  75.     Technical X Window System and OSF/Motif WWW sites
  76.     http://www.rahul.net/kenton/xsites.html
  77.  
  78.  
  79. This web site currently lists over 700 X Window System links.  This site is
  80. more technical and less product oriented than the MW3 site listed above.
  81. Visit them both; one probably has what you want.
  82.  
  83. -----------------------------------------------------------------------------
  84. Subject: 48)  What is Broadway?  I've heard it called "X on the Web".
  85.  
  86. [Last modified: Nov 96]
  87.  
  88. Answer:  Broadway is a collection of X-based technologies for the World Wide
  89. Web.  Paul Lavelle wrote a good introductory article for the November, 1995
  90. issue of *The X Advisor*:
  91.  
  92.     http://landru.unx.com/DD/advisor/docs/nov95/nov95.plavallee.shtml
  93.  
  94. Thanks to Ken Lee, http://www.rahul.net/kenton/
  95.  
  96. The X Consortium's Broadway web page is:
  97.  
  98.     http://www.x.org/consortium/broadway.html
  99.  
  100. And if you're wondering. "Why did they call it Broadway?", the X Consortium is
  101. located at 201 Broadway, Cambridge, MA.... ksall@cen.com
  102.  
  103. Century Computing's "MW3: Motif on the World Wide Web" page contains a section
  104. of links to Broadway info which will be actively maintained:
  105.  
  106.     http://www.cen.com/mw3/orgs.html#broadway-info
  107.     Broadway - the next generation of X!
  108.  
  109. including a list of Broadway-related mailing lists for X Consortium members:
  110.  
  111.     http://www.cen.com/mw3/broadway-mail-lists.html
  112.  
  113. For a concise description of Broadway, see the question "What is Broadway?"
  114. in the X11 FAQ, part 3:
  115.  
  116.     http://www.cs.ruu.nl/wais/html/na-dir/x-faq/part3.html
  117.  
  118. -----------------------------------------------------------------------------
  119. Subject: 49)  Where's an HTML version of the Motif FAQ on World Wide Web
  120. (WWW)?
  121.  
  122. [Last modified: Feb 95]
  123.  
  124. Answer:  An automatically generated HTML version of this Motif FAQ can be
  125. found at WWW URL:
  126.  
  127.     http://www.cis.ohio-state.edu/hypertext/faq/usenet/motif-faq/top.html
  128.  
  129. For a searchable version of the Motif FAQ and other FAQs (via WAIS), see:
  130.  
  131.     http://www.cs.ruu.nl/cgi-bin/faqwais
  132.  
  133. The WAIS search is great way to find a topic which may appear in several FAQs
  134. (Motif, X, Xt, Widget FAQ, etc.)
  135.  
  136. -----------------------------------------------------------------------------
  137. Subject: 50)  Which X and Motif developers have their own home page URLs?
  138.  
  139. [Last modified: Aug 95]
  140.  
  141. Answer:  NOTE: For the most current version of this list, see:
  142.  
  143.                 http://www.cen.com/mw3/people.html
  144.  
  145. This subject provides an opportunity for me to thank some of you for your
  146. invaluable contributions (direct or indirect) to this FAQ and, at the same
  147. time, to make it easy for the X and Motif community to contact you.
  148. Contributions and corrections appreciated. It is also a way to keep a current
  149. contact list for some of you who have moved to other companies.
  150.  
  151. Requirements for inclusion in this list:
  152.  
  153.     (a) have at least 2 contributions in the Motif, X, or Xt FAQ; or
  154.         work directly for OSF or the X Consortium;
  155.     (b) have your own home page (not just their company's home page);
  156.     (c) submit the following info in this 4-line format:
  157.  
  158.             First_name Last_name
  159.             Your_home_page_URL
  160.             mailto:email_address
  161.             which FAQ your name/address appears (Motif, X, or Xt)
  162.  
  163.         NOTE: Be sure to put "For Motif FAQ" as your email
  164.         subject. Send it to ksall@cen.com mailto:ksall@cen.com
  165.  
  166. X and Motif developer home pages listed in alphabetical order by last name:
  167.  
  168. David Brooks http://www.x.org/people/dbrooks/ mailto:dbrooks@x.org
  169.  
  170. John L. Cwikla http://www.wri.com:80/~cwikla/ mailto:cwikla@wri.com
  171.  
  172. Daniel Dardailler http://www.x.org:80/people/daniel/
  173. http://www.w3.org/pub/WWW/People/danield mailto:danield@w3.org
  174.  
  175. Kaleb S. Keithley http://www.x.org/people/kaleb/kaleb.html mailto:kaleb@x.org
  176.  
  177. Ken Lee http://www.rahul.net/kenton/index.shtml mailto:kenton@rahul.net
  178.  
  179. Jan Newmarch http://pandonia.canberra.edu.au/ mailto:jan@ise.canberra.edu.au
  180.  
  181. Doug Rand http://reality.sgi.com/employees/drand/ mailto:drand@sgi.com
  182.  
  183. Ralph R. Swick http://www.x.org/people/swick.html mailto:swick@x.org
  184.  
  185. -----------------------------------------------------------------------------
  186. Subject: 51)  Where can I get the HTML widget used in Mosaic?
  187.  
  188. [Last modified: Mar 96]
  189.  
  190. Answer:  Thanks to Matthew Freedman (mattf@cac.washington.edu) and
  191. intasoft@cix.compulink.co.u for updates to the URLs mentioned in this answer.
  192. If you can't find things in the places listed below, check MW3
  193. (http://www.cen.com/mw3/) which is updated more frequently than is this FAQ.
  194.  
  195. Also see the question "Is there a help system or Motif hypertext system
  196. available?"
  197.  
  198. Ken Sall (ksall@cen.com) writes: The HTML (HyperText Markup Language) widget
  199. is part of the NCSA Mosaic source code available from ftp.ncsa.uiuc.edu.  Look
  200. in the "libhtmlw" subdirectory of the "Mosaic-src-*" subdirectory of:
  201.  
  202.     ftp://ftp.ncsa.uiuc.edu/Mosaic/Unix/source/
  203.  
  204. or, more generally, look for the files HTML.c, HTML.h, HTMLP.h, etc. in your
  205. "libhtmlw" subdirectory of the Mosaic source.
  206.  
  207.  
  208. For (old) documentation, see
  209.  
  210. http://www.ncsa.uiuc.edu/SDG/Software/Mosaic/Docs/htmlwidget.html.
  211.  
  212. However, Matthew M. Freedman (mattf@cac.washington.edu) pointed out the
  213. document is out of date: "One important thing to know is that the on-line
  214. documentation for the Mosaic html widget is out of synch with the source code.
  215. I e-mailed NCSA about this in May, but they seem to have ignored the report.
  216. The one that I wasted half a day because of is HTMLSetText(). The on-line docs
  217. list four arguments, but in fact there are seven. I have no idea what the
  218. extra three undocumented parameters are used for, I just plugged in NULL's and
  219. it works. The other error I noticed is that they document a "page" field in
  220. WbAnchorCallbackData, but it does not actually exist.  Also, at least for me,
  221. after I call HTMLSetText() the first time, the widget remains blank. I have to
  222. lower and raise the window for it to be drawn. Anybody know what is wrong? I
  223. guess will probably just spoof an expose in my code."
  224.  
  225.  
  226. For information on using Mosaic by remote control, see
  227.  
  228.     http://www.ncsa.uiuc.edu/SDG/Software/XMosaic/CCI/cci-spec.html
  229. and
  230.     http://www.ncsa.uiuc.edu/SDG/Software/Mosaic/Docs/remote-control.html
  231.  
  232.  
  233. Here are more details from ah627@FreeNet.Carleton.CA (Samuel Effah):
  234.  
  235. To the numerous request for the NCSA HTML widget information.
  236.  
  237. Everything not already copyrighted by CERN is copyrighted by NCSA (including
  238. the contents of the libhtmlw, libnet, libXmx, and src directories, but not
  239. including the contents of libdtm, which is entirely public domain). ...
  240.  
  241.  * The UI grants you (hereafter, Licensee) a license to use the Software    *
  242.  * for academic, research and internal business purposes only, without a    *
  243.  * fee.  Licensee may distribute the binary and source code (if released)   *
  244.  * to third parties provided that the copyright notice and this statement   *
  245.  * appears on all copies and that no charge is associated with such         *
  246.  * copies.                                                                  *
  247.  *                                                                          *
  248. ( you can read more about the copyright in the Mosaic source code ).
  249.  
  250.  
  251. Documentation on the HTML widget can be located at:
  252.  
  253.   http://www.ncsa.uiuc.edu/SDG/Software/Mosaic/Docs/htmlwidget.html
  254.   ( it's on the older version, I think Mosaic1.x )
  255.  
  256. For starters, you can compile directory Mosaic2.4/libhtmlw for the widget.
  257. Using:  To create widget:
  258.   htlmWid = XtCreateManagedWidget( "htlmWid",
  259. htmlWidgetClass,                                      parent,
  260.                                      htlmArgs,
  261.                                      XtNumber( htlmArgs ));
  262.  
  263. Callback for anchors:
  264.   XtAddCallback(htlmWid, WbNanchorCallback, htmlRef, NULL);
  265.  
  266. where htmlRef() looks like:
  267.  
  268. static void htmlRef(widget, client_data, call_data) Widget widget; XtPointer
  269. client_data; WbAnchorCallbackData* call_data; {
  270.         buffer = readHTMLFile( call_data->href );
  271.         XtVaSetValues( widget, WbNtext, buffer, NULL ); }
  272.  
  273. where readHTMLFile() is
  274.  
  275. char * readHTMLFile( in_file ) char *in_flie; {
  276.   /* function to read a file and return its content, given
  277.      the file's name */ }
  278.  
  279. I think this is enough to start you off.
  280.  
  281. Thanks to: Samuel Effah
  282. -----------------------------------------------------------------------------
  283. Subject: 52)  What widgets does Netscape use for its bookmarks list and
  284. preference panels?
  285.  
  286. [Last modified: May 97]
  287.  
  288. Answer:  Netscape uses the Microline widget set.  Microline is now a division
  289. of Neuron Data:  http://www.neurondata.com/Products/Wl/xml.html
  290.  
  291. Ken Lee, http://www.rahul.net/kenton/
  292.  
  293.  
  294. -----------------------------------------------------------------------------
  295. Subject: 53)  TOPIC: BOOKS and JOURNALS
  296.  
  297. -----------------------------------------------------------------------------
  298. Subject: 54)  Is there a bibliography available?
  299.  
  300. [Last modified: Mar 96]
  301.  
  302. Answer:  The X Bibliography, originally maintained by Ken Lee (
  303. http://www.rahul.net/kenton/index.shtml ), is now maintained by the editor of
  304. "The X Advisor" ( http://landru.unx.com/DD/advisor/index.shtml ), Steve Mikes,
  305. smikes@unx.com.  Steve regularly posts to comp.windows.x and ba.windows.x a
  306. list of reference books and articles on X and X programming.  The X FAQ from
  307. comp.windows.x reproduces part of this list.
  308.  
  309. The complete X bibliography is available from these URLs:
  310.  
  311.         http://www.unx.com/DD/advisor/docs/bib/Xbibliography.ps
  312.         ftp://ftp.x.org/contrib/docs/ (several suffixes)
  313.         ftp://landru.unx.com/pub/TXA/Xbibliography.ps.Z
  314.  
  315. -----------------------------------------------------------------------------
  316. Subject: 55)  Is there a Motif tutorial? Xt tutorial? X11 tutorial?
  317.  
  318. [Last modified: Nov 96]
  319.  
  320. Answer:  For the most up-to-date links to Motif/X11/Xt tutorials, see:
  321.  
  322.         http://www.cen.com/mw3/code.html
  323.         MW3: Code Examples and Tutorials
  324. and
  325.         http://www.rahul.net/kenton/xsites.html#Xtutorials
  326.         On-line X programming tutorials (Kenton Lee's multi-lingual links)
  327.  
  328.  
  329. See http://www.cm.cf.ac.uk/Dave/X_lecture/X_lecture.html
  330. for a hypertext Motif tutorial (by David Marshall) with source code and
  331. illustrations.
  332.  
  333. Marshall Brain at brain@adm.csc.ncsu.edu posted a set of simple and useful
  334. Motif tutorials at http://www.iftech.com/ .
  335.  
  336. Jan Borchers <job@ira.uka.de> writes about his Xmtutor:
  337.  
  338. A free version of "Xmtutor", a menu-driven Motif application that contains an
  339. interactive tutorial about programming with Motif with many executable
  340. examples, is available via anonymous ftp.  (Thanks to Allen Fogleson
  341. (foggie@dtx.net) and Thomas Madeya (madeya@ira.uka.de) for the updates.) The
  342. exact version varies, so look in the directory:
  343.  
  344.         ftp://ftp.vse.cz/pub/386-unix/linux/freeware_for_motif/motif-tutor/xmtutor-1.3/
  345. or:
  346.         ftp://ftp.uni-stuttgart.de/pub/X11/programming/
  347.  
  348. Xmtutor is very useful to learn Motif easier than with a book, and it is a
  349. convenient Quick Reference and resource-settings testbed for Motif application
  350. developers.
  351.  
  352. It has been tested on SUN Sparcs (SunOS 4.1) and DEC Alphas (OSF/1 1.3a), but
  353. should be working OK on most other Unix / X11R4/R5 / Motif 1.1/1.2 systems.
  354.  
  355. The demo version contains all the information to get you started with Motif,
  356. and upon registration, which costs 49 DM, you get the complete tutorial,
  357. describing all widgets, other topics such as inter-client communication,
  358. Compound Strings, etc., as well as a formatted TeX file of the tutorial to
  359. print out, which gives you a complete book about Motif.
  360.  
  361. -----------------------------------------------------------------------------
  362. Subject: 56)  What books are available for Motif programmers?
  363.  
  364. [Last modified: Mar 97]
  365.  
  366. Answer:  Note: Code examples are now available for Sebern's "Building
  367. OSF/Motif Applications: A Practical Introduction" (below).
  368.  
  369.         NOTE: This answer is always "under construction". If you are the
  370.         author of, or an avid fan of, a book not listed here, send mail
  371.         to ksall@cen.com.  Corrections especially regarding new editions
  372.         and ISBN's would be greatly appreciated.
  373.  
  374.         Authors: Do you have code examples online? Send me the location.
  375.  
  376.         Most of these books can be purchased at a discount from:
  377.  
  378.                 libHiTech.a, The Exclusive Electronic Computer Book Club
  379.                 http://www.libhitech.com/libhitech/
  380.  
  381.         Another electronic book service is:
  382.  
  383.                 The Bookpool - Internet Bookstore
  384.                 http://www.bookpool.com/
  385.  
  386.  
  387. For Motif 2.0, see also the subject "Where can I find Motif 2.0
  388. documentation?" as Prentice Hall has published the Motif 2.0 documentation.
  389.  
  390. First, we present the official books from OSF. Then we include an alphabetical
  391. listing of selected books. (See the following question for Xt and Xlib books.)
  392.  
  393. The "official" OSF/Motif 1.1 and 1.2 books are:
  394.  
  395. OSF/Motif Programmers Guide, Prentice-Hall ISBN 13-640525-8 (Motif 1.0), ISBN
  396. 0-13-640681-5 (Motif 1.1), ISBN 0-13-643107-0 (Motif 1.2) (NB: This makes use
  397. of the demo programs that you get with a Motif source license.  The programs
  398. are not included and may or may not be available on your system.)
  399.  
  400. OSF/Motif Programmers Reference Manual, Prentice-Hall ISBN 13-640517-17 (Motif
  401. 1.0), ISBN 0-13-640616-5 (Motif 1.1), ISBN 0-13-643115-1 (Motif 1.2) You will
  402. need this for the system calls.
  403.  
  404. OSF/Motif Style Guide, Prentice-Hall 13-640491-X (Motif 1.0), ISBN
  405. 0-13-640673-4 (Motif 1.1), ISBN 13-643123-2 (Motif 1.2) You will need this to
  406. get some idea of how to write programs with the correct `look and feel'.
  407.  
  408.  
  409. Next is an alphabetical listing (by author) of a number of essential books not
  410. by OSF but in wide use. I will attempt to keep this list current if the
  411. authors (or their readers) send me updates as new editions become available.
  412.  
  413. Barkakati, Nabajyoti, X Window System Programming, SAMS. ISBN 0-672-22750-9.
  414. This contains a section on Motif.
  415.  
  416. Berlage, Thomas Berlage, OSF/Motif: Concepts and Programming, Addison-Wesley,
  417. UK, 1991. ISBN 0-201-55792-4.
  418.  
  419. Ferguson, Paula & Brennan, David, Motif Reference Manual, Volume 6B, O'Reilly
  420. & Associates, 1st Edition June 1993, 920 pages, ISBN: 1-56592-038-4.  "Dan
  421. Heller's Motif Programming Manual [Volume 6A, below] has long been considered
  422. the most authoritative and insightful work on Motif. Now, with the addition of
  423. this companion reference manual, programmers can dispense completely with the
  424. original OSF documentation. In addition to covering the entire Motif toolkit,
  425. this book also covers OSF's "User Interface Language" or UIL, and the Motif
  426. Resource Manager (MRM) functions used to tie together applications with user
  427. interfaces defined in UIL."
  428.  
  429. Updated Sept. 95:
  430. Flanagan, David, Motif Tools: Streamlined GUI Design and Programming with the
  431. Xmt Library, O'Reilly & Associates, 1st Edition August 1994, 1024 pages, ISBN:
  432. 1-56592-044-9.  "Motif Tools and the Xmt programming library that accompanies
  433. it on CD-ROM offer resources to empower Motif programmers and dramatically
  434. speed up application development with the X Toolkit and Motif.  The Xmt
  435. library contains nine custom widgets and over 250 convenience routines that
  436. handle many tricky aspects of GUI programming. The Layout widget, for example,
  437. is an incredibly flexible manager widget that makes the confusing and awkward
  438. Motif Form widget a thing of the past. And a single Menu widget will create an
  439. entire pulldown menu system for your application by reading a special menu
  440. description from a resource file or your C code. Other features of the library
  441. dramatically simplify the use of Motif XmStrings, automate the transfer of
  442. data between the fields of an application's data structures and the widgets of
  443. its dialog boxes, and make it possible to automatically create a widget
  444. hierarchy completely described in a resource file."
  445.  
  446. NOTE: Xmt version 2.1.2 is available for Motif 2.0. See:
  447.  
  448.         ftp://ftp.ora.com/pub/examples/xbook/Xmt/xmt212.tar.gz
  449.  
  450. Added Sept. 95:
  451. George, Alistair and Riches, Mark, Advanced Motif Programming Techniques,
  452. Prentice Hall, 1994. ISBN: 0-13-219965-3.  Glenn Carr (gcarr@lgc.com) writes:
  453. "This is a concise book that has alot of great tips and other insightful
  454. information about less obvious Motif characteristics."
  455.  
  456. Heller, Dan, Ferguson, Paula M. & Brennan, David, Motif Programming Manual,
  457. Volume 6A, O'Reilly & Associates, 2nd Edition February 1994, ISBN: 1-56592-
  458. 016-3.  "The Motif Programming Manual describes how to write applications
  459. using the Motif toolkit from the Open Software Foundation (OSF). The book goes
  460. into detail on every Motif widget class, with useful examples that will help
  461. programmers to develop their own code. Anyone doing Motif programming who
  462. doesn't want to have to figure it out on their own needs this book."  Although
  463. updated for Motif 1.2, it is still usable with Motif 1.1.
  464.  
  465. Johnson, Eric F. and Kevin Reichard, Power Programming Motif, second edition,
  466. MIS: Press, New York, NY, 1993. ISBN 1-55828-322-6.
  467.  
  468. Johnson, Eric F. and Kevin Reichard, Professional Graphics Programming in the
  469. X Window System, MIS: Press, New York, NY, 1993. ISBN 1-55828-255-6.  This
  470. book covers difficult topics such as combining non-default visuals and color
  471. overlay planes with Motif applications.
  472.  
  473. Kimball, Paul E., The X Toolkit Cookbook, Prentice Hall, 1995. ISBN 0-13-
  474. 973132-6. Covers the Toolkit in detail and also covers Motif & Athena widgets;
  475. good chapter on inter-client communication and working with other toolkits.
  476. Discussion of X11R6 features. Code examples in
  477. ftp://ftp.netcom.com/pub/pk/pkimball/cookbook/.  Submitted by
  478. raju@BooBoo.wes.army.mil (Raju Kala).
  479.  
  480. Newmarch, Jan, The X Window System and Motif - A Fast Track Approach.
  481. Addison-Wesley, ISBN 0-201-53931-4.  As the long-time maintainer of this Motif
  482. FAQ, Jan's book is bound to contain unusual and useful insights.
  483.  
  484. O'Reilly and Associates publishes an entire series of books concerning
  485. different aspects of the X Window System, including a number of books about
  486. Motif, as well as books on Xlib, Xt, and PEX. In this FAQ, we list O'Reilly
  487. books by the authors' names. For a summary of all of O'Reilly's X11 series,
  488. see:
  489.  
  490.     ftp://ftp.x.org/contrib/docs/Xbibliography.OReilly
  491.  
  492. As of this writing, however, the above list was somewhat out-dated.
  493. Therefore, telnet to gopher.ora.com, login as "gopher", select "Detailed
  494. Product Descriptions", and then select from the menu. WWW users can open this
  495. URL:
  496.  
  497.     gopher://gopher.ora.com/11/descriptions/
  498.  
  499. Sebern, Mark "Building OSF/Motif Applications: A Practical Introduction". The
  500. ISBN is 0-13-122409-3. Prentice-Hall. The book uses a large, realistic Motif
  501. application (a program to make slides for presentations) to demonstrate the
  502. use of Motif features. Both UIL and toolkit calls are discussed, though UIL is
  503. featured, both in the examples and in a reference chapter. The example code is
  504. available at ftp://ftp.x.org/contrib/book_examples/sebern.motifapp-1.1.tar.Z.
  505.  
  506. Smith, Jerry, Designing X Clients with Xt/Motif, ISBN 1-55860-255-0 Morgan
  507. Kaufmann Publishers This adopts a higher-level approach to many of the objects
  508. that commonly occur in Motif but are not in the Motif API.
  509.  
  510. Young, Douglas, "Object-Oriented Programming with C++ and OSF/Motif", Prentice
  511. Hall, 1992. ISBN 0-13-630252-1. Source code is
  512. ftp://ftp.x.org/contrib/book_examples/young.cxx.tar.Z
  513.  
  514. Young, Douglas, "The X Window System: Programming and Applications with Xt,
  515. Motif Edition", Prentice Hall, 1994. ISBN 0-13-123803-5. This is the classic
  516. tutorial from 1989 updated for Motif 1.2.  Source code is
  517. ftp://ftp.x.org/contrib/book_examples/young2.motif.tar.Z
  518.  
  519. Young, Douglas, "Motif Debugging and Performance Tuning", Prentice Hall, 1995.
  520. ISBN 0-13-147984-9. Source code is
  521. ftp://ftp.x.org/contrib/book_examples/young.debug.tar.Z
  522.  
  523. If you want to learn about UIL, one source is the "Motif Programmers's Guide"
  524. from Prentice-Hall.  However, excellent UIL coverage appears in the O'Reilly
  525. and Associates books "Motif Programming Manual, Volume 6A" by Dan Heller and
  526. Paula M. Ferguson and in "Motif Reference Manual, Volume 6B" by Paula M.
  527. Perguson with UIL Material by David Brennan. (Yes, 6A and 6B were worth the
  528. wait!)
  529.  
  530. Added May 97:
  531. Thomas C. McFarland, "X Windows on the World, Developing Internationalized
  532. Software with X, Motif, and CDE".  ISBN 0-13-359787-3.  Source code is
  533. ftp://ftp.prenhall.com/pub/ptr/hewlett_packard_professional_books.w-
  534. 064/mcfarland/xwindows.wld
  535.  
  536.  
  537. -----------------------------------------------------------------------------
  538. Subject: 57)  Which Xt and X books would also be helpful?
  539.  
  540. [Last modified: Feb 95]
  541.  
  542. Answer:  You will also need books and references on Xt and Xlib, such as:
  543.  
  544. Asente, Paul J., and Swick, Ralph R., X Window System Toolkit, The Complete
  545. Programmer's Guide and Specification, Digital Press, 1990.  The Xt bible. A
  546. treasury of information, excellent and invaluable.  Distributed by Digital
  547. Press, ISBN 1-55558-051-3, Digital Press order number EY-E757E-DP; and by
  548. Prentice-Hall, ISBN 0-13-972191-6.
  549.  
  550. Cutler, Ellie, Gilly Daniel, and O'Reilly, Tim, The X Window System in a
  551. Nutshell, O'Reilly & Associates, 2nd Edition April 1992, 424 pages, ISBN: 1-
  552. 56592-017-1.  A quick reference guide to Xlib functions datatypes and events,
  553. Xt functions and datatypes, and the standard X clients.  The second edition is
  554. expanded and covers X11R4 and X11R5.
  555.  
  556. Flanagan, David, Programmer's Supplement for R5 of the X Window System,
  557. O'Reilly & Associates, 1991, ISBN: 0-937175-86-2.  A programmer's guide to all
  558. the new features in X11R5, with reference pages for the new functions.
  559. [NOTE: Out-of-print; material incorporated in recent editions of Volumes 1, 2,
  560. 4 and 5. X11R6 supplement is in the works.]
  561.  
  562. Flanagan, David, Editor, X Toolkit Intrinsics Reference Manual, Volume 5,
  563. O'Reilly & Associates, 3rd Edition April 1992, 916 pages, ISBN: 1-56592-007-4.
  564. "The X Toolkit Intrinsics Reference Manual is a complete programmer's
  565. reference for the X Toolkit. It provides reference pages for each of the Xt
  566. functions as well as the widget classes defined by Xt and the Athena widgets.
  567. This volume is based on Xt documentation from the X Consortium and has been
  568. re-edited, reorganized, and expanded...  The third edition of Volume 5 has
  569. been completely revised. In addition to covering Release 4 and Release 5 of X,
  570. all the man pages have been completely rewritten for clarity and ease of use,
  571. and new examples and descriptions have been added throughout the book."
  572.  
  573. Mui, Linda and Pearce, Eric, X Window System Administrator's Guide, Volume 8,
  574. O'Reilly & Associates, 1st Edition October 1992, CD-ROM Released May 1993,
  575. ISBN: 1-56592-052-X (with CD-ROM) "This book is the first and only book
  576. devoted to the issues of system administration for X and X-based networks,
  577. written not just for UNIX system administrators but for anyone faced with the
  578. job of administering X (including those running X on stand-alone
  579. workstations)..."  A book for X system administrators, covering XDM, security,
  580. font management, X terminals, building X, etc.  Available with a CD-ROM
  581. containing the complete X source code.
  582.  
  583. Nye, Adrian, Xlib Programming Manual, Volume 1, O'Reilly and Associates, 3rd
  584. Edition July 1992,  824 pages, ISBN: 1-56592-002-3.  "Updated to cover X11
  585. Release 5, the Xlib Programming Manual is a complete guide to programming the
  586. X library (Xlib), the lowest level of programming interface to X. It includes
  587. introductions to internationalization, device-independent color, font service,
  588. and scalable fonts. Includes chapters on: X Window System concepts, A simple
  589. client application, Window attributes, The graphics context, Graphics in
  590. practice, Color, Events, Interclient communication, Internationalization, The
  591. Resource Manager, A complete client application, Window management, and Other
  592. programming techniques."
  593.  
  594.  
  595. Nye, Adrian, Editor, Xlib Reference Manual, Volume 2, O'Reilly & Associates,
  596. 3rd Edition June 1992, ISBN 1-56592-006-6.  Contains reference pages, derived
  597. from the MIT specification, for all Xlib functions.  The third edition covers
  598. X11R4 and X11R5, including all the new internationalization and Xcms (Color
  599. Management System) functions.
  600.  
  601. Nye, Adrian & O'Reilly, Tim, X Toolkit Intrinsics Programming Manual, Motif
  602. Edition, Volume 4M, O'Reilly and Associates, 2nd Edition August 1992, 674
  603. pages, ISBN: 1-56592-013-9.  "Volume 4 is a complete guide to programming with
  604. the X Toolkit Intrinsics, the library of C language routines that facilitates
  605. the design of user interfaces with reusable components called widgets.  It
  606. provides concepts and examples that show how to use the various X Toolkit
  607. routines. The first few chapters are devoted to using widgets; the remainder
  608. of the book covers the more complex task of writing new widgets.  Volume 4 is
  609. available in two editions. The Motif Edition uses the Motif 1.2 widget set in
  610. examples, and covers X11 Release 5."
  611.  
  612. Quercia, Valerie & O'Reilly, Tim, X Window System User's Guide, Motif Edition,
  613. Volume 3M, O'Reilly and Associates, 2nd Edition January 1993, 956 pages, ISBN:
  614. 1-56592-015-5.  "The X Window System User's Guide, Motif Edition orients the
  615. new user to window system concepts and provides detailed tutorials for many
  616. client programs, including the xterm terminal emulator and the window manager.
  617. Building on this basic knowledge, later chapters explain how to customize the
  618. X environment and provide sample configurations.  This alternative edition of
  619. the User's Guide highlights the Motif window manager, for users of the Motif
  620. graphical user interface.  Revised for Motif 1.2 and X11 Release 5."
  621.  
  622. Scheifler, Robert W., and Gettys, James, X Window System, The Complete
  623. Reference to Xlib, X Protocl, ICCCM, XLFD. Digital Press, 1992. The Xlib
  624. bible.  Third edition covers X11R5. ISBN 1-55558-088-2, Digital Press order
  625. number EY-J802E-DP.
  626.  
  627. For those interested in PHIGS and PEXlib, O'Reilly & Associates also publishes
  628. several books on these topics. See:
  629.  
  630.     gopher://gopher.ora.com/11/descriptions/prox
  631.  
  632. -----------------------------------------------------------------------------
  633. Subject: 58)  Are there books for X11R6 yet?
  634.  
  635. [Last modified: Feb 95]
  636.  
  637. Answer:  Check the X FAQ at:
  638.  
  639.     ftp://ftp.x.org/contrib/faqs/FAQ or
  640.     http://www.cis.ohio-state.edu/hypertext/faq/usenet/x-faq/top.html
  641.  
  642. Also O'Reilly and Associates have a mini-FAQ regarding their plans for X11
  643. Release 6 books:
  644.  
  645.     http://nearnet.gnn.com/gnn/bus/ora/news/r6.html
  646.  
  647. -----------------------------------------------------------------------------
  648. Subject: 59)  What relevant journals are available?
  649.  
  650. [Last modified: May 97]
  651.  
  652. Answer:  Unfortunately, none of the following magazines are still publishing.
  653. Their back issues are still interesting, though.  Back issues of "The X
  654. Advisor" are still on line.
  655.  
  656. Ken Lee, May, 1997
  657.  
  658. There are several important periodicals:
  659. In June, 1995, Steve Mikes announced a new monthly periodical called "The X
  660. Advisor" which appears both in magazine format and on-line via the Web. The
  661. subtitle from the Web page calls this "The Definitive Journal For X Window
  662. System Professionals (X11, Motif, Common Desktop Environment and Related GUI
  663. Technologies)."  The first issue contains about 6 features, 20 columns, and 15
  664. departments.  You may subscribe to either format from the WWW pages. See these
  665. URLs:
  666.  
  667.     http://www.unx.com/
  668.     http://www.unx.com/DD/advisor/index.shtml (especially)
  669.     http://www.unx.com/DD/txaCurrent.shtml (current issue)
  670.  
  671.  
  672. "The X Journal" is published bimonthly by SIGS Publications, 212-274-0640.
  673. Editorial information: editors%topgun@uunet.uu.net, editors@unx.com. The URL
  674. is:
  675.  
  676.     http://www.sigs.com/publications/txjr/txjrmain.html
  677.     1-800-361-1279
  678.     615-370-4845 (fax)
  679.     subscriptions@sigs.com
  680.  
  681. SIGS Publications also has a number of magazines concerning C++ and object
  682. oriented programming:
  683.  
  684.     http://www.sigs.com/publications/sigspubs.html
  685.  
  686.  
  687. "The X Resource: A Practical Journal of the X Window System" is published
  688. quarterly by O'Reilly and Associates, 800-998-9938.  Editorial information:
  689. Paula Ferguson (paula@ora.com).  In addition to the valuable articles which
  690. appear in regular issues, the January issue of each year (issues 1, 5, 9, 13,
  691. etc.) contains the proceedings of the Annual X Technical Conference (from
  692. 1992, 1993, 1994, and 1995, respectively) sponsored by the X Consortium.  An
  693. on-line Table of Contents per issue can be accessed via gopher.  Telnet to
  694. gopher.ora.com, login as "gopher", select "Detailed Product Descriptions", and
  695. then "X Resource". Alternatively, the WWW URL is:
  696.  
  697.     gopher://gopher.ora.com/11/descriptions/xres/
  698.  
  699. Source code examples published in "The X Resource" appear organized by issue
  700. in the directory:
  701.  
  702.     ftp://ftp.ora.com/pub/examples/xresource/
  703.  
  704. -----------------------------------------------------------------------------
  705. Subject: 60)  Is there a Motif book for shell programming, such as ksh
  706. (kornshell)?
  707.  
  708. [Last modified: Jan 96]
  709.  
  710. Answer:  Steve Pendergrast recently wrote a book about Motif programming using
  711. the desktop kornshell (dtksh) interpreter (which is now shipped with the
  712. latest versions of Solaris, HP/UX, AIX, and DEC OSF/1).  This is not a book
  713. about programming with Motif in the C language, it is a Motif book for shell
  714. programmers, and does not assume the reader has any prior X experience.
  715.  
  716. TITLE:       "Desktop KornShell Graphical Programming"
  717. AUTHOR:      J. Stephen Pendergrast, Jr.
  718. ISBN:        0-201-63375-2
  719. PUBLISHER:   Addison-Wesley
  720. DESCRIPTION: 840 pages, includes bibliography and index, over 100 figures,
  721.              over 140 programming examples
  722.              Was awarded "Best X Book of 1995" by The X Advisor magazine.
  723. WEB-REFS:    http://landru.unx.com/~pend/dtksh.html is the official home page
  724.              for the book.  There are hyper-links out to the Addison-Wesley
  725.              page that gives a complete TOC and the Preface along with other
  726.              info, plus links to web based articles on dtksh, links to download
  727.              the example programs, a dtksh FAQ, and
  728.              other stuff of interest to dtksh programmers.
  729.  
  730. -----------------------------------------------------------------------------
  731. Subject: 61)  TOPIC: MWM and the SHELL WIDGET
  732.  
  733. -----------------------------------------------------------------------------
  734. Subject: 62)  What is the difference between Motif and mwm?
  735.  
  736. Answer:  mwm is a window manager. Motif itself is made up of four parts: a
  737. User-Interface Guideline, an API toolkit of `C' routines which helps in the
  738. building of applications which conform to the Guideline, the window manager
  739. mwm, and a language UIL which is designed to ease user interface development.
  740. In general mwm will run an application built with any X-windows API, and in
  741. general an application built using the Motif toolkit will run under any window
  742. manager.
  743.  
  744. -----------------------------------------------------------------------------
  745. Subject: 63)  Does anyone have an alternative set of 3-D defaults for a
  746. monochrome screen?
  747.  
  748. Answer:  This is obviously a matter of taste. Some alternatives suggested
  749. include
  750.  
  751. !Benjamin Schreiber, bs@osf.osf.org, bs@cs.brandeis.edu
  752. Mwm*foreground:                 black           ! Actually, when a window is
  753. Mwm*background:                 white           ! deactivated, the background
  754. Mwm*backgroundPixmap:           50_foreground   ! becomes white, insted of
  755. Mwm*topShadowPixmap:            white           ! 50% foreground (grey)
  756.  
  757. Mwm*activeForeground:           black
  758. Mwm*activeBackground:           white
  759. Mwm*activeBackgroundPixmap:     50_foreground
  760. Mwm*activeTopShadowPixmap:      white
  761.  
  762. Mwm*menu*backgroundPixmap:      background
  763. Mwm*menu*topShadowPixmap:       50_foreground
  764.  
  765. Mwm*title*foreground:                   black
  766. Mwm*title*background:                   white
  767. Mwm*title*backgroundPixmap:             white
  768. Mwm*title*topShadowPixmap:              50_foreground
  769. Mwm*title*activeForeground:             white
  770. Mwm*title*activeBackground:             black
  771. Mwm*title*activeBackgroundPixmap:       black
  772. Mwm*title*activeBottomShadowPixmap:     50_foreground
  773.  
  774. Mwm*feedback*backgroundPixmap:          white
  775.  
  776. or
  777.  
  778. ! From: tsang@isi.com (Kam C. Tsang)
  779. Mwm*background:                      White
  780. Mwm*activeBackground:                White
  781. Mwm*activeBackgroundPixmap:          25_foreground
  782. Mwm*foreground:                      Black
  783. Mwm*activeForeground:                Black
  784. Mwm*menu*background:                 white
  785. Mwm*menu*foreground:                 black
  786. xterm*Foreground:                    black
  787. xterm*Background:                    white
  788.  
  789.  
  790. or
  791.  
  792. ! From: ucsd.edu!usc!snorkelwacker!paperboy!yee  (Michael K. Yee)
  793. Mwm*cleanText:                          True
  794.  
  795. Mwm*activeBackground:           white
  796. Mwm*activeForeground:           black
  797. Mwm*background:                 white
  798. Mwm*foreground:                 black
  799.  
  800. Mwm*client*activeBackgroundPixmap:      50_foreground
  801. Mwm*client*activeTopShadowPixmap:       foreground
  802. Mwm*client*activeBottomShadowPixmap:    background
  803.  
  804. !Mwm*client*background:                 white
  805. !Mwm*client*foreground:                 black
  806. Mwm*client*backgroundPixmap:            75_foreground
  807. Mwm*client*topShadowPixmap:             foreground
  808. Mwm*client*bottomShadowPixmap:          background
  809.  
  810. !Mwm*feedback*background:               white
  811. !Mwm*feedback*foreground:               black
  812. Mwm*feedback*backgroundPixmap:          50_foreground
  813. !Mwm*feedback*topShadowPixmap:          25_foreground
  814. !Mwm*feedback*bottomShadowPixmap:       background
  815.  
  816. !Mwm*menu*background:                   white
  817. !Mwm*menu*foreground:                   black
  818. Mwm*menu*backgroundPixmap:              foreground
  819. !Mwm*menu*topShadowPixmap:              foreground
  820. !Mwm*menu*bottomShadowPixmap:           background
  821.  
  822. !Mwm*icon*background:                   white
  823. !Mwm*icon*foreground:                   black
  824. Mwm*icon*activeBackgroundPixmap:        50_foreground
  825. Mwm*icon*activeBottomShadowPixmap:      foreground
  826. Mwm*icon*backgroundPixmap:              75_foreground
  827.  
  828. -----------------------------------------------------------------------------
  829. Subject: 64)  What are some useful mwm resources I can control?
  830.  
  831. [Last modified: Sept 95]
  832.  
  833. Answer:  Ken Sall (ksall@cen.com) writes:  Some you might consider, taken from
  834. the mwm(1) man page, are:
  835.  
  836.     clientAutoPlace (class ClientAutoPlace)
  837.             This resource determines the  position  of  a  window
  838.             when  the  window  has  not  been given a program- or
  839.             user-specified position.  With a value of True,  win-
  840.             dows  are positioned with the top-left corners of the
  841.             frames offset horizontally and vertically.   A  value
  842.             of  False causes the currently configured position of
  843.             the window to be used.   In  either  case,  mwm  will
  844.             attempt  to place the windows totally on-screen.  The
  845.             default value is True.
  846.  
  847.     focusAutoRaise (class FocusAutoRaise)
  848.             When the value of this resource is True, clients  are
  849.             raised  when  they  get the keyboard input focus.  If
  850.             the value is False,  the stacking of windows  on  the
  851.             display  is  not  changed when a window gets the key-
  852.             board input focus.  The default value  is  True  when
  853.             keyboardFocusPolicy  is  explicit and False when key-
  854.             boardFocusPolicy is pointer.
  855.  
  856.     interactivePlacement (class InteractivePlacement)
  857.             This resource controls the initial placement  of  new
  858.             windows  on  the  screen.   If the value is True, the
  859.             pointer shape changes before a new window  is  placed
  860.             on the screen to indicate to the user that a position
  861.             should be selected for the upper-left corner  of  the
  862.             window.   If  the  value is False, windows are placed
  863.             according to the initial window configuration  attri-
  864.             butes.  The default value of this resource is False.
  865.  
  866.     positionIsFrame (class PositionIsFrame)
  867.             This resource indicates how  client  window  position
  868.             information  (from  the  WM_NORMAL_HINTS property and
  869.             from configuration requests) is  to  be  interpreted.
  870.             If  the  resource  value  is True, the information is
  871.             interpreted as
  872.             the position of the MWM client window frame.  If  the
  873.             value  is False, it is interpreted as being the posi-
  874.             tion of the client area of the window.   The  default
  875.             value of this resource is True.
  876.  
  877.     positionOnScreen (class PositionOnScreen)
  878.             This resource is used to indicate that windows should
  879.             initially  be  placed  (if possible) so that they are
  880.             not clipped  by  the  edge  of  the  screen  (if  the
  881.             resource  value is True).  If a window is larger than
  882.             the size of  the  screen,  at  least  the  upper-left
  883.             corner  of  the window is on-screen.  If the resource
  884.             value is False, windows are placed in  the  requested
  885.             position  even  if  totally  off-screen.  The default
  886.             value of this resource is True.
  887.  
  888.     useIconBox (class UseIconBox)
  889.             If this resource is given a value of True, icons  are
  890.             placed in an icon box.  When an icon box is not used,
  891.             the icons are placed  on  the  root  window  (default
  892.             value).
  893.  
  894. [Note: Still looking for a WWW link to Motif man pages --- anyone got one?
  895. Send to ksall@cen.com]
  896.  
  897. -----------------------------------------------------------------------------
  898. Subject: 65)  How can I configure mwm, such as changing or adding to root
  899. menus?
  900.  
  901. [Last modified: Oct 95]
  902.  
  903. Answer:  Read the mwm(1) man page which describes how to configure mwm using
  904. the .mwmrc file. The default location of the system-wide version of this file
  905. is /usr/lib/X11/system.mwmrc. You can override settings in the global file by
  906. creating your own $HOME/.mwmrc.
  907.  
  908. -----------------------------------------------------------------------------
  909. Subject: 66)  How can I modify the Motif window manager decorations?
  910.  
  911. [Last modified: July 95]
  912.  
  913. Answer:  In resource files, use the window manager's client resource (which is
  914. the application) and the resource clientDecoration:
  915.  
  916. Mwm*XClock.clientDecoration:   none
  917.  
  918. turns off all clock decorations.  See the mwm(1) entry for other
  919. possibilities.
  920.  
  921. Programmatically, set the VendorShell resource XmNmwmDecorations to 0, such
  922. as:
  923.  
  924.   #include <Xm/MwmUtil.h> /* see MWM_DECOR_* and MWM_FUNC_* */
  925.   #include <Xm/DialogS.h>
  926.   popupShell =
  927.       XtVaCreatePopupShell( "PopupShell",
  928.                             xmDialogShellWidgetClass, toplevel,
  929.                             XmNmwmDecorations, 0,
  930.                             NULL );
  931.  
  932. With the 0, you have no decorations at all, but if you want just a little
  933. frame, use MWM_DECOR_BORDER instead.
  934.  
  935. Thanks to Guillaume.Gallais@asm.thomson.fr for the code fragment and pointing
  936. out that there is no MWM_DECOR_NONE.
  937.  
  938. Reinhard M. Weiss (weissrm@execpc.com) also pointed out that MWM_DECOR_NONE
  939. was fictitious. He also added:
  940.  
  941. "I have found that the resource XtNoverrideRedirect does cause the olwm to
  942. remove all decorations (my guess is that it would work in mwm roughly the
  943. same).  This works programmatically as well as in resource files (i.e.
  944. *.className*overrideRedirect: true). There are some undesirable effects to
  945. this, however, particularly with focus and managing dialogs and popups."
  946.  
  947. -----------------------------------------------------------------------------
  948. Subject: 67)  Is there an ICCCM compliant way of setting window manager
  949. decorations?
  950.  
  951. Answer:  Tom LaStrange (toml@LaStrange.COM) writes: "No, there is no ICCCM
  952. portable way to alter decorations."
  953.  
  954. -----------------------------------------------------------------------------
  955. Subject: 68)  How can I put decorations on transient windows using olwm?
  956.  
  957. Answer:  This code is from Jean-Philippe Martin-Flatin <syj@ecmwf.int>:
  958.  
  959. /**********************************************************************
  960. ** WindowDecorations.c
  961. **
  962. ** Manages window decorations under the OpenLook window manager (OLWM).
  963. **
  964. ** Adapted from a C++ program posted to comp.windows.x.motif by:
  965. **
  966. **    +--------------------------------------------------------------+
  967. **    | Ron Edmark                          User Interface Group     |
  968. **    | Tel:        (408) 980-1500 x282     Integrated Systems, Inc. |
  969. **    | Internet:   edmark@isi.com          3260 Jay St.             |
  970. **    | Voice mail: (408) 980-1590 x282     Santa Clara, CA 95054    |
  971. **    +--------------------------------------------------------------+
  972. ***********************************************************************/
  973.  
  974. #include <X11/X.h>
  975. #include <X11/Xlib.h>
  976. #include <X11/Xatom.h>
  977. #include <X11/Intrinsic.h>
  978. #include <X11/StringDefs.h>
  979. #include <X11/Protocols.h>
  980. #include <Xm/Xm.h>
  981. #include <Xm/AtomMgr.h>
  982.  
  983. /*
  984. ** Decorations for OpenLook:
  985. ** The caller can OR different mask options to change the frame decoration.
  986. */
  987. #define OLWM_Header     (long)(1<<0)
  988. #define OLWM_Resize     (long)(1<<1)
  989. #define OLWM_Close      (long)(1<<2)
  990.  
  991. /*
  992. ** Prototypes
  993. */
  994. static void InstallOLWMAtoms  (Widget w);
  995. static void AddOLWMDialogFrame(Widget widget, long decorationMask);
  996.  
  997.  
  998. /*
  999. ** Global variables
  1000. */
  1001. static Atom AtomWinAttr;
  1002. static Atom AtomWTOther;
  1003. static Atom AtomDecor;
  1004. static Atom AtomResize;
  1005. static Atom AtomHeader;
  1006. static Atom AtomClose;
  1007. static int  not_installed_yet = TRUE;
  1008.  
  1009.  
  1010. static void InstallOLWMAtoms(Widget w)
  1011. {
  1012.         AtomWinAttr = XInternAtom(XtDisplay(w), "_OL_WIN_ATTR" ,    FALSE);
  1013.         AtomWTOther = XInternAtom(XtDisplay(w), "_OL_WT_OTHER",     FALSE);
  1014.         AtomDecor   = XInternAtom(XtDisplay(w), "_OL_DECOR_ADD",    FALSE);
  1015.         AtomResize  = XInternAtom(XtDisplay(w), "_OL_DECOR_RESIZE", FALSE);
  1016.         AtomHeader  = XInternAtom(XtDisplay(w), "_OL_DECOR_HEADER", FALSE);
  1017.         AtomClose   = XInternAtom(XtDisplay(w), "_OL_DECOR_CLOSE",  FALSE);
  1018.  
  1019.         not_installed_yet = FALSE;
  1020. }
  1021.  
  1022. static void AddOLWMDialogFrame(Widget widget, long decorationMask)
  1023. {
  1024.         Atom   winAttrs[2];
  1025.         Atom   winDecor[3];
  1026.         Widget shell = widget;
  1027.         Window win;
  1028.         int    numberOfDecorations = 0;
  1029.  
  1030.         /*
  1031.         ** Make sure atoms for OpenLook are installed only once
  1032.         */
  1033.         if (not_installed_yet) InstallOLWMAtoms(widget);
  1034.  
  1035.         while (!XtIsShell(shell)) shell = XtParent(shell);
  1036.  
  1037.         win = XtWindow(shell);
  1038.  
  1039.         /*
  1040.         ** Tell Open Look that our window is not one of the standard OLWM window
  1041.         ** types. See OLIT Widget Set Programmer's Guide pp.70-73.
  1042.         */
  1043.  
  1044.         winAttrs[0] = AtomWTOther;
  1045.  
  1046.         XChangeProperty(XtDisplay(shell),
  1047.                         win,
  1048.                         AtomWinAttr,
  1049.                         XA_ATOM,
  1050.                         32,
  1051.                         PropModeReplace,
  1052.                         (unsigned char*)winAttrs,
  1053.                         1);
  1054.  
  1055.         /*
  1056.         ** Tell Open Look to add some decorations to our window
  1057.         */
  1058.         numberOfDecorations = 0;
  1059.         if (decorationMask & OLWM_Header)
  1060.                 winDecor[numberOfDecorations++] = AtomHeader;
  1061.         if (decorationMask & OLWM_Resize)
  1062.                 winDecor[numberOfDecorations++] = AtomResize;
  1063.         if (decorationMask & OLWM_Close)
  1064.         {
  1065.                 winDecor[numberOfDecorations++] = AtomClose;
  1066.  
  1067.                 /*
  1068.                 ** If the close button is specified, the header must be
  1069.                 ** specified. If the header bit is not set, set it.
  1070.                 */
  1071.                 if (!(decorationMask & OLWM_Header))
  1072.                         winDecor[numberOfDecorations++] = AtomHeader;
  1073.         }
  1074.  
  1075.         XChangeProperty(XtDisplay(shell),
  1076.                         win,
  1077.                         AtomDecor,
  1078.                         XA_ATOM,
  1079.                         32,
  1080.                         PropModeReplace,
  1081.                         (unsigned char*)winDecor,
  1082.                         numberOfDecorations);
  1083. }
  1084.  
  1085.  
  1086. /*
  1087. ** Example of use of AddOLWMDialogFrame, with a bit of extra stuff
  1088. */
  1089. void register_dialog_to_WM(Widget shell, XtCallbackProc Cbk_func)
  1090. {
  1091.         Atom atom;
  1092.  
  1093.         /*
  1094.         ** Alias the "Close" item in system menu attached to dialog shell
  1095.         ** to the activate callback of "Exit" in the menubar
  1096.         */
  1097.         if (Cbk_func)
  1098.         {
  1099.             atom = XmInternAtom(XtDisplay(shell),"WM_DELETE_WINDOW",TRUE);
  1100.             XmAddWMProtocolCallback(shell,atom, Cbk_func,NULL);
  1101.         }
  1102.  
  1103.         /*
  1104.         ** If Motif is the window manager, skip OpenLook specific stuff
  1105.         */
  1106.         if (XmIsMotifWMRunning(shell)) return;
  1107.  
  1108.         /*
  1109.         ** Register dialog shell to OpenLook.
  1110.         **
  1111.         ** WARNING: on some systems, adding the "Close" button allows the title
  1112.         ** to be properly centered in the title bar. On others, activating
  1113.         ** "Close" crashes OpenLook. The reason is not clear yet, but it seems
  1114.         ** the first case occurs with OpenWindows 2 while the second occurs with
  1115.         ** Openwindows 3. Thus, comment out one of the two following lines as
  1116.         ** suitable for your site, and send e-mail to syj@ecmwf.int if you
  1117.         ** find out what is going on !
  1118.         */
  1119.         AddOLWMDialogFrame(shell,(OLWM_Header | OLWM_Resize));
  1120. /*      AddOLWMDialogFrame(shell,(OLWM_Header | OLWM_Resize | OLWM_Close)); */
  1121. }
  1122.  
  1123.  
  1124. -----------------------------------------------------------------------------
  1125. Subject: 69)  How can I turn off the Motif window manager functions from the
  1126. system menu?
  1127. [Last modified: October 92]
  1128.  
  1129. Answer:  The user of an application can control functions in the system menu
  1130. for an application using the mwm resource clientFunctions:
  1131.  
  1132.         mwm.application_name.clientFunctions: -resize -close
  1133.  
  1134. Note that mwm will have to be restarted after putting this in their resource
  1135. database.
  1136.  
  1137.  
  1138. Answer:  The writer of an application can only remove items.  Be warned that
  1139. your users will probably gnash their teeth, swear furiously at your product
  1140. and stop using it if they discover that you have done this.  (Especially if
  1141. you have removed the Close button, your application has hung and it has taken
  1142. up all of memory and swap so it can't be killed.)  Much better is to catch the
  1143. action gracefully as in the next question.
  1144.  
  1145.         #include <Xm/MwmUtil.h>
  1146.  
  1147.         XtVaGetValues(shell, XmNmwmFunctions, &int_val, NULL);
  1148.         int_val &= ~(MWM_FUNC_CLOSE | MWM_FUNC_ALL);
  1149.         XtVaSetValues(shell, XmNmwmFunctions, int_val, NULL);
  1150.  
  1151. -----------------------------------------------------------------------------
  1152. Subject: 70)  How can I create a multi-colored window manager icon?
  1153.  
  1154. [Last modified: Oct 95]
  1155.  
  1156. Answer:  The only portable way to do this is with icon windows.  The WMShell
  1157. widget supports icon windows with its XmNiconWindow resource.  Set this to a
  1158. window  that your application has created.  The window could be the XtWindow()
  1159. of a realized shell widget.  The window must be created with the default
  1160. visual and colormap of its screen.  Other requirements on icon windows are
  1161. specified in section 4.1.9 of the X11R6 ICCCM.  Note that some window managers
  1162. provide alternate techniques for creating color icons; none of these are
  1163. standard or portable.
  1164.  
  1165. Ken Lee, http://www.rahul.net/kenton/
  1166.  
  1167. -----------------------------------------------------------------------------
  1168. Subject: 71)  How can I keep my shell windows fixed in size?
  1169.  
  1170. [Last modified: Apr 95]
  1171.  
  1172. Answer:  In addition to the decoration controls mentioned in the previous few
  1173. subjects of this FAQ, you can also specify size hints for your shell widget's
  1174. windows with these resources:  XmNminWidth, XmNmaxWidth, XmNminHeight,
  1175. XmNmaxHeight.  If you set the min and max values to the same size, most window
  1176. managers will not allow the user to resize the window.
  1177.  
  1178. Ken Lee, http://www.rahul.net/kenton/
  1179.  
  1180. -----------------------------------------------------------------------------
  1181. Subject: 72)  Why is XtGetValues of XmNx and XmNy of my toplevel shell wrong?
  1182.  
  1183. [Last modified: Oct 95]
  1184.  
  1185. Answer:  [Note: This answer is borrowed from the Xt FAQ,
  1186. ftp://ftp.x.org/contrib/faqs/FAQ-Xt, devoted to X Toolkit Intrinsics.]
  1187.  
  1188. XmNx and XmNy are the coordinates relative to your shell's parent window,
  1189. which is usually a window manager's frame window.  To translate to the root
  1190. coordinate space, use XtTranslateCoords().
  1191.  
  1192. -----------------------------------------------------------------------------
  1193. Subject: 73)  How do I get XmNx and XmNy positions to be honored correctly?
  1194.  
  1195. [Last modified: Nov 96]
  1196.  
  1197. Answer:  One answer is to pass the right hints to the window manager, perhaps
  1198. using XSetWMNormalHints.  Another approach comes from Shane Burgess
  1199. (shane@radionics.com) who writes:
  1200.  
  1201. By setting the XmNdefaultPosition resource to False, I've found that all my
  1202. XmNx & XmNy requests gets set correctly.
  1203.  
  1204. Pete Sakalaukus (sakalauk@pelican.st.usm.edu) says that XmNdefaultPosition
  1205. only works with olwm, not mwm.
  1206.  
  1207. -----------------------------------------------------------------------------
  1208. Subject: 74)  How can my application know when the user has quit Mwm?
  1209.  
  1210. [Last modified: Feb 95]
  1211.  
  1212. Answer:  Looking for an answer to this one. ANY TAKERS? (Still looking.)
  1213.  
  1214. -----------------------------------------------------------------------------
  1215. Subject: 75)  How can I tell if the user has selected "Close" from the system
  1216. menu? How do I catch the "Close"?  I need to do some clean up before exiting.
  1217.  
  1218. [Last modified: Aug 95]
  1219.  
  1220. Answer:  Catching the mwm Close involves using XmAddWMProtocolCallback and
  1221. possibly setting the XmNdeleteResponse resource. Note that whether your
  1222. application involves multiple applicationShells vs. a single applicationShell
  1223. and multiple toplevelShells is significant. Following the two older code
  1224. fragments is a complete test application which can be compiled with different
  1225. #defines to alter the behavior.           This works with R4 Intrinsics
  1226.  
  1227.         #include <Xm/Protocols.h>
  1228.  
  1229.         void FinalCleanupCB(w, client_data, call_data)
  1230.         Widget   w;
  1231.         caddr_t  client_data, call_data;
  1232.         {
  1233.                 /* tidy up stuff here */
  1234.                 ...
  1235.                 /* exit if you want to */
  1236.                 exit (0);
  1237.         }
  1238.  
  1239.         main()
  1240.         {
  1241.                 Atom wm_delete_window;
  1242.  
  1243.                 ...
  1244.                 XtRealizeWidget(toplevel);
  1245.                 ...
  1246.                 wm_delete_window =
  1247.                         XmInternAtom(XtDisplay(toplevel),
  1248.                                 "WM_DELETE_WINDOW", False);
  1249.                 XmAddWMProtocolCallback(toplevel, wm_delete_window,
  1250.                         FinalCleanupCB, NULL);
  1251.                 XtMainLoop();
  1252.         }
  1253.  
  1254. This will still kill the application.  To turn this behaviour off so that the
  1255. application is not killed, set the shell resource XmNdeleteResponse to
  1256. XmDO_NOTHING.  This means that users cannot kill your application via the
  1257. system menu, and may be a bad thing.
  1258.  
  1259. If you are running R3, Bob Hays (bobhays@spss.com) has suggested this:
  1260. "Trapping on the delete window atom does not work as I cannot force my action
  1261. routine to the top of the action list for the activity desired, so the window
  1262. manager kills my window anyway BEFORE I can do anything about it.  And, to
  1263. make matters worse, the window manager (Motif in this case) tacks its atoms
  1264. and handlers onto the window at some unknown point down the line after the
  1265. creation of the shell widget as far as I can tell.  So....
  1266.  
  1267. I have a procedure as an action routine for ClientMessage.  Then, if I get a
  1268. property change event on the window manager protocols, I then tack on
  1269. WM_SAVE_YOURSELF.  If I get this request, I clean up (it seems to happen on
  1270. WM_DELETE_WINDOW, BTW, if you remove WM_DELETE_WINDOW from the WM protocols
  1271. atom) and exit.  Works great and is less filling overall:-)."
  1272.  
  1273. The following similar code fragment is from Dave Mink
  1274. (mink@cadcam.pms.ford.com):
  1275.  
  1276. void setupCloseCallback(Widget shell, XtCallbackProc closeProc)
  1277. {
  1278.     /* get window manager delete protocol atom */
  1279.     Atom deletewin_protocol = XmInternAtom(
  1280.         XtDisplay(shell), "WM_DELETE_WINDOW", True
  1281.         );
  1282.     /* turn off default delete response */
  1283.     XtVaSetValues( shell,
  1284.         XmNdeleteResponse, XmDO_NOTHING,
  1285.         NULL);
  1286.     /* add callback for window manager delete protocol */
  1287.     XmAddWMProtocolCallback(shell, deletewin_protocol, closeProc, NULL);
  1288. }
  1289.  
  1290.  
  1291. Here is a complete code example which can be compiled several different ways,
  1292. as per the comments in the code.
  1293.  
  1294.  
  1295. /*
  1296.  * MWM Close test program.
  1297.  *
  1298.  * Creates 4 shells, testing each of 3 different values of XmNdeleteResponse.
  1299.  * Compile will -DMULTIPLE_APP_SHELLS to make all 4 shells of type
  1300.  * applicationShellWidgetClass. Otherwise, first shell created is
  1301.  * applicationShellWidgetClass, but other 3 are topLevelShellWidgetClass.
  1302.  * Results differ. You can also experiment with #defining POPUP_SHELL,
  1303.  * BEFORE_CREATE, or AFTER_CREATE.
  1304.  *
  1305.  * Ken Sall (ksall@cen.com), Motif FAQ maintainer, Century Computing, Inc.
  1306.  */
  1307.  
  1308. #include <stdio.h>
  1309.  
  1310. #include <X11/IntrinsicP.h>
  1311. #include <X11/StringDefs.h>
  1312.  
  1313. #include <X11/Shell.h>
  1314. #include <Xm/Xm.h>
  1315. #include <Xm/XmP.h>
  1316.  
  1317. #include <Xm/RowColumn.h> /* for popup */
  1318. #include <Xm/Label.h>
  1319.  
  1320. #include <X11/Protocols.h>
  1321. #include <X11/AtomMgr.h>
  1322. #include <X11/MwmUtil.h>
  1323.  
  1324. void CloseCB();
  1325. void popup_handler();
  1326.  
  1327. #ifdef MULTIPLE_APP_SHELLS
  1328. #define P1_TITLE        "P1: applicationShell: XmDO_NOTHING"
  1329. #define P2_TITLE        "P2: applicationShell: XmDESTROY"
  1330. #define P3_TITLE        "P3: applicationShell: XmUNMAP"
  1331. #define P4_TITLE        "P4: applicationShell: default"
  1332. #else
  1333. #define P1_TITLE        "P1: applicationShell: XmDO_NOTHING"
  1334. #define P2_TITLE        "P2: topLevelShell: XmDESTROY"
  1335. #define P3_TITLE        "P3: topLevelShell: XmUNMAP"
  1336. #define P4_TITLE        "P4: topLevelShell: XmDO_NOTHING"
  1337. #endif
  1338.  
  1339. void CloseCB (w, client_data, call_data)
  1340. Widget  w;              /*  widget id           */
  1341. caddr_t client_data;    /*  data from application   */
  1342. caddr_t call_data;      /*  data from widget class  */
  1343. {
  1344.     XmAnyCallbackStruct *cb = (XmAnyCallbackStruct *) call_data;
  1345.  
  1346.         printf ("caught Close from: %s\n", (char *)client_data );
  1347.         if (strcmp ( P1_TITLE, (char *)client_data ) == 0 )
  1348.                 {
  1349.                 /* do something */
  1350.                 }
  1351.         else if (strcmp ( P2_TITLE, (char *)client_data ) == 0 )
  1352.                 {
  1353.                 /* do something else */
  1354.                 }
  1355.         else if (strcmp ( P3_TITLE, (char *)client_data ) == 0 )
  1356.                 {
  1357.                 /* do something else */
  1358.                 }
  1359.         else if (strcmp ( P4_TITLE, (char *)client_data ) == 0 )
  1360.                 {
  1361.                 /* do something else */
  1362.                 }
  1363.         else    /* unreachable */
  1364.                 {
  1365.                 printf ("oops\n");
  1366.                 }
  1367. }
  1368.  
  1369. void popup_handler()
  1370. {
  1371.         printf ("popup handler\n");
  1372. }
  1373.  
  1374. int main (argc,argv, envp)
  1375.     int  argc;
  1376.     char **argv;
  1377.     char **envp;
  1378. {
  1379.    XtAppContext  app_context;
  1380.    Display       *theDisplay;
  1381.    Widget        shell1, shell2, shell3, shell4;
  1382.    Widget        label, DrawWindow, WindowPopupMenu;
  1383.    Arg           al[10];
  1384.    int           ac;
  1385.    Atom          delwinAtom1, delwinAtom2, delwinAtom3, delwinAtom4;
  1386.    XmString      xms;
  1387.  
  1388. #ifdef MULTIPLE_APP_SHELLS
  1389.    printf ("This version will demonstrate a problem if you Close P2.\n");
  1390.    printf ("Since there are multiple appshells, closing (destroying) P2 cause the app to exit.\n");
  1391. #else
  1392. #ifdef POPUP_SHELL
  1393.    printf ("This version uses XtCreatePopupShell rather than XtAppCreateShell \n");
  1394. #else
  1395.    printf ("Compile with '-DMULTIPLE_APP_SHELLS' to demonstrate a problem.\n");
  1396. #endif
  1397. #endif
  1398.  
  1399. #ifdef BEFORE_CREATE
  1400.    printf ("This version adds the XmNdeleteResponse _before_ the shell is created.\n");
  1401. #else
  1402.    printf ("This version adds the XmNdeleteResponse _after the shell is created.\n");
  1403. #endif
  1404.  
  1405.    XtToolkitInitialize ();
  1406.    app_context = XtCreateApplicationContext ();
  1407.  
  1408.    theDisplay = XtOpenDisplay ( app_context, NULL,
  1409.                                "my_program", "ProgramClass",
  1410.                                 NULL, 0, &argc, argv);
  1411.  
  1412.    /* ---------------------   BEGIN P1  -------------------- */
  1413.    ac = 0;
  1414.    XtSetArg(al[ac], XmNx, 0); ac++;
  1415.    XtSetArg(al[ac], XmNy, 0); ac++;
  1416.    XtSetArg(al[ac], XmNwidth, 350); ac++;
  1417.    XtSetArg(al[ac], XmNheight, 200); ac++;
  1418.    XtSetArg (al[ac], XmNtitle, P1_TITLE); ac++;
  1419. #ifdef BEFORE_CREATE
  1420.    XtSetArg (al[ac], XmNdeleteResponse, XmDO_NOTHING); ac++;
  1421. #endif
  1422.  
  1423.    /* The ONLY applicationShell unless MULTIPLE_APP_SHELLS is defined. */
  1424.  
  1425.    shell1 = XtAppCreateShell ("shell1", "ProgramClass",
  1426.                 applicationShellWidgetClass, theDisplay, al, ac);
  1427.  
  1428.    /* Tell mwm to exec CloseCB when close is detected. */
  1429.    delwinAtom1 = XmInternAtom (XtDisplay(shell1),
  1430.                                     "WM_DELETE_WINDOW", False);
  1431.    XmAddWMProtocolCallback (shell1, delwinAtom1, CloseCB, P1_TITLE);
  1432.  
  1433. #ifndef BEFORE_CREATE
  1434.    XtVaSetValues( shell1, XmNdeleteResponse, XmDO_NOTHING, NULL);
  1435. #endif
  1436.  
  1437.    /* ---------------------   BEGIN P2  -------------------- */
  1438.    ac = 0;
  1439.    XtSetArg(al[ac], XmNx, 375); ac++;
  1440.    XtSetArg(al[ac], XmNy, 0); ac++;
  1441.    XtSetArg(al[ac], XmNwidth, 350); ac++;
  1442.    XtSetArg(al[ac], XmNheight, 200); ac++;
  1443.    XtSetArg (al[ac], XmNtitle, P2_TITLE); ac++;
  1444. #ifdef BEFORE_CREATE
  1445.    XtSetArg (al[ac], XmNdeleteResponse, XmDESTROY); ac++;
  1446. #endif
  1447.  
  1448. #ifdef MULTIPLE_APP_SHELLS
  1449.    shell2 = XtAppCreateShell ("shell2", "ProgramClass",
  1450.                 applicationShellWidgetClass, theDisplay, al, ac);
  1451. #else
  1452. #ifdef POPUP_SHELL
  1453.    /*
  1454.     * NOTE use of XtCreatePopupShell (not XtCreateMAnagedWidget) and
  1455.     * topLevelShellWidgetClass (not applicationShellWidgetClass).
  1456.     * Parent of topLevelShell is applicationShell.
  1457.     * Use XtPopup rather than XtRealize for topLevelShell.
  1458.     */
  1459.    shell2 = XtCreatePopupShell ("shell2",
  1460.                 topLevelShellWidgetClass, shell1, al, ac);
  1461. #else
  1462.    shell2 = XtAppCreateShell ("shell2", "ProgramClass",
  1463.                 topLevelShellWidgetClass, theDisplay, al, ac);
  1464. #endif
  1465. #endif
  1466.  
  1467.    /* Tell mwm to exec CloseCB when close is detected. */
  1468.    delwinAtom2 = XmInternAtom (XtDisplay(shell2),
  1469.                                     "WM_DELETE_WINDOW", False);
  1470.    XmAddWMProtocolCallback (shell2, delwinAtom2, CloseCB, P2_TITLE);
  1471.  
  1472. #ifndef BEFORE_CREATE
  1473.    XtVaSetValues( shell2, XmNdeleteResponse, XmDESTROY, NULL);
  1474. #endif
  1475.  
  1476.    /* ---------------------   BEGIN P3  -------------------- */
  1477.    ac = 0;
  1478.    XtSetArg(al[ac], XmNx, 750); ac++;
  1479.    XtSetArg(al[ac], XmNy, 0); ac++;
  1480.    XtSetArg(al[ac], XmNwidth, 350); ac++;
  1481.    XtSetArg(al[ac], XmNheight, 200); ac++;
  1482.    XtSetArg (al[ac], XmNtitle, P3_TITLE); ac++;
  1483. #ifdef BEFORE_CREATE
  1484.    XtSetArg (al[ac], XmNdeleteResponse, XmUNMAP); ac++;
  1485. #endif
  1486.  
  1487. #ifdef MULTIPLE_APP_SHELLS
  1488.    shell3 = XtAppCreateShell ("shell3", "ProgramClass",
  1489.                 applicationShellWidgetClass, theDisplay, al, ac);
  1490. #else
  1491. #ifdef POPUP_SHELL
  1492.    /* See comments for shell2 */
  1493.    shell3 = XtCreatePopupShell ("shell3",
  1494.                 topLevelShellWidgetClass, shell1, al, ac);
  1495. #else
  1496.    shell3 = XtAppCreateShell ("shell3", "ProgramClass",
  1497.                 topLevelShellWidgetClass, theDisplay, al, ac);
  1498. #endif
  1499. #endif
  1500.  
  1501.    /* Tell mwm to exec CloseCB when close is detected. */
  1502.    delwinAtom3 = XmInternAtom (XtDisplay(shell3),
  1503.                                     "WM_DELETE_WINDOW", False);
  1504.    XmAddWMProtocolCallback (shell3, delwinAtom3, CloseCB, P3_TITLE);
  1505.  
  1506. #ifndef BEFORE_CREATE
  1507.    XtVaSetValues( shell3, XmNdeleteResponse, XmUNMAP, NULL);
  1508. #endif
  1509.  
  1510.    /* ---------------------   BEGIN P4  -------------------- */
  1511.    ac = 0;
  1512.    XtSetArg(al[ac], XmNx, 0); ac++;
  1513.    XtSetArg(al[ac], XmNy, 250); ac++;
  1514.    XtSetArg(al[ac], XmNwidth, 350); ac++;
  1515.    XtSetArg(al[ac], XmNheight, 200); ac++;
  1516.    XtSetArg (al[ac], XmNtitle, P4_TITLE); ac++;
  1517. #ifdef BEFORE_CREATE
  1518.    XtSetArg (al[ac], XmNdeleteResponse, XmDO_NOTHING); ac++;
  1519. #endif
  1520.  
  1521. #ifdef MULTIPLE_APP_SHELLS
  1522.    shell4 = XtAppCreateShell ("shell4", "ProgramClass",
  1523.                 applicationShellWidgetClass, theDisplay, al, ac);
  1524. #else
  1525. #ifdef POPUP_SHELL
  1526.    /* See comments for shell2 */
  1527.    shell4 = XtCreatePopupShell ("shell4",
  1528.                 topLevelShellWidgetClass, shell1, al, ac);
  1529. #else
  1530.    shell4 = XtAppCreateShell ("shell4", "ProgramClass",
  1531.                 topLevelShellWidgetClass, theDisplay, al, ac);
  1532. #endif
  1533. #endif
  1534.  
  1535.    /* Tell mwm to exec CloseCB when close is detected. */
  1536.    delwinAtom4 = XmInternAtom (XtDisplay(shell4),
  1537.                                     "WM_DELETE_WINDOW", False);
  1538.    XmAddWMProtocolCallback (shell4, delwinAtom4, CloseCB, P4_TITLE);
  1539.  
  1540. #ifndef BEFORE_CREATE
  1541.    XtVaSetValues( shell4, XmNdeleteResponse, XmDO_NOTHING, NULL);
  1542. #endif
  1543.  
  1544.    /* just for fun */
  1545.    ac = 0;
  1546.    WindowPopupMenu = XmCreatePopupMenu(shell1, "PopupMenu", al, ac);
  1547.    XtAddEventHandler( shell1, ButtonPressMask, FALSE, popup_handler,
  1548.                       WindowPopupMenu);
  1549.  
  1550.    ac = 0;
  1551.    xms = (XmString) XmStringCreateLocalized ( "Button3 = popup; Button2 = DnD.");
  1552.    XtSetArg(al[ac], XmNlabelString, xms); ac++;
  1553.    XtSetArg(al[ac], XmNshadowThickness, 2); ac++;
  1554.    label = XmCreateLabel (shell1, "label", al, ac);
  1555.    XtManageChild ( label );
  1556.  
  1557.    XtRealizeWidget( shell1 );
  1558.  
  1559.    /* NOTE use of XtPopup rather than XtRealizeWidget for topLevels */
  1560.  
  1561. #ifdef MULTIPLE_APP_SHELLS
  1562.    XtRealizeWidget( shell2 );
  1563.    XtRealizeWidget( shell3 );
  1564.    XtRealizeWidget( shell4 );
  1565. #else
  1566. #ifdef POPUP_SHELL
  1567.    XtPopup ( shell2, XtGrabNone );
  1568.    XtPopup ( shell3, XtGrabNone );
  1569.    XtPopup ( shell4, XtGrabNone );
  1570. #else
  1571.    XtRealizeWidget( shell2 );
  1572.    XtRealizeWidget( shell3 );
  1573.    XtRealizeWidget( shell4 );
  1574. #endif
  1575. #endif
  1576.  
  1577.    XtAppMainLoop (app_context);
  1578. }
  1579.  
  1580. -----------------------------------------------------------------------------
  1581. END OF PART THREE
  1582.