From http://www.jwz.org/xscreensaver/xscreensaver-5.30.tar.gz
[xscreensaver] / utils / resources.c
index fc5cea13e7f7e9d25681e0c48452acbf240b2e02..d95a103cd52e04fb6b6c5ba33e1d261741c5dd80 100644 (file)
@@ -1,5 +1,4 @@
-/* xscreensaver, Copyright (c) 1992, 1997, 1998, 2001
- *  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: */
 
-extern char *progname;
+#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 *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,13 +135,19 @@ 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;
@@ -159,7 +171,7 @@ get_pixel_resource (char *res_name, char *res_class,
       goto DEFAULT;
     }
   free (s);
-  return color.pixel;
+  return (unsigned int) color.pixel;
  DEFAULT:
   if (s) free (s);
 
@@ -172,7 +184,7 @@ get_pixel_resource (char *res_name, char *res_class,
     color.flags = DoRed|DoGreen|DoBlue;
     color.red = color.green = color.blue = (black_p ? 0 : 0xFFFF);
     if (XAllocColor (dpy, cmap, &color))
-      return color.pixel;
+      return (unsigned int) color.pixel;
     else
       {
         fprintf (stderr, "%s: couldn't allocate %s either!\n", progname,
@@ -229,10 +241,10 @@ parse_time (const 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);
@@ -240,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 (res_name, res_class, False);
+  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)
+{
+  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;
 }