Ensure that the widget is fully onscreen before taking a screenshot.
Otherwise X emits a BadMatch and gtk kills the process (!). Fix #8220
This commit is contained in:
parent
938e2e9648
commit
6e503b0a24
@ -200,7 +200,7 @@
|
||||
(c-name "sugar_preview_take_screenshot")
|
||||
(return-type "none")
|
||||
(parameters
|
||||
'("GdkDrawable" "drawable")
|
||||
'("GtkWidget" "widget")
|
||||
)
|
||||
)
|
||||
|
||||
|
@ -22,11 +22,11 @@ headers
|
||||
modulename sugar._sugarext
|
||||
%%
|
||||
import gobject.GObject as PyGObject_Type
|
||||
import gtk.Widget as PyGtkWidget_Type
|
||||
import gtk.Entry as PyGtkEntry_Type
|
||||
import gtk.Menu as PyGtkMenu_Type
|
||||
import gtk.Container as PyGtkContainer_Type
|
||||
import gtk.gdk.Window as PyGdkWindow_Type
|
||||
import gtk.gdk.Drawable as PyGdkDrawable_Type
|
||||
import gtk.Image as PyGtkImage_Type
|
||||
%%
|
||||
ignore-glob
|
||||
|
@ -754,8 +754,8 @@ class Activity(Window, gtk.Container):
|
||||
return {}
|
||||
|
||||
def take_screenshot(self):
|
||||
if self.canvas and self.canvas.window:
|
||||
self._preview.take_screenshot(self.canvas.window)
|
||||
if self.canvas:
|
||||
self._preview.take_screenshot(self.canvas)
|
||||
|
||||
def save(self):
|
||||
"""Request that the activity is saved to the Journal.
|
||||
|
@ -69,16 +69,38 @@ sugar_preview_clear(SugarPreview *preview)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
sugar_preview_take_screenshot(SugarPreview *preview, GdkDrawable *drawable)
|
||||
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, 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);
|
||||
|
@ -50,7 +50,7 @@ struct _SugarPreviewClass {
|
||||
|
||||
GType sugar_preview_get_type (void);
|
||||
void sugar_preview_take_screenshot (SugarPreview *preview,
|
||||
GdkDrawable *drawable);
|
||||
GtkWidget *widget);
|
||||
void sugar_preview_set_size (SugarPreview *preview,
|
||||
int width,
|
||||
int height);
|
||||
|
Loading…
Reference in New Issue
Block a user