diff options
| author | Simon Tatham <anakin@pobox.com> | 2006-12-27 15:21:55 +0000 |
|---|---|---|
| committer | Simon Tatham <anakin@pobox.com> | 2006-12-27 15:21:55 +0000 |
| commit | 197c2ebc122d9dc30036deb96f3bf098dac40615 (patch) | |
| tree | 7520630b85670f5524fd8ccc38f75b81e37ddca1 | |
| parent | 61b983ae3a8b1dc9033f7ef843a4a17228a8f311 (diff) | |
| download | puzzles-197c2ebc122d9dc30036deb96f3bf098dac40615.zip puzzles-197c2ebc122d9dc30036deb96f3bf098dac40615.tar.gz puzzles-197c2ebc122d9dc30036deb96f3bf098dac40615.tar.bz2 puzzles-197c2ebc122d9dc30036deb96f3bf098dac40615.tar.xz | |
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]
| -rw-r--r-- | gtk.c | 33 | ||||
| -rwxr-xr-x | icons/screenshot.sh | 11 |
2 files changed, 24 insertions, 20 deletions
@@ -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(); diff --git a/icons/screenshot.sh b/icons/screenshot.sh index cb856be..0e2a06e 100755 --- a/icons/screenshot.sh +++ b/icons/screenshot.sh @@ -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" |