http://packetstormsecurity.org/UNIX/admin/xscreensaver-4.04.2.tar.gz
[xscreensaver] / hacks / screenhack.c
index c3c8ad4aa713280b5809c91e3253c2a29d0ff540..2dfd9781856d302045f56d5fc894b2deccd9c6f2 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1992, 1995, 1997, 1998
+/* xscreensaver, Copyright (c) 1992, 1995, 1997, 1998, 2001, 2002
  *  Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -88,6 +88,7 @@ static char *default_defaults[] = {
   "*installColormap:   false",
   "*visualID:          default",
   "*windowID:          ",
+  "*desktopGrabber:    xscreensaver-getimage %s",
   0
 };
 
@@ -292,10 +293,10 @@ visual_warning (Screen *screen, Window window, Visual *visual, Colormap cmap,
   if (window == RootWindowOfScreen (screen))
     strcpy (win, "root window");
   else
-    sprintf (win, "window 0x%x", (unsigned long) window);
+    sprintf (win, "window 0x%lx", (unsigned long) window);
 
   if (window_p)
-    sprintf (why, "-window-id 0x%x", (unsigned long) window);
+    sprintf (why, "-window-id 0x%lx", (unsigned long) window);
   else
     strcpy (why, "-root");
 
@@ -314,7 +315,7 @@ visual_warning (Screen *screen, Window window, Visual *visual, Colormap cmap,
         {
           fprintf (stderr, "%s: ignoring `-visual %s' because of `%s'.\n",
                    progname, visual_string, why);
-          fprintf (stderr, "%s: using %s's visual 0x%x.\n",
+          fprintf (stderr, "%s: using %s's visual 0x%lx.\n",
                    progname, win, XVisualIDFromVisual (visual));
         }
       free (visual_string);
@@ -326,7 +327,7 @@ visual_warning (Screen *screen, Window window, Visual *visual, Colormap cmap,
     {
       fprintf (stderr, "%s: ignoring `-install' because of `%s'.\n",
                progname, why);
-      fprintf (stderr, "%s: using %s's colormap 0x%x.\n",
+      fprintf (stderr, "%s: using %s's colormap 0x%lx.\n",
                progname, win, (unsigned long) cmap);
     }
 
@@ -406,7 +407,8 @@ main (int argc, char **argv)
       int i;
       int x = 18;
       int end = 78;
-      Bool help_p = !strcmp(argv[1], "-help");
+      Bool help_p = (!strcmp(argv[1], "-help") ||
+                     !strcmp(argv[1], "--help"));
       fprintf (stderr, "%s\n", version);
       for (s = progclass; *s; s++) fprintf(stderr, " ");
       fprintf (stderr, "  http://www.jwz.org/xscreensaver/\n\n");
@@ -429,7 +431,44 @@ main (int argc, char **argv)
          if (argp) fprintf (stderr, " <arg>");
          if (i != merged_options_size - 1) fprintf (stderr, ", ");
        }
+
       fprintf (stderr, ".\n");
+
+#if 0
+      if (help_p)
+        {
+          fprintf (stderr, "\nResources:\n\n");
+          for (i = 0; i < merged_options_size; i++)
+            {
+              const char *opt = merged_options [i].option;
+              const char *res = merged_options [i].specifier + 1;
+              const char *val = merged_options [i].value;
+              char *s = get_string_resource ((char *) res, (char *) res);
+
+              if (s)
+                {
+                  int L = strlen(s);
+                while (L > 0 && (s[L-1] == ' ' || s[L-1] == '\t'))
+                  s[--L] = 0;
+                }
+
+              fprintf (stderr, "    %-16s %-18s ", opt, res);
+              if (merged_options [i].argKind == XrmoptionSepArg)
+                {
+                  fprintf (stderr, "[%s]", (s ? s : "?"));
+                }
+              else
+                {
+                  fprintf (stderr, "%s", (val ? val : "(null)"));
+                  if (val && s && !strcasecmp (val, s))
+                    fprintf (stderr, " [default]");
+                }
+              fprintf (stderr, "\n");
+            }
+          fprintf (stderr, "\n");
+        }
+#endif
+
       exit (help_p ? 0 : 1);
     }
 
@@ -457,6 +496,20 @@ main (int argc, char **argv)
       cmap = xgwa.colormap;
       visual = xgwa.visual;
       visual_warning (screen, window, visual, cmap, True);
+
+      /* Select KeyPress events on the external window.
+       */
+      xgwa.your_event_mask |= KeyPressMask;
+      XSelectInput (dpy, window, xgwa.your_event_mask);
+
+      /* Select ButtonPress and ButtonRelease events on the external window,
+         if no other app has already selected them (only one app can select
+         ButtonPress at a time: BadAccess results.)
+       */
+      if (! (xgwa.all_event_masks & (ButtonPressMask | ButtonReleaseMask)))
+        XSelectInput (dpy, window,
+                      (xgwa.your_event_mask |
+                       ButtonPressMask | ButtonReleaseMask));
     }
   else if (root_p)
     {
@@ -554,7 +607,8 @@ main (int argc, char **argv)
         XWindowAttributes xgwa;
         XGetWindowAttributes (dpy, window, &xgwa);
         XSelectInput (dpy, window,
-                      xgwa.your_event_mask | KeyPressMask | ButtonPressMask);
+                      (xgwa.your_event_mask | KeyPressMask |
+                       ButtonPressMask | ButtonReleaseMask));
         XChangeProperty (dpy, window, XA_WM_PROTOCOLS, XA_ATOM, 32,
                          PropModeReplace,
                          (unsigned char *) &XA_WM_DELETE_WINDOW, 1);