/* lock.c --- handling the password dialog for locking-mode.
- * xscreensaver, Copyright (c) 1993-2002 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1993-2004 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
attrmask, &attrs);
XSetWindowBackground (si->dpy, si->passwd_dialog, pw->background);
- pw->logo_pixmap = xscreensaver_logo (ssi->screen, ssi->current_visual,
+ /* We use the default visual, not ssi->visual, so that the logo pixmap's
+ visual matches that of the si->passwd_dialog window. */
+ pw->logo_pixmap = xscreensaver_logo (ssi->screen,
+ /* ssi->current_visual, */
+ DefaultVisualOfScreen(screen),
si->passwd_dialog, cmap,
pw->background,
&pw->logo_pixels, &pw->logo_npixels,
}
+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.)
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 */
*/
#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)
{
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;
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 */
\f
else
pw->timer = 0;
- idle_timer ((XtPointer) si, id);
+ idle_timer ((XtPointer) si, 0);
}