From http://www.jwz.org/xscreensaver/xscreensaver-5.30.tar.gz
[xscreensaver] / hacks / xlockmore.c
index 23c12b6dc33fb1d75f412609fe6a77dac461a6a3..d5b71f9bb4f956b595cd1daf50b3a6d324117bd4 100644 (file)
@@ -1,5 +1,5 @@
 /* xlockmore.c --- xscreensaver compatibility layer for xlockmore modules.
- * xscreensaver, Copyright (c) 1997-2013 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1997-2014 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -294,26 +294,28 @@ xlockmore_init (Display *dpy, Window window,
   
 #ifdef HAVE_COCOA
   
+# if 0
   /* 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...
+     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 */
   
   /* In Xlib-based xscreensaver, each hack runs in its own address space,