+# else /* USE_IPHONE */
+
+/* Callback for ios_load_random_image(), called after we have loaded an
+ image from the iOS device's Photo Library. See iosgrabimage.m.
+ */
+static void
+ios_load_random_image_cb (void *uiimage, const char *filename,
+ int width, int height, void *closure)
+{
+ struct pipe_closure *clo2 = (struct pipe_closure *) closure;
+ Display *dpy = DisplayOfScreen (clo2->screen);
+ XRectangle geom;
+ XWindowAttributes xgwa;
+ Window r;
+ int x, y;
+ unsigned int w, h, bbw, d;
+ int rot = 0;
+
+ XGetWindowAttributes (dpy, clo2->xwindow, &xgwa);
+ XGetGeometry (dpy, clo2->drawable, &r, &x, &y, &w, &h, &bbw, &d);
+
+ /* If the image is portrait and the window is landscape, or vice versa,
+ rotate the image. The idea is to fill up as many pixels as possible,
+ and assume the user will just rotate their phone until it looks right.
+ This makes "decayscreen", etc. much more easily viewable.
+ */
+ if (get_boolean_resource (dpy, "rotateImages", "RotateImages")) {
+ if ((width > height) != (w > h))
+ rot = 5;
+ }
+
+ if (uiimage)
+ {
+ jwxyz_draw_NSImage_or_CGImage (DisplayOfScreen (clo2->screen),
+ clo2->drawable,
+ True, uiimage, &geom,
+ rot);
+ }
+ else /* Probably means no images in the gallery. */
+ {
+ draw_colorbars (clo2->screen, xgwa.visual, clo2->drawable, xgwa.colormap,
+ 0, 0, w, h);
+ geom.x = geom.y = 0;
+ geom.width = w;
+ geom.height = h;
+ filename = 0;
+ }
+
+ clo2->callback (clo2->screen, clo2->xwindow, clo2->drawable,
+ filename, &geom, clo2->closure);
+ clo2->callback = 0;
+ if (clo2->directory) free (clo2->directory);
+ free (clo2);
+}
+
+# endif /* USE_IPHONE */
+
+
+static void
+osx_load_image_file_async (Screen *screen, Window xwindow, Drawable drawable,
+ const char *dir,
+ void (*callback) (Screen *, Window, Drawable,
+ const char *name,
+ XRectangle *geom,
+ void *closure),
+ void *closure)
+{
+# if 0 /* do it synchronously */
+
+ FILE *pipe = open_image_name_pipe (dir);
+ char buf[10240];
+ *buf = 0;
+ fgets (buf, sizeof(buf)-1, pipe);
+ pclose (pipe);
+
+ /* strip trailing newline */
+ int L = strlen(buf);
+ while (L > 0 && (buf[L-1] == '\r' || buf[L-1] == '\n'))
+ buf[--L] = 0;
+
+ XRectangle geom;
+ if (! osx_load_image_file (screen, xwindow, drawable, buf, &geom)) {
+ /* draw colorbars */
+ abort();
+ }
+ callback (screen, xwindow, drawable, buf, &geom, closure);
+
+# else /* do it asynchronously */
+
+ struct pipe_closure *clo2 = (struct pipe_closure *) calloc (1, sizeof(*clo2));
+
+ clo2->screen = screen;
+ clo2->xwindow = xwindow;
+ clo2->drawable = drawable;
+ clo2->callback = callback;
+ clo2->closure = closure;
+
+# ifndef USE_IPHONE
+ clo2->directory = strdup (dir);
+ clo2->pipe = open_image_name_pipe (dir);
+ clo2->id = XtAppAddInput (XtDisplayToApplicationContext (
+ DisplayOfScreen (screen)),
+ fileno (clo2->pipe),
+ (XtPointer) (XtInputReadMask | XtInputExceptMask),
+ pipe_cb, (XtPointer) clo2);
+# else /* USE_IPHONE */
+ ios_load_random_image (ios_load_random_image_cb, clo2);
+# endif /* USE_IPHONE */
+
+# endif
+}
+