ref: 197c2ebc122d9dc30036deb96f3bf098dac40615
parent: 61b983ae3a8b1dc9033f7ef843a4a17228a8f311
author: Simon Tatham <[email protected]>
date: Wed Dec 27 10:21:55 EST 2006
Aha, this seems to be a more sensible way of getting screenshots: 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. [originally from svn r7022]
--- a/gtk.c
+++ b/gtk.c
@@ -1804,7 +1804,7 @@
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 @@
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 @@
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 @@
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();
--- a/icons/screenshot.sh
+++ b/icons/screenshot.sh
@@ -22,13 +22,4 @@
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"