ftp://netsw.org/x11/tools/desktop/xscreensaver-4.07.tar.gz
[xscreensaver] / driver / windows.c
index cbc72d76b698bc8322a2b435f3f521a9f644f824..694236113b4a1581c6a0300e0084b9e270df9cfc 100644 (file)
@@ -119,7 +119,7 @@ grab_kbd(saver_info *si, Window w, int screen_no)
     }
 
   if (p->verbose_p)
-    fprintf(stderr, "%s: %d: grabbing keyboard on 0x%x... %s.\n",
+    fprintf(stderr, "%s: %d: grabbing keyboard on 0x%lx... %s.\n",
            blurb(), screen_no, (unsigned long) w, grab_string(status));
   return status;
 }
@@ -139,7 +139,7 @@ grab_mouse (saver_info *si, Window w, Cursor cursor, int screen_no)
     }
 
   if (p->verbose_p)
-    fprintf(stderr, "%s: %d: grabbing mouse on 0x%x... %s.\n",
+    fprintf(stderr, "%s: %d: grabbing mouse on 0x%lx... %s.\n",
            blurb(), screen_no, (unsigned long) w, grab_string(status));
   return status;
 }
@@ -151,7 +151,7 @@ ungrab_kbd(saver_info *si)
   saver_preferences *p = &si->prefs;
   XUngrabKeyboard(si->dpy, CurrentTime);
   if (p->verbose_p)
-    fprintf(stderr, "%s: %d: ungrabbing keyboard (was 0x%x).\n",
+    fprintf(stderr, "%s: %d: ungrabbing keyboard (was 0x%lx).\n",
             blurb(), si->keyboard_grab_screen,
             (unsigned long) si->keyboard_grab_window);
   si->keyboard_grab_window = 0;
@@ -164,7 +164,7 @@ ungrab_mouse(saver_info *si)
   saver_preferences *p = &si->prefs;
   XUngrabPointer(si->dpy, CurrentTime);
   if (p->verbose_p)
-    fprintf(stderr, "%s: %d: ungrabbing mouse (was 0x%x).\n",
+    fprintf(stderr, "%s: %d: ungrabbing mouse (was 0x%lx).\n",
             blurb(), si->mouse_grab_screen,
             (unsigned long) si->mouse_grab_window);
   si->mouse_grab_window = 0;
@@ -361,6 +361,11 @@ remove_vroot_property (Display *dpy, Window win)
 
 static Bool safe_XKillClient (Display *dpy, XID id);
 
+#ifdef HAVE_XF86VMODE
+static Bool safe_XF86VidModeGetViewPort (Display *, int, int *, int *);
+#endif /* HAVE_XF86VMODE */
+
+
 static void
 kill_xsetroot_data_1 (Display *dpy, Window window,
                       Atom prop, const char *atom_name,
@@ -966,8 +971,8 @@ get_screen_viewport (saver_screen_info *ssi,
 
   if (!xinerama_p &&  /* Xinerama + VidMode = broken. */
       XF86VidModeQueryExtension (si->dpy, &event, &error) &&
-      XF86VidModeGetModeLine (si->dpy, ssi->number, &dot, &ml) &&
-      XF86VidModeGetViewPort (si->dpy, ssi->number, &x, &y))
+      safe_XF86VidModeGetViewPort (si->dpy, ssi->number, &x, &y) &&
+      XF86VidModeGetModeLine (si->dpy, ssi->number, &dot, &ml))
     {
       char msg[512];
       *x_ret = x;
@@ -1164,6 +1169,36 @@ safe_XKillClient (Display *dpy, XID id)
 }
 
 
+#ifdef HAVE_XF86VMODE
+static Bool
+safe_XF86VidModeGetViewPort (Display *dpy, int screen, int *xP, int *yP)
+{
+  Bool result;
+  XErrorHandler old_handler;
+  XSync (dpy, False);
+  error_handler_hit_p = False;
+  old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
+
+  result = XF86VidModeGetViewPort (dpy, screen, xP, yP);
+
+  XSync (dpy, False);
+  XSetErrorHandler (old_handler);
+  XSync (dpy, False);
+
+  return (error_handler_hit_p
+          ? False
+          : result);
+}
+
+/* There is no "safe_XF86VidModeGetModeLine" because it fails with an
+   untrappable I/O error instead of an X error -- so one must call
+   safe_XF86VidModeGetViewPort first, and assume that both have the
+   same error condition.  Thank you XFree, may I have another.
+ */
+
+#endif /* HAVE_XF86VMODE */
+
+
 static void
 initialize_screensaver_window_1 (saver_screen_info *ssi)
 {
@@ -1518,7 +1553,7 @@ mouse_screen (saver_info *si)
                              &root_x, &root_y, &win_x, &win_y, &mask))
             {
               if (p->verbose_p)
-                fprintf (stderr, "%s: mouse is on screen %d\n",
+                fprintf (stderr, "%s: mouse is on screen %d of %d\n",
                          blurb(), i, si->nscreens);
               return i;
             }
@@ -1577,9 +1612,9 @@ blank_screen (saver_info *si)
       {
         int ev, er;
         if (!XF86VidModeQueryExtension (si->dpy, &ev, &er) ||
-            !XF86VidModeGetViewPort (si->dpy, i,
-                                     &ssi->blank_vp_x,
-                                     &ssi->blank_vp_y))
+            !safe_XF86VidModeGetViewPort (si->dpy, i,
+                                          &ssi->blank_vp_x,
+                                          &ssi->blank_vp_y))
           ssi->blank_vp_x = ssi->blank_vp_y = -1;
       }
 #endif /* HAVE_XF86VMODE */