File xtexit.dif of Package xtexit

--- README.SuSE
+++ README.SuSE	2000/05/31 00:02:21
@@ -0,0 +1,52 @@
+README.SuSE for xtexit
+kfr@suse.de 7.5.96
+
+
+I changed the original program as follow:
+
+- Use the 3D Athena widgets (-lXaw3d instead of -lXaw in Makefile)
+- The program steps are:
+  1. Send all applications the WM_DELETE_WINDOW event
+  2. Pop up a dialog to ask the user to quit X-Window.
+  3. If pressed ok, kill all applications.
+- The command line options are ignored :-(
+
+The idea of this quick&dirty hack is, that the applications have a chance
+to ask you somthing befor exit really. If you are in an editor you can
+choose to save your work. If there is nothing to ask, the programms
+quit immediatly.
+
+
+Copyright Notices:
+This work is based on the work from Teemu Torma, Front End Oy.
+The original copyright is:
+
+   Copyright 1990 Front End Oy
+
+   Permission to use, copy, modify, and distribute this software and its
+   documentation for any purpose and without fee is hereby granted, provided
+   that the above copyright notice appear in all copies and that both that
+   copyright notice and this permission notice appear in supporting
+   documentation, and that the name of Front End not be used in advertising
+   or publicity pertaining to distribution of the software without specific,
+   written prior permission.  Front End makes no representations about the
+   suitability of this software for any purpose.  It is provided "as is"
+   without express or implied warranty.
+
+   FRONT END DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+   ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+   FRONT END.  BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+   ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+   IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+   OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+   Author:  Teemu Torma, Front End Oy
+            tot@frend.fi
+
+   Ported to Athena Widgets by: Paul Raines
+				raines@slac.stanford.edu
+
+This work is copyrighted by Klaus Franken, <kfr@suse.de>, 
+S.u.S.E. Gmbh, Fuerth, Germany
+
+Please feel free to send bug reports, ideas and better versions.
--- XTexit.ad
+++ XTexit.ad	2000/05/31 00:02:21
@@ -11,10 +11,11 @@
 ! We need to have some geometry here since top level shell has no kids
 ! to set it to some non-zero size.
 
-XTexit.Geometry:		180x70
+XTexit.Geometry:		280x170
 
 ! Misc resources.
 
-*fontList:			*-helvetica-bold-r-normal-*-*-140-*
+*fontList:			*-helvetica-bold-r-normal-*-*-160-*
 *foreground:			Black
-*confirmDialogShell.title:	Confirm Dialog
+*background:			Red
+*confirmDialogShell.title:	Exit X-Window ?
--- xtexit.c
+++ xtexit.c	2000/05/31 00:02:21
@@ -54,7 +54,7 @@
   { Nlevels, CLevels, XtRInt, sizeof (int),
       XtOffset (XTexit, levels), XtRImmediate, (caddr_t) 0 },
   { Ntext, CText, XtRString, sizeof (char *),
-      XtOffset (XTexit, text), XtRString, (XtPointer) "Exit X-Windows?" },
+      XtOffset (XTexit, text), XtRString, (XtPointer) "Exit X-Window?" },
 };
 
 /* Options for us. */
@@ -319,7 +319,7 @@
 
   if (! XQueryTree (display, root, &dummy, &dummy, &kids, &num_kids))
     return;
-	    
+
   /* Add kids with WM_STATE property to window list. They are potential X
      clients.
      If not possible X client, recurse tree below it. */
@@ -344,9 +344,10 @@
 
 
 /* Kill all the clients from the X server. */
+/* kill -15 */
 
 static void
-KillClients (xtexit)
+KillClients15 (xtexit)
      XTexit xtexit;
 {
   Display *display = xtexit->display;
@@ -386,6 +387,51 @@
   for (count = 0; count < xtexit->last_window; count ++)
     KillApplication (xtexit, xtexit->window_list[count], False);
 
+}
+
+
+/* Kill all the clients from the X server. */
+/* kill -9 */
+
+static void
+KillClients9 (xtexit)
+     XTexit xtexit;
+{
+  Display *display = xtexit->display;
+  int screen, count;
+
+
+  for (screen = 0; screen < ScreenCount (display); screen ++)
+
+  /* Intern atoms we need. */
+
+  WmState = XInternAtom (display, "WM_STATE", False);
+  WmProtocols = XInternAtom (display, "WM_PROTOCOLS", False);
+  WmDeleteWindow = XInternAtom (display, "WM_DELETE_WINDOW", False);
+
+  /* Initialize window list variables in the xtexit structure. */
+
+  xtexit->window_list = (Window *) 0;
+  xtexit->window_list_size = 0;
+  xtexit->last_window = 0;
+
+  /* Ignore hangup signals.
+     If we are invoked under xterm or emacs, they will kill us when we kill
+     them. I wonder whether we should ignore also SIGTERM's.. */
+
+  signal (SIGHUP, SIG_IGN);
+
+  /* Set our own error handler that ignores BadWindow errors. */
+
+  XSetErrorHandler (ErrorHandler);
+
+  /* Read in top level windows in all screens. */
+
+  for (screen = 0; screen < ScreenCount (display); screen ++)
+    {
+      ReadWindows (xtexit, RootWindow (display, screen), 1, False);
+    }
+
   /* Remove our windows from the display.
      Just for the visual effect. */
 
@@ -398,26 +444,22 @@
   /* If we've got delay, wait that many seconds before doing force kill.
      This time, we read all the windows and do XKillClient(3X11) to them. */
 
-  if (xtexit->delay > 0)
-    {
-      sleep (xtexit->delay);
-
-      /* Remove all windows from the window list. */
+  /* Remove all windows from the window list. */
 
-      xtexit->last_window = 0;
+  xtexit->last_window = 0;
 
-      /* Read all windows into the memory and kill them. */
+  /* Read all windows into the memory and kill them. */
 
-      for (screen = 0; screen < ScreenCount (display); screen ++)
-	{
-	  ReadWindows (xtexit, RootWindow (display, screen), 1, True);
-	}
-      for (count = 0; count < xtexit->last_window; count ++)
-	KillApplication (xtexit, xtexit->window_list[count], True);
-      XSync (display, False);
-    }
+  for (screen = 0; screen < ScreenCount (display); screen ++)
+  {
+    ReadWindows (xtexit, RootWindow (display, screen), 1, True);
+  }
+  printf("Anzahl clients: %d\n", xtexit->last_window);
+  for (count = 0; count < xtexit->last_window; count ++)
+  KillApplication (xtexit, xtexit->window_list[count], True);
+  XSync (display, False);
 }
-
+  
 
 /* Confirm callback which never returns.
    This is called when use confirms  killing all applications. */
@@ -429,7 +471,7 @@
 {
   XTexit xtexit = (XTexit) closure;
 
-  KillClients (xtexit);
+  KillClients9 (xtexit);
   exit (0);
 }
 
@@ -441,7 +483,7 @@
 String *params;
 Cardinal *num_params;
 {
-  KillClients (p_xtexit);
+  KillClients9 (p_xtexit);
   exit (0);
 }
 
@@ -489,6 +531,7 @@
   XtTranslations mytranslations;
   int screen = XScreenNumberOfScreen (XtScreen (parent));
 
+
   num = 0;
   XtSetArg (args[num], XtNallowShellResize, True); num ++;
   shell = XtCreatePopupShell ("confirmDialogShell", transientShellWidgetClass,
@@ -553,6 +596,7 @@
   Widget top;
   XTexitRec xtexit;
   XtAppContext appcontext;
+  int num_clients;
 
   /* Initialize X toolkit and make top level shell.
      Move this widget to somewhere where it's not visible. */
@@ -578,17 +622,17 @@
   xtexit.top = XtWindow (top);
   xtexit.dialog = 0;
   
-  /* If we need to be confirmed, pop up confirm shell.
-     Otherwise just kill the clients. */
+  /* 1. send a "signal 15" to all clients */
+  KillClients15 (&xtexit);
 
-  if (xtexit.confirm)
-    {
-      XtAppAddActions(appcontext, window_actions, XtNumber(window_actions));
-      PopupConfirmDialog (top, &xtexit);
-      XtAppMainLoop (appcontext);
-    }
-  else
-    KillClients (&xtexit);
+  num_clients = 3;
+  if (num_clients < 3)
+    KillClients9(&xtexit);
+
+  /* 3. Dialog-Popup and send a "signal 9" to all clients */
+  XtAppAddActions(appcontext, window_actions, XtNumber(window_actions));
+  PopupConfirmDialog (top, &xtexit);
+  XtAppMainLoop (appcontext);
 
   exit (0);
 }
openSUSE Build Service is sponsored by