🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: comp.sources.bugs
Article #707

Tgif-2.12-patch16 (16th patch for tgif-2.12), Part 01/01

#707
From: William Cheng
Date: Thu, 07 Jan 1993 06:27
2254 lines
69303 bytes
Below is tgif-2.12-patch16 (16th patch for tgif-2.12).  (The complete
source for tgif-2.12 at patchlevel 16 can be found in the following
places for anonymous ftp:  export.lcs.mit.edu:/contrib/tgif-2.12-p16.tar.Z
and cs.ucla.edu:/pub/tgif/tgif-2.12-p16.tar.Z.)

Tgif is an Xlib based 2-D drawing tool under X11.

Remove everything outside of the 'cut here' lines (inclusive) and save
the file as tgif-2.12-patch16; then apply the patch with
'patch -p -N < tgif-2.12-patch16'.  Here is a short list of added
features/bug fixes.

1)  Allow the launch= attribute to be multiline.
2)  Make pasting work in text mode.  The default paste command is still
    <Cntrl><Meta>y.
3)  Add user interrupt when redrawing.  Add a new X default,
    Tgif*IntrCheckInterval to define the number of objects drawn before
    checking for user interrupt.
4)  Fix some memory leaks.  Thanks to Mark Sterin <mark@FibHaifa.com> for
    the fixes.

Please send bug reports to william@cs.ucla.edu.
---------------------------------> cut here <---------------------------------
*** choice.c.orig	Wed Jan  6 22:06:37 1993
--- choice.c	Wed Jan  6 22:06:38 1993
***************
*** 25,29 ****
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/choice.c,v 2.58.2.1 1992/10/16 05:17:33 william Exp $";
  #endif
  
--- 25,29 ----
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/choice.c,v 2.58.2.4 1993/01/03 23:34:16 william Exp $";
  #endif
  
***************
*** 414,430 ****
     switch (pageStyle)
     {
!       case PORTRAIT:
!          XSetStipple (mainDisplay, rasterGC, filePixmap);
!          XFillRectangle (mainDisplay, choiceWindow, rasterGC,
!                FILE_COL*choiceImageW, FILE_ROW*choiceImageH,
!                choiceImageW, choiceImageH);
!          break;
!       case LANDSCAPE:
!          XSetStipple (mainDisplay, rasterGC, landscapePixmap);
!          XFillRectangle (mainDisplay, choiceWindow, rasterGC,
!                FILE_COL*choiceImageW, FILE_ROW*choiceImageH,
!                choiceImageW, choiceImageH);
!          break;
     }
  }
  
--- 414,422 ----
     switch (pageStyle)
     {
!       case PORTRAIT: XSetStipple(mainDisplay,rasterGC,filePixmap); break;
!       case LANDSCAPE: XSetStipple(mainDisplay,rasterGC,landscapePixmap); break;
     }
+    XFillRectangle (mainDisplay, choiceWindow, rasterGC, FILE_COL*choiceImageW,
+          FILE_ROW*choiceImageH, choiceImageW, choiceImageH);
  }
  
***************
*** 465,483 ****
  void ShowMoveMode ()
  {
!    switch (moveMode)
!    {
!       case CONST_MOVE:
!          XSetStipple (mainDisplay, rasterGC, moveModePixmap[CONST_MOVE]);
!          XFillRectangle (mainDisplay, choiceWindow, rasterGC,
!                MOVE_MODE_COL*choiceImageW, MOVE_MODE_ROW*choiceImageH,
!                choiceImageW, choiceImageH);
!          break;
!       case UNCONST_MOVE:
!          XSetStipple (mainDisplay, rasterGC, moveModePixmap[UNCONST_MOVE]);
!          XFillRectangle (mainDisplay, choiceWindow, rasterGC,
!                MOVE_MODE_COL*choiceImageW, MOVE_MODE_ROW*choiceImageH,
!                choiceImageW, choiceImageH);
!          break;
!    }
  }
  
--- 457,464 ----
  void ShowMoveMode ()
  {
!    XSetStipple (mainDisplay, rasterGC, moveModePixmap[moveMode]);
!    XFillRectangle (mainDisplay, choiceWindow, rasterGC,
!          MOVE_MODE_COL*choiceImageW, MOVE_MODE_ROW*choiceImageH,
!          choiceImageW, choiceImageH);
  }
  
***************
*** 821,825 ****
     zoomedIn = saved_zoomed_in;
     zoomScale = saved_zoom_scale;
!    PreciseZoom (new_zoomed_in, new_zoom_scale);
  }
  
--- 802,806 ----
     zoomedIn = saved_zoomed_in;
     zoomScale = saved_zoom_scale;
!    PreciseZoom (new_zoomed_in, new_zoom_scale, FALSE);
  }
  
*** cmd.c.orig	Wed Jan  6 22:06:43 1993
--- cmd.c	Wed Jan  6 22:06:44 1993
***************
*** 25,29 ****
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/cmd.c,v 2.18.2.1 1992/10/16 05:26:14 william Exp $";
  #endif
  
--- 25,29 ----
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/cmd.c,v 2.18.2.2 1993/01/02 20:21:17 william Exp $";
  #endif
  
***************
*** 158,162 ****
     struct CmdRec	* CmdPtr;
  {
!    register struct CmdRec	* cmd_ptr;
  
     if (curCmd == NULL)
--- 158,162 ----
     struct CmdRec	* CmdPtr;
  {
!    register struct CmdRec	* cmd_ptr, * next_cmd;
  
     if (curCmd == NULL)
***************
*** 165,170 ****
        cmd_ptr = curCmd->next;
  
!    for ( ; cmd_ptr != NULL; cmd_ptr = cmd_ptr->next)
     {
        DeleteARedoRecord (cmd_ptr);
        historyCount--;
--- 165,171 ----
        cmd_ptr = curCmd->next;
  
!    for ( ; cmd_ptr != NULL; cmd_ptr = next_cmd)
     {
+       next_cmd = cmd_ptr->next;
        DeleteARedoRecord (cmd_ptr);
        historyCount--;
***************
*** 175,182 ****
  void CleanUpCmds ()
  {
!    register struct CmdRec	* cmd_ptr;
  
!    for (cmd_ptr = firstCmd; cmd_ptr != NULL; cmd_ptr = cmd_ptr->next)
        DeleteARedoRecord (cmd_ptr);
     firstCmd = lastCmd = curCmd = NULL;
     historyCount = 0;
--- 176,186 ----
  void CleanUpCmds ()
  {
!    register struct CmdRec	* cmd_ptr, * next_cmd;
  
!    for (cmd_ptr = firstCmd; cmd_ptr != NULL; cmd_ptr = next_cmd)
!    {
!       next_cmd = cmd_ptr->next;
        DeleteARedoRecord (cmd_ptr);
+    }
     firstCmd = lastCmd = curCmd = NULL;
     historyCount = 0;
*** copypaste.c.orig	Wed Jan  6 22:06:46 1993
--- copypaste.c	Wed Jan  6 22:06:47 1993
***************
*** 26,30 ****
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/copypaste.c,v 2.30.1.2 1992/10/16 05:07:26 william Exp $";
  #endif
  
--- 26,30 ----
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/copypaste.c,v 2.30.1.4 1992/12/20 01:02:35 william Exp $";
  #endif
  
***************
*** 42,45 ****
--- 42,46 ----
  #include "color.e"
  #include "cursor.e"
+ #include "drawing.e"
  #include "dup.e"
  #include "file.e"
***************
*** 279,283 ****
  }
  
! void PasteFromCutBuffer ()
  {
     FILE 		* fp;
--- 280,284 ----
  }
  
! int PasteFromCutBuffer ()
  {
     FILE 		* fp;
***************
*** 292,301 ****
     {
        Msg ("Cut buffer is empty");
!       return;
     }
     if (((unsigned char)(*cut_buffer)) != header)
     {
        PasteString (cut_buffer);
!       return;
     }
     cut_buffer++;
--- 293,307 ----
     {
        Msg ("Cut buffer is empty");
!       return (TRUE);
     }
     if (((unsigned char)(*cut_buffer)) != header)
     {
+       if (curChoice == DRAWTEXT)
+       {
+          pasteInDrawTextMode = TRUE;
+          return (FALSE);
+       }
        PasteString (cut_buffer);
!       return (TRUE);
     }
     cut_buffer++;
***************
*** 308,312 ****
        sprintf (msg, "Can not open %s for write.", tmpfile);
        Msg (msg);
!       return;
     }
     if (write (fileno(fp), cut_buffer, len) < len)
--- 314,318 ----
        sprintf (msg, "Can not open %s for write.", tmpfile);
        Msg (msg);
!       return (TRUE);
     }
     if (write (fileno(fp), cut_buffer, len) < len)
***************
*** 317,321 ****
              tmpfile);
        Msg (msg);
!       return;
     }
     fflush (fp);
--- 323,327 ----
              tmpfile);
        Msg (msg);
!       return (TRUE);
     }
     fflush (fp);
***************
*** 353,357 ****
              fileVersion);
        Msg (msg);
!       return;
     }
      
--- 359,363 ----
              fileVersion);
        Msg (msg);
!       return (TRUE);
     }
      
***************
*** 403,406 ****
--- 409,413 ----
  
     Msg ("Objects pasted from tgif.");
+    return (TRUE);
  }        
  
*** drawing.c.orig	Wed Jan  6 22:06:51 1993
--- drawing.c	Wed Jan  6 22:06:54 1993
***************
*** 25,29 ****
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/drawing.c,v 2.115 1992/08/11 03:58:46 william Exp $";
  #endif
  
--- 25,29 ----
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/drawing.c,v 2.115.1.4 1993/01/03 01:14:56 william Exp $";
  #endif
  
***************
*** 80,83 ****
--- 80,85 ----
  #define O_GRID (O_VIS+O_INVIS)
  
+ int		intrCheckInterval=10;
+ int		pasteInDrawTextMode=FALSE;
  int		numRedrawBBox=INVALID;
  int		numClipRecs=0;
***************
*** 181,187 ****
  }
  
! void DrawObj (Win, ObjPtr)
     Window			Win;
     register struct ObjRec	* ObjPtr;
  {
     register struct ObjRec	* obj_ptr;
--- 183,254 ----
  }
  
! static int	intrShown=FALSE;
! static int	checkCount=0;
! 
! void ShowInterrupt ()
! {
!    GC		gc;
!    XGCValues	values;
! 
!    if (intrCheckInterval <= 0) return;
! 
!    values.foreground = myFgPixel;
!    values.background = myBgPixel;
!    values.fill_style = FillOpaqueStippled;
!    values.stipple = intrPixmap;
!    gc = XCreateGC (mainDisplay, dummyWindow1,
!          GCForeground | GCBackground | GCFillStyle | GCStipple, &values);
!    XFillRectangle (mainDisplay, dummyWindow1, gc, 0, 0, scrollBarW, scrollBarW);
!    XFreeGC(mainDisplay, gc);
! 
!    XSync (mainDisplay, False);
!    intrShown = TRUE;
! }
! 
! void HideInterrupt ()
! {
!    XEvent	ev;
! 
!    while (XCheckWindowEvent (mainDisplay, dummyWindow1, ButtonPressMask, &ev)) ;
!    XClearWindow (mainDisplay, dummyWindow1);
!    intrShown = FALSE;
!    checkCount = 0;
! }
! 
! void RedrawDummyWindow1 ()
! {
!    XEvent	ev;
! 
!    while (XCheckWindowEvent (mainDisplay, dummyWindow1, ExposureMask, &ev)) ;
!    while (XCheckWindowEvent (mainDisplay, dummyWindow1, ButtonPressMask, &ev)) ;
!    if (intrShown)
!       ShowInterrupt ();
!    else
!       HideInterrupt ();
! }
! 
! int CheckInterrupt ()
! {
!    if (intrCheckInterval <= 0) return (FALSE);
!    if (++checkCount >= intrCheckInterval)
!    {
!       XEvent	ev;
! 
!       checkCount = 0;
!       if (XCheckWindowEvent (mainDisplay, dummyWindow1, ButtonPressMask, &ev))
!       {
!          while (XCheckWindowEvent (mainDisplay, dummyWindow1, ButtonPressMask,
!                &ev)) ;
!          return (TRUE);
!       }
!    }
!    return (FALSE);
! }
! 
! int DrawObj (Win, ObjPtr)
     Window			Win;
     register struct ObjRec	* ObjPtr;
+    /* returns TRUE if all objects are drawn */
+    /* returns FALSE if interrupted by the user */
  {
     register struct ObjRec	* obj_ptr;
***************
*** 230,234 ****
           for ( ; obj_ptr != NULL; obj_ptr = obj_ptr->prev)
              if (!checkBBox || NeedToDraw (obj_ptr->bbox))
!                DrawObj (Win, obj_ptr);
           if (ObjPtr->type == OBJ_ICON && ObjPtr->dirty)
           {
--- 297,308 ----
           for ( ; obj_ptr != NULL; obj_ptr = obj_ptr->prev)
              if (!checkBBox || NeedToDraw (obj_ptr->bbox))
!             {
!                if (!DrawObj (Win, obj_ptr)) return (FALSE);
!                if (CheckInterrupt ())
!                {
!                   Msg ("User interrupt.  Repaint aborted.");
!                   return (FALSE);
!                }
!             }
           if (ObjPtr->type == OBJ_ICON && ObjPtr->dirty)
           {
***************
*** 245,248 ****
--- 319,323 ----
           break;
     }
+    return (TRUE);
  }
  
***************
*** 299,307 ****
     smallArea[0].ltx = LtX; smallArea[0].lty = LtY;
     smallArea[0].rbx = RbX; smallArea[0].rby = RbY;
     for (obj_ptr = BotObj; obj_ptr != NULL; obj_ptr = obj_ptr->prev)
        if (BBoxIntersect (obj_ptr->bbox, drawWinBBox) &&
              BBoxIntersect (obj_ptr->bbox, smallArea[0]))
!          DrawObj (drawWindow, obj_ptr);
! 
     SetDefaultDrawWinClipRecs ();
  }
--- 374,392 ----
     smallArea[0].ltx = LtX; smallArea[0].lty = LtY;
     smallArea[0].rbx = RbX; smallArea[0].rby = RbY;
+    ShowInterrupt ();
     for (obj_ptr = BotObj; obj_ptr != NULL; obj_ptr = obj_ptr->prev)
+    {
        if (BBoxIntersect (obj_ptr->bbox, drawWinBBox) &&
              BBoxIntersect (obj_ptr->bbox, smallArea[0]))
!       {
!          if (!DrawObj (drawWindow, obj_ptr)) break;
!          if (CheckInterrupt ())
!          {
!             Msg ("User interrupt.  Repaint aborted.");
!             break;
!          }
!       }
!    }
!    HideInterrupt ();
     SetDefaultDrawWinClipRecs ();
  }
***************
*** 465,468 ****
--- 550,554 ----
     smallArea[1].ltx = LtX2; smallArea[1].lty = LtY2;
     smallArea[1].rbx = RbX2; smallArea[1].rby = RbY2;
+    ShowInterrupt ();
     for (obj_ptr = BotObj; obj_ptr != NULL; obj_ptr = obj_ptr->prev)
     {
***************
*** 470,476 ****
              (BBoxIntersect (obj_ptr->bbox, bbox1) ||
              BBoxIntersect (obj_ptr->bbox, bbox2)))
!          DrawObj (drawWindow, obj_ptr);
     }
! 
     SetDefaultDrawWinClipRecs ();
  }
--- 556,569 ----
              (BBoxIntersect (obj_ptr->bbox, bbox1) ||
              BBoxIntersect (obj_ptr->bbox, bbox2)))
!       {
!          if (!DrawObj (drawWindow, obj_ptr)) break;
!          if (CheckInterrupt ())
!          {
!             Msg ("User interrupt.  Repaint aborted.");
!             break;
!          }
!       }
     }
!    HideInterrupt ();
     SetDefaultDrawWinClipRecs ();
  }
***************
*** 637,642 ****
  
     checkBBox = FALSE;
     for (obj_ptr = botObj; obj_ptr != NULL; obj_ptr = obj_ptr->prev)
!       DrawObj (pixmap, obj_ptr);
     checkBBox = TRUE;
  
--- 730,751 ----
  
     checkBBox = FALSE;
+    ShowInterrupt ();
     for (obj_ptr = botObj; obj_ptr != NULL; obj_ptr = obj_ptr->prev)
!    {
!       if (!DrawObj (pixmap, obj_ptr))
!       {
!          XFreePixmap (mainDisplay, pixmap);
!          pixmap = None;
!          break;
!       }
!       if (CheckInterrupt ())
!       {
!          Msg ("User interrupt.  Repaint aborted.");
!          XFreePixmap (mainDisplay, pixmap);
!          pixmap = None;
!          break;
!       }
!    }
!    HideInterrupt ();
     checkBBox = TRUE;
  
***************
*** 661,667 ****
  
     numRedrawBBox = 0;
     for (obj_ptr = BotObj; obj_ptr != NULL; obj_ptr = obj_ptr->prev)
        if (BBoxIntersect (obj_ptr->bbox, drawWinBBox))
!          DrawObj (drawWindow, obj_ptr);
  }
  
--- 770,787 ----
  
     numRedrawBBox = 0;
+    ShowInterrupt ();
     for (obj_ptr = BotObj; obj_ptr != NULL; obj_ptr = obj_ptr->prev)
+    {
        if (BBoxIntersect (obj_ptr->bbox, drawWinBBox))
!       {
!          if (!DrawObj (drawWindow, obj_ptr)) break;
!          if (CheckInterrupt ())
!          {
!             Msg ("User interrupt.  Repaint aborted.");
!             break;
!          }
!       }
!    }
!    HideInterrupt ();
  }
  
***************
*** 863,867 ****
              case 'w': /*^#w*/ ToggleAllSelLineType (); break;
              case 'x': /*^#x*/ ToggleWhereToPrint (); break;
!             case 'y': /*^#y*/ PasteFromCutBuffer (); break;
              case 'z': /*^#z*/ SetCurChoice (DRAWARC); break;
              case '.': /*^#.*/ ImportXBitmapFile (); break;
--- 983,987 ----
              case 'w': /*^#w*/ ToggleAllSelLineType (); break;
              case 'x': /*^#x*/ ToggleWhereToPrint (); break;
!             case 'y': /*^#y*/ if (!PasteFromCutBuffer()) return(INVALID); break;
              case 'z': /*^#z*/ SetCurChoice (DRAWARC); break;
              case '.': /*^#.*/ ImportXBitmapFile (); break;
*** file.c.orig	Wed Jan  6 22:06:59 1993
--- file.c	Wed Jan  6 22:07:02 1993
***************
*** 25,29 ****
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/file.c,v 2.192.1.11 1992/12/06 03:09:02 william Exp $";
  #endif
  
--- 25,29 ----
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/file.c,v 2.192.1.14 1992/12/22 05:43:04 william Exp $";
  #endif
  
***************
*** 1874,1878 ****
     FILE			* fp;
     char 		tmp_filename[MAXPATHLENGTH+1];
!    int 			tmp_linenum;
  
     strcpy (saved_cur_dir, curDir);
--- 1874,1878 ----
     FILE			* fp;
     char 		tmp_filename[MAXPATHLENGTH+1];
!    int 			tmp_linenum, interrupted;
  
     strcpy (saved_cur_dir, curDir);
***************
*** 1914,1918 ****
--- 1914,1921 ----
  
     numRedrawBBox = 0;
+    ShowInterrupt ();
+    interrupted = FALSE;
     while ((read_status = ReadObj (fp, &obj_ptr)) == TRUE)
+    {
        if (obj_ptr != NULL)
        {
***************
*** 1919,1926 ****
           AdjForOldVersion (obj_ptr);
           AddObj (NULL, topObj, obj_ptr);
!          if (PointInBBox (obj_ptr->x, obj_ptr->y, drawWinBBox) ||
!                BBoxIntersect (obj_ptr->bbox, drawWinBBox))
!             DrawObj (drawWindow, obj_ptr);
        }
  
     strcpy (scanFileName, tmp_filename);
--- 1922,1936 ----
           AdjForOldVersion (obj_ptr);
           AddObj (NULL, topObj, obj_ptr);
!          if (!interrupted &&
!                (PointInBBox (obj_ptr->x, obj_ptr->y, drawWinBBox) ||
!                BBoxIntersect (obj_ptr->bbox, drawWinBBox)))
!          {
!             if (!DrawObj (drawWindow, obj_ptr)) interrupted = TRUE;
!             if (CheckInterrupt ()) interrupted = TRUE;
!          }
        }
+    }
+    if (interrupted) Msg ("User interrupt.  Drawing aborted.");
+    HideInterrupt ();
  
     strcpy (scanFileName, tmp_filename);
*** grid.c.orig	Wed Jan  6 22:07:07 1993
--- grid.c	Wed Jan  6 22:07:09 1993
***************
*** 25,29 ****
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/grid.c,v 2.77 1992/05/11 23:41:53 william Exp $";
  #endif
  
--- 25,29 ----
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/grid.c,v 2.78 1992/12/14 02:05:21 william Exp $";
  #endif
  
***************
*** 676,685 ****
  }
  
! void PreciseZoom (zoomed_in, zoom_scale)
!    int	zoomed_in, zoom_scale;
  {
     int	xc, yc;
  
!    if (zoomedIn == zoomed_in && zoomScale == zoom_scale) return;
  
     if (curChoice==DRAWTEXT && textCursorShown)
--- 676,685 ----
  }
  
! void PreciseZoom (zoomed_in, zoom_scale, force_zoom)
!    int	zoomed_in, zoom_scale, force_zoom;
  {
     int	xc, yc;
  
!    if (!force_zoom && zoomedIn == zoomed_in && zoomScale == zoom_scale) return;
  
     if (curChoice==DRAWTEXT && textCursorShown)
*** mainloop.c.orig	Wed Jan  6 22:07:15 1993
--- mainloop.c	Wed Jan  6 22:07:17 1993
***************
*** 25,29 ****
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/mainloop.c,v 2.79.1.6 1992/11/29 23:26:26 william Exp $";
  #endif
  
--- 25,29 ----
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/mainloop.c,v 2.79.1.7 1992/12/21 00:20:05 william Exp $";
  #endif
  
***************
*** 305,308 ****
--- 305,313 ----
        RedrawHScrollWindow ();
     }
+    else if (input->xany.window == dummyWindow1)
+    {
+       while (XCheckWindowEvent (mainDisplay, dummyWindow1, ExposureMask, &ev)) ;
+       RedrawDummyWindow1 ();
+    }
     else if (pinnedMainMenu && input->xany.window == mainMenuWindow)
     {
***************
*** 686,689 ****
--- 691,696 ----
              input.xany.window == hSBarWindow)
           ScrollEventHandler (&input);
+       else if (input.xany.window == dummyWindow1)
+          RedrawDummyWindow1 ();
        else if (input.xany.type == MappingNotify)
           XRefreshKeyboardMapping (&(input.xmapping));
*** mainmenu.c.orig	Wed Jan  6 22:07:21 1993
--- mainmenu.c	Wed Jan  6 22:07:22 1993
***************
*** 26,30 ****
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/mainmenu.c,v 1.51 1992/08/08 08:26:43 william Exp $";
  #endif
  
--- 26,30 ----
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/mainmenu.c,v 1.51.1.3 1993/01/04 01:21:22 william Exp $";
  #endif
  
***************
*** 327,331 ****
     register int			i, j;
     register unsigned char	hash_value;
!    Window			root_win, parent_win, * child_win;
     unsigned int			num_child;
  
--- 327,331 ----
     register int			i, j;
     register unsigned char	hash_value;
!    Window			root_win, parent_win, * child_wins;
     unsigned int			num_child;
  
***************
*** 344,348 ****
        }
  
!    XQueryTree (mainDisplay, rootWindow, &root_win, &parent_win, &child_win,
           &num_child);
  
--- 344,348 ----
        }
  
!    XQueryTree (mainDisplay, rootWindow, &root_win, &parent_win, &child_wins,
           &num_child);
  
***************
*** 353,360 ****
     for (i = 0; i < num_child; i++)
     {
!       hash_value = child_win[i] & 0xff;
        if (checkExtra[hash_value>>3] & (1<<(hash_value&0x7)))
        {
!          if (child_win[i] == mainMenuWindow)
              stackingWins[numStacking++] = mainMenuWindow;
           else
--- 353,360 ----
     for (i = 0; i < num_child; i++)
     {
!       hash_value = child_wins[i] & 0xff;
        if (checkExtra[hash_value>>3] & (1<<(hash_value&0x7)))
        {
!          if (child_wins[i] == mainMenuWindow)
              stackingWins[numStacking++] = mainMenuWindow;
           else
***************
*** 363,369 ****
              {
                 if (extraWinInfo[j].raise && extraWinInfo[j].mapped &&
!                      extraWinInfo[j].window == child_win[i])
                 {
!                   stackingWins[numStacking++] = child_win[i];
                    break;
                 }
--- 363,369 ----
              {
                 if (extraWinInfo[j].raise && extraWinInfo[j].mapped &&
!                      extraWinInfo[j].window == child_wins[i])
                 {
!                   stackingWins[numStacking++] = child_wins[i];
                    break;
                 }
***************
*** 372,375 ****
--- 372,376 ----
        }
     }
+    if (child_wins != NULL) XFree ((void *)child_wins);
  }
  
***************
*** 749,753 ****
              &num_child) == 0)
           return;
!       if (child_wins != NULL) cfree (child_wins);
        if (parent_win == rootWindow)
           done = TRUE;
--- 750,754 ----
              &num_child) == 0)
           return;
!       if (child_wins != NULL) XFree ((void *)child_wins);
        if (parent_win == rootWindow)
           done = TRUE;
*** poly.c.orig	Wed Jan  6 22:07:30 1993
--- poly.c	Wed Jan  6 22:07:31 1993
***************
*** 25,29 ****
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/poly.c,v 2.59.1.3 1992/11/07 23:32:42 william Exp $";
  #endif
  
--- 25,29 ----
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/poly.c,v 2.59.1.4 1993/01/03 23:34:24 william Exp $";
  #endif
  
***************
*** 198,202 ****
     struct ObjRec	* obj_ptr;
     register int		i;
!    XPoint		* v, * rv;
     int			ltx, lty, rbx, rby;
  
--- 198,202 ----
     struct ObjRec	* obj_ptr;
     register int		i;
!    XPoint		* v;
     int			ltx, lty, rbx, rby;
  
***************
*** 204,209 ****
     poly_ptr->n = NumPts;
     v = (XPoint *) calloc (NumPts+1, sizeof(XPoint));
!    rv = (XPoint *) calloc (NumPts+1, sizeof(XPoint));
!    if (v == NULL || rv == NULL) fprintf (stderr, "Can not calloc().\n");
     pt_ptr = lastPtPtr;
     ltx = rbx = pt_ptr->x;
--- 204,208 ----
     poly_ptr->n = NumPts;
     v = (XPoint *) calloc (NumPts+1, sizeof(XPoint));
!    if (v == NULL) fprintf (stderr, "Can not calloc().\n");
     pt_ptr = lastPtPtr;
     ltx = rbx = pt_ptr->x;
***************
*** 222,226 ****
  
     poly_ptr->vlist = v;
-    poly_ptr->rvlist = rv;
     poly_ptr->svlist = poly_ptr->asvlist = NULL;
     poly_ptr->style = lineStyle;
--- 221,224 ----
***************
*** 809,813 ****
     dash = ObjPtr->detail.p->dash;
     rotation = ObjPtr->rotation;
!    v = (rotation == 0) ? ObjPtr->detail.p->vlist : ObjPtr->detail.p->rvlist;
     num_pts = ObjPtr->detail.p->n;
  
--- 807,811 ----
     dash = ObjPtr->detail.p->dash;
     rotation = ObjPtr->rotation;
!    v = ObjPtr->detail.p->vlist;
     num_pts = ObjPtr->detail.p->n;
  
***************
*** 1184,1188 ****
     register int		i;
     struct PolyRec	* poly_ptr;
!    XPoint		* v, * rv;
     char			color_str[20], * s, inbuf[MAXSTRING+1], msg[MAXSTRING];
     int			num_pts, ltx=0, lty=0, rbx=0, rby=0, x, y, id=0;
--- 1182,1186 ----
     register int		i;
     struct PolyRec	* poly_ptr;
!    XPoint		* v;
     char			color_str[20], * s, inbuf[MAXSTRING+1], msg[MAXSTRING];
     int			num_pts, ltx=0, lty=0, rbx=0, rby=0, x, y, id=0;
***************
*** 1218,1223 ****
     {
        v = (XPoint *) calloc (4, sizeof(XPoint));
!       rv = (XPoint *) calloc (4, sizeof(XPoint));
!       if (v == NULL || rv == NULL) fprintf (stderr, "Can not calloc().\n");
     }
     else
--- 1216,1220 ----
     {
        v = (XPoint *) calloc (4, sizeof(XPoint));
!       if (v == NULL) fprintf (stderr, "Can not calloc().\n");
     }
     else
***************
*** 1224,1229 ****
     {
        v = (XPoint *) calloc (num_pts+1, sizeof(XPoint));
!       rv = (XPoint *) calloc (num_pts+1, sizeof(XPoint));
!       if (v == NULL || rv == NULL) fprintf (stderr, "Can not calloc().\n");
     }
  
--- 1221,1225 ----
     {
        v = (XPoint *) calloc (num_pts+1, sizeof(XPoint));
!       if (v == NULL) fprintf (stderr, "Can not calloc().\n");
     }
  
***************
*** 1239,1243 ****
              cfree (poly_ptr);
              cfree (v);
-             cfree (rv);
              *ObjPtr = NULL;
              return;
--- 1235,1238 ----
***************
*** 1269,1273 ****
              cfree (poly_ptr);
              cfree (v);
-             cfree (rv);
              *ObjPtr = NULL;
              return;
--- 1264,1267 ----
***************
*** 1321,1325 ****
           cfree (poly_ptr);
           cfree (v);
-          cfree (rv);
           *ObjPtr = NULL;
           return;
--- 1315,1318 ----
***************
*** 1350,1354 ****
           cfree (poly_ptr);
           cfree (v);
-          cfree (rv);
           *ObjPtr = NULL;
           return;
--- 1343,1346 ----
***************
*** 1380,1384 ****
           cfree (poly_ptr);
           cfree (v);
-          cfree (rv);
           *ObjPtr = NULL;
           return;
--- 1372,1375 ----
***************
*** 1404,1408 ****
           cfree (poly_ptr);
           cfree (v);
-          cfree (rv);
           *ObjPtr = NULL;
           return;
--- 1395,1398 ----
***************
*** 1427,1431 ****
           cfree (poly_ptr);
           cfree (v);
-          cfree (rv);
           *ObjPtr = NULL;
           return;
--- 1417,1420 ----
***************
*** 1446,1450 ****
           cfree (poly_ptr);
           cfree (v);
-          cfree (rv);
           *ObjPtr = NULL;
           return;
--- 1435,1438 ----
***************
*** 1466,1470 ****
           cfree (poly_ptr);
           cfree (v);
-          cfree (rv);
           *ObjPtr = NULL;
           return;
--- 1454,1457 ----
***************
*** 1488,1492 ****
           cfree (poly_ptr);
           cfree (v);
-          cfree (rv);
           *ObjPtr = NULL;
           return;
--- 1475,1478 ----
***************
*** 1511,1515 ****
           cfree (poly_ptr);
           cfree (v);
-          cfree (rv);
           *ObjPtr = NULL;
           return;
--- 1497,1500 ----
***************
*** 1537,1541 ****
  
     poly_ptr->vlist = v;
-    poly_ptr->rvlist = rv;
     poly_ptr->svlist = poly_ptr->asvlist = NULL;
  
--- 1522,1525 ----
***************
*** 1562,1569 ****
     struct ObjRec	* ObjPtr;
  {
!    if (ObjPtr->detail.p->curved) cfree (ObjPtr->detail.p->svlist);
     if (ObjPtr->detail.p->asvlist != NULL) cfree (ObjPtr->detail.p->asvlist);
     cfree (ObjPtr->detail.p->vlist);
-    cfree (ObjPtr->detail.p->rvlist);
     cfree (ObjPtr->detail.p);
     cfree (ObjPtr);
--- 1546,1552 ----
     struct ObjRec	* ObjPtr;
  {
!    if (ObjPtr->detail.p->svlist != NULL) cfree (ObjPtr->detail.p->svlist);
     if (ObjPtr->detail.p->asvlist != NULL) cfree (ObjPtr->detail.p->asvlist);
     cfree (ObjPtr->detail.p->vlist);
     cfree (ObjPtr->detail.p);
     cfree (ObjPtr);
*** polygon.c.orig	Wed Jan  6 22:07:37 1993
--- polygon.c	Wed Jan  6 22:07:38 1993
***************
*** 25,29 ****
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/polygon.c,v 2.58.1.3 1992/11/07 23:33:09 william Exp $";
  #endif
  
--- 25,29 ----
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/polygon.c,v 2.58.1.4 1993/01/03 23:34:24 william Exp $";
  #endif
  
***************
*** 736,740 ****
     register int		i;
     struct PolygonRec	* polygon_ptr;
!    XPoint		* v, * rv;
     char			color_str[20], * s, inbuf[MAXSTRING], msg[MAXSTRING];
     int			num_pts, ltx=0, lty=0, rbx=0, rby=0, x, y, id=0;
--- 736,740 ----
     register int		i;
     struct PolygonRec	* polygon_ptr;
!    XPoint		* v;
     char			color_str[20], * s, inbuf[MAXSTRING], msg[MAXSTRING];
     int			num_pts, ltx=0, lty=0, rbx=0, rby=0, x, y, id=0;
***************
*** 769,774 ****
     {
        v = (XPoint *) calloc (5, sizeof(XPoint));
!       rv = (XPoint *) calloc (5, sizeof(XPoint));
!       if (v == NULL || rv == NULL) fprintf (stderr, "Can not calloc().\n");
     }
     else
--- 769,773 ----
     {
        v = (XPoint *) calloc (5, sizeof(XPoint));
!       if (v == NULL) fprintf (stderr, "Can not calloc().\n");
     }
     else
***************
*** 775,780 ****
     {
        v = (XPoint *) calloc (num_pts+1, sizeof(XPoint));
!       rv = (XPoint *) calloc (num_pts+1, sizeof(XPoint));
!       if (v == NULL || rv == NULL) fprintf (stderr, "Can not calloc().\n");
     }
  
--- 774,778 ----
     {
        v = (XPoint *) calloc (num_pts+1, sizeof(XPoint));
!       if (v == NULL) fprintf (stderr, "Can not calloc().\n");
     }
  
***************
*** 790,794 ****
              cfree (polygon_ptr);
              cfree (v);
-             cfree (rv);
              *ObjPtr = NULL;
              return;
--- 788,791 ----
***************
*** 820,824 ****
              cfree (polygon_ptr);
              cfree (v);
-             cfree (rv);
              *ObjPtr = NULL;
              return;
--- 817,820 ----
***************
*** 885,889 ****
           cfree (polygon_ptr);
           cfree (v);
-          cfree (rv);
           *ObjPtr = NULL;
           return;
--- 881,884 ----
***************
*** 913,917 ****
           cfree (polygon_ptr);
           cfree (v);
-          cfree (rv);
           *ObjPtr = NULL;
           return;
--- 908,911 ----
***************
*** 934,938 ****
           cfree (polygon_ptr);
           cfree (v);
-          cfree (rv);
           *ObjPtr = NULL;
           return;
--- 928,931 ----
***************
*** 951,955 ****
           cfree (polygon_ptr);
           cfree (v);
-          cfree (rv);
           *ObjPtr = NULL;
           return;
--- 944,947 ----
***************
*** 969,973 ****
           cfree (polygon_ptr);
           cfree (v);
-          cfree (rv);
           *ObjPtr = NULL;
           return;
--- 961,964 ----
***************
*** 988,992 ****
           cfree (polygon_ptr);
           cfree (v);
-          cfree (rv);
           *ObjPtr = NULL;
           return;
--- 979,982 ----
***************
*** 1008,1012 ****
           cfree (polygon_ptr);
           cfree (v);
-          cfree (rv);
           *ObjPtr = NULL;
           return;
--- 998,1001 ----
***************
*** 1026,1030 ****
  
     polygon_ptr->vlist = v;
-    polygon_ptr->rvlist = rv;
     polygon_ptr->svlist = NULL;
  
--- 1015,1018 ----
***************
*** 1053,1059 ****
     struct ObjRec	* ObjPtr;
  {
!    if (ObjPtr->detail.g->curved) cfree (ObjPtr->detail.g->svlist);
     cfree (ObjPtr->detail.g->vlist);
-    cfree (ObjPtr->detail.g->rvlist);
     cfree (ObjPtr->detail.g);
     cfree (ObjPtr);
--- 1041,1046 ----
     struct ObjRec	* ObjPtr;
  {
!    if (ObjPtr->detail.g->svlist != NULL) cfree (ObjPtr->detail.g->svlist);
     cfree (ObjPtr->detail.g->vlist);
     cfree (ObjPtr->detail.g);
     cfree (ObjPtr);
*** raster.c.orig	Wed Jan  6 22:07:46 1993
--- raster.c	Wed Jan  6 22:07:47 1993
***************
*** 25,29 ****
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/raster.c,v 2.42 1992/06/19 05:41:12 william Exp $";
  #endif
  
--- 25,29 ----
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/raster.c,v 2.42.1.2 1992/12/21 00:27:27 william Exp $";
  #endif
  
***************
*** 168,171 ****
--- 168,172 ----
  #include "xbm/unconst_move.xbm"
  #include "xbm/edit.xbm"
+ #include "xbm/intr.xbm"
  
  #include "xbm/rotate_0.xbm"
***************
*** 203,206 ****
--- 204,209 ----
  Pixmap	moveModePixmap[MAXMOVEMODES];
  Pixmap	editPixmap;
+ Pixmap	intrPixmap;
+ 
  Pixmap	rotatePixmap[4];
  Pixmap	whereToPrintPixmap[MAXWHERETOPRINT];
***************
*** 557,560 ****
--- 560,566 ----
           edit_bits, edit_width, edit_height);
  
+    intrPixmap = XCreateBitmapFromData (mainDisplay, mainWindow,
+          intr_bits, intr_width, intr_height);
+ 
     rotatePixmap[0] = XCreateBitmapFromData (mainDisplay, mainWindow,
           rotate_0_bits, rotate_0_width, rotate_0_height);
***************
*** 694,697 ****
--- 700,704 ----
        XFreePixmap (mainDisplay, moveModePixmap[i]);
     XFreePixmap (mainDisplay, editPixmap);
+    XFreePixmap (mainDisplay, intrPixmap);
     for (i = 0; i < 4; i++)
        XFreePixmap (mainDisplay, rotatePixmap[i]);
*** select.c.orig	Wed Jan  6 22:07:52 1993
--- select.c	Wed Jan  6 22:07:54 1993
***************
*** 25,29 ****
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/select.c,v 2.70.1.5 1992/12/06 23:53:20 william Exp $";
  #endif
  
--- 25,29 ----
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/select.c,v 2.70.1.7 1993/01/03 23:45:28 william Exp $";
  #endif
  
***************
*** 66,71 ****
  struct VSelRec	* topVSel = NULL, * botVSel = NULL;
  
- static struct SelRec	* topCutSel = NULL, * botCutSel = NULL;
- 
  void CalcBBox (X1, Y1, X2, Y2, LtX, LtY, RbX, RbY)
     int X1, Y1, X2, Y2, * LtX, * LtY, * RbX, * RbY;
--- 66,69 ----
***************
*** 1320,1327 ****
  {
     register char	* c_ptr, * buf_ptr;
!    char			* start_ptr, * new_c_ptr;
     char			buf[MAXSTRING+1], * cmd, * cmd_ptr;
!    int			cur_size=2*MAXSTRING, count=0, cmd_len=0;
     struct AttrRec	* attr_ptr;
  
     cmd = (char *) calloc (cur_size+1, sizeof(char));
--- 1318,1327 ----
  {
     register char	* c_ptr, * buf_ptr;
!    char			* new_c_ptr;
     char			buf[MAXSTRING+1], * cmd, * cmd_ptr;
!    int			cur_size=2*MAXSTRING, count=0, cmd_len=0, n;
!    int			first_time=TRUE;
     struct AttrRec	* attr_ptr;
+    struct StrRec	* str_ptr;
  
     cmd = (char *) calloc (cur_size+1, sizeof(char));
***************
*** 1328,1392 ****
     cmd_ptr = cmd;
     buf_ptr = buf;
!    for (start_ptr = c_ptr = launch_attr->s; *c_ptr != '\0'; c_ptr++, count++)
     {
!       switch (*c_ptr)
        {
!          case '\\':
!             c_ptr++;
!             *buf_ptr++ = *c_ptr;
!             break;
!          case '$':
!             if (count != 0)
!             {
!                *buf_ptr = '\0';
                 if (count+cmd_len >= cur_size)
                 {
!                   int	n=cmd_ptr-cmd;
!  
                    cur_size += MAXSTRING;
!                   cmd = (char *) realloc (cmd, (cur_size+1)*sizeof(char));
                    cmd_ptr = cmd+n;
                 }
!                strcpy (cmd_ptr, buf);
                 cmd_ptr += count;
!                count = 0;
!                buf_ptr = buf;
!             }
!             if ((attr_ptr = ValidAttrArg (c_ptr, obj_ptr, &new_c_ptr)) == NULL)
!             {
!                cfree (cmd);
!                return;
!             }
!             count = strlen (attr_ptr->s);
!             if (count+cmd_len >= cur_size)
!             {
!                int	n=cmd_ptr-cmd;
!  
!                cur_size += MAXSTRING;
!                cmd = (char *) realloc (cmd, (cur_size+1)*sizeof(char));
!                cmd_ptr = cmd+n;
!             }
!             strcpy (cmd_ptr, attr_ptr->s);
!             cmd_ptr += count;
!             count = -1;
!             c_ptr = new_c_ptr;
!             break;
!          default:
!             *buf_ptr++ = *c_ptr;
!             break;
        }
!    }
!    if (count != 0)
!    {
!       *buf_ptr = '\0';
!       if (count+cmd_len >= cur_size)
        {
!          int	n=cmd_ptr-cmd;
! 
!          cur_size += MAXSTRING;
!          cmd = (char *) realloc (cmd, (cur_size+1)*sizeof(char));
!          cmd_ptr = cmd+n;
        }
!       strcpy (cmd_ptr, buf);
     }
     LaunchIt (cmd);
--- 1328,1400 ----
     cmd_ptr = cmd;
     buf_ptr = buf;
!    for (str_ptr = launch_attr->obj->detail.t->first; str_ptr != NULL;
!          str_ptr = str_ptr->next)
     {
!       if (first_time)
        {
!          first_time = FALSE;
!          c_ptr = launch_attr->s;
!       }
!       else
!          c_ptr = str_ptr->s;
! 
!       for ( ; *c_ptr != '\0'; c_ptr++, count++)
!       {
!          switch (*c_ptr)
!          {
!             case '\\': c_ptr++; *buf_ptr++ = *c_ptr; break;
!             case '$':
!                if (count != 0)
!                {
!                   *buf_ptr = '\0';
!                   if (count+cmd_len >= cur_size)
!                   {
!                      n = cmd_ptr-cmd;
!                      cur_size += MAXSTRING;
!                      cmd = (char *) realloc (cmd, (cur_size+2)*sizeof(char));
!                      cmd_ptr = cmd+n;
!                   }
!                   strcpy (cmd_ptr, buf);
!                   cmd_ptr += count;
!                   count = 0;
!                   buf_ptr = buf;
!                }
!                if ((attr_ptr = ValidAttrArg(c_ptr,obj_ptr,&new_c_ptr)) == NULL)
!                {
!                   cfree (cmd);
!                   return;
!                }
!                count = strlen (attr_ptr->s);
                 if (count+cmd_len >= cur_size)
                 {
!                   n = cmd_ptr-cmd;
                    cur_size += MAXSTRING;
!                   cmd = (char *) realloc (cmd, (cur_size+2)*sizeof(char));
                    cmd_ptr = cmd+n;
                 }
!                strcpy (cmd_ptr, attr_ptr->s);
                 cmd_ptr += count;
!                count = -1;
!                c_ptr = new_c_ptr;
!                break;
!             default: *buf_ptr++ = *c_ptr; break;
!          }
        }
!       if (count != 0)
        {
!          *buf_ptr = '\0';
!          if (count+cmd_len >= cur_size)
!          {
!             n = cmd_ptr-cmd;
!             cur_size += MAXSTRING;
!             cmd = (char *) realloc (cmd, (cur_size+2)*sizeof(char));
!             cmd_ptr = cmd+n;
!          }
!          strcpy (cmd_ptr, buf);
!          cmd_ptr += count;
!          count = 0;
!          buf_ptr = buf;
        }
!       if (str_ptr->next != NULL) { *cmd_ptr++ = ' '; *cmd_ptr = '\0'; }
     }
     LaunchIt (cmd);
*** setup.c.orig	Wed Jan  6 22:08:01 1993
--- setup.c	Wed Jan  6 22:08:02 1993
***************
*** 25,29 ****
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/setup.c,v 2.100.2.3 1992/11/29 23:59:22 william Exp $";
  #endif
  
--- 25,29 ----
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/setup.c,v 2.100.2.9 1993/01/04 02:51:43 william Exp $";
  #endif
  
***************
*** 165,169 ****
  short	handleSize=3;
  
! static Window	dummyWindow1, dummyWindow2;
  
  static Atom	protocolAtom;
--- 165,169 ----
  short	handleSize=3;
  
! Window	dummyWindow1, dummyWindow2;
  
  static Atom	protocolAtom;
***************
*** 276,280 ****
           Msg (msg);
        }
!       XFree (c_ptr);
     }
  
--- 276,280 ----
           Msg (msg);
        }
!       XFree ((void *)c_ptr);
     }
  
***************
*** 346,350 ****
                 titleWindowH+choiceWindowH+rulerW+drawWinH+8*brdrW, hSBarW,
                 scrollBarW);
!          XMoveWindow (mainDisplay, dummyWindow1, drawWinW+rulerW+4*brdrW,
              titleWindowH+choiceWindowH+rulerW+drawWinH+8*brdrW);
        }
--- 346,350 ----
                 titleWindowH+choiceWindowH+rulerW+drawWinH+8*brdrW, hSBarW,
                 scrollBarW);
!          XMoveWindow (mainDisplay, dummyWindow2, drawWinW+rulerW+4*brdrW,
              titleWindowH+choiceWindowH+rulerW+drawWinH+8*brdrW);
        }
***************
*** 597,600 ****
--- 597,604 ----
           groupedTextEditable = TRUE;
     }
+    intrCheckInterval = 10;
+    if ((c_ptr = XGetDefault (mainDisplay, TOOL_NAME,
+          "IntrCheckInterval")) != NULL)
+       intrCheckInterval = atoi (c_ptr);
  
     strcpy (scanFileName, "No File");
***************
*** 806,810 ****
     }
  
!    if ((dummyWindow1 = XCreateSimpleWindow (mainDisplay, mainWindow,
           rulerW+drawWinW+4*brdrW,
           titleWindowH+choiceWindowH+rulerW+drawWinH+8*brdrW,
--- 810,814 ----
     }
  
!    if ((dummyWindow2 = XCreateSimpleWindow (mainDisplay, mainWindow,
           rulerW+drawWinW+4*brdrW,
           titleWindowH+choiceWindowH+rulerW+drawWinH+8*brdrW,
***************
*** 812,816 ****
     { fprintf (stderr, "Could not create dummy window!\n"); exit(1); }
  
!    if ((dummyWindow2 = XCreateSimpleWindow (mainDisplay, mainWindow, 0,
           titleWindowH+choiceWindowH+4*brdrW, rulerW, rulerW,
           brdrW, myBorderPixel, myBgPixel)) == 0) 
--- 816,820 ----
     { fprintf (stderr, "Could not create dummy window!\n"); exit(1); }
  
!    if ((dummyWindow1 = XCreateSimpleWindow (mainDisplay, mainWindow, 0,
           titleWindowH+choiceWindowH+4*brdrW, rulerW, rulerW,
           brdrW, myBorderPixel, myBgPixel)) == 0) 
***************
*** 897,900 ****
--- 901,906 ----
        XMapWindow (mainDisplay, hSBarWindow);
        XSelectInput (mainDisplay, hSBarWindow, ButtonPressMask | ExposureMask);
+       XMapWindow (mainDisplay, dummyWindow1);
+       XSelectInput (mainDisplay, dummyWindow1, ButtonPressMask | ExposureMask);
     }
  #else
***************
*** 933,936 ****
--- 939,944 ----
        XSelectInput (mainDisplay, hSBarWindow, ButtonPressMask | ExposureMask);
        XMapWindow (mainDisplay, hSBarWindow);
+       XSelectInput (mainDisplay, dummyWindow1, ButtonPressMask | ExposureMask);
+       XMapWindow (mainDisplay, dummyWindow1);
     }
  #endif
***************
*** 938,942 ****
     if (!canvasWindowOnly)
     {
-       XMapWindow (mainDisplay, dummyWindow1);
        XMapWindow (mainDisplay, dummyWindow2);
     }
--- 946,949 ----
*** special.c.orig	Wed Jan  6 22:08:07 1993
--- special.c	Wed Jan  6 22:08:08 1993
***************
*** 25,29 ****
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/special.c,v 2.60 1992/03/31 07:56:57 william Exp $";
  #endif
  
--- 25,29 ----
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/special.c,v 2.60.1.1 1992/12/22 04:34:08 william Exp $";
  #endif
  
***************
*** 248,252 ****
--- 248,254 ----
           MoveObj (ObjPtr, grid_dx, grid_dy);
           numRedrawBBox = 0;
+          ShowInterrupt ();
           DrawObj (drawWindow, ObjPtr);
+          HideInterrupt ();
        }
        else if (input.type == MotionNotify)
*** stk.c.orig	Wed Jan  6 22:08:12 1993
--- stk.c	Wed Jan  6 22:08:13 1993
***************
*** 25,29 ****
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/stk.c,v 2.37.1.2 1992/10/21 05:00:55 william Exp $";
  #endif
  
--- 25,29 ----
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/stk.c,v 2.37.1.5 1992/12/22 05:43:04 william Exp $";
  #endif
  
***************
*** 81,85 ****
     int			read_status, short_name;
     FILE			* fp;
!    int			tmp_linenum;
     char			tmp_filename[MAXPATHLENGTH];
  
--- 81,85 ----
     int			read_status, short_name;
     FILE			* fp;
!    int			tmp_linenum, interrupted;
     char			tmp_filename[MAXPATHLENGTH];
  
***************
*** 193,197 ****
--- 193,200 ----
     SetWatchCursor (mainWindow);
     numRedrawBBox = 0;
+    ShowInterrupt ();
+    interrupted = FALSE;
     while ((read_status = ReadObj (fp, &obj_ptr)) == TRUE)
+    {
        if (obj_ptr != NULL)
        {
***************
*** 198,205 ****
           AdjForOldVersion (obj_ptr);
           AddObj (NULL, topObj, obj_ptr);
!          if (PointInBBox (obj_ptr->x, obj_ptr->y, drawWinBBox) ||
!                BBoxIntersect (obj_ptr->bbox, drawWinBBox))
!             DrawObj (drawWindow, obj_ptr);
        }
  
     strcpy (scanFileName, tmp_filename);
--- 201,215 ----
           AdjForOldVersion (obj_ptr);
           AddObj (NULL, topObj, obj_ptr);
!          if (!interrupted &&
!                (PointInBBox (obj_ptr->x, obj_ptr->y, drawWinBBox) ||
!                BBoxIntersect (obj_ptr->bbox, drawWinBBox)))
!          {
!             if (!DrawObj (drawWindow, obj_ptr)) interrupted = TRUE;
!             if (CheckInterrupt ()) interrupted = TRUE;
!          }
        }
+    }
+    if (interrupted) Msg ("User interrupt.  Drawing aborted.");
+    HideInterrupt ();
  
     strcpy (scanFileName, tmp_filename);
*** text.c.orig	Wed Jan  6 22:08:21 1993
--- text.c	Wed Jan  6 22:08:24 1993
***************
*** 25,29 ****
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/text.c,v 2.110 1992/10/21 05:14:30 william Exp $";
  #endif
  
--- 25,29 ----
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/text.c,v 2.111 1992/12/20 01:34:19 william Exp $";
  #endif
  
***************
*** 1969,1972 ****
--- 1969,1974 ----
     ScrollTo (textCurX, textCurY);
  }
+ 
+ #define TGIF_HEADER 0x80
   
  static XComposeStatus	c_stat;
***************
*** 1975,1981 ****
     XEvent	* input;
  {
!    char			s[80];
!    XKeyEvent		* key_ev;
!    KeySym		key_sym;
  
     if (input->type == ButtonPress)
--- 1977,1983 ----
     XEvent	* input;
  {
!    char		s[80];
!    XKeyEvent	* key_ev;
!    KeySym	key_sym;
  
     if (input->type == ButtonPress)
***************
*** 1984,1987 ****
--- 1986,2027 ----
     {
        if (!textCursorShown) return;
+ 
+       if (pasteInDrawTextMode)
+       {
+          char	* c_ptr, * cut_buffer;
+          int	len;
+ 
+          pasteInDrawTextMode = FALSE;
+          cut_buffer = (char *) XFetchBytes (mainDisplay, &len);
+          if (len == 0) { Msg ("Cut buffer is empty."); return; }
+ 
+          if (escPressed)
+          {
+             escPressed = FALSE;
+             Msg ("An <ESC> key press is ignored.");
+          }
+          s[1] = '\0';
+          EraseTextCursor ();
+          for (c_ptr = cut_buffer; *c_ptr != '\0'; c_ptr++)
+          {
+             s[0] = *c_ptr;
+             switch (s[0])
+             {
+                case '\r':
+                case '\n': HandleCRLF (colorIndex); break;
+ 
+                case '\177': Msg ("Can not paste <DEL>."); break;
+                case '\b': Msg ("Can not paste <BS>."); break;
+                case '\033': Msg ("Can not paste <ESC>."); break;
+                case '\t': Msg ("Can not paste <TAB>."); break;
+ 
+                default: HandleChar (s, colorIndex); break;
+             }
+          }
+          PutTextCursor ();
+          MarkRulers (textCurX, textCurY);
+          SetFileModified (TRUE);
+          return;
+       }
  
        key_ev = &(input->xkey);
*** xbitmap.c.orig	Wed Jan  6 22:08:31 1993
--- xbitmap.c	Wed Jan  6 22:08:33 1993
***************
*** 25,29 ****
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/xbitmap.c,v 2.116 1992/11/24 06:02:46 william Exp $";
  #endif
  
--- 25,29 ----
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/xbitmap.c,v 2.117 1993/01/03 22:51:20 william Exp $";
  #endif
  
***************
*** 2373,2379 ****
     xbm_ptr->cached_zoom = 0;
     if (xbm_ptr->data != NULL) cfree (xbm_ptr->data);
     if (xbm_ptr->real_type == XBM_EPS)
     {
-       if (xbm_ptr->filename != NULL) cfree (xbm_ptr->filename);
        for (i = 0; i < xbm_ptr->num_epsf_lines; i++)
           if (xbm_ptr->epsflines[i] != NULL)
--- 2373,2379 ----
     xbm_ptr->cached_zoom = 0;
     if (xbm_ptr->data != NULL) cfree (xbm_ptr->data);
+    if (xbm_ptr->filename != NULL) cfree (xbm_ptr->filename);
     if (xbm_ptr->real_type == XBM_EPS)
     {
        for (i = 0; i < xbm_ptr->num_epsf_lines; i++)
           if (xbm_ptr->epsflines[i] != NULL)
*** xpixmap.c.orig	Wed Jan  6 22:08:40 1993
--- xpixmap.c	Wed Jan  6 22:08:42 1993
***************
*** 25,29 ****
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/xpixmap.c,v 2.119 1992/11/26 23:48:45 william Exp $";
  #endif
  
--- 25,29 ----
  #ifndef lint
  static char RCSid[] =
!       "@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/xpixmap.c,v 2.120 1992/12/18 05:34:11 william Exp $";
  #endif
  
***************
*** 935,942 ****
              fprintf (FP, "%c", hexValue[(pixel_index>>4)&0x0f]);
              fprintf (FP, "%c", hexValue[pixel_index&0x0f]);
!             if (col%36 == 35) fprintf (FP, "\n   ");
           }
           if (col%36 != 0) fprintf (FP, "\n");
!          if (row != image_h-1) fprintf (FP, "   ");
        }
     }
--- 935,944 ----
              fprintf (FP, "%c", hexValue[(pixel_index>>4)&0x0f]);
              fprintf (FP, "%c", hexValue[pixel_index&0x0f]);
!             if (col%36 == 35)
!                fprintf (FP, "\n%s",
!                      (col==image_w-1 && row==image_h-1) ? "" : "   ");
           }
           if (col%36 != 0) fprintf (FP, "\n");
!          if (row != image_h-1 && (col%36) != 0) fprintf (FP, "   ");
        }
     }
*** copypaste.e.orig	Wed Jan  6 22:08:44 1993
--- copypaste.e	Wed Jan  6 22:08:45 1993
***************
*** 24,28 ****
   * Copyright (C) 1990, 1991, 1992, William Cheng.
   *
!  * @(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/copypaste.e,v 2.6 1992/03/31 07:59:57 william Exp $
   */
  
--- 24,28 ----
   * Copyright (C) 1990, 1991, 1992, William Cheng.
   *
!  * @(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/copypaste.e,v 2.7 1992/12/20 00:54:04 william Exp $
   */
  
***************
*** 30,33 ****
  
  extern void	CopyToCutBuffer ();
! extern void	PasteFromCutBuffer ();
  extern void	CleanUpCutBuffer ();
--- 30,33 ----
  
  extern void	CopyToCutBuffer ();
! extern int	PasteFromCutBuffer ();
  extern void	CleanUpCutBuffer ();
*** drawing.e.orig	Wed Jan  6 22:08:47 1993
--- drawing.e	Wed Jan  6 22:08:48 1993
***************
*** 23,29 ****
   * PERFORMANCE OF THIS SOFTWARE.
   *
!  * @(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/drawing.e,v 2.9 1992/08/11 03:58:27 william Exp $
   */
  
  extern int	numRedrawBBox;
  extern int	numClipRecs;
--- 23,31 ----
   * PERFORMANCE OF THIS SOFTWARE.
   *
!  * @(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/drawing.e,v 2.14 1992/12/21 00:51:44 william Exp $
   */
  
+ extern int	intrCheckInterval;
+ extern int	pasteInDrawTextMode;
  extern int	numRedrawBBox;
  extern int	numClipRecs;
***************
*** 33,37 ****
  extern void	SetDefaultDrawWinClipRecs ();
  extern void	SetDefaultIconWinClipRecs ();
! extern void	DrawObj ();
  extern void	DrawPaperBoundary ();
  extern void	RedrawAnArea ();
--- 35,43 ----
  extern void	SetDefaultDrawWinClipRecs ();
  extern void	SetDefaultIconWinClipRecs ();
! extern void	ShowInterrupt ();
! extern void	HideInterrupt ();
! extern void	RedrawDummyWindow1 ();
! extern int	CheckInterrupt ();
! extern int	DrawObj ();
  extern void	DrawPaperBoundary ();
  extern void	RedrawAnArea ();
*** raster.e.orig	Wed Jan  6 22:08:52 1993
--- raster.e	Wed Jan  6 22:08:52 1993
***************
*** 23,27 ****
   * PERFORMANCE OF THIS SOFTWARE.
   *
!  * @(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/raster.e,v 2.24 1992/03/31 08:02:16 william Exp $
   */
  
--- 23,27 ----
   * PERFORMANCE OF THIS SOFTWARE.
   *
!  * @(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/raster.e,v 2.25 1992/12/21 00:25:13 william Exp $
   */
  
***************
*** 55,58 ****
--- 55,59 ----
  extern Pixmap	moveModePixmap[];
  extern Pixmap	editPixmap;
+ extern Pixmap	intrPixmap;
  
  extern Pixmap	rotatePixmap[];
*** setup.e.orig	Wed Jan  6 22:08:55 1993
--- setup.e	Wed Jan  6 22:08:55 1993
***************
*** 23,27 ****
   * PERFORMANCE OF THIS SOFTWARE.
   *
!  * @(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/setup.e,v 2.13 1992/03/31 08:02:48 william Exp $
   */
  
--- 23,27 ----
   * PERFORMANCE OF THIS SOFTWARE.
   *
!  * @(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/setup.e,v 2.14 1992/12/21 00:20:18 william Exp $
   */
  
***************
*** 64,67 ****
--- 64,68 ----
  extern Window	iconWindow;
  extern Window	iconBaseWindow;
+ extern Window	dummyWindow1, dummyWindow2;
  
  extern int	paperWidth;
*** patchlevel.h.orig	Wed Jan  6 22:08:58 1993
--- patchlevel.h	Wed Jan  6 22:08:59 1993
***************
*** 23,28 ****
   * PERFORMANCE OF THIS SOFTWARE.
   *
!  * @(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/patchlevel.h,v 2.29.1.4 1992/11/29 01:49:45 william Exp $
   */
  
! #define TGIF_PATCHLEVEL 15
--- 23,28 ----
   * PERFORMANCE OF THIS SOFTWARE.
   *
!  * @(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/patchlevel.h,v 2.29.1.5 1992/12/14 06:33:01 william Exp $
   */
  
! #define TGIF_PATCHLEVEL 16
*** types.h.orig	Wed Jan  6 22:09:02 1993
--- types.h	Wed Jan  6 22:09:03 1993
***************
*** 23,27 ****
   * PERFORMANCE OF THIS SOFTWARE.
   *
!  * @(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/types.h,v 2.71 1992/08/08 08:27:29 william Exp $
   */
  
--- 23,27 ----
   * PERFORMANCE OF THIS SOFTWARE.
   *
!  * @(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/types.h,v 2.71.1.1 1993/01/03 23:23:40 william Exp $
   */
  
***************
*** 78,82 ****
     int			n;	/* number of points in the polyline */
     XPoint		* vlist;
-    XPoint		* rvlist; /* rotated vlist */
     int			sn;	/* number of points in the spline polyline */
     XPoint		* svlist;
--- 78,81 ----
***************
*** 89,93 ****
     int			n;	/* number of points in the polygon */
     XPoint		* vlist;
-    XPoint		* rvlist; /* rotated vlist */
     int			sn;	/* number of points in the spline polygon */
     XPoint		* svlist;
--- 88,91 ----
***************
*** 97,101 ****
  typedef struct BoxRec {
     int		fill, width, pen, dash;
-    XPoint	* rvlist; /* rotated vlist */
  } * BoxRecPtr;
  
--- 95,98 ----
***************
*** 179,183 ****
  typedef struct RCBoxRec {
     int		fill, width, pen, dash, radius;
-    XPoint	* rvlist; /* rotated vlist */
  } * RCBoxRecPtr;
  
--- 176,179 ----
*** Makefile.noimake.orig	Wed Jan  6 22:09:06 1993
--- Makefile.noimake	Wed Jan  6 22:09:08 1993
***************
*** 23,27 ****
  # PERFORMANCE OF THIS SOFTWARE.
  #
! # @(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/Makefile.noimake,v 2.131.1.8 1992/11/29 07:09:55 william Exp $
  #
  
--- 23,27 ----
  # PERFORMANCE OF THIS SOFTWARE.
  #
! # @(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/Makefile.noimake,v 2.131.1.12 1993/01/03 01:48:39 william Exp $
  #
  
***************
*** 157,160 ****
--- 157,161 ----
  	\
  	xbm/rcbradius.xbm xbm/const_move.xbm xbm/unconst_move.xbm \
+ 	xbm/edit.xbm xbm/intr.xbm \
  	\
  	xbm/rotate_0.xbm xbm/rotate_90.xbm xbm/rotate_180.xbm xbm/rotate_270.xbm
***************
*** 212,217 ****
  		select.e setup.e text.e xpixmap.e
  copypaste.o:	const.h types.h \
! 		auxtext.e box.e choice.e cmd.e color.e cursor.e dup.e file.e \
! 		font.e move.e obj.e pattern.e select.e setup.e special.e text.e
  cursor.o:	const.h types.h $(CURSOR_BM) \
  		choice.e color.e setup.e xbitmap.e
--- 213,219 ----
  		select.e setup.e text.e xpixmap.e
  copypaste.o:	const.h types.h \
! 		auxtext.e box.e choice.e cmd.e color.e cursor.e drawing.e \
! 		dup.e file.e font.e move.e obj.e pattern.e select.e setup.e \
! 		special.e text.e
  cursor.o:	const.h types.h $(CURSOR_BM) \
  		choice.e color.e setup.e xbitmap.e
*** Imakefile.orig	Wed Jan  6 22:09:11 1993
--- Imakefile	Wed Jan  6 22:09:12 1993
***************
*** 23,30 ****
  /**/# PERFORMANCE OF THIS SOFTWARE.
  /**/#
! /**/# @(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/Imakefile,v 2.84.1.8 1992/12/07 00:27:40 william Exp $
  /**/#
  
! TGIFVERSION	= 2.12-p15
  PROGRAMS	= tgif prtgif /**/#frontend11.o testdrive
  /**/#CDEBUGFLAGS= -g
--- 23,30 ----
  /**/# PERFORMANCE OF THIS SOFTWARE.
  /**/#
! /**/# @(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/Imakefile,v 2.84.1.9 1992/12/21 01:46:05 william Exp $
  /**/#
  
! TGIFVERSION	= 2.12-p16
  PROGRAMS	= tgif prtgif /**/#frontend11.o testdrive
  /**/#CDEBUGFLAGS= -g
*** tgif.man.orig	Wed Jan  6 22:09:17 1993
--- tgif.man	Wed Jan  6 22:09:20 1993
***************
*** 1,4 ****
! .\"@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/tgif.man,v 2.132 1992/11/29 23:58:54 william Exp $
! .TH TGIF n "Version 2.12-p15 and Above" "Tgif"
  .SH NAME
  \fItgif\fR \- Xlib based interactive 2-D drawing facility under X11.
--- 1,4 ----
! .\"@(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/tgif.man,v 2.136 1992/12/22 05:36:07 william Exp $
! .TH TGIF n "Version 2.12-p16 and Above" "Tgif"
  .SH NAME
  \fItgif\fR \- Xlib based interactive 2-D drawing facility under X11.
***************
*** 423,426 ****
--- 423,437 ----
  units any more.
  .TP
+ .I Interrupt Window
+ .br
+ This window is right below the Message Window and to the left of the
+ horizontal ruler.  When the Tgif*IntrCheckInterval X default has a
+ positive value, an interrupt icon is visible when the Canvas Window
+ is being redrawn.  If the user clicks on this window when the
+ interrupt icon is visible, tgif aborts the repainting of the objects.
+ If this is done when a file is being opened (either through Open()
+ or Push()), the drawing of objects is stopped, but the reading of
+ the file continues (reading of the file is not aborted).
+ .TP
  .I Popup Menus
  .br
***************
*** 1251,1254 ****
--- 1262,1270 ----
  (which is 128/72).
  The default value is 1.
+ .TP
+ .I Tgif*IntrCheckInterval: NUMBER
+ This specifies the number of objects drawn before tgif checks for
+ interrupts.  If this is set to be 0 or less, interrupt is not allowed.
+ The default value is 10.
  .TP
  .I Tgif*MaxColors: NUMBER
*** HISTORY.orig	Wed Jan  6 22:09:28 1993
--- HISTORY	Wed Jan  6 22:09:29 1993
***************
*** 1,5 ****
  /*
!  *  @(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/HISTORY,v 2.39 1992/12/07 00:58:38 william Exp $
   */
  -----------------------> tgif-2.12-p14 => tgif-2.12-p15 <-----------------------
  I've just put tgif-2.12-patch15 (15 patch for tgif-2.12) in the
--- 1,26 ----
  /*
!  *  @(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/HISTORY,v 2.40 1993/01/04 01:06:09 william Exp $
   */
+ -----------------------> tgif-2.12-p15 => tgif-2.12-p16 <-----------------------
+ I've just put tgif-2.12-patch16 (16 patch for tgif-2.12) in the
+ following places for anonymous ftp:
+ 
+ 	export.lcs.mit.edu:/contrib/tgif-2.12-patch16.Z
+ 	cs.ucla.edu:/pub/tgif/tgif-2.12-patch16.Z
+ 
+ The patch is also posted to comp.sources.bugs.
+ 
+ Please uncompress and then apply the patch with
+ 'patch -p -N < tgif-2.12-patch16'.
+ Here's a short list of added features/bug fixes.
+ 
+ 1)  Allow the launch= attribute to be multiline.
+ 2)  Make pasting work in text mode.  The default paste command is still
+     <Cntrl><Meta>y.
+ 3)  Add user interrupt when redrawing.  Add a new X default,
+     Tgif*IntrCheckInterval to define the number of objects drawn before
+     checking for user interrupt.
+ 4)  Fix some memory leaks.  Thanks to Mark Sterin <mark@FibHaifa.com> for
+     the fixes.
  -----------------------> tgif-2.12-p14 => tgif-2.12-p15 <-----------------------
  I've just put tgif-2.12-patch15 (15 patch for tgif-2.12) in the
*** descrip.mms.orig	Wed Jan  6 22:09:33 1993
--- descrip.mms	Wed Jan  6 22:09:34 1993
***************
*** 6,10 ****
  ! $ DEFINE SYS SYS$LIBRARY
  !
! ! @(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/descrip.mms,v 2.124.1.6 1992/11/29 07:09:55 william Exp $
  !
  
--- 6,10 ----
  ! $ DEFINE SYS SYS$LIBRARY
  !
! ! @(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/descrip.mms,v 2.124.1.10 1993/01/03 01:49:13 william Exp $
  !
  
***************
*** 132,135 ****
--- 132,136 ----
  	-
  	xbm/rcbradius.xbm,xbm/const_move.xbm,xbm/unconst_move.xbm,-
+ 	xbm/edit.xbm,xbm/intr.xbm,-
  	-
  	xbm/rotate_0.xbm,xbm/rotate_90.xbm,xbm/rotate_180.xbm,xbm/rotate_270.xbm
***************
*** 186,191 ****
  		select.e,setup.e,text.e,xpixmap.e
  copypaste.obj depends_on copypaste.c,	const.h,types.h,-
! 		auxtext.e,box.e,choice.e,cmd.e,color.e,cursor.e,dup.e,file.e,-
! 		font.e,move.e,obj.e,pattern.e,select.e,setup.e,special.e,text.e
  cursor.obj depends_on cursor.c,		const.h,types.h,$(CURSOR_BM),-
  		choice.e,color.e,setup.e,xbitmap.e
--- 187,193 ----
  		select.e,setup.e,text.e,xpixmap.e
  copypaste.obj depends_on copypaste.c,	const.h,types.h,-
! 		auxtext.e,box.e,choice.e,cmd.e,color.e,cursor.e,drawing.e,-
! 		dup.e,file.e,font.e,move.e,obj.e,pattern.e,select.e,setup.e,-
! 		special.e,text.e
  cursor.obj depends_on cursor.c,		const.h,types.h,$(CURSOR_BM),-
  		choice.e,color.e,setup.e,xbitmap.e
*** xbm/intr.xbm.orig	Wed Jan  6 22:09:36 1993
--- xbm/intr.xbm	Wed Jan  6 22:09:37 1993
***************
*** 0 ****
--- 1,11 ----
+ /*
+  * @(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/xbm/RCS/intr.xbm,v 2.0 1992/12/21 02:19:11 william Exp $
+  */
+ #define intr_width 16
+ #define intr_height 16
+ #define intr_x_hot 0
+ #define intr_y_hot 0
+ static char intr_bits[] = {
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xe0,
+    0x00, 0xf8, 0x00, 0xf0, 0xc0, 0xf9, 0xe0, 0x99, 0xe0, 0x0d, 0xb0, 0x0f,
+    0x98, 0x07, 0x9c, 0x03, 0x0c, 0x00, 0x00, 0x00};
*** tgif.Xdefaults.orig	Wed Jan  6 22:09:39 1993
--- tgif.Xdefaults	Wed Jan  6 22:09:39 1993
***************
*** 3,7 ****
  ! suitable for appending to any .Xdefaults file.
  !
! ! @(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/tgif.Xdefaults,v 2.30 1992/11/24 03:51:15 william Exp $
  !
  Tgif*Geometry:			640x512-40+20
--- 3,7 ----
  ! suitable for appending to any .Xdefaults file.
  !
! ! @(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/tgif.Xdefaults,v 2.32 1992/12/21 01:36:41 william Exp $
  !
  Tgif*Geometry:			640x512-40+20
***************
*** 86,89 ****
--- 86,90 ----
  Tgif*DefaultEPSScaling:		1
  !Tgif*DefaultEPSScaling:	1.7778
+ Tgif*IntrCheckInterval:		10
  !
  Tgif*MaxColors:			11
*** launch-demo-1.obj.orig	Wed Jan  6 22:09:41 1993
--- launch-demo-1.obj	Wed Jan  6 22:09:42 1993
***************
*** 1,6 ****
! %TGIF 2.12-p15
  state(0,27,100,0,0,0,8,1,0,2,0,0,0,1,0,1,0,0,0,3,1,0,0,10,0,0,1,1,0,16,1).
  %
! % @(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/launch-demo-1.obj,v 2.0 1992/12/07 00:24:47 william Exp $
  % %W%
  %
--- 1,6 ----
! %TGIF 2.12-p16
  state(0,27,100,0,0,0,8,1,0,2,0,0,0,1,0,1,0,0,0,3,1,0,0,10,0,0,1,1,0,16,1).
  %
! % @(#)$Header: /amnt/kona/tangram/u/william/X11/TGIF2/RCS/launch-demo-1.obj,v 2.1 1993/01/04 02:28:39 william Exp $
  % %W%
  %
***************
*** 34,46 ****
  ]).
  group([
! text('green',88,320,0,0,3,7,0,0,1,292,166,648,1,18,4,0,2,0,0,[
  	"To get a fancier look.  Select an",
  	"object and type <Meta>m.",
! 	"Then use left button to get a popup",
! 	"menu; select an attribute; click right",
! 	"button to hide the attribute or click",
! 	"the middle button to hide the attribute",
  	"name."]),
! text('green',64,320,0,0,3,1,0,0,1,16,22,649,1,18,4,0,0,0,0,[
  	"3)"])
  ],
--- 34,47 ----
  ]).
  group([
! text('green',88,312,0,0,3,8,0,0,1,246,190,648,1,18,4,0,2,0,0,[
  	"To get a fancier look.  Select an",
  	"object and type <Meta>m.",
! 	"Then use left button to get a",
! 	"popup menu; select an attribute;",
! 	"click right button to hide the",
! 	"attribute or click the middle",
! 	"button to hide the attribute",
  	"name."]),
! text('green',64,312,0,0,3,1,0,0,1,16,22,649,1,18,4,0,0,0,0,[
  	"3)"])
  ],
***************
*** 84,86 ****
--- 85,132 ----
  text('blue',512,128,2,0,5,1,1,0,1,166,29,54,0,24,5,0,0,0,0,[
  	"name=example"]))
+ ]).
+ group([
+ polygon('cyan',5,[
+ 	502,448,493,480,547,480,556,448,502,448],2,1,0,0,1465,0,0,0,[
+ ]),
+ polygon('cyan',5,[
+ 	493,480,484,512,538,512,547,480,493,480],2,1,0,0,1466,0,0,0,[
+ ]),
+ poly('cyan',2,[
+ 	502,448,556,448],0,1,1,1467,0,0,0,0,8,3,0,[
+ ]),
+ poly('cyan',2,[
+ 	484,512,538,512],0,1,1,1468,0,0,0,0,8,3,0,[
+ ]),
+ poly('cyan',3,[
+ 	502,448,484,464,493,480],0,1,1,1469,1,2,0,0,8,3,0,[
+ ]),
+ poly('cyan',3,[
+ 	484,512,502,496,493,480],0,1,1,1470,1,2,0,0,8,3,0,[
+ ]),
+ poly('cyan',3,[
+ 	556,448,538,464,547,480],0,1,1,1471,1,2,0,0,8,3,0,[
+ ]),
+ poly('cyan',3,[
+ 	538,512,556,496,547,480],0,1,1,1472,1,2,0,0,8,3,0,[
+ ])
+ ],
+ 1464,0,[
+ attr("page=", "1", 1, 1, 0,
+ text('magenta',520,452,2,2,5,1,1,0,1,82,29,1473,0,24,5,0,0,0,0,[
+ 	"page=1"])),
+ attr("dir=", "/u/tangram/u/william/X11/TGIF2", 1, 1, 0,
+ text('yellow',520,512,0,0,3,1,1,0,1,289,22,1474,1,18,4,0,0,0,0,[
+ 	"dir=/u/tangram/u/william/X11/TGIF2"])),
+ attr("launch=", "cd $(dir);", 1, 1, 0,
+ text('yellow',512,384,0,0,3,3,1,0,1,370,66,1475,1,18,4,0,0,0,0,[
+ 	"launch=cd $(dir);",
+ 	"dvips -N -n 1 -p $(page) $(name) > $(tmpfile);",
+ 	"xterm -geom 40x8+200+400 -e gs $(tmpfile) &"])),
+ attr("name=", "example", 1, 1, 0,
+ text('green',524,476,2,0,5,1,1,0,1,166,29,1476,0,24,5,0,0,0,0,[
+ 	"name=example"])),
+ attr("tmpfile=", "/tmp/tgif.ps", 1, 1, 0,
+ text('yellow',520,536,0,0,3,1,1,0,1,151,22,1551,1,18,4,0,0,0,0,[
+ 	"tmpfile=/tmp/tgif.ps"]))
  ]).
---------------------------------> cut here <---------------------------------
-- 
Bill Cheng // UCLA Computer Science Department // (310) 645-8328
3564-C Boelter Hall // Los Angeles, California 90024 // USA
william@CS.UCLA.EDU      ...!{uunet|ucbvax}!cs.ucla.edu!william
Technical Details
Message-ID: <1993Jan7.062750.26736@cs.ucla.edu>
Path: arc1-ca.pugleaf.net!sparky!uunet!zaphod.mps.ohio-state.edu!usc!ucla-cs!lanai.cs.ucla.edu!william

Show Full Headers
Complete Article Headers
Newsgroups: comp.sources.bugs
Path: arc1-ca.pugleaf.net!sparky!uunet!zaphod.mps.ohio-state.edu!usc!ucla-cs!lanai.cs.ucla.edu!william
From: william@lanai.cs.ucla.edu (William Cheng)
Subject: Tgif-2.12-patch16 (16th patch for tgif-2.12), Part 01/01
Message-ID: <1993Jan7.062750.26736@cs.ucla.edu>
Followup-To: william@cs.ucla.edu
Keywords: draw, postscript, latex, hierarchical, x11, xlib, wysiwyg, bitmap
Sender: usenet@cs.ucla.edu (Mr Usenet)
Nntp-Posting-Host: lanai.cs.ucla.edu
Organization: UCLA, Computer Science Department
Date: Thu, 7 Jan 93 06:27:50 GMT
Lines: 2254