From http://www.jwz.org/xscreensaver/xscreensaver-5.38.tar.gz
[xscreensaver] / hacks / flag.c
index c0c33b271456c0870ab5d2296fbdb993ce9a1a71..874f5d8261e5a8c5800d282ca5f8e587a12e1e37 100644 (file)
@@ -45,9 +45,13 @@ static const char sccsid[] = "@(#)flag.c     4.02 97/04/01 xlockmore";
                                        "*ncolors:              200     \n"             \
                                        "*bitmap:                               \n"             \
                                        "*font:         " DEF_FONT      "\n"    \
-                                       "*text:                                 \n"
+                                       "*text:                                 \n" \
+                                       "*fpsSolid:             true    \n" \
+                                   "*lowrez:       true    \n" \
+
 # define BRIGHT_COLORS
 # define UNIFORM_COLORS
+# define release_flag 0
 # define reshape_flag 0
 # define flag_handle_event 0
 # include "xlockmore.h"                                /* from the xscreensaver distribution */
@@ -192,7 +196,7 @@ make_flag_bits(ModeInfo *mi)
   char *bitmap_name = get_string_resource (dpy, "bitmap", "Bitmap");
   char *text = get_string_resource (dpy, "text", "Text");
 
-#ifdef HAVE_COCOA
+#ifdef HAVE_JWXYZ
   bitmap_name = 0;  /* #### always use default */
 #endif
 
@@ -263,13 +267,42 @@ make_flag_bits(ModeInfo *mi)
                                                                         strlen(uts.sysname) +
                                                                         strlen(uts.version) +
                                                                         strlen(uts.release) + 10);
-# ifdef _AIX
+# if defined(_AIX)
                          sprintf(text, "%s\n%s %s.%s",
                                          uts.nodename, uts.sysname, uts.version, uts.release);
-# else  /* !_AIX */
+#  elif defined(__APPLE__) && !defined(USE_IPHONE)  /* MacOS X + XDarwin */
+              {
+                const char *file = 
+                  "/System/Library/CoreServices/SystemVersion.plist";
+                FILE *f = fopen (file, "r");
+                char *pbv = 0, *pn = 0, *puvv = 0;
+                if (f) {
+                  char *s, buf[255];
+
+                  while (fgets (buf, sizeof(buf)-1, f)) {
+#                   define GRAB(S,V)                                   \
+                    if (strstr(buf, S)) {                                      \
+                      fgets (buf, sizeof(buf)-1, f);                   \
+                      if ((s = strchr (buf, '>'))) V = strdup(s+1);    \
+                      if ((s = strchr (V, '<'))) *s = 0;                       \
+                    }
+                    GRAB ("ProductName", pn)
+                    GRAB ("ProductBuildVersion", pbv)
+                    GRAB ("ProductUserVisibleVersion", puvv)
+#                   undef GRAB
+                  }
+                }
+                if (pbv)
+                  sprintf (text, "%s\n%s\n%s", 
+                           uts.nodename, pn, puvv /*, uts.machine*/);
+                else
+                  sprintf(text, "%s\n%s %s",
+                          uts.nodename, uts.sysname, uts.release);
+              }
+# else
                          sprintf(text, "%s\n%s %s",
                                          uts.nodename, uts.sysname, uts.release);
-# endif /* !_AIX */
+# endif /* special system types */
                        }
 #else  /* !HAVE_UNAME */
 # ifdef VMS
@@ -351,7 +384,9 @@ make_flag_bits(ModeInfo *mi)
          fp->image = XGetImage(dpy, bitmap, 0, 0, width, height, 1L, XYPixmap);
          XFreePixmap(dpy, bitmap);
        }
-  else
+
+
+  if (! fp->image)
        {
       char *bits = (char *) malloc (sizeof(bob_bits));
       memcpy (bits, bob_bits, sizeof(bob_bits));
@@ -399,11 +434,7 @@ init_flag(ModeInfo * mi)
        int         size = MI_SIZE(mi);
        flagstruct *fp;
 
-       if (flags == NULL) {
-               if ((flags = (flagstruct *) calloc(MI_NUM_SCREENS(mi),
-                                              sizeof (flagstruct))) == NULL)
-                       return;
-       }
+       MI_INIT (mi, flags);
        fp = &flags[MI_SCREEN(mi)];
 
        make_flag_bits(mi);
@@ -427,7 +458,7 @@ init_flag(ModeInfo * mi)
 
        if (!fp->initialized) {
       fp->dbufp = True;
-# ifdef HAVE_COCOA             /* Don't second-guess Quartz's double-buffering */
+# ifdef HAVE_JWXYZ             /* Don't second-guess Quartz's double-buffering */
       fp->dbufp = False;
 #endif
                fp->initialized = True;
@@ -467,9 +498,6 @@ init_flag(ModeInfo * mi)
        XClearWindow(display, MI_WINDOW(mi));
 }
 
-ENTRYPOINT void release_flag(ModeInfo * mi);
-
-
 ENTRYPOINT void
 draw_flag(ModeInfo * mi)
 {
@@ -502,34 +530,29 @@ draw_flag(ModeInfo * mi)
        fp->sidx %= (ANGLES * MI_NPIXELS(mi));
        fp->timer++;
        if ((MI_CYCLES(mi) > 0) && (fp->timer >= MI_CYCLES(mi)))
-      {
-        release_flag(mi);
                init_flag(mi);
-      }
 }
 
 ENTRYPOINT void
-release_flag(ModeInfo * mi)
+free_flag(ModeInfo * mi)
 {
-       if (flags != NULL) {
-               int         screen;
-
-               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++)
-                 {
-                       if (flags[screen].cache && flags[screen].dbufp)
-                               XFreePixmap(MI_DISPLAY(mi), flags[screen].cache);
-                       if (flags[screen].image)
-                         XDestroyImage(flags[screen].image);
-                 }
-               (void) free((void *) flags);
-               flags = NULL;
-       }
+       int         screen = MI_SCREEN(mi);
+
+       if (flags == NULL)
+               return;
+
+       if (flags[screen].cache && flags[screen].dbufp)
+               XFreePixmap(MI_DISPLAY(mi), flags[screen].cache);
+       if (flags[screen].image)
+         XDestroyImage(flags[screen].image);
 }
 
+#ifndef STANDALONE
 ENTRYPOINT void
 refresh_flag(ModeInfo * mi)
 {
        /* Do nothing, it will refresh by itself */
 }
+#endif
 
 XSCREENSAVER_MODULE ("Flag", flag)