From http://www.jwz.org/xscreensaver/xscreensaver-5.30.tar.gz
[xscreensaver] / utils / resources.c
index 5bcd2c27c3c8b4d0df0585640cecb6ce253276ba..d95a103cd52e04fb6b6c5ba33e1d261741c5dd80 100644 (file)
@@ -1,5 +1,4 @@
-/* xscreensaver, Copyright (c) 1992, 1997, 1998
- *  Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1992-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
 
 #include "utils.h"
 #include "resources.h"
-#include <X11/Xresource.h>
+
+extern char *progname;
 
 
-/* Resource functions.  Assumes: */
+#ifndef HAVE_COCOA
+
+#include <X11/Xresource.h>
+
+/* These are the Xlib/Xrm versions of these functions.
+   The Cocoa versions are on OSX/XScreenSaverView.m.
+ */
 
-extern char *progname;
 extern char *progclass;
-extern XrmDatabase db;
+extern XrmDatabase XtDatabase (Display *);
 
-static unsigned int get_time_resource (char *res_name, char *res_class,
+static unsigned int get_time_resource (Display *dpy, 
+                                       char *res_name, char *res_class,
                                       Bool sec_p);
 
 #ifndef isupper
@@ -32,7 +38,7 @@ static unsigned int get_time_resource (char *res_name, char *res_class,
 #endif
 
 char *
-get_string_resource (char *res_name, char *res_class)
+get_string_resource (Display *dpy, char *res_name, char *res_class)
 {
   XrmValue value;
   char *type;
@@ -43,7 +49,7 @@ get_string_resource (char *res_name, char *res_class)
   strcpy (full_class, progclass);
   strcat (full_class, ".");
   strcat (full_class, res_class);
-  if (XrmGetResource (db, full_name, full_class, &type, &value))
+  if (XrmGetResource (XtDatabase (dpy), full_name, full_class, &type, &value))
     {
       char *str = (char *) malloc (value.size + 1);
       strncpy (str, (char *) value.addr, value.size);
@@ -54,10 +60,10 @@ get_string_resource (char *res_name, char *res_class)
 }
 
 Bool 
-get_boolean_resource (char *res_name, char *res_class)
+get_boolean_resource (Display *dpy, char *res_name, char *res_class)
 {
   char *tmp, buf [100];
-  char *s = get_string_resource (res_name, res_class);
+  char *s = get_string_resource (dpy, res_name, res_class);
   char *os = s;
   if (! s) return 0;
   for (tmp = buf; *s; s++)
@@ -80,10 +86,10 @@ get_boolean_resource (char *res_name, char *res_class)
 }
 
 int 
-get_integer_resource (char *res_name, char *res_class)
+get_integer_resource (Display *dpy, char *res_name, char *res_class)
 {
   int val;
-  char c, *s = get_string_resource (res_name, res_class);
+  char c, *s = get_string_resource (dpy, res_name, res_class);
   char *ss = s;
   if (!s) return 0;
 
@@ -91,7 +97,7 @@ get_integer_resource (char *res_name, char *res_class)
 
   if (ss[0] == '0' && (ss[1] == 'x' || ss[1] == 'X'))  /* 0x: parse as hex */
     {
-      if (1 == sscanf (ss+2, "%x %c", &val, &c))
+      if (1 == sscanf (ss+2, "%x %c", (unsigned int *) &val, &c))
        {
          free (s);
          return val;
@@ -113,10 +119,10 @@ get_integer_resource (char *res_name, char *res_class)
 }
 
 double
-get_float_resource (char *res_name, char *res_class)
+get_float_resource (Display *dpy, char *res_name, char *res_class)
 {
   double val;
-  char c, *s = get_string_resource (res_name, res_class);
+  char c, *s = get_string_resource (dpy, res_name, res_class);
   if (! s) return 0.0;
   if (1 == sscanf (s, " %lf %c", &val, &c))
     {
@@ -129,14 +135,21 @@ get_float_resource (char *res_name, char *res_class)
   return 0.0;
 }
 
+#endif /* !HAVE_COCOA */
+
+
+/* These functions are the same with Xlib and Cocoa:
+ */
+
 
 unsigned int
-get_pixel_resource (char *res_name, char *res_class,
-                   Display *dpy, Colormap cmap)
+get_pixel_resource (Display *dpy, Colormap cmap,
+                    char *res_name, char *res_class)
 {
   XColor color;
-  char *s = get_string_resource (res_name, res_class);
+  char *s = get_string_resource (dpy, res_name, res_class);
   char *s2;
+  Bool ok = True;
   if (!s) goto DEFAULT;
 
   for (s2 = s + strlen(s) - 1; s2 > s; s2--)
@@ -147,27 +160,47 @@ get_pixel_resource (char *res_name, char *res_class,
 
   if (! XParseColor (dpy, cmap, s, &color))
     {
-      fprintf (stderr, "%s: can't parse color %s\n", progname, s);
+      fprintf (stderr, "%s: can't parse color %s", progname, s);
+      ok = False;
       goto DEFAULT;
     }
   if (! XAllocColor (dpy, cmap, &color))
     {
-      fprintf (stderr, "%s: couldn't allocate color %s\n", progname, s);
+      fprintf (stderr, "%s: couldn't allocate color %s", progname, s);
+      ok = False;
       goto DEFAULT;
     }
   free (s);
-  return color.pixel;
+  return (unsigned int) color.pixel;
  DEFAULT:
   if (s) free (s);
-  return ((strlen(res_class) >= 10 &&
-          !strcmp ("Background", res_class + strlen(res_class) - 10))
-         ? BlackPixel (dpy, DefaultScreen (dpy))
-         : WhitePixel (dpy, DefaultScreen (dpy)));
+
+  {
+    Bool black_p = (strlen(res_class) >= 10 &&
+                    !strcasecmp ("Background",
+                                 res_class + strlen(res_class) - 10));
+    if (!ok)
+      fprintf (stderr, ": using %s.\n", (black_p ? "black" : "white"));
+    color.flags = DoRed|DoGreen|DoBlue;
+    color.red = color.green = color.blue = (black_p ? 0 : 0xFFFF);
+    if (XAllocColor (dpy, cmap, &color))
+      return (unsigned int) color.pixel;
+    else
+      {
+        fprintf (stderr, "%s: couldn't allocate %s either!\n", progname,
+                 (black_p ? "black" : "white"));
+        /* We can't use BlackPixel/WhitePixel here, because we don't know
+           what screen we're allocating on (only an issue when running inside
+           the xscreensaver daemon: for hacks, DefaultScreen is fine.)
+         */
+        return 0;
+      }
+  }
 }
 
 
 int
-parse_time (char *string, Bool seconds_default_p, Bool silent_p)
+parse_time (const char *string, Bool seconds_default_p, Bool silent_p)
 {
   unsigned int h, m, s;
   char c;
@@ -208,10 +241,10 @@ parse_time (char *string, Bool seconds_default_p, Bool silent_p)
 }
 
 static unsigned int 
-get_time_resource (char *res_name, char *res_class, Bool sec_p)
+get_time_resource (Display *dpy, char *res_name, char *res_class, Bool sec_p)
 {
   int val;
-  char *s = get_string_resource (res_name, res_class);
+  char *s = get_string_resource (dpy, res_name, res_class);
   if (!s) return 0;
   val = parse_time (s, sec_p, False);
   free (s);
@@ -219,13 +252,45 @@ get_time_resource (char *res_name, char *res_class, Bool sec_p)
 }
 
 unsigned int 
-get_seconds_resource (char *res_name, char *res_class)
+get_seconds_resource (Display *dpy, char *res_name, char *res_class)
 {
-  return get_time_resource (res_name, res_class, True);
+  return get_time_resource (dpy, res_name, res_class, True);
 }
 
 unsigned int 
-get_minutes_resource (char *res_name, char *res_class)
+get_minutes_resource (Display *dpy, char *res_name, char *res_class)
+{
+  return get_time_resource (dpy, res_name, res_class, False);
+}
+
+
+/* A utility function for event-handler functions:
+   Returns True if the event is a simple click, Space, Tab, etc.
+   Returns False otherwise.
+   The idea here is that most hacks interpret to clicks or basic
+   keypresses as "change it up".
+
+   This isn't really the right file for this, but whatever.
+ */
+Bool
+screenhack_event_helper (Display *dpy, Window window, XEvent *event)
 {
-  return get_time_resource (res_name, res_class, False);
+  if (event->xany.type == KeyPress)
+    {
+      KeySym keysym;
+      char c = 0;
+      XLookupString (&event->xkey, &c, 1, &keysym, 0);
+      if (c == ' ' || c == '\t' || c == '\r' || c == '\n' ||
+          keysym == XK_Left || keysym == XK_Right ||
+          keysym == XK_Up || keysym == XK_Down ||
+          keysym == XK_Prior || keysym == XK_Next)
+        return True;
+    }
+  else if (event->xany.type == ButtonPress)
+    {
+      if (event->xbutton.button == 1)
+        return True;
+    }
+
+  return False;
 }