Hi,

just so this patch doesn't get lost while we rebase to F10, we should
apply it once OLPC rebases and check the performance improvement.

Regards,

Tomeu
From 96b5ec2fac8081fc41c698a347d7c8f529f9da70 Mon Sep 17 00:00:00 2001
From: Tomeu Vizoso <[EMAIL PROTECTED]>
Date: Tue, 11 Nov 2008 17:34:34 +0100
Subject: [PATCH] Remove the hacks for asking the X server for screenshots and use gtk.Widget.get_snapshot() instead.

---
 src/sugar/Makefile.am          |    4 +-
 src/sugar/_sugarext.defs       |   45 -------------
 src/sugar/_sugarext.override   |    1 -
 src/sugar/activity/activity.py |   39 ++---------
 src/sugar/sugar-preview.c      |  139 ----------------------------------------
 src/sugar/sugar-preview.h      |   62 ------------------
 tests/graphics/preview.py      |   43 ------------
 7 files changed, 9 insertions(+), 324 deletions(-)
 delete mode 100644 src/sugar/sugar-preview.c
 delete mode 100644 src/sugar/sugar-preview.h
 delete mode 100644 tests/graphics/preview.py

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 39c2f48..3ab1aa8 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
@@ -727,10 +719,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)
 
@@ -741,8 +738,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):
@@ -756,10 +751,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.
         
@@ -785,7 +776,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:
@@ -816,8 +807,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
 
@@ -980,9 +969,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
 
@@ -1001,15 +987,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 <gdk/gdkx.h>
-#include <gtk/gtkwindow.h>
-#include <X11/extensions/XShm.h>
-
-#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 <gdk/gdkdrawable.h>
-
-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__ */
diff --git a/tests/graphics/preview.py b/tests/graphics/preview.py
deleted file mode 100644
index c1e9ccb..0000000
--- a/tests/graphics/preview.py
+++ /dev/null
@@ -1,43 +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.
-
-"""
-"""
-
-import gtk
-import gobject
-
-from sugar import _sugarext
-
-import common
-
-def _preview_timeout_cb():
-    preview = _sugarext.Preview()
-    preview.take_screenshot(button.window)
-    preview.get_pixbuf().save('/home/marco/test.png','png')
-    preview.clear()
-
-test = common.Test()
-
-button = gtk.Button('Hello')
-test.pack_start(button)
-button.show()
-
-gobject.timeout_add(2000, _preview_timeout_cb)
-
-if __name__ == "__main__":
-    common.main(test)
-- 
1.5.6.3

_______________________________________________
Sugar mailing list
[email protected]
http://lists.laptop.org/listinfo/sugar

Reply via email to