diff options
author | faith <faith> | 2000-01-06 12:56:54 +0000 |
---|---|---|
committer | faith <faith> | 2000-01-06 12:56:54 +0000 |
commit | ac92f536404367c9977f8ae8fb7a3eee0242334e (patch) | |
tree | f7df43d396cf6739e97230eae89780109427b99a /xc/programs/xdm/reset.c | |
parent | 11c6e363cc4cda0e9d64c8ba09b7d12dc796d6d0 (diff) |
Import of XFree86 3.9.17
Diffstat (limited to 'xc/programs/xdm/reset.c')
-rw-r--r-- | xc/programs/xdm/reset.c | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/xc/programs/xdm/reset.c b/xc/programs/xdm/reset.c new file mode 100644 index 000000000..1eaba9170 --- /dev/null +++ b/xc/programs/xdm/reset.c @@ -0,0 +1,111 @@ +/* $TOG: reset.c /main/12 1998/02/09 13:56:00 kaleb $ */ +/* + +Copyright 1988, 1998 The Open Group + +All Rights Reserved. + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ +/* $XFree86: xc/programs/xdm/reset.c,v 1.2 1998/10/10 15:25:37 dawes Exp $ */ + +/* + * xdm - display manager daemon + * Author: Keith Packard, MIT X Consortium + * + * pseudoReset -- pretend to reset the server by killing all clients + * with windows. It will reset the server most of the time, unless + * a client remains connected with no windows. + */ + +# include "dm.h" +# include "dm_error.h" + +# include <X11/Xlib.h> +# include <signal.h> + +/*ARGSUSED*/ +static int +ignoreErrors (Display *dpy, XErrorEvent *event) +{ + Debug ("ignoring error\n"); + return 0; +} + +/* + * this is mostly bogus -- but quite useful. I wish the protocol + * had some way of enumerating and identifying clients, that way + * this code wouldn't have to be this kludgy. + */ + +static void +killWindows (Display *dpy, Window window) +{ + Window root, parent, *children; + int child; + unsigned int nchildren = 0; + + while (XQueryTree (dpy, window, &root, &parent, &children, &nchildren) + && nchildren > 0) + { + for (child = 0; child < nchildren; child++) { + Debug ("XKillClient 0x%lx\n", (unsigned long)children[child]); + XKillClient (dpy, children[child]); + } + XFree ((char *)children); + } +} + +static Jmp_buf resetJmp; + +/* ARGSUSED */ +static SIGVAL +abortReset (int n) +{ + Longjmp (resetJmp, 1); +} + +/* + * this display connection better not have any windows... + */ + +void +pseudoReset (Display *dpy) +{ + Window root; + int screen; + + if (Setjmp (resetJmp)) { + LogError ("pseudoReset timeout\n"); + } else { + (void) Signal (SIGALRM, abortReset); + (void) alarm (30); + XSetErrorHandler (ignoreErrors); + for (screen = 0; screen < ScreenCount (dpy); screen++) { + Debug ("pseudoReset screen %d\n", screen); + root = RootWindow (dpy, screen); + killWindows (dpy, root); + } + Debug ("before XSync\n"); + XSync (dpy, False); + (void) alarm (0); + } + Signal (SIGALRM, SIG_DFL); + XSetErrorHandler ((XErrorHandler)0 ); + Debug ("pseudoReset done\n"); +} |