http://packetstormsecurity.org/UNIX/admin/xscreensaver-4.16.tar.gz
[xscreensaver] / driver / xscreensaver.c
index de42a100c9980e0ae03fc68f087f24d4c392dc27..5d948f655fd665e68b6e2a4eeda76da01251e107 100644 (file)
@@ -255,7 +255,7 @@ do_help (saver_info *si)
   fflush (stdout);
   fflush (stderr);
   fprintf (stdout, "\
-xscreensaver %s, copyright (c) 1991-2003 by Jamie Zawinski <jwz@jwz.org>\n\
+xscreensaver %s, copyright (c) 1991-2004 by Jamie Zawinski <jwz@jwz.org>\n\
 \n\
   All xscreensaver configuration is via the `~/.xscreensaver' file.\n\
   Rather than editing that file by hand, just run `xscreensaver-demo':\n\
@@ -719,7 +719,7 @@ print_banner (saver_info *si)
 
   if (p->verbose_p)
     fprintf (stderr,
-            "%s %s, copyright (c) 1991-2003 "
+            "%s %s, copyright (c) 1991-2004 "
             "by Jamie Zawinski <jwz@jwz.org>.\n",
             progname, si->version);
 
@@ -1034,6 +1034,10 @@ initialize_server_extensions (saver_info *si)
                  blurb());
     }
 
+#ifdef HAVE_RANDR
+  query_randr_extension (si);
+#endif
+
   if (!system_has_proc_interrupts_p)
     {
       si->using_proc_interrupts = False;
@@ -1372,27 +1376,33 @@ main_loop (saver_info *si)
 
          To avoid this: after un-blanking the screen, sleep for a second,
          and then really make sure the window is unmapped.
+
+         Update: actually, let's do that once a second for 8 seconds,
+         because sometimes the machine is slow, and we miss...
        */
       {
-        int i;
-        XSync (si->dpy, False);
-        sleep (1);
-        for (i = 0; i < si->nscreens; i++)
+        int i, j;
+        for (j = 0; j < 8; j++)
           {
-            saver_screen_info *ssi = &si->screens[i];
-            Window w = ssi->screensaver_window;
-            XWindowAttributes xgwa;
-            XGetWindowAttributes (si->dpy, w, &xgwa);
-            if (xgwa.map_state != IsUnmapped)
+            XSync (si->dpy, False);
+            sleep (1);
+            for (i = 0; i < si->nscreens; i++)
               {
-                if (p->verbose_p)
-                  fprintf (stderr,
-                           "%s: %d: client race! emergency unmap 0x%lx.\n",
-                           blurb(), i, (unsigned long) w);
-                XUnmapWindow (si->dpy, w);
+                saver_screen_info *ssi = &si->screens[i];
+                Window w = ssi->screensaver_window;
+                XWindowAttributes xgwa;
+                XGetWindowAttributes (si->dpy, w, &xgwa);
+                if (xgwa.map_state != IsUnmapped)
+                  {
+                    if (p->verbose_p)
+                      fprintf (stderr,
+                               "%s: %d: client race! emergency unmap 0x%lx.\n",
+                               blurb(), i, (unsigned long) w);
+                    XUnmapWindow (si->dpy, w);
+                  }
               }
+            XSync (si->dpy, False);
           }
-        XSync (si->dpy, False);
       }
     }
 }
@@ -1667,6 +1677,14 @@ handle_clientmessage (saver_info *si, XEvent *event, Bool until_idle_p)
     {
       if (until_idle_p)
        {
+          if (p->mode == DONT_BLANK)
+            {
+              clientmessage_response(si, window, True,
+                         "ACTIVATE ClientMessage received in DONT_BLANK mode.",
+                                     "screen blanking is currently disabled.");
+              return False;
+            }
+
          clientmessage_response(si, window, False,
                                 "ACTIVATE ClientMessage received.",
                                 "activating.");
@@ -1771,6 +1789,14 @@ handle_clientmessage (saver_info *si, XEvent *event, Bool until_idle_p)
       char buf2 [255];
       long which = event->xclient.data.l[1];
 
+      if (p->mode == DONT_BLANK)
+        {
+          clientmessage_response(si, window, True,
+                           "SELECT ClientMessage received in DONT_BLANK mode.",
+                                 "screen blanking is currently disabled.");
+          return False;
+        }
+
       sprintf (buf, "SELECT %ld ClientMessage received.", which);
       sprintf (buf2, "activating (%ld).", which);
       clientmessage_response (si, window, False, buf, buf2);
@@ -1890,7 +1916,11 @@ handle_clientmessage (saver_info *si, XEvent *event, Bool until_idle_p)
                              "not compiled with support for locking.",
                              "locking not enabled.");
 #else /* !NO_LOCKING */
-      if (si->locking_disabled_p)
+      if (p->mode == DONT_BLANK)
+        clientmessage_response(si, window, True,
+                             "LOCK ClientMessage received in DONT_BLANK mode.",
+                               "screen blanking is currently disabled.");
+      else if (si->locking_disabled_p)
        clientmessage_response (si, window, True,
                      "LOCK ClientMessage received, but locking is disabled.",
                              "locking not enabled.");
@@ -2089,7 +2119,17 @@ analyze_display (saver_info *si)
         False
 #     endif
    }, { "XINERAMA",                             "Xinerama",
+#     ifdef HAVE_XINERAMA
         True
+#     else
+        False
+#     endif
+   }, { "RANDR",                                "Resize-and-Rotate",
+#     ifdef HAVE_RANDR
+        True
+#     else
+        False
+#     endif
    }, { "Apple-DRI",                            "Apple-DRI (XDarwin)",
         True
    },