Aha, this seems to be a more sensible way of getting screenshots:
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Wed, 27 Dec 2006 15:21:55 +0000 (15:21 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Wed, 27 Dec 2006 15:21:55 +0000 (15:21 +0000)
instead of having the puzzle binary export its window ID to a script
which then runs xwd, we can use the gdk-pixbuf library to have the
puzzle binary _itself_ read its own internal pixmap and save it
straight to a PNG. How handy. And faster, and less timing-sensitive.

git-svn-id: svn://svn.tartarus.org/sgt/puzzles@7022 cda61777-01e9-0310-a592-d414129be87e

gtk.c
icons/screenshot.sh

diff --git a/gtk.c b/gtk.c
index 35e7466..27c3ea5 100644 (file)
--- a/gtk.c
+++ b/gtk.c
@@ -1804,7 +1804,7 @@ int main(int argc, char **argv)
     float redo_proportion = 0.0F;
     char *arg = NULL;
     int argtype = ARG_EITHER;
-    int output_window_id = FALSE;
+    char *screenshot_file = NULL;
     int doing_opts = TRUE;
     int ac = argc;
     char **av = argv;
@@ -1902,15 +1902,22 @@ int main(int argc, char **argv)
                        pname);
                return 1;
            }
-       } else if (doing_opts && !strcmp(p, "--windowid")) {
+       } else if (doing_opts && !strcmp(p, "--screenshot")) {
            /*
             * Another internal option for the icon building
-            * script. This causes the window ID of the central
+            * script. This causes a screenshot of the central
             * drawing area (i.e. not including the menu bar or
-            * status bar) to be printed on standard output once
-            * the window has been drawn.
+            * status bar) to be saved to a PNG file once the
+            * window has been drawn, and then the application
+            * quits immediately.
             */
-           output_window_id = TRUE;
+           if (--ac > 0) {
+               screenshot_file = *++av;
+           } else {
+               fprintf(stderr, "%s: no argument supplied to '--screenshot'\n",
+                       pname);
+               return 1;
+           }
        } else if (doing_opts && (!strcmp(p, "--with-solutions") ||
                                  !strcmp(p, "--with-solution") ||
                                  !strcmp(p, "--with-solns") ||
@@ -2071,7 +2078,7 @@ int main(int argc, char **argv)
            return 1;
        }
 
-       if (output_window_id) {
+       if (screenshot_file) {
            /*
             * Some puzzles will not redraw their entire area if
             * given a partially completed animation, which means
@@ -2088,10 +2095,16 @@ int main(int argc, char **argv)
            midend_freeze_timer(fe->me, redo_proportion);
        }
 
-       if (output_window_id) {
+       if (screenshot_file) {
+           GdkPixbuf *pb;
+
            midend_redraw(fe->me);
-           printf("%p\n", (void *)GDK_WINDOW_XWINDOW(fe->area->window));
-           fflush(stdout);
+
+           pb = gdk_pixbuf_get_from_drawable(NULL, fe->pixmap,
+                                             NULL, 0, 0, 0, 0, -1, -1);
+           gdk_pixbuf_save(pb, screenshot_file, "png", NULL);
+
+           exit(0);
        }
 
        gtk_main();
index cb856be..0e2a06e 100755 (executable)
@@ -22,13 +22,4 @@ else
   redo=
 fi
 
-"$binary" $redo --windowid --load "$save" 2>/dev/null | {
-  read windowid
-  # I'm not sure why I have to do this sleep, since gtk.c does
-  # carefully redraw the window _before_ outputting the window ID,
-  # but nonetheless this script doesn't seem to be reliable without
-  # it :-/
-  sleep 1
-  xwd -silent -id $windowid | convert xwd:- "$image"
-  xkill -id $windowid >/dev/null
-}
+"$binary" $redo --screenshot "$image" --load "$save"