From 44cabc891b9311fa7a20ac229ee9c04090caba2d Mon Sep 17 00:00:00 2001 From: Tomeu Vizoso Date: Tue, 11 Nov 2008 16:34:34 +0000 Subject: Remove the hacks for asking the X server for screenshots and use gtk.Widget.get_snapshot() instead. --- (limited to 'src') diff --git a/src/sugar/Makefile.am b/src/sugar/Makefile.am index dabb35d..fb87bf6 100644 --- a/src/sugar/Makefile.am +++ b/src/sugar/Makefile.am @@ -56,9 +56,7 @@ _sugarext_la_SOURCES = \ sugar-key-grabber.c \ sugar-key-grabber.h \ sugar-menu.h \ - sugar-menu.c \ - sugar-preview.h \ - sugar-preview.c + sugar-menu.c BUILT_SOURCES = \ _sugarext.c \ diff --git a/src/sugar/_sugarext.defs b/src/sugar/_sugarext.defs index c18e707..a6befa4 100644 --- a/src/sugar/_sugarext.defs +++ b/src/sugar/_sugarext.defs @@ -29,13 +29,6 @@ (gtype-id "SUGAR_TYPE_GRID") ) -(define-object Preview - (in-module "Sugar") - (parent "GObject") - (c-name "SugarPreview") - (gtype-id "SUGAR_TYPE_PREVIEW") -) - (define-object IconEntry (in-module "Sexy") (parent "GtkEntry") @@ -248,44 +241,6 @@ (return-type "none") ) -;; From sugar-preview.h - -(define-function sugar_preview_get_type - (c-name "sugar_preview_get_type") - (return-type "GType") -) - -(define-method take_screenshot - (of-object "SugarPreview") - (c-name "sugar_preview_take_screenshot") - (return-type "none") - (parameters - '("GtkWidget" "widget") - ) -) - -(define-method set_size - (of-object "SugarPreview") - (c-name "sugar_preview_set_size") - (return-type "none") - (parameters - '("int" "width") - '("int" "height") - ) -) - -(define-method clear - (of-object "SugarPreview") - (c-name "sugar_preview_clear") - (return-type "none") -) - -(define-method get_pixbuf - (of-object "SugarPreview") - (c-name "sugar_preview_get_pixbuf") - (return-type "GdkPixbuf*") -) - ;; From eggsmclient.h (define-function egg_sm_client_get_type diff --git a/src/sugar/_sugarext.override b/src/sugar/_sugarext.override index 39b5385..6b768bb 100644 --- a/src/sugar/_sugarext.override +++ b/src/sugar/_sugarext.override @@ -8,7 +8,6 @@ headers #include "sugar-grid.h" #include "sugar-key-grabber.h" #include "sugar-menu.h" -#include "sugar-preview.h" #include "sexy-icon-entry.h" #include "gsm-session.h" #include "gsm-xsmp.h" diff --git a/src/sugar/activity/activity.py b/src/sugar/activity/activity.py index 66669c8..114c685 100644 --- a/src/sugar/activity/activity.py +++ b/src/sugar/activity/activity.py @@ -469,20 +469,12 @@ class Activity(Window, gtk.Container): self.connect('realize', self.__realize_cb) self.connect('delete-event', self.__delete_event_cb) - # watch visibility-notify-events to know when we can safely - # take a screenshot of the activity - self.add_events(gtk.gdk.VISIBILITY_NOTIFY_MASK) - self.connect('visibility-notify-event', - self.__visibility_notify_event_cb) - self._fully_obscured = True - self._active = False self._activity_id = handle.activity_id self._pservice = presenceservice.get_instance() self.shared_activity = None self._share_id = None self._join_id = None - self._preview = _sugarext.Preview() self._updating_jobject = False self._closing = False self._quit_requested = False @@ -721,10 +713,15 @@ class Activity(Window, gtk.Container): self._jobject = None def _get_preview(self): - pixbuf = self._preview.get_pixbuf() - if pixbuf is None: + + if self.canvas is None or not hasattr(self.canvas, 'get_snapshot'): return None + pixmap = self.canvas.get_snapshot((-1, -1, 0, 0)) + width, height = pixmap.get_size() + pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, 0, 8, width, height) + pixbuf = pixbuf.get_from_drawable(pixmap, pixmap.get_colormap(), + 0, 0, 0, 0, width, height) pixbuf = pixbuf.scale_simple(style.zoom(300), style.zoom(225), gtk.gdk.INTERP_BILINEAR) @@ -735,8 +732,6 @@ class Activity(Window, gtk.Container): pixbuf.save_to_callback(save_func, 'png', user_data=preview_data) preview_data = ''.join(preview_data) - self._preview.clear() - return preview_data def _get_buddies(self): @@ -750,10 +745,6 @@ class Activity(Window, gtk.Container): else: return {} - def take_screenshot(self): - if self.canvas: - self._preview.take_screenshot(self.canvas) - def save(self): """Request that the activity is saved to the Journal. @@ -779,7 +770,7 @@ class Activity(Window, gtk.Container): self.metadata['buddies'] = cjson.encode(self._get_buddies()) preview = self._get_preview() - if self._preview: + if preview is not None: self.metadata['preview'] = dbus.ByteArray(preview) try: @@ -810,8 +801,6 @@ class Activity(Window, gtk.Container): copy work that needs to be done in write_file() """ logging.debug('Activity.copy: %r' % self._jobject.object_id) - if not self._fully_obscured: - self.take_screenshot() self.save() self._jobject.object_id = None @@ -974,9 +963,6 @@ class Activity(Window, gtk.Container): write_file() to do any state saving instead. If the application wants to control wether it can close, it should override can_close(). """ - if not self._fully_obscured: - self.take_screenshot() - if not self.can_close(): return @@ -995,15 +981,6 @@ class Activity(Window, gtk.Container): self.close() return True - def __visibility_notify_event_cb(self, widget, event): - """Visibility state is used when deciding if we can take screenshots. - Currently we allow screenshots whenever the activity window is fully - visible or partially obscured.""" - if event.state is gtk.gdk.VISIBILITY_FULLY_OBSCURED: - self._fully_obscured = True - else: - self._fully_obscured = False - def get_metadata(self): """Returns the jobject metadata or None if there is no jobject. diff --git a/src/sugar/sugar-preview.c b/src/sugar/sugar-preview.c deleted file mode 100644 index 44b83e4..0000000 --- a/src/sugar/sugar-preview.c +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (C) 2007, Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include -#include -#include - -#include "sugar-preview.h" - -static void sugar_preview_class_init (SugarPreviewClass *menu_class); -static void sugar_preview_init (SugarPreview *menu); - -G_DEFINE_TYPE(SugarPreview, sugar_preview, G_TYPE_OBJECT) - -void -sugar_preview_set_size(SugarPreview *preview, int width, int height) -{ - preview->width = width; - preview->height = height; -} - -GdkPixbuf * -sugar_preview_get_pixbuf(SugarPreview *preview) -{ - if (preview->pixbuf != NULL) { - return preview->pixbuf; - } - - if (preview->image == NULL) { - return NULL; - } - - preview->pixbuf = gdk_pixbuf_get_from_image(NULL, preview->image, NULL, - 0, 0, 0, 0, - preview->image->width, - preview->image->height); - g_object_unref(G_OBJECT(preview->image)); - preview->image = NULL; - - return preview->pixbuf; -} - -void -sugar_preview_clear(SugarPreview *preview) -{ - if (preview->image != NULL) { - g_object_unref(G_OBJECT(preview->image)); - preview->image = NULL; - } - if (preview->pixbuf != NULL) { - g_object_unref(G_OBJECT(preview->pixbuf)); - preview->pixbuf = NULL; - } -} - -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); - visual = gdk_drawable_get_visual(drawable); - colormap = gdk_drawable_get_colormap(drawable); - - preview->image = gdk_image_new(GDK_IMAGE_SHARED, visual, width, height); - gdk_image_set_colormap(preview->image, colormap); - - XShmGetImage(GDK_SCREEN_XDISPLAY(screen), - GDK_DRAWABLE_XID(drawable), - gdk_x11_image_get_ximage(preview->image), - 0, 0, AllPlanes); -} - -static void -sugar_preview_dispose(GObject *object) -{ - SugarPreview *preview = SUGAR_PREVIEW(object); - sugar_preview_clear(preview); -} - -static void -sugar_preview_class_init(SugarPreviewClass *preview_class) -{ - GObjectClass *g_object_class = G_OBJECT_CLASS (preview_class); - - g_object_class->dispose = sugar_preview_dispose; -} - -static void -sugar_preview_init(SugarPreview *preview) -{ - preview->image = NULL; - preview->pixbuf = NULL; -} diff --git a/src/sugar/sugar-preview.h b/src/sugar/sugar-preview.h deleted file mode 100644 index 70ea156..0000000 --- a/src/sugar/sugar-preview.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2007, Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __SUGAR_PREVIEW_H__ -#define __SUGAR_PREVIEW_H__ - -#include - -G_BEGIN_DECLS - -typedef struct _SugarPreview SugarPreview; -typedef struct _SugarPreviewClass SugarPreviewClass; - -#define SUGAR_TYPE_PREVIEW (sugar_preview_get_type()) -#define SUGAR_PREVIEW(object) (G_TYPE_CHECK_INSTANCE_CAST((object), SUGAR_TYPE_PREVIEW, SugarPreview)) -#define SUGAR_PREVIEW_CLASS(klass) (G_TYPE_CHACK_CLASS_CAST((klass), SUGAR_TYPE_PREVIEW, SugarPreviewClass)) -#define SUGAR_IS_PREVIEW(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), SUGAR_TYPE_PREVIEW)) -#define SUGAR_IS_PREVIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SUGAR_TYPE_PREVIEW)) -#define SUGAR_PREVIEW_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS((object), SUGAR_TYPE_PREVIEW, SugarPreviewClass)) - -struct _SugarPreview { - GObject base_instance; - - GdkImage *image; - GdkPixbuf *pixbuf; - - int width; - int height; -}; - -struct _SugarPreviewClass { - GObjectClass base_class; -}; - -GType sugar_preview_get_type (void); -void sugar_preview_take_screenshot (SugarPreview *preview, - GtkWidget *widget); -void sugar_preview_set_size (SugarPreview *preview, - int width, - int height); -GdkPixbuf *sugar_preview_get_pixbuf (SugarPreview *preview); -void sugar_preview_clear (SugarPreview *preview); - -G_END_DECLS - -#endif /* __SUGAR_PREVIEW_H__ */ -- cgit v0.9.1