X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fxlockmore.c;h=00994ac878d93763e22f2a28f69e00e473afda34;hb=aa75c7476aeaa84cf3abc192b376a8b03c325213;hp=0c0b2c921b007679fc003cb1711869c9b279f8d1;hpb=ec8d2b32b63649e6d32bdfb306eda062769af823;p=xscreensaver diff --git a/hacks/xlockmore.c b/hacks/xlockmore.c index 0c0b2c92..00994ac8 100644 --- a/hacks/xlockmore.c +++ b/hacks/xlockmore.c @@ -1,5 +1,5 @@ /* xlockmore.c --- xscreensaver compatibility layer for xlockmore modules. - * xscreensaver, Copyright (c) 1997-2011 Jamie Zawinski + * xscreensaver, Copyright (c) 1997-2014 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -19,9 +19,9 @@ #include "xlockmoreI.h" #include "screenhack.h" -#ifndef HAVE_COCOA +#ifndef HAVE_JWXYZ # include -#endif /* !HAVE_COCOA */ +#endif /* !HAVE_JWXYZ */ #define countof(x) (sizeof((x))/sizeof(*(x))) @@ -157,7 +157,7 @@ xlockmore_setup (struct xscreensaver_function_table *xsft, void *arg) /* Put on the PROGCLASS.background/foreground resources. */ s = (char *) malloc(50); *s = 0; -# ifndef HAVE_COCOA +# ifndef HAVE_JWXYZ strcpy (s, progclass); # endif strcat (s, ".background: black"); @@ -165,7 +165,7 @@ xlockmore_setup (struct xscreensaver_function_table *xsft, void *arg) s = (char *) malloc(50); *s = 0; -# ifndef HAVE_COCOA +# ifndef HAVE_JWXYZ strcpy (s, progclass); # endif strcat (s, ".foreground: white"); @@ -292,29 +292,31 @@ xlockmore_init (Display *dpy, Window window, mi->window = window; XGetWindowAttributes (dpy, window, &mi->xgwa); -#ifdef HAVE_COCOA +#ifdef HAVE_JWXYZ - /* In Cocoa-based xscreensaver, all hacks run in the same address space, - so each one needs to get its own screen number. We just use a global - counter for that, instead of actually trying to figure out which - monitor each window is on. Also, the embedded "preview" view counts - as a screen as well. - - Note that the screen number will increase each time the saver is - restarted (e.g., each time preferences are changed!) So we just - keep pushing the num_screens number up as needed, and assume that - no more than 10 simultanious copies will be running at once... +# if 0 + /* In Cocoa and Android-based xscreensaver, all hacks run in the + same address space, so each one needs to get its own screen + number. Believe what jwxyz says about screen counts and numbers. */ - { - static int screen_tick = 0; - mi->num_screens = 10; - mi->screen_number = screen_tick++; - if (screen_tick >= mi->num_screens) - mi->num_screens += 10; - } - + mi->num_screens = ScreenCount (dpy); + mi->screen_number = XScreenNumberOfScreen (mi->xgwa.screen); +# else + /* No, that doesn't work. + The xlockmore docs/HACKERS.GUIDE says that xlock modes are supposed to + support repeated calls to init_*() for the same screen in the same + session, but in practice, a number of them blow up if you do that. + So instead we're stuck with a world where on OSX/iOS, we have to + increment the screen number every time the hack is run. Arrgh. + */ + mi->num_screens = 40; + mi->screen_number = xlmft->screen_count; + if (mi->screen_number >= mi->num_screens) abort(); + xlmft->screen_count++; +# endif root_p = True; -#else /* !HAVE_COCOA -- real Xlib */ + +#else /* real Xlib */ /* In Xlib-based xscreensaver, each hack runs in its own address space, so each one only needs to be aware of one screen. @@ -335,7 +337,7 @@ xlockmore_init (Display *dpy, Window window, /* Everybody gets motion events, just in case. */ XSelectInput (dpy, window, (mi->xgwa.your_event_mask | PointerMotionMask)); -#endif /* !HAVE_COCOA */ +#endif /* !HAVE_JWXYZ */ color.flags = DoRed|DoGreen|DoBlue; color.red = color.green = color.blue = 0; @@ -349,7 +351,6 @@ xlockmore_init (Display *dpy, Window window, if (mono_p) { - static unsigned long pixels[2]; static XColor colors[2]; MONO: mi->npixels = 2; @@ -359,8 +360,6 @@ xlockmore_init (Display *dpy, Window window, if (!mi->colors) mi->colors = (XColor *) calloc (mi->npixels, sizeof (*mi->colors)); - pixels[0] = mi->black; - pixels[1] = mi->white; colors[0].flags = DoRed|DoGreen|DoBlue; colors[1].flags = DoRed|DoGreen|DoBlue; colors[0].red = colors[0].green = colors[0].blue = 0; @@ -382,18 +381,21 @@ xlockmore_init (Display *dpy, Window window, switch (mi->xlmft->desired_color_scheme) { case color_scheme_uniform: - make_uniform_colormap (dpy, mi->xgwa.visual, mi->xgwa.colormap, + make_uniform_colormap (mi->xgwa.screen, mi->xgwa.visual, + mi->xgwa.colormap, mi->colors, &mi->npixels, True, &mi->writable_p, True); break; case color_scheme_smooth: - make_smooth_colormap (dpy, mi->xgwa.visual, mi->xgwa.colormap, + make_smooth_colormap (mi->xgwa.screen, mi->xgwa.visual, + mi->xgwa.colormap, mi->colors, &mi->npixels, True, &mi->writable_p, True); break; case color_scheme_bright: case color_scheme_default: - make_random_colormap (dpy, mi->xgwa.visual, mi->xgwa.colormap, + make_random_colormap (mi->xgwa.screen, mi->xgwa.visual, + mi->xgwa.colormap, mi->colors, &mi->npixels, (mi->xlmft->desired_color_scheme == color_scheme_bright),