Files
xtexit/xtexit.dif
2017-11-14 09:34:11 +00:00

258 lines
7.7 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
--- 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);
}