X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?p=xscreensaver;a=blobdiff_plain;f=hacks%2Fscreenhack.c;h=786d24b4cc5ddf95a3f02eb4186c5c5fecedb0e8;hp=5a70760d53d81e99ae3e3bf71b21a9d0ba9f190d;hb=72c1f4c1dc6ab07fe121a327ff1c30bf51ef74c1;hpb=c596d1306f5f92f7eab76224d3b049980a14adcb diff --git a/hacks/screenhack.c b/hacks/screenhack.c index 5a70760d..786d24b4 100644 --- a/hacks/screenhack.c +++ b/hacks/screenhack.c @@ -57,6 +57,14 @@ #include "version.h" #include "vroot.h" +#ifndef isupper +# define isupper(c) ((c) >= 'A' && (c) <= 'Z') +#endif +#ifndef _tolower +# define _tolower(c) ((c) - 'A' + 'a') +#endif + + char *progname; XrmDatabase db; XtAppContext app; @@ -244,6 +252,11 @@ pick_visual (Screen *screen) */ Visual *v = 0; char *string = get_string_resource ("visualID", "VisualID"); + char *s; + + if (string) + for (s = string; *s; s++) + if (isupper (*s)) *s = _tolower (*s); if (!string || !*string || !strcmp (string, "gl") || @@ -262,12 +275,61 @@ 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" 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, + Bool window_p) +{ + char *visual_string = get_string_resource ("visualID", "VisualID"); + Visual *desired_visual = pick_visual (screen); + char win[100]; + char why[100]; + + if (window == RootWindowOfScreen (screen)) + strcpy (win, "root window"); + else + sprintf (win, "window 0x%x", (unsigned long) window); + + if (window_p) + sprintf (why, "-window-id 0x%x", (unsigned long) window); + else + strcpy (why, "-root"); + + if (visual_string && *visual_string) + { + 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", + progname, win, XVisualIDFromVisual (visual)); + } + free (visual_string); + } + + if (visual == DefaultVisualOfScreen (screen) && + has_writable_cells (screen, visual) && + get_boolean_resource ("installColormap", "InstallColormap")) + { + fprintf (stderr, "%s: ignoring `-install' because of `%s'.\n", + progname, why); + fprintf (stderr, "%s: using %s's colormap 0x%x.\n", + progname, win, (unsigned long) cmap); + } +} + + int main (int argc, char **argv) { Widget toplevel; Display *dpy; Window window; + Screen *screen; Visual *visual; Colormap cmap; Bool root_p; @@ -297,7 +359,9 @@ main (int argc, char **argv) merged_options_size, &argc, argv, merged_defaults, 0, 0); dpy = XtDisplay (toplevel); + screen = XtScreen (toplevel); db = XtDatabase (dpy); + XtGetApplicationNameAndClass (dpy, &progname, &progclass); /* half-assed way of avoiding buffer-overrun attacks. */ @@ -378,6 +442,7 @@ main (int argc, char **argv) XGetWindowAttributes (dpy, window, &xgwa); cmap = xgwa.colormap; visual = xgwa.visual; + visual_warning (screen, window, visual, cmap, True); } else if (root_p) { @@ -387,11 +452,11 @@ main (int argc, char **argv) XGetWindowAttributes (dpy, window, &xgwa); cmap = xgwa.colormap; visual = xgwa.visual; + visual_warning (screen, window, visual, cmap, False); } else { Boolean def_visual_p; - Screen *screen = XtScreen (toplevel); visual = pick_visual (screen); if (toplevel->core.width <= 0)