From http://www.jwz.org/xscreensaver/xscreensaver-5.16.tar.gz
[xscreensaver] / utils / grabclient.c
index 438197e80da1ff1eb2b4db6dcbb9d8e5a47c7cae..a0a19f34dbf53286dbbcd8d77d2b8490b5468e8b 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1992-2010 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1992-2012 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
@@ -545,6 +545,7 @@ struct pipe_closure {
   Screen *screen;
   Window xwindow;
   Drawable drawable;
+  char *directory;
   void (*callback) (Screen *, Window, Drawable,
                     const char *name, XRectangle *geom,
                     void *closure);
@@ -559,6 +560,8 @@ pipe_cb (XtPointer closure, int *source, XtInputId *id)
    */
   struct pipe_closure *clo2 = (struct pipe_closure *) closure;
   char buf[10240];
+  const char *dir = clo2->directory;
+  char *absfile = 0;
   fgets (buf, sizeof(buf)-1, clo2->pipe);
   pclose (clo2->pipe);
   clo2->pipe = 0;
@@ -573,8 +576,17 @@ pipe_cb (XtPointer closure, int *source, XtInputId *id)
   Display *dpy = DisplayOfScreen (clo2->screen);
   XRectangle geom;
 
+  if (*buf && *buf != '/')             /* pathname is relative to dir. */
+    {
+      absfile = malloc (strlen(dir) + strlen(buf) + 10);
+      strcpy (absfile, dir);
+      if (dir[strlen(dir)-1] != '/')
+        strcat (absfile, "/");
+      strcat (absfile, buf);
+    }
+
   if (! osx_load_image_file (clo2->screen, clo2->xwindow, clo2->drawable,
-                             buf, &geom)) {
+                             (absfile ? absfile : buf), &geom)) {
     /* unable to load image - draw colorbars 
      */
     XWindowAttributes xgwa;
@@ -605,9 +617,11 @@ pipe_cb (XtPointer closure, int *source, XtInputId *id)
     geom.height = h;
   }
 
+  if (absfile) free (absfile);
   clo2->callback (clo2->screen, clo2->xwindow, clo2->drawable, buf, &geom,
                   clo2->closure);
   clo2->callback = 0;
+  free (clo2->directory);
   free (clo2);
 }
 
@@ -645,6 +659,7 @@ osx_load_image_file_async (Screen *screen, Window xwindow, Drawable drawable,
 
   Display *dpy = DisplayOfScreen (screen);
   struct pipe_closure *clo2 = (struct pipe_closure *) calloc (1, sizeof(*clo2));
+  clo2->directory = strdup (dir);
   clo2->pipe = open_image_name_pipe (dir);
   clo2->id = XtAppAddInput (XtDisplayToApplicationContext (dpy), 
                             fileno (clo2->pipe),
@@ -678,6 +693,14 @@ load_random_image_1 (Screen *screen, Window window, Drawable drawable,
   Bool done = False;
   XRectangle geom_ret_2;
   char *name_ret_2 = 0;
+  
+# ifdef USE_IPHONE
+  /* Currently, only screen-grabbing is implemented, not loading of
+     images from the iPhone Photo Library.  See osxgrabscreen.m.
+   */
+  deskp = True;
+  filep = False;
+# endif
 
   if (!drawable) abort();
 
@@ -724,10 +747,11 @@ load_random_image_1 (Screen *screen, Window window, Drawable drawable,
   }
 
   if (deskp && !done) {
-    osx_grab_desktop_image (screen, window, drawable);
-    if (name_ret)
-      *name_ret = strdup ("desktop");
-    done = True;
+    if (osx_grab_desktop_image (screen, window, drawable, &geom_ret_2)) {
+      if (name_ret)
+        *name_ret = strdup ("desktop");
+      done = True;
+    }
   }
 
   if (! done)