home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / x / volume12 / tvtwm / patch5 / patch.5
Text File  |  1993-04-28  |  65KB  |  2,320 lines

  1. tvtwm patch 5
  2.  
  3. This patch fixes the following problems:
  4.  
  5.  1.  Removed XSynchronize call from twm.c
  6.  2.  The panner windows do not move during a move operation unless  
  7.      the move is opaque.
  8.  3.  StayUpMenus keyword allows menus to be displayed until the next 
  9.      ButtonPress event. (Gregg Jensen uucigj@swbatl.sbc.com)
  10.  4.  f.zoom commands now obey size hints.
  11.  5.  Added PannerOpaqueScroll keyword
  12.     (Eric A. Anderson <uunet!andrew.cmu.edu!ea08+>
  13.  6.  TWM Windows menu is now sorted based upon the state of the
  14.      SortIconManager variable. (Eric A. Anderson)
  15.  7.  MenuTitleFont and TitleFontPadding variables added
  16.     (uunet!cstr.ed.ac.uk!rjc)
  17.  8.  PannerBackgroundPixmap and VirtualDesktopBackgroundPixmap must now be
  18.      specified inside of the Pixmaps list. (uunet!cstr.ed.ac.uk!rjc)
  19.  8.  Resize outlines now go away if a resize is cancelled in other than
  20.      the +0+0 quadrant.
  21.  9.  Primitive include file support for .{tv}twmrc via:
  22.      include filename    (Gregory Bond <uunet!bby.oz.au!gnb)
  23. 10.  Panner interaction under OpenWindows 2.0 is fixed (bkm@eng.sun.com)
  24.  
  25.  
  26. diff -c old/add_window.c new/add_window.c
  27. *** old/add_window.c    Thu Nov 15 20:13:07 1990
  28. --- new/add_window.c    Tue Apr 23 08:17:12 1991
  29. ***************
  30. *** 1108,1113 ****
  31. --- 1108,1114 ----
  32.           pm = None;
  33.       }
  34.       }
  35.       if (pm) {
  36.       valuemask = CWBackPixmap;
  37.       attributes.background_pixmap = pm;
  38. ***************
  39. *** 1116,1127 ****
  40. --- 1117,1133 ----
  41.       attributes.background_pixel = tmp_win->title.fore;
  42.       }
  43.   
  44. +     valuemask |= CWBackingStore;
  45. +     attributes.backing_store= NotUseful;
  46.       w = XCreateWindow (dpy, tmp_win->title_w, 0, Scr->FramePadding,
  47.                  (unsigned int) Scr->TBInfo.width, (unsigned int) h,
  48.                  (unsigned int) 0,
  49.                  Scr->d_depth, (unsigned int) CopyFromParent,
  50.                  Scr->d_visual, valuemask, &attributes);
  51.       if (pm) XFreePixmap (dpy, pm);
  52.       return w;
  53.   }
  54.   
  55. ***************
  56. *** 1296,1317 ****
  57.       if (tmp_win->hilite_w)
  58.         XUnmapWindow(dpy, tmp_win->hilite_w);
  59.       return;
  60. - }
  61. - SetHighlightPixmap (filename)
  62. -     char *filename;
  63. - {
  64. -     Pixmap pm = GetBitmap (filename);
  65. -     if (pm) {
  66. -     if (Scr->hilitePm) {
  67. -         XFreePixmap (dpy, Scr->hilitePm);
  68. -     }
  69. -     Scr->hilitePm = pm;
  70. -     Scr->hilite_pm_width = JunkWidth;
  71. -     Scr->hilite_pm_height = JunkHeight;
  72. -     }
  73.   }
  74.   
  75.   
  76. --- 1302,1307 ----
  77. diff -c old/events.c new/events.c
  78. *** old/events.c    Thu Nov 15 20:13:08 1990
  79. --- new/events.c    Tue Apr 23 08:17:12 1991
  80. ***************
  81. *** 33,38 ****
  82. --- 33,56 ----
  83.    * twm event handling
  84.    *
  85.    * $Log:    events.c,v $
  86. +  * Revision 9.0  91/04/23  07:40:32  toml
  87. +  * Revision bump
  88. +  * 
  89. +  * Revision 8.5  90/12/31  09:50:23  toml
  90. +  * A better StayUpMenu fix
  91. +  * 
  92. +  * Revision 8.4  90/12/31  09:45:03  toml
  93. +  * Fixes a StayUpMenus crash
  94. +  * 
  95. +  * Revision 8.3  90/12/29  16:39:30  toml
  96. +  * RJC patches
  97. +  * 
  98. +  * Revision 8.2  90/12/29  11:24:16  toml
  99. +  * Added PannerOpaqueScroll
  100. +  * 
  101. +  * Revision 8.1  90/12/29  10:13:10  toml
  102. +  * StayUpMenus
  103. +  * 
  104.    * Revision 8.0  90/11/15  20:02:36  toml
  105.    * Revision bump
  106.    * 
  107. ***************
  108. *** 108,114 ****
  109. --- 126,135 ----
  110.   ScreenInfo *FindScreenInfo();
  111.   int ButtonPressed = -1;
  112.   int Cancel = FALSE;
  113. + int GlobalFirstTime = True;
  114. + int GlobalMenuButton = False;
  115.   
  116.   void HandleCreateNotify();
  117.   void HandleReparentNotify();
  118.   
  119. ***************
  120. *** 1077,1083 ****
  121.           }
  122.           flush_expose (Event.xany.window);
  123.           return;
  124. !     } else if (Tmp_win->titlebuttons) {
  125.           int i;
  126.           Window w = Event.xany.window;
  127.           register TBWindow *tbw;
  128. --- 1098,1159 ----
  129.           }
  130.           flush_expose (Event.xany.window);
  131.           return;
  132. !     } else if (Event.xany.window == Tmp_win->hilite_w)
  133. !            {
  134. !            GC gc = None;
  135. !            XGCValues gcv;
  136. !            Window w= Event.xany.window;
  137. !            
  138. !            if (Scr->hiliteLeftPm) 
  139. !            {
  140. !            gcv.foreground = Tmp_win->title.fore;
  141. !            gcv.background = Tmp_win->title.back;
  142. !            gcv.graphics_exposures = False;
  143. !            gc = XCreateGC (dpy, w,
  144. !                    (GCForeground|GCBackground
  145. !                     |GCGraphicsExposures),
  146. !                    &gcv);
  147. !            if (gc) 
  148. !                {
  149. !                XCopyPlane (dpy, Scr->hiliteLeftPm, w,
  150. !                    gc, 
  151. !                    0, 0, 
  152. !                    Scr->hilite_left_pm_width, 
  153. !                    Scr->hilite_left_pm_height,
  154. !                    0, 0, 1);
  155. !                XFreeGC (dpy, gc);
  156. !                }
  157. !            }
  158. !            
  159. !            if (Scr->hiliteRightPm) 
  160. !            {
  161. !            if ( gc==None ) 
  162. !                {
  163. !                gcv.foreground = Tmp_win->title.fore;
  164. !                gcv.background = Tmp_win->title.back;
  165. !                gcv.graphics_exposures = False;
  166. !                gc = XCreateGC (dpy, w,
  167. !                        (GCForeground|GCBackground
  168. !                     |GCGraphicsExposures),
  169. !                        &gcv);
  170. !                }
  171. !            if (gc) 
  172. !                {
  173. !                XCopyPlane (dpy, Scr->hiliteRightPm,w,
  174. !                    gc, 
  175. !                    Tmp_win->rightx
  176. !                        - Tmp_win->highlightx
  177. !                        - Scr->hilite_right_pm_width, 0, 
  178. !                    Scr->hilite_right_pm_width, 
  179. !                    Scr->hilite_right_pm_height,
  180. !                    0, 0, 1);
  181. !                XFreeGC (dpy, gc);
  182. !                }
  183. !            }
  184. !            flush_expose (Event.xany.window);
  185. !            }
  186. !     else if (Tmp_win->titlebuttons) {
  187.           int i;
  188.           Window w = Event.xany.window;
  189.           register TBWindow *tbw;
  190. ***************
  191. *** 1520,1525 ****
  192. --- 1596,1613 ----
  193.       int xl, xr, yt, yb, w, h;
  194.       unsigned mask;
  195.   
  196. +     if (Scr->StayUpMenus)
  197. +     {
  198. +         if (GlobalFirstTime == True && GlobalMenuButton == True )
  199. +         {
  200. +             ButtonPressed = -1;
  201. +             GlobalFirstTime = False;
  202. +             return;
  203. +         } /* end if  */
  204. +     
  205. +         GlobalFirstTime = True;
  206. +     } /* end if  */
  207.       if (Event.xany.window == Scr->Panner)
  208.       {
  209.       HandlePannerButtonRelease(&Event);
  210. ***************
  211. *** 1527,1533 ****
  212.       }
  213.       if (DragWindow != None)
  214.       {
  215. !     MoveOutline(Scr->Root, 0, 0, 0, 0, 0, 0);
  216.   
  217.       XFindContext(dpy, DragWindow, TwmContext, (caddr_t *)&Tmp_win);
  218.       if (DragWindow == Tmp_win->frame)
  219. --- 1615,1621 ----
  220.       }
  221.       if (DragWindow != None)
  222.       {
  223. !     MoveOutline(None, 0, 0, 0, 0, 0, 0);
  224.   
  225.       XFindContext(dpy, DragWindow, TwmContext, (caddr_t *)&Tmp_win);
  226.       if (DragWindow == Tmp_win->frame)
  227. ***************
  228. *** 1686,1691 ****
  229. --- 1774,1782 ----
  230.       int y = Event.xbutton.y_root;
  231.       Bool center;
  232.   
  233. +     if (Scr->StayUpMenus)
  234. +     GlobalMenuButton = True;
  235.       if (!Scr->NoGrabServer)
  236.       XGrabServer(dpy);
  237.       if (w) {
  238. ***************
  239. *** 1719,1726 ****
  240.       Cursor cur;
  241.   
  242.       /* pop down the menu, if any */
  243. !     if (ActiveMenu != NULL)
  244. !     PopDownMenu();
  245.   
  246.       if (InfoLines) {
  247.       XUnmapWindow(dpy, Scr->InfoWindow);
  248. --- 1810,1830 ----
  249.       Cursor cur;
  250.   
  251.       /* pop down the menu, if any */
  252. !     /* if (ActiveMenu != NULL)
  253. !     PopDownMenu(); */
  254. !     if (Scr->StayUpMenus)
  255. !     {
  256. !         if (GlobalFirstTime == False && GlobalMenuButton == True)
  257. !         {
  258. !             return;
  259. !         } /* end if  */
  260. !     } /* end if  */
  261. !     else
  262. !     {
  263. !         /* pop down the menu, if any */
  264. !         if (ActiveMenu != NULL)
  265. !         PopDownMenu();
  266. !     } /* end else  */
  267.   
  268.       if (InfoLines) {
  269.       XUnmapWindow(dpy, Scr->InfoWindow);
  270. ***************
  271. *** 1728,1733 ****
  272. --- 1832,1839 ----
  273.       }
  274.       XSync(dpy, 0);            /* XXX - remove? */
  275.   
  276. +     /* @@@@@@@@@@@ Put this so that bound keys will do things.
  277. +        EG, meta-button one will let you move the panner. */
  278.       if (Event.xany.window == Scr->Panner)
  279.       {
  280.       HandlePannerButtonPress(&Event);
  281. ***************
  282. *** 1750,1756 ****
  283.       if (Scr->OpaqueMove && DragWindow != None) {
  284.           XMoveWindow (dpy, DragWindow, origDragX, origDragY);
  285.       } else {
  286. !         MoveOutline(Scr->Root, 0, 0, 0, 0, 0, 0);
  287.       }
  288.       XUnmapWindow(dpy, Scr->SizeWindow);
  289.       if (!Scr->OpaqueMove)
  290. --- 1856,1862 ----
  291.       if (Scr->OpaqueMove && DragWindow != None) {
  292.           XMoveWindow (dpy, DragWindow, origDragX, origDragY);
  293.       } else {
  294. !         MoveOutline(None, 0, 0, 0, 0, 0, 0);
  295.       }
  296.       XUnmapWindow(dpy, Scr->SizeWindow);
  297.       if (!Scr->OpaqueMove)
  298. ***************
  299. *** 1774,1781 ****
  300.       ButtonPressed = Event.xbutton.button;
  301.   
  302.       if (ResizeWindow != None ||
  303. !     DragWindow != None  ||
  304. !     ActiveMenu != NULL)
  305.       return;
  306.   
  307.       /* check the title bar buttons */
  308. --- 1880,1886 ----
  309.       ButtonPressed = Event.xbutton.button;
  310.   
  311.       if (ResizeWindow != None ||
  312. !     DragWindow != None)
  313.       return;
  314.   
  315.       /* check the title bar buttons */
  316. ***************
  317. *** 1899,1904 ****
  318. --- 2004,2016 ----
  319.       ExecuteFunction(RootFunction, Action, Event.xany.window,
  320.           Tmp_win, &Event, Context, FALSE);
  321.   
  322. +         if (Scr->StayUpMenus)
  323. +         {
  324. +             /* pop down the menu, if any */
  325. +             if (ActiveMenu != NULL)
  326. +             PopDownMenu();
  327. +         } /* end if  */
  328.       RootFunction = NULL;
  329.       return;
  330.       }
  331. ***************
  332. *** 1917,1924 ****
  333.       RootFunction = NULL;
  334.       if (Scr->Mouse[Event.xbutton.button][Context][modifier].func == F_MENU)
  335.       {
  336. !     do_menu (Scr->Mouse[Event.xbutton.button][Context][modifier].menu,
  337. !          (Window) None);
  338.       }
  339.       else if (Scr->Mouse[Event.xbutton.button][Context][modifier].func != NULL)
  340.       {
  341. --- 2029,2040 ----
  342.       RootFunction = NULL;
  343.       if (Scr->Mouse[Event.xbutton.button][Context][modifier].func == F_MENU)
  344.       {
  345. !         do_menu (Scr->Mouse[Event.xbutton.button][Context][modifier].menu,
  346. !             (Window) None);
  347. !         if (Scr->StayUpMenus)
  348. !         {
  349. !             GlobalMenuButton = False;
  350. !         } /* end if  */
  351.       }
  352.       else if (Scr->Mouse[Event.xbutton.button][Context][modifier].func != NULL)
  353.       {
  354. ***************
  355. *** 1965,1970 ****
  356. --- 2081,2087 ----
  357.   } HENScanArgs;
  358.   
  359.   /* ARGSUSED*/
  360.   static Bool
  361.   HENQueueScanner(dpy, ev, args)
  362.       Display *dpy;
  363. diff -c old/gram.y new/gram.y
  364. *** old/gram.y    Thu Nov 15 20:13:09 1990
  365. --- new/gram.y    Tue Apr 23 08:17:13 1991
  366. ***************
  367. *** 87,93 ****
  368.   %token <num> START_ICONIFIED NO_TITLE_HILITE TITLE_HILITE
  369.   %token <num> MOVE RESIZE WAIT SELECT KILL LEFT_TITLEBUTTON RIGHT_TITLEBUTTON 
  370.   %token <num> NUMBER KEYWORD NKEYWORD CKEYWORD CLKEYWORD FKEYWORD FSKEYWORD 
  371. ! %token <num> SKEYWORD DKEYWORD JKEYWORD WINDOW_RING WARP_CURSOR ERRORTOKEN
  372.   %token <num> NO_STACKMODE ICON_TITLE NO_ICON_TITLE
  373.   %token <ptr> STRING 
  374.   
  375. --- 87,93 ----
  376.   %token <num> START_ICONIFIED NO_TITLE_HILITE TITLE_HILITE
  377.   %token <num> MOVE RESIZE WAIT SELECT KILL LEFT_TITLEBUTTON RIGHT_TITLEBUTTON 
  378.   %token <num> NUMBER KEYWORD NKEYWORD CKEYWORD CLKEYWORD FKEYWORD FSKEYWORD 
  379. ! %token <num> SKEYWORD DKEYWORD JKEYWORD PKEYWORD WINDOW_RING WARP_CURSOR ERRORTOKEN
  380.   %token <num> NO_STACKMODE ICON_TITLE NO_ICON_TITLE
  381.   %token <ptr> STRING 
  382.   
  383. ***************
  384. *** 345,351 ****
  385.           | pixmap_entries pixmap_entry
  386.           ;
  387.   
  388. ! pixmap_entry    : TITLE_HILITE string { SetHighlightPixmap ($2); }
  389.           ;
  390.   
  391.   
  392. --- 345,351 ----
  393.           | pixmap_entries pixmap_entry
  394.           ;
  395.   
  396. ! pixmap_entry    :  PKEYWORD string { do_pixmap_keyword($1,$2); }
  397.           ;
  398.   
  399.   
  400. diff -c old/iconmgr.c new/iconmgr.c
  401. *** old/iconmgr.c    Thu Nov 15 20:13:10 1990
  402. --- new/iconmgr.c    Tue Apr 23 08:17:13 1991
  403. ***************
  404. *** 499,504 ****
  405. --- 499,506 ----
  406.    ***********************************************************************
  407.    */
  408.   
  409. + extern int FIXED_XmuCompareISOLatin1();
  410.   void InsertInIconManager(ip, tmp, tmp_win)
  411.       IconMgr *ip;
  412.       WList *tmp;
  413. ***************
  414. *** 506,512 ****
  415.   {
  416.       WList *tmp1;
  417.       int added;
  418. !     int (*compar)() = (Scr->CaseSensitive ? strcmp : XmuCompareISOLatin1);
  419.   
  420.       added = FALSE;
  421.       if (ip->first == NULL)
  422. --- 508,514 ----
  423.   {
  424.       WList *tmp1;
  425.       int added;
  426. !     int (*compar)() = (Scr->CaseSensitive ? strcmp : FIXED_XmuCompareISOLatin1);
  427.   
  428.       added = FALSE;
  429.       if (ip->first == NULL)
  430. ***************
  431. *** 655,661 ****
  432.   {
  433.       WList *tmp1, *tmp2;
  434.       int done;
  435. !     int (*compar)() = (Scr->CaseSensitive ? strcmp : XmuCompareISOLatin1);
  436.   
  437.       if (ip == NULL)
  438.       ip = Active->iconmgr;
  439. --- 657,663 ----
  440.   {
  441.       WList *tmp1, *tmp2;
  442.       int done;
  443. !     int (*compar)() = (Scr->CaseSensitive ? strcmp : FIXED_XmuCompareISOLatin1);
  444.   
  445.       if (ip == NULL)
  446.       ip = Active->iconmgr;
  447. diff -c old/icons.c new/icons.c
  448. *** old/icons.c    Thu Nov 15 20:13:10 1990
  449. --- new/icons.c    Tue Apr 23 08:17:13 1991
  450. ***************
  451. *** 26,31 ****
  452. --- 26,34 ----
  453.    * Icon releated routines
  454.    *
  455.    * $Log:    icons.c,v $
  456. +  * Revision 9.0  91/04/23  07:40:37  toml
  457. +  * Revision bump
  458. +  * 
  459.    * Revision 8.0  90/11/15  20:02:40  toml
  460.    * Revision bump
  461.    * 
  462. diff -c old/menus.c new/menus.c
  463. *** old/menus.c    Thu Nov 15 20:13:12 1990
  464. --- new/menus.c    Tue Apr 23 08:17:14 1991
  465. ***************
  466. *** 33,38 ****
  467. --- 33,50 ----
  468.    * twm menu code
  469.    *
  470.    * $Log:    menus.c,v $
  471. +  * Revision 9.0  91/04/23  07:40:40  toml
  472. +  * Revision bump
  473. +  * 
  474. +  * Revision 8.3  91/04/15  09:13:24  toml
  475. +  * Remove version comment
  476. +  * 
  477. +  * Revision 8.2  90/12/29  16:39:35  toml
  478. +  * RJC patches
  479. +  * 
  480. +  * Revision 8.1  90/12/29  10:13:12  toml
  481. +  * StayUpMenus
  482. +  * 
  483.    * Revision 8.0  90/11/15  20:02:43  toml
  484.    * Revision bump
  485.    * 
  486. ***************
  487. *** 82,91 ****
  488. --- 94,106 ----
  489.   #include "vdt.h"
  490.   #include "add_window.h"
  491.   #include "patchlevel.h"
  492. + #include "malloc.h"
  493. + #include <X11/Xmu/CharSet.h>
  494.   
  495.   extern XEvent Event;
  496.   
  497.   int RootFunction = NULL;
  498.   MenuRoot *ActiveMenu = NULL;        /* the active menu */
  499.   MenuItem *ActiveItem = NULL;        /* the active menu item */
  500.   int MoveFunction;            /* either F_MOVE or F_FORCEMOVE */
  501. ***************
  502. *** 116,121 ****
  503. --- 131,138 ----
  504.   extern char *InitFile;
  505.   static void Identify();
  506.   
  507. + #define MAX(x,y) ((x)>(y)?(x):(y))
  508.   #define SHADOWWIDTH 5            /* in pixels */
  509.   
  510.   /***********************************************************************
  511. ***************
  512. *** 372,388 ****
  513.       int y_offset;
  514.       int text_y;
  515.       GC gc;
  516.   
  517.   #ifdef DEBUG_MENUS
  518.       fprintf(stderr, "Paint entry\n");
  519.   #endif
  520.       y_offset = mi->item_num * Scr->EntryHeight;
  521. -     text_y = y_offset + Scr->MenuFont.y;
  522.   
  523.       if (mi->func != F_TITLE)
  524.       {
  525.       int x, y;
  526.   
  527.       if (mi->state)
  528.       {
  529.           XSetForeground(dpy, Scr->NormalGC, mi->hi_back);
  530. --- 389,409 ----
  531.       int y_offset;
  532.       int text_y;
  533.       GC gc;
  534. +     MyFont *font;
  535.   
  536.   #ifdef DEBUG_MENUS
  537.       fprintf(stderr, "Paint entry\n");
  538.   #endif
  539.       y_offset = mi->item_num * Scr->EntryHeight;
  540.   
  541.       if (mi->func != F_TITLE)
  542.       {
  543.       int x, y;
  544.   
  545. +     font = &(Scr->MenuFont);
  546. +     text_y = y_offset + font->y;
  547.       if (mi->state)
  548.       {
  549.           XSetForeground(dpy, Scr->NormalGC, mi->hi_back);
  550. ***************
  551. *** 390,396 ****
  552.           XFillRectangle(dpy, mr->w, Scr->NormalGC, 0, y_offset,
  553.           mr->width, Scr->EntryHeight);
  554.   
  555. !         FBF(mi->hi_fore, mi->hi_back, Scr->MenuFont.font->fid);
  556.   
  557.           XDrawString(dpy, mr->w, Scr->NormalGC, mi->x,
  558.           text_y, mi->item, mi->strlen);
  559. --- 411,417 ----
  560.           XFillRectangle(dpy, mr->w, Scr->NormalGC, 0, y_offset,
  561.           mr->width, Scr->EntryHeight);
  562.   
  563. !         FBF(mi->hi_fore, mi->hi_back, font->font->fid);
  564.   
  565.           XDrawString(dpy, mr->w, Scr->NormalGC, mi->x,
  566.           text_y, mi->item, mi->strlen);
  567. ***************
  568. *** 406,412 ****
  569.           XFillRectangle(dpy, mr->w, Scr->NormalGC, 0, y_offset,
  570.               mr->width, Scr->EntryHeight);
  571.   
  572. !         FBF(mi->fore, mi->back, Scr->MenuFont.font->fid);
  573.           gc = Scr->NormalGC;
  574.           }
  575.           else
  576. --- 427,433 ----
  577.           XFillRectangle(dpy, mr->w, Scr->NormalGC, 0, y_offset,
  578.               mr->width, Scr->EntryHeight);
  579.   
  580. !         FBF(mi->fore, mi->back, font->font->fid);
  581.           gc = Scr->NormalGC;
  582.           }
  583.           else
  584. ***************
  585. *** 426,432 ****
  586.               menu12_bits, menu12_width, menu12_height, 1, 0, 1);
  587.           }
  588.           x = mr->width - menu12_width - 5;
  589. !         y = y_offset + ((Scr->MenuFont.height - menu12_height) / 2);
  590.           XCopyPlane(dpy, Scr->pullPm, mr->w, gc, 0, 0,
  591.           menu12_width, menu12_height, x, y, 1);
  592.       }
  593. --- 447,453 ----
  594.               menu12_bits, menu12_width, menu12_height, 1, 0, 1);
  595.           }
  596.           x = mr->width - menu12_width - 5;
  597. !         y = y_offset + ((font->height - menu12_height) / 2);
  598.           XCopyPlane(dpy, Scr->pullPm, mr->w, gc, 0, 0,
  599.           menu12_width, menu12_height, x, y, 1);
  600.       }
  601. ***************
  602. *** 435,440 ****
  603. --- 456,468 ----
  604.       {
  605.       int y;
  606.   
  607. +     if (Scr->MenuTitleFont.name != NULL )
  608. +         font = &(Scr->MenuTitleFont);
  609. +     else
  610. +         font = &(Scr->MenuFont);
  611. +     text_y = y_offset + font->y;
  612.       XSetForeground(dpy, Scr->NormalGC, mi->back);
  613.   
  614.       /* fill the rectangle with the title background color */
  615. ***************
  616. *** 441,448 ****
  617. --- 469,483 ----
  618.       XFillRectangle(dpy, mr->w, Scr->NormalGC, 0, y_offset,
  619.           mr->width, Scr->EntryHeight);
  620.   
  621. +     if ( Scr->MenuLineWidth > 0 ) /* note we loose the high efficiancy `0' line width */
  622.       {
  623.           XSetForeground(dpy, Scr->NormalGC, mi->fore);
  624. +         XSetLineAttributes(dpy,Scr->NormalGC,
  625. +                    Scr->MenuLineWidth,
  626. +                    LineSolid,
  627. +                    CapButt,
  628. +                    JoinMiter);
  629.           /* now draw the dividing lines */
  630.           if (y_offset)
  631.             XDrawLine (dpy, mr->w, Scr->NormalGC, 0, y_offset,
  632. ***************
  633. *** 449,457 ****
  634.                mr->width, y_offset);
  635.           y = ((mi->item_num+1) * Scr->EntryHeight)-1;
  636.           XDrawLine(dpy, mr->w, Scr->NormalGC, 0, y, mr->width, y);
  637.       }
  638.   
  639. !     FBF(mi->fore, mi->back, Scr->MenuFont.font->fid);
  640.       /* finally render the title */
  641.       XDrawString(dpy, mr->w, Scr->NormalGC, mi->x,
  642.           text_y, mi->item, mi->strlen);
  643. --- 484,497 ----
  644.                mr->width, y_offset);
  645.           y = ((mi->item_num+1) * Scr->EntryHeight)-1;
  646.           XDrawLine(dpy, mr->w, Scr->NormalGC, 0, y, mr->width, y);
  647. +         XSetLineAttributes(dpy,Scr->NormalGC,
  648. +                    0,
  649. +                    LineSolid,
  650. +                    CapButt,
  651. +                    JoinMiter);
  652.       }
  653.   
  654. !     FBF(mi->fore, mi->back, font->font->fid);
  655.       /* finally render the title */
  656.       XDrawString(dpy, mr->w, Scr->NormalGC, mi->x,
  657.           text_y, mi->item, mi->strlen);
  658. ***************
  659. *** 491,496 ****
  660. --- 531,537 ----
  661.       Window aJunkRoot,aJunkChild;
  662.       unsigned int aJunkMask;
  663.       int a_type;
  664. +     static int firstTime = True;
  665.   
  666.       while (TRUE)
  667.       {
  668. ***************
  669. *** 499,506 ****
  670.       {
  671.           a_type = Event.type;
  672.           if (!DispatchEvent ()) continue;
  673. !         if (a_type == ButtonRelease || Cancel)
  674. !         return;
  675.       }
  676.   
  677.       /* if we haven't recieved the enter notify yet, wait */
  678. --- 540,572 ----
  679.       {
  680.           a_type = Event.type;
  681.           if (!DispatchEvent ()) continue;
  682. !         /* if (a_type == ButtonRelease || Cancel)
  683. !         return; */
  684. !         if (Event.type == ButtonRelease)
  685. !         {
  686. !             if (Scr->StayUpMenus)
  687. !             {
  688. !             if (firstTime == True)
  689. !             {
  690. !                 /* it was the first release of the button */
  691. !                 firstTime = False;
  692. !             } /* end if  */
  693. !             else
  694. !             {
  695. !                 /* thats the second we need to return now */
  696. !                 firstTime = True;
  697. !                 return;
  698. !             } /* end else  */
  699. !             } /* end if  */
  700. !             else
  701. !             {
  702. !             return;
  703. !             } /* end else  */
  704. !         }
  705. !         if (Event.type ==  Cancel)
  706. !         return;
  707.       }
  708.   
  709.       /* if we haven't recieved the enter notify yet, wait */
  710. ***************
  711. *** 682,687 ****
  712. --- 748,754 ----
  713.   {
  714.       MenuItem *tmp;
  715.       int width;
  716. +     MyFont *font;
  717.   
  718.   #ifdef DEBUG_MENUS
  719.       fprintf(stderr, "adding menu item=\"%s\", action=%s, sub=%d, f=%d\n",
  720. ***************
  721. *** 711,718 ****
  722.       tmp->state = 0;
  723.       tmp->func = func;
  724.   
  725.       if (!Scr->HaveFonts) CreateFonts();
  726. !     width = XTextWidth(Scr->MenuFont.font, item, tmp->strlen);
  727.       if (width <= 0)
  728.       width = 1;
  729.       if (width > menu->width)
  730. --- 778,790 ----
  731.       tmp->state = 0;
  732.       tmp->func = func;
  733.   
  734. +     if ( func == F_TITLE && Scr->MenuTitleFont.name != NULL)
  735. +     font= &(Scr->MenuTitleFont);
  736. +     else
  737. +     font= &(Scr->MenuFont);
  738.       if (!Scr->HaveFonts) CreateFonts();
  739. !     width = XTextWidth(font->font, item, tmp->strlen);
  740.       if (width <= 0)
  741.       width = 1;
  742.       if (width > menu->width)
  743. ***************
  744. *** 767,775 ****
  745.       unsigned long valuemask;
  746.       XSetWindowAttributes attributes;
  747.       Colormap cmap = Scr->TwmRoot.cmaps.cwins[0]->colormap->c;
  748.   
  749. -     Scr->EntryHeight = Scr->MenuFont.height + 4;
  750.       /* lets first size the window accordingly */
  751.       if (mr->mapped == NEVER_MAPPED)
  752.       {
  753. --- 839,858 ----
  754.       unsigned long valuemask;
  755.       XSetWindowAttributes attributes;
  756.       Colormap cmap = Scr->TwmRoot.cmaps.cwins[0]->colormap->c;
  757. +     MyFont *titleFont; 
  758. +   
  759. +     if ( Scr->MenuTitleFont.name != NULL )
  760. +     {
  761. +      Scr->EntryHeight = MAX(Scr->MenuFont.height,
  762. +                     Scr->MenuTitleFont.height) + 4;
  763. +      titleFont= &(Scr->MenuTitleFont);
  764. +     }
  765. +     else
  766. +     {
  767. +       Scr->EntryHeight = Scr->MenuFont.height + 4;
  768. +     titleFont= &(Scr->MenuFont);
  769. +     }
  770.   
  771.       /* lets first size the window accordingly */
  772.       if (mr->mapped == NEVER_MAPPED)
  773.       {
  774. ***************
  775. *** 786,792 ****
  776.           cur->x = 5;
  777.           else
  778.           {
  779. !         cur->x = width - XTextWidth(Scr->MenuFont.font, cur->item,
  780.               cur->strlen);
  781.           cur->x /= 2;
  782.           }
  783. --- 869,875 ----
  784.           cur->x = 5;
  785.           else
  786.           {
  787. !         cur->x = width - XTextWidth(titleFont->font, cur->item,
  788.               cur->strlen);
  789.           cur->x /= 2;
  790.           }
  791. ***************
  792. *** 955,1048 ****
  793.    ***********************************************************************
  794.    */
  795.   
  796.   Bool PopUpMenu (menu, x, y, center)
  797.       MenuRoot *menu;
  798.       int x, y;
  799.       Bool center;
  800.   {
  801. !     if (!menu) return False;
  802.   
  803. !     InstallRootColormap();
  804.   
  805. !     if (menu == Scr->Windows)
  806.       {
  807. !     TwmWindow *tmp_win;
  808.   
  809. !     /* this is the twm windows menu,  let's go ahead and build it */
  810.   
  811. !     DestroyMenu (menu);
  812.   
  813. !     menu->first = NULL;
  814. !     menu->last = NULL;
  815. !     menu->items = 0;
  816. !     menu->width = 0;
  817. !     menu->mapped = NEVER_MAPPED;
  818.   
  819. !     AddToMenu(menu, "TWM Windows", NULLSTR, NULL, F_TITLE,NULLSTR,NULLSTR);
  820.       for (tmp_win = Scr->TwmRoot.next;
  821.            tmp_win != NULL;
  822.            tmp_win = tmp_win->next)
  823. !     {
  824.           AddToMenu (menu, tmp_win->name, (char *) tmp_win, NULL, F_POPUP, 
  825.                  NULLSTR, NULLSTR);
  826. !     }
  827. !     MakeMenu(menu);
  828.       }
  829.   
  830. !     if (menu->w == None || menu->items == 0) return False;
  831.   
  832. !     /* Prevent recursively bringing up menus. */
  833. !     if (menu->mapped == MAPPED) return False;
  834.   
  835. !     /*
  836. !      * Dynamically set the parent;  this allows pull-ups to also be main
  837. !      * menus, or to be brought up from more than one place.
  838. !      */
  839. !     menu->prev = ActiveMenu;
  840.   
  841. !     XGrabPointer(dpy, Scr->Root, True,
  842. !     ButtonPressMask | ButtonReleaseMask,
  843. !     GrabModeAsync, GrabModeAsync,
  844. !     Scr->Root, Scr->MenuCursor, CurrentTime);
  845.   
  846. !     ActiveMenu = menu;
  847. !     menu->mapped = MAPPED;
  848. !     menu->entered = FALSE;
  849.   
  850. !     if (center) {
  851. !     x -= (menu->width / 2);
  852. !     y -= (Scr->EntryHeight / 2);    /* sticky menus would be nice here */
  853. !     }
  854.   
  855. !     /*
  856. !      * clip to screen
  857. !      */
  858. !     if (x + menu->width > Scr->MyDisplayWidth) {
  859. !     x = Scr->MyDisplayWidth - menu->width;
  860. !     }
  861. !     if (x < 0) x = 0;
  862. !     if (y + menu->height > Scr->MyDisplayHeight) {
  863. !     y = Scr->MyDisplayHeight - menu->height;
  864. !     }
  865. !     if (y < 0) y = 0;
  866.   
  867. !     MenuOrigins[MenuDepth].x = x;
  868. !     MenuOrigins[MenuDepth].y = y;
  869. !     MenuDepth++;
  870.   
  871. !     XMoveWindow(dpy, menu->w, x, y);
  872. !     if (Scr->Shadow) {
  873. !     XMoveWindow (dpy, menu->shadow, x + SHADOWWIDTH, y + SHADOWWIDTH);
  874. !     }
  875. !     if (Scr->Shadow) {
  876. !     XRaiseWindow (dpy, menu->shadow);
  877. !     }
  878. !     XMapRaised(dpy, menu->w);
  879. !     if (Scr->Shadow) {
  880. !     XMapWindow (dpy, menu->shadow);
  881. !     }
  882. !     XSync(dpy, 0);
  883. !     return True;
  884.   }
  885.   
  886.   /***********************************************************************
  887. --- 1038,1168 ----
  888.    ***********************************************************************
  889.    */
  890.   
  891. + extern int FIXED_XmuCompareISOLatin1();
  892.   Bool PopUpMenu (menu, x, y, center)
  893.       MenuRoot *menu;
  894.       int x, y;
  895.       Bool center;
  896.   {
  897. !   TwmWindow **sortlist,*bakwin;
  898. !   int loop,curpos,count;
  899. !   int (*compar)() = (Scr->CaseSensitive ? strcmp : FIXED_XmuCompareISOLatin1);
  900. !   if (!menu) return False;
  901.   
  902. !   InstallRootColormap();
  903.   
  904. !   if (menu == Scr->Windows)
  905.       {
  906. !       TwmWindow *tmp_win;
  907.   
  908. !       /* this is the twm windows menu,  let's go ahead and build it */
  909.   
  910. !       DestroyMenu (menu);
  911.   
  912. !       menu->first = NULL;
  913. !       menu->last = NULL;
  914. !       menu->items = 0;
  915. !       menu->width = 0;
  916. !       menu->mapped = NEVER_MAPPED;
  917.   
  918. !       AddToMenu(menu, "TWM Windows", NULLSTR, NULL, F_TITLE,NULLSTR,NULLSTR);
  919. !       /* CODE to SORT THE MENU @@@@@@@@@@@@@@ */
  920. !       if (Scr->SortIconMgr)
  921. !     {
  922. !       
  923. !       for(count=0,tmp_win=Scr->TwmRoot.next;
  924. !           tmp_win != NULL;
  925. !           tmp_win = tmp_win->next,count++);
  926. !       sortlist = (TwmWindow **)malloc(sizeof(TwmWindow *) * count);
  927. !       for(loop=0,tmp_win=Scr->TwmRoot.next;
  928. !           tmp_win != NULL;
  929. !           tmp_win = tmp_win->next,loop++)
  930. !         sortlist[loop]=tmp_win;
  931. !       
  932. !       /* Now that we have them in the list, just do an insertion sort. */
  933. !       for (curpos=1;curpos<count;curpos++) {
  934. !         /*Everything from 0 to curpos-1 is sorted.*/
  935. !         bakwin = sortlist[curpos];
  936. !         for (loop=curpos;(loop>0);loop--)
  937. !           /*Everything from loop to curpos is sorted*/
  938. !           /* Sort order is [0] = min, [n]=max */
  939. !           if (((*compar)(sortlist[loop-1]->name,bakwin->name))>0)
  940. !         sortlist[loop]=sortlist[loop-1];
  941. !           else
  942. !         break;
  943. !         sortlist[loop]=bakwin;
  944. !       }
  945. !       
  946. !       for(loop=0;loop<count;loop++) 
  947. !         AddToMenu(menu,sortlist[loop]->name, (char *)sortlist[loop], NULL, 
  948. !               F_POPUP,NULLSTR,NULLSTR);
  949. !     }
  950. !       else 
  951.       for (tmp_win = Scr->TwmRoot.next;
  952.            tmp_win != NULL;
  953.            tmp_win = tmp_win->next)
  954. !       {
  955.           AddToMenu (menu, tmp_win->name, (char *) tmp_win, NULL, F_POPUP, 
  956.                  NULLSTR, NULLSTR);
  957. !       }
  958. !       MakeMenu(menu);
  959.       }
  960.   
  961. !   if (menu->w == None || menu->items == 0) return False;
  962.   
  963. !   /* Prevent recursively bringing up menus. */
  964. !   if (menu->mapped == MAPPED) return False;
  965.   
  966. !   /*
  967. !    * Dynamically set the parent;  this allows pull-ups to also be main
  968. !    * menus, or to be brought up from more than one place.
  969. !    */
  970. !   menu->prev = ActiveMenu;
  971.   
  972. !   XGrabPointer(dpy, Scr->Root, True,
  973. !            ButtonPressMask | ButtonReleaseMask,
  974. !            GrabModeAsync, GrabModeAsync,
  975. !            Scr->Root, Scr->MenuCursor, CurrentTime);
  976.   
  977. !   ActiveMenu = menu;
  978. !   menu->mapped = MAPPED;
  979. !   menu->entered = FALSE;
  980.   
  981. !   if (center) {
  982. !     x -= (menu->width / 2);
  983. !     y -= (Scr->EntryHeight / 2); /* sticky menus would be nice here */
  984. !   }
  985.   
  986. !   /*
  987. !    * clip to screen
  988. !    */
  989. !   if (x + menu->width > Scr->MyDisplayWidth) {
  990. !     x = Scr->MyDisplayWidth - menu->width;
  991. !   }
  992. !   if (x < 0) x = 0;
  993. !   if (y + menu->height > Scr->MyDisplayHeight) {
  994. !     y = Scr->MyDisplayHeight - menu->height;
  995. !   }
  996. !   if (y < 0) y = 0;
  997.   
  998. !   MenuOrigins[MenuDepth].x = x;
  999. !   MenuOrigins[MenuDepth].y = y;
  1000. !   MenuDepth++;
  1001.   
  1002. !   XMoveWindow(dpy, menu->w, x, y);
  1003. !   if (Scr->Shadow) {
  1004. !     XMoveWindow (dpy, menu->shadow, x + SHADOWWIDTH, y + SHADOWWIDTH);
  1005. !   }
  1006. !   if (Scr->Shadow) {
  1007. !     XRaiseWindow (dpy, menu->shadow);
  1008. !   }
  1009. !   XMapRaised(dpy, menu->w);
  1010. !   if (Scr->Shadow) {
  1011. !     XMapWindow (dpy, menu->shadow);
  1012. !   }
  1013. !   XSync(dpy, 0);
  1014. !   return True;
  1015.   }
  1016.   
  1017.   /***********************************************************************
  1018. ***************
  1019. *** 1866,1874 ****
  1020.           XUngrabServer (dpy);
  1021.           XSync (dpy, 0);
  1022.       }
  1023. !     Execute(action);
  1024.       break;
  1025.   
  1026.       case F_UNFOCUS:
  1027.       FocusOnRoot();
  1028.       break;
  1029. --- 1986,2005 ----
  1030.           XUngrabServer (dpy);
  1031.           XSync (dpy, 0);
  1032.       }
  1033. !     (void)Execute(action);
  1034.       break;
  1035.   
  1036. +     case F_TESTEXEC:
  1037. +     PopDownMenu();
  1038. +     if (!Scr->NoGrabServer) {
  1039. +         XUngrabServer (dpy);
  1040. +         XSync (dpy, 0);
  1041. +     }
  1042. +     do_next_action= (Execute(action)==0);
  1043. +     if ( !do_next_action )
  1044. +         XBell(dpy,0);
  1045. +     break;
  1046.       case F_UNFOCUS:
  1047.       FocusOnRoot();
  1048.       break;
  1049. ***************
  1050. *** 2195,2201 ****
  1051.    ***********************************************************************
  1052.    */
  1053.   
  1054. ! void
  1055.   Execute(s)
  1056.       char *s;
  1057.   {
  1058. --- 2326,2332 ----
  1059.    ***********************************************************************
  1060.    */
  1061.   
  1062. ! int
  1063.   Execute(s)
  1064.       char *s;
  1065.   {
  1066. ***************
  1067. *** 2205,2210 ****
  1068. --- 2336,2342 ----
  1069.       char oldDisplay[256];
  1070.       char *doisplay;
  1071.       int restorevar = 0;
  1072. +     int status;
  1073.   
  1074.       oldDisplay[0] = '\0';
  1075.       doisplay=getenv("DISPLAY");
  1076. ***************
  1077. *** 2229,2240 ****
  1078.       restorevar = 1;
  1079.       }
  1080.   
  1081. !     (void) system (s);
  1082.   
  1083.       if (restorevar) {        /* why bother? */
  1084.       (void) sprintf (buf, "DISPLAY=%s", oldDisplay);
  1085.       putenv (buf);
  1086.       }
  1087.   }
  1088.   
  1089.   /***********************************************************************
  1090. --- 2361,2378 ----
  1091.       restorevar = 1;
  1092.       }
  1093.   
  1094. !     status=system (s);
  1095.   
  1096. +     /* this next bit may be horribly BSD specific. */
  1097. +     if ( (status&0xff) == 0 )
  1098. +     status = (status &0xff00) >> 8;
  1099.       if (restorevar) {        /* why bother? */
  1100.       (void) sprintf (buf, "DISPLAY=%s", oldDisplay);
  1101.       putenv (buf);
  1102.       }
  1103. +     return status;
  1104.   }
  1105.   
  1106.   /***********************************************************************
  1107. ***************
  1108. *** 2439,2444 ****
  1109. --- 2577,2583 ----
  1110.       n = 0;
  1111.       (void) sprintf(Info[n++], "tvtwm version:  %s", Version);
  1112.       (void) sprintf(Info[n++], "Patchlevel %d", PATCHLEVEL);
  1113.       Info[n++][0] = '\0';
  1114.   
  1115.       if (t) {
  1116. diff -c old/menus.h new/menus.h
  1117. *** old/menus.h    Thu Nov 15 20:13:12 1990
  1118. --- new/menus.h    Tue Apr 23 08:17:15 1991
  1119. ***************
  1120. *** 148,154 ****
  1121.   extern Bool AddFuncKey();
  1122.   extern int ExecuteFunction();
  1123.   extern int DeferExecution();
  1124. ! extern void Execute();
  1125.   extern void FocusOnRoot();
  1126.   
  1127.   #endif /* _MENUS_ */
  1128. --- 148,154 ----
  1129.   extern Bool AddFuncKey();
  1130.   extern int ExecuteFunction();
  1131.   extern int DeferExecution();
  1132. ! extern int Execute();
  1133.   extern void FocusOnRoot();
  1134.   
  1135.   #endif /* _MENUS_ */
  1136. diff -c old/move.c new/move.c
  1137. *** old/move.c    Thu Nov 15 20:13:13 1990
  1138. --- new/move.c    Tue Apr 23 08:17:15 1991
  1139. ***************
  1140. *** 170,179 ****
  1141. --- 170,185 ----
  1142.       int junkxroot, junkyroot;
  1143.       unsigned int junkMask;
  1144.       int first;
  1145. +     XSetWindowAttributes attr;
  1146.   
  1147.       if (!Scr->NoGrabServer || !Scr->OpaqueMove)
  1148.       XGrabServer(dpy);
  1149.   
  1150. +     if (Scr->OpaqueMove) {
  1151. +     attr.save_under = True;
  1152. +     XChangeWindowAttributes(dpy, window, CWSaveUnder, &attr);
  1153. +     }
  1154. +     
  1155.       if (!adding) {
  1156.       XGrabPointer(dpy, Scr->Root, True,
  1157.           PointerMotionMask | EnterWindowMask | LeaveWindowMask | ButtonPressMask | ButtonReleaseMask,
  1158. ***************
  1159. *** 280,285 ****
  1160. --- 286,296 ----
  1161.   
  1162.       if (*cancel)
  1163.       WindowMoved = False;
  1164. +     if (Scr->OpaqueMove) {
  1165. +     attr.save_under = False;
  1166. +     XChangeWindowAttributes(dpy, window, CWSaveUnder, &attr);
  1167. +     }
  1168.   }
  1169.   
  1170.   /***********************************************************************
  1171. ***************
  1172. *** 344,349 ****
  1173. --- 355,361 ----
  1174.       int deltax, deltay;
  1175.       int vdtx, vdty;
  1176.       char str[20];
  1177. +     Window actual, virtual;
  1178.   
  1179.       dragX = x_root;
  1180.       dragY = y_root;
  1181. ***************
  1182. *** 373,384 ****
  1183.           yt = vdty + Scr->MyDisplayHeight - dragHeight;
  1184.       }
  1185.   
  1186. !     if (panner==IN_PANNER) {
  1187. !       if (Scr->OpaqueMove)
  1188. !     XMoveWindow(dpy,tmp_win->frame,xl*Scr->PannerScale,yt*Scr->PannerScale);
  1189. !     } else
  1190. !       if (!tmp_win->sticky)
  1191. !       XMoveWindow(dpy,tmp_win->virtualWindow,xl/Scr->PannerScale,yt/Scr->PannerScale);
  1192.       if (Scr->OpaqueMove)
  1193.       XMoveWindow(dpy, window, xl, yt);
  1194.       else
  1195. --- 385,417 ----
  1196.           yt = vdty + Scr->MyDisplayHeight - dragHeight;
  1197.       }
  1198.   
  1199. !     if (Scr->VirtualDesktop && Scr->OpaqueMove && !tmp_win->sticky) {
  1200. !     if (panner == IN_PANNER) {
  1201. !         if (window == tmp_win->virtualWindow) {
  1202. !         actual = tmp_win->frame;
  1203. !         virtual = tmp_win->virtualWindow;
  1204. !         }
  1205. !         else {
  1206. !         actual = tmp_win->icon_w;
  1207. !         virtual = tmp_win->virtualIcon;
  1208. !         }
  1209. !     }
  1210. !     else {
  1211. !         if (window == tmp_win->frame) {
  1212. !         actual = tmp_win->frame;
  1213. !         virtual = tmp_win->virtualWindow;
  1214. !         }
  1215. !         else {
  1216. !         actual = tmp_win->icon_w;
  1217. !         virtual = tmp_win->virtualIcon;
  1218. !         }
  1219. !     }
  1220. !     if (panner == IN_PANNER)
  1221. !         XMoveWindow(dpy, actual, xl*Scr->PannerScale, yt*Scr->PannerScale);
  1222. !     else
  1223. !         XMoveWindow(dpy, virtual, xl/Scr->PannerScale, yt/Scr->PannerScale);
  1224. !     }
  1225.       if (Scr->OpaqueMove)
  1226.       XMoveWindow(dpy, window, xl, yt);
  1227.       else
  1228. ***************
  1229. *** 400,406 ****
  1230.   {
  1231.       Window junkChild;
  1232.       int doingFine;
  1233. !     XEvent event;
  1234.       int xdest, ydest;
  1235.       unsigned mask;
  1236.       static int buttons;
  1237. --- 433,439 ----
  1238.   {
  1239.       Window junkChild;
  1240.       int doingFine;
  1241. !     XEvent event,bakevent;
  1242.       int xdest, ydest;
  1243.       unsigned mask;
  1244.       static int buttons;
  1245. ***************
  1246. *** 412,418 ****
  1247.   
  1248.       doingFine = True;
  1249.       while (doingFine) {
  1250. !     XMaskEvent(dpy, ButtonPressMask|ButtonReleaseMask|PointerMotionMask|EnterWindowMask|LeaveWindowMask, &event);
  1251.       switch (event.type) {
  1252.           case ButtonPress:
  1253.           if (pulldown) {
  1254. --- 445,451 ----
  1255.   
  1256.       doingFine = True;
  1257.       while (doingFine) {
  1258. !     XNextEvent(dpy, &event);
  1259.       switch (event.type) {
  1260.           case ButtonPress:
  1261.           if (pulldown) {
  1262. ***************
  1263. *** 454,459 ****
  1264. --- 487,504 ----
  1265.               ButtonPressed = -1;
  1266.                       *done = True;
  1267.               doingFine = False;
  1268. +             /* RJC: added code to do a final move here */
  1269. +             if (!WindowMoved &&
  1270. +             (abs(event.xbutton.x_root - rootX) >= Scr->MoveDelta ||
  1271. +              abs(event.xbutton.y_root - rootY) >= Scr->MoveDelta))
  1272. +             {
  1273. +                 WindowMoved = True;
  1274. +             }
  1275. +             if (WindowMoved) {
  1276. +                 *x_root = event.xbutton.x_root + offsetX;
  1277. +             *y_root = event.xbutton.y_root + offsetY;
  1278. +             }
  1279.           }
  1280.           break;
  1281.           case EnterNotify:
  1282. ***************
  1283. *** 489,494 ****
  1284. --- 534,546 ----
  1285.               doingFine = False;
  1286.           }
  1287.           break;
  1288. +           default: bakevent = Event;
  1289. +                Event=event;
  1290. +                DispatchEvent();
  1291. +                Event=bakevent;
  1292.       }
  1293.       }
  1294.   }
  1295. diff -c old/parse.c new/parse.c
  1296. *** old/parse.c    Thu Nov 15 20:13:14 1990
  1297. --- new/parse.c    Tue Apr 23 08:17:15 1991
  1298. ***************
  1299. *** 42,47 ****
  1300. --- 42,48 ----
  1301.   #endif
  1302.   
  1303.   #include <stdio.h>
  1304. + #include <ctype.h>
  1305.   #include <X11/Xos.h>
  1306.   #include <X11/Xmu/CharSet.h>
  1307.   #include "twm.h"
  1308. ***************
  1309. *** 226,231 ****
  1310. --- 227,241 ----
  1311.    ***********************************************************************
  1312.    */
  1313.   
  1314. + #define MAX_INCLUDES 10
  1315. + static struct incl {
  1316. +      FILE *fp;
  1317. +      char *name;
  1318. +      int lineno;
  1319. + } rc_includes[MAX_INCLUDES];
  1320. + static int include_file = 0;
  1321.   static int twmFileInput()
  1322.   {
  1323.       if (overflowlen) return (int) overflowbuff[--overflowlen];
  1324. ***************
  1325. *** 232,242 ****
  1326.   
  1327.       while (ptr == len)
  1328.       {
  1329. !     if (fgets(buff, BUF_LEN, twmrc) == NULL)
  1330. !         return NULL;
  1331.   
  1332.       yylineno++;
  1333.   
  1334.       ptr = 0;
  1335.       len = strlen(buff);
  1336.       }
  1337. --- 242,288 ----
  1338.   
  1339.       while (ptr == len)
  1340.       {
  1341. !     while (include_file) {
  1342. !          if (fgets(buff, BUF_LEN, rc_includes[include_file].fp) == NULL) {
  1343. !           free(rc_includes[include_file].name); 
  1344. !           fclose(rc_includes[include_file].fp);
  1345. !           yylineno = rc_includes[include_file--].lineno;
  1346. !          } else 
  1347. !           break; 
  1348. !     }
  1349. !     if (!include_file)
  1350. !          if (fgets(buff, BUF_LEN, twmrc) == NULL)
  1351. !           return NULL;
  1352.   
  1353.       yylineno++;
  1354.   
  1355. +     if (strncmp(buff, "include", 7) == 0) {
  1356. +          /* Whoops, an include file! */
  1357. +          char *p = buff + 7, *q;
  1358. +          FILE *fp;
  1359. +          
  1360. +          while (isspace(*p)) p++;
  1361. +          for (q = p; *q && !isspace(*q); q++)
  1362. +           continue;
  1363. +          *q = 0;
  1364. +          if ((fp = fopen(p, "r")) == NULL) {
  1365. +           fprintf(stderr, "%s: Unable to open included init file %s\n", 
  1366. +               ProgramName, p);
  1367. +           continue;
  1368. +          }
  1369. +          if (++include_file >= MAX_INCLUDES) {
  1370. +           fprintf(stderr, "%s: init file includes nested too deep\n",
  1371. +               ProgramName);
  1372. +           continue;
  1373. +          }
  1374. +          rc_includes[include_file].fp = fp;
  1375. +          rc_includes[include_file].lineno = yylineno;
  1376. +          yylineno = 0;
  1377. +          rc_includes[include_file].name = malloc(strlen(p)+1);
  1378. +          strcpy(rc_includes[include_file].name, p);
  1379. +          continue;
  1380. +     }
  1381.       ptr = 0;
  1382.       len = strlen(buff);
  1383.       }
  1384. ***************
  1385. *** 342,347 ****
  1386. --- 388,395 ----
  1387.   #define kw0_WarpUnmapped        25
  1388.   #define kw0_ShowVirtualNames        26
  1389.   #define kw0_StickyAbove            27
  1390. + #define kw0_StayUpMenus            28
  1391. + #define kw0_PannerOpaqueScroll        29
  1392.   
  1393.   #define kws_UsePPosition        1
  1394.   #define kws_IconFont            2
  1395. ***************
  1396. *** 355,363 ****
  1397.   #define kws_VirtualDesktop        10
  1398.   #define kws_PannerState            11
  1399.   #define kws_PannerGeometry        12
  1400. - #define kws_VirtualDesktopBackgroundPixmap 13
  1401. - #define kws_PannerBackgroundPixmap    14
  1402.   #define kws_VirtualFont            15
  1403.   
  1404.   #define kwn_ConstrainedMoveTime        1
  1405.   #define kwn_MoveDelta            2
  1406. --- 403,410 ----
  1407.   #define kws_VirtualDesktop        10
  1408.   #define kws_PannerState            11
  1409.   #define kws_PannerGeometry        12
  1410.   #define kws_VirtualFont            15
  1411. + #define kws_MenuTitleFont               16
  1412.   
  1413.   #define kwn_ConstrainedMoveTime        1
  1414.   #define kwn_MoveDelta            2
  1415. ***************
  1416. *** 371,376 ****
  1417. --- 418,425 ----
  1418.   #define kwn_PannerScale            10
  1419.   #define kwn_ScrollDistanceX        11
  1420.   #define kwn_ScrollDistanceY        12
  1421. + #define kwn_MenuLineWidth               13
  1422. + #define kwn_TitleFontPadding            14
  1423.   
  1424.   #define kwcl_BorderColor        1
  1425.   #define kwcl_IconManagerHighlight    2
  1426. ***************
  1427. *** 398,403 ****
  1428. --- 447,457 ----
  1429.   #define kwc_PannerForeground        10
  1430.   #define kwc_PannerBackground        11
  1431.   
  1432. + #define kwp_TitleHighlight              1
  1433. + #define kwp_TitleHighlightLeft          2
  1434. + #define kwp_TitleHighlightRight         3
  1435. + #define kwp_PannerBackgroundPixmap      4
  1436. + #define kwp_VirtualDesktopBackgroundPixmap 5
  1437.   
  1438.   /*
  1439.    * The following is sorted alphabetically according to name (which must be
  1440. ***************
  1441. *** 492,497 ****
  1442. --- 546,552 ----
  1443.       { "f.sorticonmgr",        FKEYWORD, F_SORTICONMGR },
  1444.       { "f.source",        FSKEYWORD, F_BEEP },  /* XXX - don't work */
  1445.       { "f.stick",        FKEYWORD, F_STICK },
  1446. +     { "f.test",                 FKEYWORD, F_TESTEXEC },
  1447.       { "f.title",        FKEYWORD, F_TITLE },
  1448.       { "f.topzoom",        FKEYWORD, F_TOPZOOM },
  1449.       { "f.twmrc",        FKEYWORD, F_RESTART },
  1450. ***************
  1451. *** 543,550 ****
  1452. --- 598,607 ----
  1453.       { "menubackground",        CKEYWORD, kwc_MenuBackground },
  1454.       { "menufont",        SKEYWORD, kws_MenuFont },
  1455.       { "menuforeground",        CKEYWORD, kwc_MenuForeground },
  1456. +     { "menulinewidth",        NKEYWORD, kwn_MenuLineWidth },
  1457.       { "menushadowcolor",    CKEYWORD, kwc_MenuShadowColor },
  1458.       { "menutitlebackground",    CKEYWORD, kwc_MenuTitleBackground },
  1459. +     { "menutitlefont",        SKEYWORD, kws_MenuTitleFont },
  1460.       { "menutitleforeground",    CKEYWORD, kwc_MenuTitleForeground },
  1461.       { "meta",            META, 0 },
  1462.       { "mod",            META, 0 },  /* fake it */
  1463. ***************
  1464. *** 572,580 ****
  1465.       { "noversion",        KEYWORD, kw0_NoVersion },
  1466.       { "opaquemove",        KEYWORD, kw0_OpaqueMove },
  1467.       { "pannerbackground",    CKEYWORD, kwc_PannerBackground },
  1468. !     { "pannerbackgroundpixmap",    SKEYWORD, kws_PannerBackgroundPixmap },
  1469.       { "pannerforeground",    CKEYWORD, kwc_PannerForeground },
  1470.       { "pannergeometry",        SKEYWORD, kws_PannerGeometry },
  1471.       { "pannerscale",        NKEYWORD, kwn_PannerScale },
  1472.       { "pannerstate",        SKEYWORD, kws_PannerState },
  1473.       { "pixmaps",        PIXMAPS, 0 },
  1474. --- 629,638 ----
  1475.       { "noversion",        KEYWORD, kw0_NoVersion },
  1476.       { "opaquemove",        KEYWORD, kw0_OpaqueMove },
  1477.       { "pannerbackground",    CKEYWORD, kwc_PannerBackground },
  1478. !     { "pannerbackgroundpixmap",    PKEYWORD, kwp_PannerBackgroundPixmap },
  1479.       { "pannerforeground",    CKEYWORD, kwc_PannerForeground },
  1480.       { "pannergeometry",        SKEYWORD, kws_PannerGeometry },
  1481. +     { "panneropaquescroll",       KEYWORD, kw0_PannerOpaqueScroll },
  1482.       { "pannerscale",        NKEYWORD, kwn_PannerScale },
  1483.       { "pannerstate",        SKEYWORD, kws_PannerState },
  1484.       { "pixmaps",        PIXMAPS, 0 },
  1485. ***************
  1486. *** 597,602 ****
  1487. --- 655,661 ----
  1488.       { "south",            DKEYWORD, D_SOUTH },
  1489.       { "squeezetitle",        SQUEEZE_TITLE, 0 },
  1490.       { "starticonified",        START_ICONIFIED, 0 },
  1491. +     { "stayupmenus",        KEYWORD, kw0_StayUpMenus },
  1492.       { "sticky",            STICKY, 0 },
  1493.       { "stickyabove",        KEYWORD, kw0_StickyAbove },
  1494.       { "t",            TITLE, 0 },
  1495. ***************
  1496. *** 604,611 ****
  1497.       { "titlebackground",    CLKEYWORD, kwcl_TitleBackground },
  1498.       { "titlebuttonborderwidth",    NKEYWORD, kwn_TitleButtonBorderWidth },
  1499.       { "titlefont",        SKEYWORD, kws_TitleFont },
  1500.       { "titleforeground",    CLKEYWORD, kwcl_TitleForeground },
  1501. !     { "titlehighlight",        TITLE_HILITE, 0 },
  1502.       { "titlepadding",        NKEYWORD, kwn_TitlePadding },
  1503.       { "unknownicon",        SKEYWORD, kws_UnknownIcon },
  1504.       { "usepposition",        SKEYWORD, kws_UsePPosition },
  1505. --- 663,673 ----
  1506.       { "titlebackground",    CLKEYWORD, kwcl_TitleBackground },
  1507.       { "titlebuttonborderwidth",    NKEYWORD, kwn_TitleButtonBorderWidth },
  1508.       { "titlefont",        SKEYWORD, kws_TitleFont },
  1509. +     { "titlefontpadding",       NKEYWORD, kwn_TitleFontPadding },
  1510.       { "titleforeground",    CLKEYWORD, kwcl_TitleForeground },
  1511. !     { "titlehighlight",        PKEYWORD, kwp_TitleHighlight },
  1512. !     { "titlehighlightleft",    PKEYWORD, kwp_TitleHighlightLeft },
  1513. !     { "titlehighlightright",    PKEYWORD, kwp_TitleHighlightRight },
  1514.       { "titlepadding",        NKEYWORD, kwn_TitlePadding },
  1515.       { "unknownicon",        SKEYWORD, kws_UnknownIcon },
  1516.       { "usepposition",        SKEYWORD, kws_UsePPosition },
  1517. ***************
  1518. *** 612,619 ****
  1519.       { "virtualbackground",    CLKEYWORD, kwcl_VirtualBackground },
  1520.       { "virtualdesktop",        SKEYWORD, kws_VirtualDesktop },
  1521.       { "virtualdesktopbackground",CKEYWORD, kwc_VirtualDesktopBackground },
  1522. !     { "virtualdesktopbackgroundpixmap",SKEYWORD,
  1523. !                     kws_VirtualDesktopBackgroundPixmap },
  1524.       { "virtualdesktopforeground",CKEYWORD, kwc_VirtualDesktopForeground },
  1525.       { "virtualfont",        SKEYWORD, kws_VirtualFont },
  1526.       { "virtualforeground",    CLKEYWORD, kwcl_VirtualForeground },
  1527. --- 674,681 ----
  1528.       { "virtualbackground",    CLKEYWORD, kwcl_VirtualBackground },
  1529.       { "virtualdesktop",        SKEYWORD, kws_VirtualDesktop },
  1530.       { "virtualdesktopbackground",CKEYWORD, kwc_VirtualDesktopBackground },
  1531. !     { "virtualdesktopbackgroundpixmap",PKEYWORD,
  1532. !                     kwp_VirtualDesktopBackgroundPixmap },
  1533.       { "virtualdesktopforeground",CKEYWORD, kwc_VirtualDesktopForeground },
  1534.       { "virtualfont",        SKEYWORD, kws_VirtualFont },
  1535.       { "virtualforeground",    CLKEYWORD, kwcl_VirtualForeground },
  1536. ***************
  1537. *** 673,678 ****
  1538. --- 735,744 ----
  1539.       Scr->StickyAbove = TRUE;
  1540.       return 1;
  1541.   
  1542. +       case kw0_PannerOpaqueScroll:
  1543. +     Scr->PannerOpaqueScroll = TRUE;
  1544. +     return 1;
  1545.         case kw0_AutoRelativeResize:
  1546.       Scr->AutoRelativeResize = TRUE;
  1547.       return 1;
  1548. ***************
  1549. *** 761,766 ****
  1550. --- 827,836 ----
  1551.       Scr->ShowVirtualNames = TRUE;
  1552.       return 1;
  1553.   
  1554. +       case kw0_StayUpMenus:
  1555. +     if (Scr->FirstTime) Scr->StayUpMenus = TRUE;
  1556. +     return 1;
  1557.         case kw0_NoCaseSensitive:
  1558.       Scr->CaseSensitive = FALSE;
  1559.       return 1;
  1560. ***************
  1561. *** 783,796 ****
  1562.       char *s;
  1563.   {
  1564.       switch (keyword) {
  1565. -       case kws_VirtualDesktopBackgroundPixmap:
  1566. -     Scr->vdtPixmap = s;
  1567. -     return 1;
  1568.   
  1569. -       case kws_PannerBackgroundPixmap:
  1570. -     Scr->PannerPixmap = s;
  1571. -     return 1;
  1572.         case kws_VirtualDesktop:
  1573.       {
  1574.           int status, x, y;
  1575. --- 853,859 ----
  1576. ***************
  1577. *** 867,872 ****
  1578. --- 930,939 ----
  1579.       if (!Scr->HaveFonts) Scr->MenuFont.name = s;
  1580.       return 1;
  1581.   
  1582. +       case kws_MenuTitleFont:
  1583. +     if (!Scr->HaveFonts) Scr->MenuTitleFont.name = s; 
  1584. +     return 1;
  1585.         case kws_TitleFont:
  1586.       if (!Scr->HaveFonts) Scr->TitleBarFont.name = s;
  1587.       return 1;
  1588. ***************
  1589. *** 929,934 ****
  1590. --- 996,1009 ----
  1591.       ConstrainedMoveTime = num;
  1592.       return 1;
  1593.   
  1594. +       case kwn_MenuLineWidth:
  1595. +     Scr->MenuLineWidth = num;
  1596. +     return 1;
  1597. +       case kwn_TitleFontPadding:
  1598. +     Scr->TitleFontPadding = num;
  1599. +     return 1;
  1600.         case kwn_MoveDelta:
  1601.       Scr->MoveDelta = num;
  1602.       return 1;
  1603. ***************
  1604. *** 1085,1090 ****
  1605. --- 1160,1223 ----
  1606.       return 0;
  1607.   }
  1608.   
  1609. + int do_pixmap_keyword(keyword, filename)
  1610. +     int keyword;
  1611. +     char *filename;
  1612. + {
  1613. + Pixmap pm;
  1614. + switch(keyword)
  1615. +     {
  1616. +  case kwp_TitleHighlight:
  1617. +     pm = GetBitmap (filename);
  1618. +     if (pm) {
  1619. +     if (Scr->hilitePm) {
  1620. +         XFreePixmap (dpy, Scr->hilitePm);
  1621. +     }
  1622. +     Scr->hilitePm = pm;
  1623. +     Scr->hilite_pm_width = JunkWidth;
  1624. +     Scr->hilite_pm_height = JunkHeight;
  1625. +     }
  1626. +     return 1;
  1627. +  case kwp_TitleHighlightLeft:
  1628. +     pm = GetBitmap (filename);
  1629. +     if (pm) {
  1630. +     if (Scr->hiliteLeftPm) {
  1631. +         XFreePixmap (dpy, Scr->hiliteLeftPm);
  1632. +     }
  1633. +     Scr->hiliteLeftPm = pm;
  1634. +     Scr->hilite_left_pm_width = JunkWidth;
  1635. +     Scr->hilite_left_pm_height = JunkHeight;
  1636. +     }
  1637. +     return 1;
  1638. +  case kwp_TitleHighlightRight:
  1639. +     pm = GetBitmap (filename);
  1640. +     if (pm) {
  1641. +     if (Scr->hiliteRightPm) {
  1642. +         XFreePixmap (dpy, Scr->hiliteRightPm);
  1643. +     }
  1644. +     Scr->hiliteRightPm = pm;
  1645. +     Scr->hilite_right_pm_width = JunkWidth;
  1646. +     Scr->hilite_right_pm_height = JunkHeight;
  1647. +     }
  1648. +     return 1;
  1649. +  case kwp_PannerBackgroundPixmap:
  1650. +     Scr->PannerPixmap = filename;
  1651. +     return 1;
  1652. +  case kwp_VirtualDesktopBackgroundPixmap:
  1653. +     Scr->vdtPixmap = filename;
  1654. +     return 1;
  1655. +     }
  1656. +     return 0;
  1657. + }
  1658.   
  1659.   static int ParseUsePPosition (s)
  1660.       register char *s;
  1661. diff -c old/parse.h new/parse.h
  1662. *** old/parse.h    Thu Nov 15 20:13:14 1990
  1663. --- new/parse.h    Tue Apr 23 08:17:15 1991
  1664. ***************
  1665. *** 110,115 ****
  1666. --- 110,116 ----
  1667.   #define F_WARPTOSCREEN        109    /* string */
  1668.   #define F_COLORMAP        110    /* string */
  1669.   #define F_SCROLL        111    /* string */
  1670. + #define F_TESTEXEC              112     /* string */
  1671.   
  1672.   #define D_NORTH            1
  1673.   #define D_SOUTH            2
  1674. diff -c old/patchlevel.h new/patchlevel.h
  1675. *** old/patchlevel.h    Thu Nov 15 20:13:14 1990
  1676. --- new/patchlevel.h    Tue Apr 23 08:17:15 1991
  1677. ***************
  1678. *** 1 ****
  1679. ! #define PATCHLEVEL 4
  1680. --- 1 ----
  1681. ! #define PATCHLEVEL 5
  1682. diff -c old/resize.c new/resize.c
  1683. *** old/resize.c    Thu Nov 15 20:13:15 1990
  1684. --- new/resize.c    Tue Apr 23 08:17:16 1991
  1685. ***************
  1686. *** 33,38 ****
  1687. --- 33,47 ----
  1688.    * window resizing borrowed from the "wm" window manager
  1689.    *
  1690.    * $Log:    resize.c,v $
  1691. +  * Revision 9.0  91/04/23  07:40:45  toml
  1692. +  * Revision bump
  1693. +  * 
  1694. +  * Revision 8.2  90/12/29  16:39:40  toml
  1695. +  * RJC patches
  1696. +  * 
  1697. +  * Revision 8.1  90/12/29  10:33:36  toml
  1698. +  * zoom commands now obey size hints
  1699. +  * 
  1700.    * Revision 8.0  90/11/15  20:02:49  toml
  1701.    * Revision bump
  1702.    * 
  1703. ***************
  1704. *** 810,815 ****
  1705. --- 819,825 ----
  1706.        */
  1707.       if (tmp_win->title_height && tmp_win->hilite_w)
  1708.       {
  1709.       xwc.width = (tmp_win->rightx - tmp_win->highlightx);
  1710.       if (Scr->TBInfo.nright > 0) xwc.width -= Scr->TitlePadding;
  1711.           if (xwc.width <= 0) {
  1712. ***************
  1713. *** 821,826 ****
  1714. --- 831,838 ----
  1715.   
  1716.           xwcm = CWX | CWWidth;
  1717.           XConfigureWindow(dpy, tmp_win->hilite_w, xwcm, &xwc);
  1718.       }
  1719.   
  1720.   #ifdef SHAPE
  1721. ***************
  1722. *** 973,1002 ****
  1723.       if (!Scr->NoRaiseResize)
  1724.           RaiseFrame(dpy, tmp_win);
  1725.   
  1726. !     dragHeight -= tmp_win->title_height;
  1727. !     if (tmp_win->hints.flags&PMinSize && tmp_win->hints.flags & PResizeInc)
  1728. !     {
  1729. !         dragWidth -= tmp_win->hints.min_width;
  1730. !         dragHeight -= tmp_win->hints.min_height;
  1731. !     }
  1732. !     if (tmp_win->hints.flags & PResizeInc)
  1733. !     {
  1734. !         dragWidth /= tmp_win->hints.width_inc;
  1735. !         dragHeight /= tmp_win->hints.height_inc;
  1736. !         dragWidth *= tmp_win->hints.width_inc;
  1737. !         dragHeight *= tmp_win->hints.height_inc;
  1738. !     }
  1739. !     if (tmp_win->hints.flags&PMinSize && tmp_win->hints.flags & PResizeInc)
  1740. !     {
  1741. !         dragWidth += tmp_win->hints.min_width;
  1742. !         dragHeight += tmp_win->hints.min_height;
  1743. !     }
  1744. !     dragHeight += tmp_win->title_height;
  1745.   
  1746.       SetupWindow (tmp_win, dragx , dragy , dragWidth, dragHeight, -1);
  1747.       XUngrabPointer (dpy, CurrentTime);
  1748. --- 985,991 ----
  1749.       if (!Scr->NoRaiseResize)
  1750.           RaiseFrame(dpy, tmp_win);
  1751.   
  1752. !     ConstrainSize(tmp_win, &dragWidth, &dragHeight);
  1753.   
  1754.       SetupWindow (tmp_win, dragx , dragy , dragWidth, dragHeight, -1);
  1755.       XUngrabPointer (dpy, CurrentTime);
  1756. diff -c old/screen.h new/screen.h
  1757. *** old/screen.h    Thu Nov 15 20:13:15 1990
  1758. --- new/screen.h    Tue Apr 23 08:17:16 1991
  1759. ***************
  1760. *** 90,97 ****
  1761.       Pixmap siconifyPm;        /* the icon manager iconify pixmap */
  1762.       Pixmap pullPm;        /* pull right menu arrow */
  1763.       Pixmap hilitePm;        /* focus highlight window background */
  1764. -     Pixmap rootWeave;        /* root weave pixmap */
  1765.       int hilite_pm_width, hilite_pm_height;  /* cache the size */
  1766.   
  1767.       MenuRoot *MenuList;        /* head of the menu list */
  1768.       MenuRoot *LastMenu;        /* the last menu (mostly unused?) */
  1769. --- 90,101 ----
  1770.       Pixmap siconifyPm;        /* the icon manager iconify pixmap */
  1771.       Pixmap pullPm;        /* pull right menu arrow */
  1772.       Pixmap hilitePm;        /* focus highlight window background */
  1773.       int hilite_pm_width, hilite_pm_height;  /* cache the size */
  1774. +     Pixmap hiliteLeftPm;    /* focus highlight window left end */
  1775. +     int hilite_left_pm_width, hilite_left_pm_height;  /* cache the size */
  1776. +     Pixmap hiliteRightPm;    /* focus highlight window right end */
  1777. +     int hilite_right_pm_width, hilite_right_pm_height;  /* cache the size */
  1778. +     Pixmap rootWeave;        /* root weave pixmap */
  1779.   
  1780.       MenuRoot *MenuList;        /* head of the menu list */
  1781.       MenuRoot *LastMenu;        /* the last menu (mostly unused?) */
  1782. ***************
  1783. *** 202,207 ****
  1784. --- 206,212 ----
  1785.       unsigned long XORvalue;    /* number to use when drawing xor'ed */
  1786.       MyFont TitleBarFont;    /* title bar font structure */
  1787.       MyFont MenuFont;        /* menu font structure */
  1788. +     MyFont MenuTitleFont;    /* menu title font structure */
  1789.       MyFont IconFont;        /* icon font structure */
  1790.       MyFont SizeFont;        /* resize font structure */
  1791.       MyFont IconManagerFont;    /* window list font structure */
  1792. ***************
  1793. *** 220,226 ****
  1794. --- 225,233 ----
  1795.       int TitleHeight;        /* height of the title bar window */
  1796.       TwmWindow *Focus;        /* the twm window that has focus */
  1797.       int EntryHeight;        /* menu entry height */
  1798. +     int MenuLineWidth;        /* the width of menu lines 0 means no bars */
  1799.       int FramePadding;        /* distance between decorations and border */
  1800. +     int TitleFontPadding;          /* additional width to add to font height */
  1801.       int TitlePadding;        /* distance between items in titlebar */
  1802.       int ButtonIndent;        /* amount to shrink buttons on each side */
  1803.       int NumAutoRaises;        /* number of autoraise windows on screen */
  1804. ***************
  1805. *** 265,270 ****
  1806. --- 272,278 ----
  1807.       short WarpUnmapped;        /* allow warping to unmapped windows */
  1808.       short PannerState;        /* the initial state of the panner */
  1809.       short PannerScale;        /* scale of the panner */
  1810. +     short PannerOpaqueScroll;   /* When you scroll in the panner, is it opaque? */
  1811.       char *PannerGeometry;    /* geometry of the panner */
  1812.       int PannerOutlineWidth;
  1813.       int PannerOutlineHeight;
  1814. ***************
  1815. *** 277,282 ****
  1816. --- 285,291 ----
  1817.       short PannerBackgroundSet;    /* background of panner is set */
  1818.       char *PannerPixmap;        /* Panner pixmap */
  1819.       short StickyAbove;        /* should sticky windows be above? */
  1820. +     short StayUpMenus;         /* do the menus stay up upon release of button ? */
  1821.   
  1822.       FuncKey FuncKeyRoot;
  1823.   } ScreenInfo;
  1824. diff -c old/tvtwm.man new/tvtwm.man
  1825. *** old/tvtwm.man    Thu Nov 15 20:13:17 1990
  1826. --- new/tvtwm.man    Tue Apr 23 08:17:17 1991
  1827. ***************
  1828. *** 608,613 ****
  1829. --- 608,615 ----
  1830.   menus, and
  1831.   can only be specified inside of a 
  1832.   \fBColor\fP or \fBMonochrome\fP list.  The default is "white".
  1833. + .IP "\fBMenuTitleFont\fP \fIstring\fP" 8
  1834. + This variable specifies the font to be used in menu titles.
  1835.   .IP "\fBMenuTitleForeground\fP \fIstring\fP" 8
  1836.   This variable specifies the foreground color for \fBf.title\fP entries in
  1837.   menus and
  1838. ***************
  1839. *** 715,720 ****
  1840. --- 717,726 ----
  1841.   .IP "\fBPannerGeometry\fP \fIstring\fP" 8
  1842.   This variable specifies the position of the Virtual Desktop panner.
  1843.   The default geometry is "-0-0".
  1844. + .IP \"fBPannerOpaqueScroll\fP" 8
  1845. + This variable causes the panner to scroll the Virtual Desktop
  1846. + opaquely.  This variable only takes effect if the \fBStickyAbove\fP
  1847. + variable is also set.
  1848.   .IP "\fBPannerScale\fP \fIscale\fP" 8
  1849.   This variable specifies that scale of the Virtual Desktop Panner
  1850.   in relation to the actual screen.  The default scale is 20.
  1851. ***************
  1852. *** 804,809 ****
  1853. --- 810,819 ----
  1854.   is given, only those windows will be started iconic.  This is useful for
  1855.   programs that do not support an \fI-iconic\fP command line option or
  1856.   resource.
  1857. + .IP \"fBStayUpMenus" 8
  1858. + This variable alters menu interaction.  By default, a menu item is selected
  1859. + when a mouse button is released over it.  This variable causes menu itmes to
  1860. + be selected on the next button press event.
  1861.   .IP "\fBSticky\fP [{ \fIwin-list\fP }]" 8
  1862.   This variable is a list of client windows that will be sticky
  1863.   by default.  See the \fBVIRTUAL DESKTOP\fP section for a full
  1864. ***************
  1865. *** 825,830 ****
  1866. --- 835,843 ----
  1867.   .IP "\fBTitleFont\fP \fIstring\fP" 8
  1868.   This variable specifies the font to used for displaying window names in
  1869.   titlebars.  The default is "8x13".
  1870. + .IP "\fBTitleFontPadding\fP \fIpixels\fP" 8
  1871. + This variable specifies the number of pixels of padding to be placed 
  1872. + above window titles.  This allows for using small fonts with larger buttons.
  1873.   .IP "\fBTitleForeground\fP \fIstring\fP [{ \fIwin-list\fP }]" 8
  1874.   This variable specifies the foreground color used in titlebars, and
  1875.   may only be specified inside of a 
  1876. diff -c old/twm.c new/twm.c
  1877. *** old/twm.c    Thu Nov 15 20:13:18 1990
  1878. --- new/twm.c    Tue Apr 23 08:17:17 1991
  1879. ***************
  1880. *** 33,38 ****
  1881. --- 33,53 ----
  1882.    * twm - "Tom's Window Manager"
  1883.    *
  1884.    * $Log:    twm.c,v $
  1885. +  * Revision 9.0  91/04/23  07:40:51  toml
  1886. +  * Revision bump
  1887. +  * 
  1888. +  * Revision 8.4  90/12/29  16:39:43  toml
  1889. +  * RJC patches
  1890. +  * 
  1891. +  * Revision 8.3  90/12/29  11:24:30  toml
  1892. +  * Added PannerOpaqueScroll
  1893. +  * 
  1894. +  * Revision 8.2  90/12/29  10:13:16  toml
  1895. +  * StayUpMenus
  1896. +  * 
  1897. +  * Revision 8.1  90/11/16  14:16:35  toml
  1898. +  * Removed xsync
  1899. +  * 
  1900.    * Revision 8.0  90/11/15  20:02:53  toml
  1901.    * Revision bump
  1902.    * 
  1903. ***************
  1904. *** 79,84 ****
  1905. --- 94,101 ----
  1906.   #include <X11/Xproto.h>
  1907.   #include <X11/bitmaps/root_weave>
  1908.   #include "vdt.h"
  1909. + #define XK_LATIN1
  1910. + #include <X11/keysymdef.h>
  1911.   
  1912.   Display *dpy;            /* which display are we talking to */
  1913.   Window ResizeWindow;        /* the window we are resizing */
  1914. ***************
  1915. *** 221,227 ****
  1916.       exit (1);
  1917.       }
  1918.   
  1919. !     XSynchronize(dpy, True); /* */
  1920.   
  1921.       if (fcntl(ConnectionNumber(dpy), F_SETFD, 1) == -1) {
  1922.       fprintf (stderr, 
  1923. --- 238,246 ----
  1924.       exit (1);
  1925.       }
  1926.   
  1927. ! #ifdef XSYNC
  1928. !     XSynchronize(dpy, True);
  1929. ! #endif
  1930.   
  1931.       if (fcntl(ConnectionNumber(dpy), F_SETFD, 1) == -1) {
  1932.       fprintf (stderr, 
  1933. ***************
  1934. *** 421,426 ****
  1935. --- 440,447 ----
  1936.       Scr->siconifyPm = None;
  1937.       Scr->pullPm = None;
  1938.       Scr->hilitePm = None;
  1939. +     Scr->hiliteLeftPm = None;
  1940. +     Scr->hiliteRightPm = None;
  1941.       Scr->tbpm.xlogo = None;
  1942.       Scr->tbpm.resize = None;
  1943.       Scr->tbpm.question = None;
  1944. ***************
  1945. *** 440,449 ****
  1946.       CreateGCs();
  1947.       MakeMenus();
  1948.   
  1949. !     Scr->TitleBarFont.y += Scr->FramePadding;
  1950. !     Scr->TitleHeight = Scr->TitleBarFont.height + Scr->FramePadding * 2;
  1951.       /* make title height be odd so buttons look nice and centered */
  1952.       if (!(Scr->TitleHeight & 1)) Scr->TitleHeight++;
  1953.   
  1954.       InitTitlebarButtons ();        /* menus are now loaded! */
  1955.   
  1956. --- 461,473 ----
  1957.       CreateGCs();
  1958.       MakeMenus();
  1959.   
  1960. !     Scr->TitleBarFont.y += Scr->FramePadding + Scr->TitleFontPadding / 2 ;
  1961. !     Scr->TitleHeight = Scr->TitleBarFont.height + Scr->FramePadding * 2 + Scr->TitleFontPadding ;
  1962.       /* make title height be odd so buttons look nice and centered */
  1963. +     /*
  1964.       if (!(Scr->TitleHeight & 1)) Scr->TitleHeight++;
  1965. +     */
  1966.   
  1967.       InitTitlebarButtons ();        /* menus are now loaded! */
  1968.   
  1969. ***************
  1970. *** 640,647 ****
  1971. --- 664,673 ----
  1972.       Scr->VirtualC.back = UNKNOWN_PIXEL;
  1973.       Scr->VirtualC.fore = UNKNOWN_PIXEL;
  1974.   
  1975. +     Scr->MenuLineWidth = 1;
  1976.       Scr->FramePadding = 2;        /* values that look "nice" on */
  1977.       Scr->TitlePadding = 8;        /* 75 and 100dpi displays */
  1978. +     Scr->TitleFontPadding = 0;
  1979.       Scr->ButtonIndent = 1;
  1980.       Scr->SizeStringOffset = 0;
  1981.       Scr->BorderWidth = BW;
  1982. ***************
  1983. *** 691,696 ****
  1984. --- 717,724 ----
  1985.       Scr->WarpUnmapped = FALSE;
  1986.       Scr->NoIconTitle = FALSE;
  1987.       Scr->StickyAbove = FALSE;
  1988. +     Scr->StayUpMenus = FALSE;
  1989. +     Scr->PannerOpaqueScroll = FALSE;
  1990.   
  1991.       /* setup default fonts; overridden by defaults from system.twmrc */
  1992.   #define DEFAULT_NICE_FONT "variable"
  1993. ***************
  1994. *** 701,706 ****
  1995. --- 729,736 ----
  1996.       Scr->TitleBarFont.name = DEFAULT_NICE_FONT;
  1997.       Scr->MenuFont.font = NULL;
  1998.       Scr->MenuFont.name = DEFAULT_NICE_FONT;
  1999. +     Scr->MenuTitleFont.font = NULL;
  2000. +     Scr->MenuTitleFont.name = NULL; /* use MenuFont unless set */
  2001.       Scr->IconFont.font = NULL;
  2002.       Scr->IconFont.name = DEFAULT_NICE_FONT;
  2003.       Scr->SizeFont.font = NULL;
  2004. ***************
  2005. *** 719,724 ****
  2006. --- 749,758 ----
  2007.   {
  2008.       GetFont(&Scr->TitleBarFont);
  2009.       GetFont(&Scr->MenuFont);
  2010. +     if ( Scr->MenuTitleFont.name != NULL )
  2011. +     {
  2012. +     GetFont(&Scr->MenuTitleFont);
  2013. +     }
  2014.       GetFont(&Scr->IconFont);
  2015.       GetFont(&Scr->SizeFont);
  2016.       GetFont(&Scr->IconManagerFont);
  2017. ***************
  2018. *** 919,922 ****
  2019. --- 953,988 ----
  2020.       _XA_WM_SAVE_YOURSELF = XInternAtom (dpy, "WM_SAVE_YOURSELF", False);
  2021.       _XA_WM_DELETE_WINDOW = XInternAtom (dpy, "WM_DELETE_WINDOW", False);
  2022.       _XA_TWM_FLAGS = XInternAtom (dpy, "_TWM_FLAGS", False);
  2023. + }
  2024. + int FIXED_XmuCompareISOLatin1 (first, second)
  2025. +     char *first, *second;
  2026. + {
  2027. +     register unsigned char *ap, *bp;
  2028. +     register unsigned char a= *first, b= *second;
  2029. +     for (ap = (unsigned char *) first, bp = (unsigned char *) second;
  2030. +      *ap && *bp; ap++, bp++) {
  2031. +     if ((a = *ap) != (b = *bp)) {
  2032. +         /* try lowercasing and try again */
  2033. +         if ((a >= XK_A) && (a <= XK_Z))
  2034. +           a += (XK_a - XK_A);
  2035. +         else if ((a >= XK_Agrave) && (a <= XK_Odiaeresis))
  2036. +           a += (XK_agrave - XK_Agrave);
  2037. +         else if ((a >= XK_Ooblique) && (a <= XK_Thorn))
  2038. +           a += (XK_oslash - XK_Ooblique);
  2039. +         if ((b >= XK_A) && (b <= XK_Z))
  2040. +           b += (XK_a - XK_A);
  2041. +         else if ((b >= XK_Agrave) && (b <= XK_Odiaeresis))
  2042. +           b += (XK_agrave - XK_Agrave);
  2043. +         else if ((b >= XK_Ooblique) && (b <= XK_Thorn))
  2044. +           b += (XK_oslash - XK_Ooblique);
  2045. +         if (a != b) break;
  2046. +     }
  2047. +     }
  2048. +     return (((int)a) - ((int) b));
  2049.   }
  2050. diff -c old/util.c new/util.c
  2051. *** old/util.c    Thu Nov 15 20:13:18 1990
  2052. --- new/util.c    Tue Apr 23 08:17:17 1991
  2053. ***************
  2054. *** 77,82 ****
  2055. --- 77,83 ----
  2056.       Window root;
  2057.       int x, y, width, height, bw, th;
  2058.   {
  2059. +     static Window lastRoot;
  2060.       static int    lastx = 0;
  2061.       static int    lasty = 0;
  2062.       static int    lastWidth = 0;
  2063. ***************
  2064. *** 92,97 ****
  2065. --- 93,101 ----
  2066.       && lastBW == bw && th == lastTH)
  2067.       return;
  2068.       
  2069. +     if (root == None)
  2070. +     root = lastRoot;
  2071. +     lastRoot = root;
  2072.       r = outline;
  2073.   
  2074.   #define DRAWIT() \
  2075. ***************
  2076. *** 313,318 ****
  2077. --- 317,324 ----
  2078.    ***********************************************************************
  2079.    */
  2080.   
  2081. + extern int FIXED_XmuCompareISOLatin1();
  2082.   Pixmap FindBitmap (name, widthp, heightp)
  2083.       char *name;
  2084.       unsigned int *widthp, *heightp;
  2085. ***************
  2086. *** 341,347 ****
  2087.       };
  2088.       
  2089.       for (i = 0; i < (sizeof pmtab)/(sizeof pmtab[0]); i++) {
  2090. !         if (XmuCompareISOLatin1 (pmtab[i].name, name) == 0)
  2091.             return (*pmtab[i].proc) (widthp, heightp);
  2092.       }
  2093.       fprintf (stderr, "%s:  no such built-in bitmap \"%s\"\n",
  2094. --- 347,353 ----
  2095.       };
  2096.       
  2097.       for (i = 0; i < (sizeof pmtab)/(sizeof pmtab[0]); i++) {
  2098. !         if (FIXED_XmuCompareISOLatin1 (pmtab[i].name, name) == 0)
  2099.             return (*pmtab[i].proc) (widthp, heightp);
  2100.       }
  2101.       fprintf (stderr, "%s:  no such built-in bitmap \"%s\"\n",
  2102. diff -c old/vdt.c new/vdt.c
  2103. *** old/vdt.c    Thu Nov 15 20:13:19 1990
  2104. --- new/vdt.c    Tue Apr 23 08:17:17 1991
  2105. ***************
  2106. *** 28,33 ****
  2107. --- 28,51 ----
  2108.    * $XConsortium: vdt.c,v 1.140 90/03/23 11:42:33 jim Exp $
  2109.    *
  2110.    * $Log:    vdt.c,v $
  2111. +  * Revision 9.0  91/04/23  07:40:54  toml
  2112. +  * Revision bump
  2113. +  * 
  2114. +  * Revision 8.5  91/04/18  08:19:20  toml
  2115. +  * Disable backing store on the virtual desktop
  2116. +  * 
  2117. +  * Revision 8.4  91/04/15  14:54:18  toml
  2118. +  * Fixes panner interaction under OpenWindows
  2119. +  * 
  2120. +  * Revision 8.3  90/12/29  15:26:03  toml
  2121. +  * Made PannerOpaqueScroll only take effect if StickyAbove is also set.
  2122. +  * 
  2123. +  * Revision 8.2  90/12/29  11:24:22  toml
  2124. +  * Added PannerOpaqueScroll
  2125. +  * 
  2126. +  * Revision 8.1  90/12/29  09:56:37  toml
  2127. +  * Disallow unmapnotify is window is panner
  2128. +  * 
  2129.    * Revision 8.0  90/11/15  20:02:56  toml
  2130.    * Revision bump
  2131.    * 
  2132. ***************
  2133. *** 213,219 ****
  2134.       if (height > MAX_VDT_HEIGHT) height = MAX_VDT_HEIGHT;
  2135.       virtual = XCreateSimpleWindow(dpy, Scr->Panner, x, y,
  2136.       width, height, 1, border, background);
  2137. !     XGrabButton(dpy, Button2, AnyModifier, virtual,
  2138.       True, ButtonPressMask | ButtonReleaseMask,
  2139.       GrabModeAsync, GrabModeAsync, Scr->Panner, None);
  2140.       XSelectInput(dpy, virtual, KeyPressMask | ExposureMask );
  2141. --- 231,237 ----
  2142.       if (height > MAX_VDT_HEIGHT) height = MAX_VDT_HEIGHT;
  2143.       virtual = XCreateSimpleWindow(dpy, Scr->Panner, x, y,
  2144.       width, height, 1, border, background);
  2145. !     XGrabButton(dpy, Button2, 0L, virtual,
  2146.       True, ButtonPressMask | ButtonReleaseMask,
  2147.       GrabModeAsync, GrabModeAsync, Scr->Panner, None);
  2148.       XSelectInput(dpy, virtual, KeyPressMask | ExposureMask );
  2149. ***************
  2150. *** 286,292 ****
  2151.   TwmWindow *tmp_win;
  2152.   {
  2153.       XUnmapWindow(dpy, tmp_win->frame);
  2154. !     if (!tmp_win->iconmgr)
  2155.       XUnmapWindow(dpy, tmp_win->w);
  2156.       if (tmp_win->virtualWindow && !tmp_win->sticky)
  2157.       XUnmapWindow(dpy, tmp_win->virtualWindow);
  2158. --- 304,310 ----
  2159.   TwmWindow *tmp_win;
  2160.   {
  2161.       XUnmapWindow(dpy, tmp_win->frame);
  2162. !     if (!tmp_win->iconmgr && tmp_win->w != Scr->Panner)
  2163.       XUnmapWindow(dpy, tmp_win->w);
  2164.       if (tmp_win->virtualWindow && !tmp_win->sticky)
  2165.       XUnmapWindow(dpy, tmp_win->virtualWindow);
  2166. ***************
  2167. *** 499,507 ****
  2168.           XFreeGC(dpy, gc);
  2169.       }
  2170.       }
  2171. !     attrMask = CWOverrideRedirect | CWEventMask | CWBackPixmap;
  2172.       attr.override_redirect = True;
  2173.       attr.event_mask = SubstructureRedirectMask|SubstructureNotifyMask;
  2174.       attr.background_pixmap = Scr->rootWeave;
  2175.       if (pm)
  2176.       attr.background_pixmap = pm;
  2177. --- 517,526 ----
  2178.           XFreeGC(dpy, gc);
  2179.       }
  2180.       }
  2181. !     attrMask = CWOverrideRedirect | CWEventMask | CWBackPixmap | CWBackingStore;
  2182.       attr.override_redirect = True;
  2183.       attr.event_mask = SubstructureRedirectMask|SubstructureNotifyMask;
  2184. +     attr.backing_store = NotUseful;
  2185.       attr.background_pixmap = Scr->rootWeave;
  2186.       if (pm)
  2187.       attr.background_pixmap = pm;
  2188. ***************
  2189. *** 611,620 ****
  2190.       Scr->PannerWidth = sizeHints->base_width;
  2191.       Scr->PannerHeight = sizeHints->base_height;
  2192.   
  2193. !     XGrabButton(dpy, Button1, AnyModifier, Scr->Panner,
  2194.       True, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask,
  2195.       GrabModeAsync, GrabModeAsync, Scr->Panner, None);
  2196. !     XGrabButton(dpy, Button3, AnyModifier, Scr->Panner,
  2197.       True, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask,
  2198.       GrabModeAsync, GrabModeAsync, Scr->Panner, None);
  2199.       XSetWMProperties(dpy, Scr->Panner, &wName, &iName, NULL, 0,
  2200. --- 630,639 ----
  2201.       Scr->PannerWidth = sizeHints->base_width;
  2202.       Scr->PannerHeight = sizeHints->base_height;
  2203.   
  2204. !     XGrabButton(dpy, Button1, 0L, Scr->Panner,
  2205.       True, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask,
  2206.       GrabModeAsync, GrabModeAsync, Scr->Panner, None);
  2207. !     XGrabButton(dpy, Button3, 0L, Scr->Panner,
  2208.       True, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask,
  2209.       GrabModeAsync, GrabModeAsync, Scr->Panner, None);
  2210.       XSetWMProperties(dpy, Scr->Panner, &wName, &iName, NULL, 0,
  2211. ***************
  2212. *** 689,694 ****
  2213. --- 708,714 ----
  2214.   HandlePannerMotionNotify(ev)
  2215.   XEvent *ev;
  2216.   {
  2217. +     XEvent dummyev;
  2218.       int deltaX, deltaY;
  2219.       int newOutlineX, newOutlineY;
  2220.   
  2221. ***************
  2222. *** 722,727 ****
  2223. --- 742,751 ----
  2224.       XDrawRectangle(dpy, Scr->Panner, Scr->DrawGC,
  2225.       Scr->PannerOutlineX, Scr->PannerOutlineY,
  2226.       Scr->PannerOutlineWidth, Scr->PannerOutlineHeight);
  2227. +     while(XCheckTypedEvent(dpy,MotionNotify,&dummyev));
  2228. +     if (Scr->PannerOpaqueScroll && Scr->StickyAbove)
  2229. +       MoveDesktop(Scr->PannerOutlineX*Scr->PannerScale,
  2230. +           Scr->PannerOutlineY*Scr->PannerScale);
  2231.   }
  2232.   
  2233.   
  2234. diff -c old/version.c new/version.c
  2235. *** old/version.c    Thu Nov 15 20:13:20 1990
  2236. --- new/version.c    Tue Apr 23 08:17:18 1991
  2237. ***************
  2238. *** 26,30 ****
  2239.   /*****************************************************************************/
  2240.   
  2241.   /* char *Version = "MIT X Consortium, R4"; */
  2242. ! char *Version = "$Revision: 8.0 $";
  2243.   
  2244. --- 26,30 ----
  2245.   /*****************************************************************************/
  2246.   
  2247.   /* char *Version = "MIT X Consortium, R4"; */
  2248. ! char *Version = "$Revision: 9.0 $";
  2249.   
  2250.