home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 2 / FFMCD02.bin / new / dev / misc / cweb / examples / oemacs.w < prev    next >
Text File  |  1993-12-21  |  38KB  |  897 lines

  1. \datethis
  2. @i xview_types.w
  3.  
  4. @* Introduction.
  5. This program provides an interface between the GNU Emacs editor and the
  6. OpenWindows environment, using the XView toolkit for interactive graphics.
  7. It is based on \.{emacstool}, a SunView interface written by Jeff Peck
  8. of Sun Microsystems in 1986 and adapted by him in 1988 to \.{xvetool},
  9. an early XView interface. The present code, by Don Knuth, is designed to work
  10. with OpenWindows Version~3 as distributed in 1992, using a Sun Type~4
  11. keyboard.
  12.  
  13. GNU Emacs is a highly portable and versatile program, which does most
  14. of the hard work involved in editing files. Our job is simply twofold:
  15. To get \.{emacs} started in an appropriate window, and to transmit
  16. keyboard and mouse events as sequences of characters that \.{emacs}
  17. can happily consume.  These simple tasks do, however, require us to
  18. get a lot of fussy details right. In fact, this program could not have been
  19. written without a good deal more knowledge about XView than can be found
  20. in the manuals. Fortunately Jeff Peck works for Sun, and his
  21. inside knowledge has provided the necessary clues. (All complaints below
  22. about the XView documentation are based on the reference manuals and
  23. programming manuals available from Sun and from O'Reilly \AM\ Associates, in
  24. the summer of 1992. Let us hope that such problems will not persist;
  25. computer programming should be fun, but some of the code below was
  26. written only after a bitter struggle!)
  27.  
  28. The command-line arguments to \.{oemacs} are either standard XView
  29. arguments, which specify the font and the size and position of the window,
  30. the icon, the colors, etc.; or they are standard arguments of \.{emacs},
  31. which typically specify the file to be edited and a position in that file.
  32. If I decide later to make certain things in \.{oemacs} less hardwired,
  33. I will look for options in the X resource database instead of on the
  34. command line.
  35.  
  36. An important note about using \.{xmodmap} to change the behavior of
  37. certain keys appears below. It makes \.{emacs} more powerful, unless you
  38. have other good uses for those keys. (See the entry for \.{xmodmap}
  39. in the index.)
  40.  
  41. Before using \.{oemacs}, you must compile \.{emacs} with the
  42. \.{sunfns} module (which the \.{Makefile} will do for you if you've
  43. configured it correctly), and you should include the lines
  44. $$\vbox{\halign{\.{#}\hfil\cr
  45. (load-library "sun-mouse")\cr
  46. (load-library "sun-fns")\cr}}$$
  47. in Emacs's file \.{lisp/site-init.el}.
  48.  
  49. Caution: This program was developed and tested with Peck's improved
  50. versions of sun-mouse and sun-fns; these are available from
  51. \.{peck@@sun.com} if not yet part of the GNU distribution.
  52.  
  53. @ We follow the traditional structure of XView applications. The |exit|
  54. statement at the end is important, because \.{oemacs} can be invoked by
  55. the \.{system} command in \TEX/ (when the user has typed \.e in response
  56. to an error message); without |exit(0)|, \TEX/ would complain of trouble
  57. executing this program, although we would simply be terminating the program
  58. without returning any particular value.
  59.  
  60. @c
  61. @<Include header files@>@;
  62. @#
  63. Frame frame; /* the base frame where we will live */
  64. @<Global variables@>@; /* additional globals besides |frame| */
  65. @#
  66. @<Event-handling procedures@>@;
  67. @#
  68. main(argc,argv)
  69.   int argc;@+char *argv[]; /* typical \UNIX/ setup */
  70. {
  71.   @<Special initialization@>;
  72.   @<Install the components and controls of |frame|@>;
  73.   xv_main_loop(frame);
  74.   exit(0);
  75. }
  76.  
  77. @ Including the header file \.{<xview/xview.h>} also causes other
  78. basic header files like \.{<xview/frame.h>}, \.{<xview/icon.h>}, etc.,
  79. to be loaded. We must call the \CEE/ compiler with the flag
  80. \.{-I\$(OPENWINHOME)/include} so that the \CEE/ preprocessor will
  81. find the OpenWindows header files.
  82.  
  83. Some \UNIX/ systems define string functions in \.{<string.h>}, some in
  84. \.{<strings.h>}; the Sun documentation calls for \.{<string.h>}. My
  85. experiments indicate that Sun's compiler and loader work perfectly
  86. well with string functions even when no header files are given, so the
  87. programmer doesn't really have to remember the right name. Similarly,
  88. \.{<stdio.h>} isn't really needed with Sun's \CEE/, unless certain macros
  89. are used. I'll include \.{<string.h>} and \.{<stdio.h>} anyway, in the
  90. spirit of being obedient to the stated rules.
  91.  
  92. @<Include...@>=
  93. #include <string.h>
  94. #include <stdio.h>
  95. #include <xview/xview.h>
  96.  
  97. @* The icon and frame.
  98. First we attach an icon that will appear if the user closes the \.{oemacs}
  99. window later.
  100.  
  101. There are two reasons for doing this first. One is that we might as well
  102. begin with an easy task, in order to get warmed up. The other is that
  103. if we specify the icon {\it after\/} creating the frame, we will unconditionally
  104. override an icon that the user may have specified with the \.{-WI}
  105. option on the command line. (This is one of the little things a
  106. programmer has to turn by trial and error, since the XView documentation
  107. leaves much unsaid.)
  108.  
  109. The colors used in the icon will be inherited from the frame, so they will
  110. be reversed if the user asks for reverse video. I~prefer to have the icon
  111. always in black on a yellow background, so I'm making the color explicit.
  112. (I hope this will work on monochrome displays; it works fine on my
  113. grayscale monitor.)
  114.  
  115. @<Create a frame with the gnu icon@>=
  116. {@+Server_image icon_image=(Server_image)xv_create(NULL,SERVER_IMAGE,@|
  117.        XV_WIDTH,64,XV_HEIGHT,64,SERVER_IMAGE_BITS,icon_bits,NULL);
  118.   Server_image mask_image=(Server_image)xv_create(NULL,SERVER_IMAGE,@|
  119.        XV_WIDTH,64,XV_HEIGHT,64,SERVER_IMAGE_BITS,mask_bits,NULL);
  120.   Cms cms=(Cms)xv_create(NULL,CMS,CMS_SIZE,2,@|
  121.         CMS_NAMED_COLORS,"yellow","black",NULL,NULL);
  122.   Icon icon=(Icon)xv_create(NULL,ICON,@|
  123.        ICON_IMAGE,icon_image,ICON_MASK_IMAGE,mask_image,@|
  124.        WIN_CMS,cms,NULL);
  125.   frame=xv_create(NULL,FRAME,FRAME_ICON,icon,NULL);
  126. }
  127.  
  128. @ @<Include...@>=
  129. #include <xview/cms.h>
  130.  
  131. @ If the user hasn't specified a label with the \.{-Wl} option, we turn off
  132. the header line at the top of the frame. That gives us a chance to see
  133. two more lines of the file \.{emacs} is editing. However, we add a
  134. label of our own; it will show up in the virtual window manager display.
  135.  
  136. @<Remove the frame header, unless the user has specifically requested it@>=
  137. if (xv_get(frame,XV_LABEL)==NULL) /* no label specified */
  138.   xv_set(frame,FRAME_SHOW_HEADER,FALSE,XV_LABEL,"OEMACS",NULL);
  139.  
  140. @ The following icon and mask are derived from the ``what's gnu'' image on the
  141. back cover of the GNU Emacs manual. (This accounts for my black-on-yellow
  142. preference.)
  143.  
  144. @<Global...@>=
  145. unsigned short icon_bits[]={@|
  146.     0x0000,    0x0000,    0x0000,    0x1E00,
  147.     0x0000,    0x0000,    0x0000,    0x0900,@|
  148.     0x001E,    0x0000,    0x0000,    0x0880,
  149.     0x0064,    0x0000,    0x0000,    0x0440,@|
  150.     0x0088,    0x0000,    0x0000,    0x0420,
  151.     0x0110,    0x0000,    0x0000,    0x0210,@|
  152.     0x0220,    0x0000,    0x0000,    0x0210,
  153.     0x0420,    0x0FCF,    0x01C0,    0x0108,@|
  154.     0x0840,    0x1030,    0x8620,    0x0088,
  155.     0x1080,    0x00C0,    0x5810,    0x0084,@|
  156.     0x1080,    0x1F00,    0x2008,    0x0044,
  157.     0x2100,    0xE200,    0x1004,    0x0044,@|
  158.     0x4103,    0x0400,    0x0002,    0x0042,
  159.     0x4204,    0x080E,    0x0001,    0x0042,@|
  160.     0x8200,    0x7830,    0x0020,    0x8082,
  161.     0x8203,    0x9040,    0x0018,    0x4102,@|
  162.     0x8204,    0x2080,    0x07C6,    0x3E04,
  163.     0x8108,    0x410C,    0x0021,    0x8004,@|
  164.     0x8080,    0x8210,    0x03D0,    0x6008,
  165.     0x4041,    0x0420,    0x0008,    0x1810,@|
  166.     0x403E,    0x0820,    0x0FFC,    0x0620,
  167.     0x2000,    0x1040,    0x0002,    0x01C0,@|
  168.     0x1000,    0x608C,    0x0FFF,    0x0060,
  169.     0x0801,    0x8110,    0x0080,    0x8118,@|
  170.     0x0406,    0x0220,    0x1FFF,    0x66E0,
  171.     0x0238,    0x044F,    0x0000,    0xD800,@|
  172.     0x01C0,    0x0890,    0x8FFF,    0x4000,
  173.     0x0300,    0x10A6,    0x4041,    0x6000,@|
  174.     0x1C00,    0x2026,    0x4FFF,    0x6000,
  175.     0x60CC,    0x4026,    0x4001,    0x6000,@|
  176.     0x1F33,    0x8010,    0x8FFF,    0x4000,
  177.     0x0012,    0x000F,    0x0040,    0xC000,@|
  178.     0x0022,    0x4000,    0x07FF,    0x4000,
  179.     0x0024,    0x4000,    0x0000,    0x2000,@|
  180.     0x0024,    0x4818,    0x8FFF,    0xE000,
  181.     0x0024,    0x4907,    0x0040,    0x2000,@|
  182.     0x0044,    0x4900,    0x1FFF,    0xE000,
  183.     0x0044,    0x4900,    0x0000,    0x2000,@|
  184.     0x0044,    0x4900,    0x07FF,    0xE000,
  185.     0x0044,    0x4880,    0x0020,    0x2000,@|
  186.     0x0044,    0x4880,    0x07FF,    0xE000,
  187.     0x0044,    0x4840,    0x0000,    0x2000,@|
  188.     0x0044,    0x2A20,    0x07FF,    0xE000,
  189.     0x0044,    0x2410,    0x0020,    0x2000,@|
  190.     0x0042,    0x2448,    0x0FFF,    0xE000,
  191.     0x0042,    0x2948,    0x0000,    0x2000,@|
  192.     0x0041,    0x1144,    0x07FF,    0xA000,
  193.     0x0041,    0x1144,    0x2010,    0x1000,@|
  194.     0x0021,    0x1126,    0