X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fscreenhack.c;h=9d11b350f665b7bb8bc8d73362ed9abdcaa42a93;hb=cccbddbc4140cf9a06d7d95cc5c0ca36eb5d6e28;hp=be5c19befc6aad8defb6eaab1fed1274d6dec039;hpb=a445bdd3e3ba4abbee441844b6665b4c3c13d48c;p=xscreensaver diff --git a/hacks/screenhack.c b/hacks/screenhack.c index be5c19be..9d11b350 100644 --- a/hacks/screenhack.c +++ b/hacks/screenhack.c @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 1992, 1995, 1997, 1998, 2001 +/* xscreensaver, Copyright (c) 1992, 1995, 1997, 1998, 2001, 2002 * Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its @@ -77,6 +77,7 @@ static XrmOptionDescRec default_options [] = { { "-install", ".installColormap", XrmoptionNoArg, "True" }, { "-noinstall",".installColormap", XrmoptionNoArg, "False" }, { "-visual", ".visualID", XrmoptionSepArg, 0 }, + { "-window-id", ".windowID", XrmoptionSepArg, 0 }, { 0, 0, 0, 0 } }; @@ -86,6 +87,8 @@ static char *default_defaults[] = { "*mono: false", "*installColormap: false", "*visualID: default", + "*windowID: ", + "*desktopGrabber: xscreensaver-getimage %s", 0 }; @@ -274,9 +277,9 @@ pick_visual (Screen *screen) /* Notice when the user has requested a different visual or colormap - on a pre-existing window (e.g., "-root -visual truecolor") and - complain, since when drawing on an existing window, we have no - choice about these things. + on a pre-existing window (e.g., "-root -visual truecolor" or + "-window-id 0x2c00001 -install") and complain, since when drawing + on an existing window, we have no choice about these things. */ static void visual_warning (Screen *screen, Window window, Visual *visual, Colormap cmap, @@ -345,6 +348,7 @@ main (int argc, char **argv) Visual *visual; Colormap cmap; Bool root_p; + Window on_window = 0; XEvent event; Boolean dont_clear /*, dont_map */; char version[255]; @@ -403,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"); @@ -426,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); } @@ -438,7 +480,36 @@ main (int argc, char **argv) root_p = get_boolean_resource ("root", "Boolean"); - if (root_p) + { + char *s = get_string_resource ("windowID", "WindowID"); + if (s && *s) + on_window = get_integer_resource ("windowID", "WindowID"); + if (s) free (s); + } + + if (on_window) + { + XWindowAttributes xgwa; + window = (Window) on_window; + XtDestroyWidget (toplevel); + XGetWindowAttributes (dpy, window, &xgwa); + 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 events on the external window, if no other + app has already selected it (only one app can select ButtonPress + at a time: BadAccess results.) + */ + if (! (xgwa.all_event_masks & ButtonPressMask)) + XSelectInput (dpy, window, xgwa.your_event_mask | ButtonPressMask); + } + else if (root_p) { XWindowAttributes xgwa; window = RootWindowOfScreen (XtScreen (toplevel)); @@ -549,7 +620,7 @@ main (int argc, char **argv) XClearWindow (dpy, window); } - if (!root_p) + if (!root_p && !on_window) /* wait for it to be mapped */ XIfEvent (dpy, &event, MapNotify_event_p, (XPointer) window);