[gimp] Derive GimpCanvas from GimpOverlayBox



commit 8124792130ba616ed1fe74a0988eef01c1c63362
Author: Michael Natterer <mitch gimp org>
Date:   Sun Oct 18 22:19:29 2009 +0200

    Derive GimpCanvas from GimpOverlayBox
    
    - adapt callbacks to ignore / not block events on offscreen children
    - use GimpOverlayBox' scroll API which makes sure overlay children
      don't scroll along

 app/display/gimpcanvas.c                 |  113 ++++++------------------------
 app/display/gimpcanvas.h                 |   11 ++--
 app/display/gimpdisplayshell-callbacks.c |   10 +++-
 app/display/gimpdisplayshell-scroll.c    |    3 +-
 4 files changed, 37 insertions(+), 100 deletions(-)
---
diff --git a/app/display/gimpcanvas.c b/app/display/gimpcanvas.c
index f9d5cb8..c541c30 100644
--- a/app/display/gimpcanvas.c
+++ b/app/display/gimpcanvas.c
@@ -46,27 +46,25 @@ enum
 
 /*  local function prototypes  */
 
-static void    gimp_canvas_set_property  (GObject         *object,
-                                          guint            property_id,
-                                          const GValue    *value,
-                                          GParamSpec      *pspec);
-static void    gimp_canvas_get_property  (GObject         *object,
-                                          guint            property_id,
-                                          GValue          *value,
-                                          GParamSpec      *pspec);
-
-static void    gimp_canvas_realize       (GtkWidget       *widget);
-static void    gimp_canvas_unrealize     (GtkWidget       *widget);
-static void    gimp_canvas_size_allocate (GtkWidget       *widget,
-                                          GtkAllocation   *allocation);
-static void    gimp_canvas_style_set     (GtkWidget       *widget,
-                                          GtkStyle        *prev_style);
+static void    gimp_canvas_set_property (GObject         *object,
+                                         guint            property_id,
+                                         const GValue    *value,
+                                         GParamSpec      *pspec);
+static void    gimp_canvas_get_property (GObject         *object,
+                                         guint            property_id,
+                                         GValue          *value,
+                                         GParamSpec      *pspec);
+
+static void    gimp_canvas_realize      (GtkWidget       *widget);
+static void    gimp_canvas_unrealize    (GtkWidget       *widget);
+static void    gimp_canvas_style_set    (GtkWidget       *widget,
+                                         GtkStyle        *prev_style);
 
 static GdkGC * gimp_canvas_gc_new       (GimpCanvas      *canvas,
                                          GimpCanvasStyle  style);
 
 
-G_DEFINE_TYPE (GimpCanvas, gimp_canvas, GTK_TYPE_CONTAINER)
+G_DEFINE_TYPE (GimpCanvas, gimp_canvas, GIMP_TYPE_OVERLAY_BOX)
 
 #define parent_class gimp_canvas_parent_class
 
@@ -167,7 +165,6 @@ gimp_canvas_class_init (GimpCanvasClass *klass)
 
   widget_class->realize       = gimp_canvas_realize;
   widget_class->unrealize     = gimp_canvas_unrealize;
-  widget_class->size_allocate = gimp_canvas_size_allocate;
   widget_class->style_set     = gimp_canvas_style_set;
 
   g_object_class_install_property (object_class, PROP_CONFIG,
@@ -184,6 +181,7 @@ gimp_canvas_init (GimpCanvas *canvas)
   gint       i;
 
   gtk_widget_set_can_focus (widget, TRUE);
+  gtk_widget_add_events (widget, GIMP_CANVAS_EVENT_MASK);
   gtk_widget_set_extension_events (widget, GDK_EXTENSION_EVENTS_ALL);
 
   for (i = 0; i < GIMP_CANVAS_NUM_STYLES; i++)
@@ -195,9 +193,9 @@ gimp_canvas_init (GimpCanvas *canvas)
 
 static void
 gimp_canvas_set_property (GObject      *object,
-                           guint         property_id,
-                           const GValue *value,
-                           GParamSpec   *pspec)
+                          guint         property_id,
+                          const GValue *value,
+                          GParamSpec   *pspec)
 {
   GimpCanvas *canvas = GIMP_CANVAS (object);
 
@@ -234,38 +232,9 @@ gimp_canvas_get_property (GObject    *object,
 static void
 gimp_canvas_realize (GtkWidget *widget)
 {
-  GimpCanvas    *canvas = GIMP_CANVAS (widget);
-  GtkAllocation  allocation;
-  GdkWindowAttr  attributes;
-  gint           attributes_mask;
-
-  GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
-
-  gtk_widget_get_allocation (widget, &allocation);
+  GimpCanvas *canvas = GIMP_CANVAS (widget);
 
-  attributes.x           = allocation.x;
-  attributes.y           = allocation.y;
-  attributes.width       = allocation.width;
-  attributes.height      = allocation.height;
-  attributes.window_type = GDK_WINDOW_CHILD;
-  attributes.wclass      = GDK_INPUT_OUTPUT;
-  attributes.visual      = gtk_widget_get_visual (widget);
-  attributes.colormap    = gtk_widget_get_colormap (widget);
-  attributes.event_mask  = (gtk_widget_get_events (widget) |
-                            GIMP_CANVAS_EVENT_MASK);
-
-  attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
-
-  gtk_widget_set_window (widget,
-                         gdk_window_new (gtk_widget_get_parent_window (widget),
-                                         &attributes, attributes_mask));
-  gdk_window_set_user_data (gtk_widget_get_window (widget), widget);
-
-  widget->style = gtk_style_attach (gtk_widget_get_style (widget),
-                                    gtk_widget_get_window (widget));
-  gtk_style_set_background (gtk_widget_get_style (widget),
-                            gtk_widget_get_window (widget),
-                            GTK_STATE_NORMAL);
+  GTK_WIDGET_CLASS (parent_class)->realize (widget);
 
   canvas->stipple[0] =
     gdk_bitmap_create_from_data (gtk_widget_get_window (widget),
@@ -306,18 +275,6 @@ gimp_canvas_unrealize (GtkWidget *widget)
 }
 
 static void
-gimp_canvas_size_allocate (GtkWidget     *widget,
-                           GtkAllocation *allocation)
-{
-  gtk_widget_set_allocation (widget, allocation);
-
-  if (GTK_WIDGET_REALIZED (widget))
-    gdk_window_move_resize (gtk_widget_get_window (widget),
-                            allocation->x, allocation->y,
-                            allocation->width, allocation->height);
-}
-
-static void
 gimp_canvas_style_set (GtkWidget *widget,
                        GtkStyle  *prev_style)
 {
@@ -564,34 +521,6 @@ gimp_canvas_new (GimpDisplayConfig *config)
 }
 
 /**
- * gimp_canvas_scroll:
- * @canvas: the #GimpCanvas widget to scroll.
- * @offset_x: the x scroll amount.
- * @offset_y: the y scroll amount.
- *
- * Scrolls the canvas using gdk_window_scroll() and makes sure the result
- * is displayed immediately by calling gdk_window_process_updates().
- **/
-void
-gimp_canvas_scroll (GimpCanvas *canvas,
-                    gint        offset_x,
-                    gint        offset_y)
-{
-  GtkWidget *widget;
-  GdkWindow *window;
-
-  g_return_if_fail (GIMP_IS_CANVAS (canvas));
-
-  widget = GTK_WIDGET (canvas);
-  window = gtk_widget_get_window (widget);
-
-  gdk_window_scroll (window, offset_x, offset_y);
-
-  /*  Make sure expose events are processed before scrolling again  */
-  gdk_window_process_updates (window, FALSE);
-}
-
-/**
  * gimp_canvas_draw_cursor:
  * @canvas: the #GimpCanvas widget to draw on.
  * @x: x coordinate
diff --git a/app/display/gimpcanvas.h b/app/display/gimpcanvas.h
index fb0e4b0..acaa76b 100644
--- a/app/display/gimpcanvas.h
+++ b/app/display/gimpcanvas.h
@@ -19,6 +19,9 @@
 #define __GIMP_CANVAS_H__
 
 
+#include "widgets/gimpoverlaybox.h"
+
+
 typedef enum
 {
   GIMP_CANVAS_STYLE_BLACK,
@@ -68,7 +71,7 @@ typedef struct _GimpCanvasClass GimpCanvasClass;
 
 struct _GimpCanvas
 {
-  GtkContainer       parent_instance;
+  GimpOverlayBox     parent_instance;
 
   GimpDisplayConfig *config;
 
@@ -79,7 +82,7 @@ struct _GimpCanvas
 
 struct _GimpCanvasClass
 {
-  GtkContainerClass  parent_class;
+  GimpOverlayBoxClass  parent_class;
 };
 
 
@@ -87,10 +90,6 @@ GType        gimp_canvas_get_type          (void) G_GNUC_CONST;
 
 GtkWidget  * gimp_canvas_new               (GimpDisplayConfig *config);
 
-void         gimp_canvas_scroll            (GimpCanvas        *canvas,
-                                            gint               offset_x,
-                                            gint               offset_y);
-
 void         gimp_canvas_draw_cursor       (GimpCanvas        *canvas,
                                             gint               x,
                                             gint               y);
diff --git a/app/display/gimpdisplayshell-callbacks.c b/app/display/gimpdisplayshell-callbacks.c
index f44359d..90b4658 100644
--- a/app/display/gimpdisplayshell-callbacks.c
+++ b/app/display/gimpdisplayshell-callbacks.c
@@ -375,6 +375,10 @@ gimp_display_shell_canvas_expose (GtkWidget        *widget,
   if (! shell->display || ! gimp_display_get_shell (shell->display))
     return TRUE;
 
+  /*  ignore events on overlays  */
+  if (eevent->window != gtk_widget_get_window (widget))
+    return FALSE;
+
   if (gimp_display_get_image (shell->display))
     {
       gimp_display_shell_canvas_expose_image (shell, eevent);
@@ -382,7 +386,7 @@ gimp_display_shell_canvas_expose (GtkWidget        *widget,
       /* Return TRUE here to avoid redrawing the image when it gets the
        * keyboard focus.
        */
-      return TRUE;
+      return FALSE; /* TRUE; */
     }
   else
     {
@@ -615,6 +619,10 @@ gimp_display_shell_canvas_tool_events (GtkWidget        *canvas,
   if (gimp_display_shell_events (canvas, event, shell))
     return TRUE;
 
+  /*  ignore events on overlays  */
+  if (((GdkEventAny *) event)->window != canvas->window)
+    return FALSE;
+
   display = shell->display;
   gimp    = gimp_display_get_gimp (display);
   image   = gimp_display_get_image (display);
diff --git a/app/display/gimpdisplayshell-scroll.c b/app/display/gimpdisplayshell-scroll.c
index 7cc4869..a42e30c 100644
--- a/app/display/gimpdisplayshell-scroll.c
+++ b/app/display/gimpdisplayshell-scroll.c
@@ -122,7 +122,8 @@ gimp_display_shell_scroll (GimpDisplayShell *shell,
       shell->offset_x += x_offset;
       shell->offset_y += y_offset;
 
-      gimp_canvas_scroll (GIMP_CANVAS (shell->canvas), -x_offset, -y_offset);
+      gimp_overlay_box_scroll (GIMP_OVERLAY_BOX (shell->canvas),
+                               -x_offset, -y_offset);
 
       /*  Update scrollbars and rulers  */
       gimp_display_shell_update_scrollbars_and_rulers (shell);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]