X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fscreenhack.c;h=2dfd9781856d302045f56d5fc894b2deccd9c6f2;hb=13dbc569cdc6e29019722c0ef9b932a925efbcad;hp=786d24b4cc5ddf95a3f02eb4186c5c5fecedb0e8;hpb=72c1f4c1dc6ab07fe121a327ff1c30bf51ef74c1;p=xscreensaver diff --git a/hacks/screenhack.c b/hacks/screenhack.c index 786d24b4..2dfd9781 100644 --- a/hacks/screenhack.c +++ b/hacks/screenhack.c @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 1992, 1995, 1997, 1998 +/* xscreensaver, Copyright (c) 1992, 1995, 1997, 1998, 2001, 2002 * Jamie Zawinski * * 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,20 +293,29 @@ 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"); if (visual_string && *visual_string) { - if (visual != desired_visual) + char *s; + for (s = visual_string; *s; s++) + if (isupper (*s)) *s = _tolower (*s); + + if (!strcmp (visual_string, "default") || + !strcmp (visual_string, "default") || + !strcmp (visual_string, "best")) + /* don't warn about these, just silently DWIM. */ + ; + else if (visual != desired_visual) { 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); @@ -317,9 +327,14 @@ 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); } + +# ifdef USE_GL + if (!validate_gl_visual (stderr, screen, win, visual)) + exit (1); +# endif /* USE_GL */ } @@ -392,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"); @@ -415,7 +431,44 @@ main (int argc, char **argv) if (argp) fprintf (stderr, " "); 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); } @@ -443,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) { @@ -459,6 +526,11 @@ main (int argc, char **argv) Boolean def_visual_p; visual = pick_visual (screen); +# ifdef USE_GL + if (!validate_gl_visual (stderr, screen, "window", visual)) + exit (1); +# endif /* USE_GL */ + if (toplevel->core.width <= 0) toplevel->core.width = 600; if (toplevel->core.height <= 0) @@ -486,6 +558,7 @@ main (int argc, char **argv) XtNcolormap, cmap, XtNbackground, (Pixel) bg, XtNborderColor, (Pixel) bd, + XtNinput, True, /* for WM_HINTS */ 0); XtDestroyWidget (toplevel); toplevel = new; @@ -494,7 +567,10 @@ main (int argc, char **argv) } else { - XtVaSetValues (toplevel, XtNmappedWhenManaged, False, 0); + XtVaSetValues (toplevel, + XtNmappedWhenManaged, False, + XtNinput, True, /* for WM_HINTS */ + 0); XtRealizeWidget (toplevel); window = XtWindow (toplevel); @@ -531,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); @@ -551,7 +628,13 @@ main (int argc, char **argv) XIfEvent (dpy, &event, MapNotify_event_p, (XPointer) window); XSync (dpy, False); - srandom ((int) time ((time_t *) 0)); + + /* This is the one and only place that the random-number generator is + seeded in any screenhack. You do not need to seed the RNG again, + it is done for you before your code is invoked. */ +# undef ya_rand_init + ya_rand_init (0); + screenhack (dpy, window); /* doesn't return */ return 0; }