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 13:09:45 (GMT) |
commit | 269491c492a4e9722b36fa0754d881feb56499d5 (patch) | |
tree | e8d675992637a45179022255f1b581b3218ed1cc /src/sugar/sugar-preview.c | |
parent | 88579800c383455484f4c43e3392e4c0a39118ae (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); |