- Rename README.SuSE to README.SUSE, adhering to the correct spelling (Update xtexit.dif). OBS-URL: https://build.opensuse.org/request/show/541533 OBS-URL: https://build.opensuse.org/package/show/X11:Utilities/xtexit?expand=0&rev=6
258 lines
7.7 KiB
Plaintext
258 lines
7.7 KiB
Plaintext
--- 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);
|
||
}
|