X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?p=xscreensaver;a=blobdiff_plain;f=driver%2Flock.c;h=2aa61f637daa8f9178ee7b31521651f7c9c7d57e;hp=529bf862326f597d90b395fc76be3a7bdcc11bca;hb=ffd8c0873576a9e3065696a624dce6b766b77062;hpb=6cee540bdbb571485cd5e519f89f389faebd0495 diff --git a/driver/lock.c b/driver/lock.c index 529bf862..2aa61f63 100644 --- a/driver/lock.c +++ b/driver/lock.c @@ -1,5 +1,5 @@ /* lock.c --- handling the password dialog for locking-mode. - * xscreensaver, Copyright (c) 1993-2002 Jamie Zawinski + * xscreensaver, Copyright (c) 1993-2004 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -882,6 +882,16 @@ destroy_passwd_window (saver_info *si) } +static Bool error_handler_hit_p = False; + +static int +ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error) +{ + error_handler_hit_p = True; + return 0; +} + + #ifdef HAVE_XHPDISABLERESET /* This function enables and disables the C-Sh-Reset hot-key, which normally resets the X server (logging out the logged-in user.) @@ -927,15 +937,32 @@ static void xfree_lock_grab_smasher (saver_info *si, Bool lock_p) { saver_preferences *p = &si->prefs; - int status = XF86MiscSetGrabKeysState (si->dpy, !lock_p); + int status; + + XErrorHandler old_handler; + XSync (si->dpy, False); + error_handler_hit_p = False; + old_handler = XSetErrorHandler (ignore_all_errors_ehandler); + XSync (si->dpy, False); + status = XF86MiscSetGrabKeysState (si->dpy, !lock_p); + XSync (si->dpy, False); + if (error_handler_hit_p) status = 666; + + if (!lock_p && status == MiscExtGrabStateAlready) + status = MiscExtGrabStateSuccess; /* shut up, consider this success */ if (p->verbose_p && status != MiscExtGrabStateSuccess) - fprintf (stderr, "%s: error: XF86MiscSetGrabKeysState returned %s\n", - blurb(), + fprintf (stderr, "%s: error: XF86MiscSetGrabKeysState(%d) returned %s\n", + blurb(), !lock_p, (status == MiscExtGrabStateSuccess ? "MiscExtGrabStateSuccess" : status == MiscExtGrabStateLocked ? "MiscExtGrabStateLocked" : status == MiscExtGrabStateAlready ? "MiscExtGrabStateAlready" : + status == 666 ? "an X error" : "unknown value")); + + XSync (si->dpy, False); + XSetErrorHandler (old_handler); + XSync (si->dpy, False); } #endif /* HAVE_XF86MISCSETGRABKEYSSTATE */ @@ -1011,9 +1038,6 @@ linux_lock_vt_switch (saver_info *si, Bool lock_p) */ #ifdef HAVE_XF86VMODE -static int ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error); -static Bool vp_got_error = False; - static void xfree_lock_mode_switch (saver_info *si, Bool lock_p) { @@ -1029,14 +1053,15 @@ xfree_lock_mode_switch (saver_info *si, Bool lock_p) if (!XF86VidModeQueryExtension (si->dpy, &event, &error)) return; - for (screen = 0; screen < si->nscreens; screen++) + for (screen = 0; screen < (si->xinerama_p ? 1 : si->nscreens); screen++) { XSync (si->dpy, False); old_handler = XSetErrorHandler (ignore_all_errors_ehandler); + error_handler_hit_p = False; status = XF86VidModeLockModeSwitch (si->dpy, screen, lock_p); XSync (si->dpy, False); XSetErrorHandler (old_handler); - if (vp_got_error) status = False; + if (error_handler_hit_p) status = False; if (status) any_mode_locked_p = lock_p; @@ -1052,14 +1077,6 @@ xfree_lock_mode_switch (saver_info *si, Bool lock_p) blurb(), screen, (lock_p ? "locked" : "unlocked")); } } - -static int -ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error) -{ - vp_got_error = True; - return 0; -} - #endif /* HAVE_XF86VMODE */ @@ -1146,7 +1163,7 @@ passwd_animate_timer (XtPointer closure, XtIntervalId *id) else pw->timer = 0; - idle_timer ((XtPointer) si, id); + idle_timer ((XtPointer) si, 0); }