diff options
author | Marco Pesenti Gritti <mpgritti@gmail.com> | 2008-08-31 12:40:03 (GMT) |
---|---|---|
committer | Marco Pesenti Gritti <mpgritti@gmail.com> | 2008-08-31 12:40:03 (GMT) |
commit | 6e503b0a24e7fca0ddb0c2d04470af2d54cbe8b0 (patch) | |
tree | 47b1c342e134ba61c1a65b1806ac79d1aa227b1c /src/sugar/sugar-preview.c | |
parent | 938e2e964824719fa2ddc76f43caa5711e4f1da9 (diff) |
Ensure that the widget is fully onscreen before taking a screenshot.
Otherwise X emits a BadMatch and gtk kills the process (!).
Fix #8220
Diffstat (limited to 'src/sugar/sugar-preview.c')
-rw-r--r-- | src/sugar/sugar-preview.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/sugar/sugar-preview.c b/src/sugar/sugar-preview.c index 42fb9d3..44b83e4 100644 --- a/src/sugar/sugar-preview.c +++ b/src/sugar/sugar-preview.c @@ -69,16 +69,38 @@ sugar_preview_clear(SugarPreview *preview) } } +static gboolean +widget_is_off_screen(GtkWidget *widget) +{ + GdkScreen *screen; + gint x, y, width, height; + + screen = gtk_widget_get_screen(widget); + + gdk_window_get_geometry(widget->window, &x, &y, &width, &height, NULL); + + return (x < 0 || y < 0 || + x + width > gdk_screen_get_width(screen) || + y + height > gdk_screen_get_height(screen)); +} + void -sugar_preview_take_screenshot(SugarPreview *preview, GdkDrawable *drawable) +sugar_preview_take_screenshot(SugarPreview *preview, GtkWidget *widget) { + GdkDrawable *drawable; GdkScreen *screen; GdkVisual *visual; GdkColormap *colormap; gint width, height; + if (widget->window == NULL || widget_is_off_screen(widget)) { + return; + } + sugar_preview_clear(preview); + drawable = GDK_DRAWABLE(widget->window); + gdk_drawable_get_size(drawable, &width, &height); screen = gdk_drawable_get_screen(drawable); |