diff options
Diffstat (limited to 'src/sugar/sugar-preview.c')
-rw-r--r-- | src/sugar/sugar-preview.c | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/src/sugar/sugar-preview.c b/src/sugar/sugar-preview.c index f54045b..44b83e4 100644 --- a/src/sugar/sugar-preview.c +++ b/src/sugar/sugar-preview.c @@ -19,6 +19,7 @@ #include <gdk/gdkx.h> #include <gtk/gtkwindow.h> +#include <X11/extensions/XShm.h> #include "sugar-preview.h" @@ -37,8 +38,6 @@ sugar_preview_set_size(SugarPreview *preview, int width, int height) GdkPixbuf * sugar_preview_get_pixbuf(SugarPreview *preview) { - GdkPixbuf *pixbuf; - if (preview->pixbuf != NULL) { return preview->pixbuf; } @@ -70,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); @@ -92,7 +113,7 @@ sugar_preview_take_screenshot(SugarPreview *preview, GdkDrawable *drawable) XShmGetImage(GDK_SCREEN_XDISPLAY(screen), GDK_DRAWABLE_XID(drawable), gdk_x11_image_get_ximage(preview->image), - 0, 0, AllPlanes, ZPixmap); + 0, 0, AllPlanes); } static void |