From http://www.jwz.org/xscreensaver/xscreensaver-5.35.tar.gz
[xscreensaver] / hacks / webcollage-cocoa.m
index c9f628abbb695c094b2e2ade301ad2fd168ec73b..e8bc2b255beddaf1ac81a925481f350f6f847fed 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2006-2008 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2006-2015 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
@@ -80,22 +80,27 @@ input_available_p (int fd)
 
 
 static void
-display_image (state *st, const char *file)
+display_image (Display *dpy, Window window, state *st, const char *file)
 {
   NSImage *image = [[NSImage alloc] 
                      initWithContentsOfFile:
                        [NSString stringWithCString: file
-                                          encoding: kCFStringEncodingUTF8]];
+                                          encoding: NSUTF8StringEncoding]];
 
   if (! image) {
     fprintf (stderr, "webcollage: failed to load \"%s\"\n", file);
     return;
   }
 
-  [image drawAtPoint: NSMakePoint (0, 0)
-            fromRect: NSMakeRect (0, 0, [image size].width, [image size].height)
-           operation: NSCompositeCopy
-            fraction: 1.0];
+  CGFloat w = [image size].width;
+  CGFloat h = [image size].height;
+  if (w <= 1 || h <= 1) {
+    fprintf (stderr, "webcollage: unparsable image \"%s\"\n", file);
+    [image release];
+    return;
+  }
+
+  jwxyz_draw_NSImage_or_CGImage (dpy, window, True, image, 0, 0);
   [image release];
 }
 
@@ -120,26 +125,26 @@ open_pipe (state *st)
   char *filter  = get_string_resource  (st->dpy, "filter",  "Filter");
   char *filter2 = get_string_resource  (st->dpy, "filter2", "Filter2");
 
-  av[ac++] = "webcollage";
-  av[ac++] = "-cocoa";
+  av[ac++] = strdup ("webcollage");
+  av[ac++] = strdup ("-cocoa");
 
-  av[ac++] = "-size";
+  av[ac++] = strdup ("-size");
   sprintf (buf, "%dx%d", st->xgwa.width, st->xgwa.height);
   av[ac++] = strdup (buf);
 
-  av[ac++] = "-timeout"; sprintf (buf, "%d", timeout);
+  av[ac++] = strdup ("-timeout"); sprintf (buf, "%d", timeout);
   av[ac++] = strdup (buf);
-  av[ac++] = "-delay";   sprintf (buf, "%d", delay);
+  av[ac++] = strdup ("-delay");   sprintf (buf, "%d", delay);
   av[ac++] = strdup (buf);
-  av[ac++] = "-opacity"; sprintf (buf, "%.2f", opacity);
+  av[ac++] = strdup ("-opacity"); sprintf (buf, "%.2f", opacity);
   av[ac++] = strdup (buf);
 
   if (filter && *filter) {
-    av[ac++] = "-filter";
+    av[ac++] = strdup ("-filter");
     av[ac++] = filter;
   }
   if (filter2 && *filter2) {
-    av[ac++] = "-filter2";
+    av[ac++] = strdup ("-filter2");
     av[ac++] = filter2;
   }
 
@@ -203,6 +208,9 @@ open_pipe (state *st)
       }
     }
 
+  while (ac > 0)
+    free (av[--ac]);
+
   if (! st->pipe_fd) abort();
 
   st->pid = forked;
@@ -247,7 +255,7 @@ webcollage_init (Display *dpy, Window window)
     for (i = 0; i < sizeof(sigs)/sizeof(*sigs); i++) {
       if (signal (sigs[i], signal_handler)) {
         perror ("webcollage: signal");
-        exit (1);
+        //exit (1);
       }
     }
   }
@@ -298,7 +306,7 @@ webcollage_draw (Display *dpy, Window window, void *closure)
   const char *target = "COCOA LOAD ";
   if (!strncmp (target, buf, strlen(target))) {
     const char *file = buf + strlen(target);
-    display_image (st, file);
+    display_image (dpy, window, st, file);
   }
 
   return st->delay;