X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fwebcollage-cocoa.m;h=e8bc2b255beddaf1ac81a925481f350f6f847fed;hb=aa75c7476aeaa84cf3abc192b376a8b03c325213;hp=d6505df2f5f7cda72df903a218dd618fb78d5304;hpb=5f9c47ca98dd43d8f59b7c27d3fde6edfde4fe21;p=xscreensaver diff --git a/hacks/webcollage-cocoa.m b/hacks/webcollage-cocoa.m index d6505df2..e8bc2b25 100644 --- a/hacks/webcollage-cocoa.m +++ b/hacks/webcollage-cocoa.m @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2006-2011 Jamie Zawinski +/* xscreensaver, Copyright (c) 2006-2015 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -80,7 +80,7 @@ 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: @@ -92,10 +92,15 @@ display_image (state *st, const char *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; @@ -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;