[gtk+] Make set_cairo_surface_size a vfunc on GdkWindowImpl



commit eca2af52306176ebd5370e35b71da7dc7b4f549e
Author: Kristian Rietveld <kris gtk org>
Date:   Tue Oct 5 15:21:40 2010 +0200

    Make set_cairo_surface_size a vfunc on GdkWindowImpl
    
    Note the special implementation of this method on GdkOffscreenWindow
    that makes sure its current surface is not destroyed.

 gdk/gdkinternals.h              |    4 ----
 gdk/gdkoffscreenwindow.c        |   13 +++++++++++++
 gdk/gdkwindow.c                 |   15 +++++++++------
 gdk/gdkwindowimpl.h             |    5 +++++
 gdk/quartz/gdkdrawable-quartz.c |    9 ---------
 gdk/quartz/gdkwindow-quartz.c   |   13 +++++++++++++
 gdk/win32/gdkdrawable-win32.c   |    9 ---------
 gdk/win32/gdkwindow-win32.c     |   13 +++++++++++++
 gdk/x11/gdkdrawable-x11.c       |    9 ---------
 gdk/x11/gdkwindow-x11.c         |   12 ++++++++++++
 10 files changed, 65 insertions(+), 37 deletions(-)
---
diff --git a/gdk/gdkinternals.h b/gdk/gdkinternals.h
index 9f2c4ca..e2f45d5 100644
--- a/gdk/gdkinternals.h
+++ b/gdk/gdkinternals.h
@@ -495,10 +495,6 @@ void _gdk_display_pointer_info_foreach (GdkDisplay                   *display,
 void _gdk_window_invalidate_for_expose (GdkWindow       *window,
 					cairo_region_t       *region);
 
-gboolean _gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface,
-					        int width,
-					        int height);
-
 GdkWindow * _gdk_window_find_child_at (GdkWindow *window,
 				       int x, int y);
 GdkWindow * _gdk_window_find_descendant_at (GdkWindow *toplevel,
diff --git a/gdk/gdkoffscreenwindow.c b/gdk/gdkoffscreenwindow.c
index ebbdcc7..dbacf95 100644
--- a/gdk/gdkoffscreenwindow.c
+++ b/gdk/gdkoffscreenwindow.c
@@ -597,6 +597,18 @@ gdk_offscreen_window_translate (GdkWindow      *window,
   _gdk_window_add_damage (window, area);
 }
 
+static cairo_surface_t *
+gdk_offscreen_window_resize_cairo_surface (GdkWindow       *window,
+                                           cairo_surface_t *surface,
+                                           gint             width,
+                                           gint             height)
+{
+  /* No-op.  The surface gets resized in
+   * gdk_offscreen_window_move_resize_internal().
+   */
+  return surface;
+}
+
 /**
  * gdk_offscreen_window_set_embedder:
  * @window: a #GdkWindow
@@ -700,4 +712,5 @@ gdk_offscreen_window_impl_iface_init (GdkWindowImplIface *iface)
   iface->get_root_coords = gdk_offscreen_window_get_root_coords;
   iface->get_device_state = gdk_offscreen_window_get_device_state;
   iface->destroy = gdk_offscreen_window_destroy;
+  iface->resize_cairo_surface = gdk_offscreen_window_resize_cairo_surface;
 }
diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c
index e0ef633..6801900 100644
--- a/gdk/gdkwindow.c
+++ b/gdk/gdkwindow.c
@@ -1018,14 +1018,17 @@ recompute_visible_regions_internal (GdkWindowObject *private,
       recompute_visible_regions_internal (private->parent, TRUE, FALSE, FALSE);
     }
 
-  if (private->cairo_surface &&
-      (!gdk_window_has_impl (private) ||
-       !_gdk_windowing_set_cairo_surface_size (private->cairo_surface,
-                                               private->width,
-                                               private->height)))
+  if (private->cairo_surface && gdk_window_has_impl (private))
     {
-      gdk_window_drop_cairo_surface (private);
+      GdkWindowImplIface *iface = GDK_WINDOW_IMPL_GET_IFACE (private->impl);
+
+      private->cairo_surface = iface->resize_cairo_surface (private->impl,
+                                                            private->cairo_surface,
+                                                            private->width,
+                                                            private->height);
     }
+  else if (private->cairo_surface)
+    gdk_window_drop_cairo_surface (private);
 }
 
 /* Call this when private has changed in one or more of these ways:
diff --git a/gdk/gdkwindowimpl.h b/gdk/gdkwindowimpl.h
index a39ed37..1c9d819 100644
--- a/gdk/gdkwindowimpl.h
+++ b/gdk/gdkwindowimpl.h
@@ -141,6 +141,11 @@ struct _GdkWindowImplIface
   void         (* destroy)              (GdkWindow       *window,
 					 gboolean         recursing,
 					 gboolean         foreign_destroy);
+
+  cairo_surface_t * (* resize_cairo_surface) (GdkWindow       *window,
+                                              cairo_surface_t *surface,
+                                              gint             width,
+                                              gint             height);
 };
 
 /* Interface Functions */
diff --git a/gdk/quartz/gdkdrawable-quartz.c b/gdk/quartz/gdkdrawable-quartz.c
index b199136..632f0cd 100644
--- a/gdk/quartz/gdkdrawable-quartz.c
+++ b/gdk/quartz/gdkdrawable-quartz.c
@@ -32,15 +32,6 @@ typedef struct {
   CGContextRef  cg_context;
 } GdkQuartzCairoSurfaceData;
 
-gboolean
-_gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface,
-				       int              width,
-				       int              height)
-{
-  /* This is not supported with quartz surfaces. */
-  return FALSE;
-}
-
 static void
 gdk_quartz_cairo_surface_destroy (void *data)
 {
diff --git a/gdk/quartz/gdkwindow-quartz.c b/gdk/quartz/gdkwindow-quartz.c
index 6a58347..11d140f 100644
--- a/gdk/quartz/gdkwindow-quartz.c
+++ b/gdk/quartz/gdkwindow-quartz.c
@@ -1086,6 +1086,18 @@ _gdk_quartz_window_destroy (GdkWindow *window,
     }
 }
 
+static cairo_surface_t *
+gdk_window_quartz_resize_cairo_surface (GdkWindow       *window,
+                                        cairo_surface_t *surface,
+                                        gint             width,
+                                        gint             height)
+{
+  /* Quartz surfaces cannot be resized */
+  cairo_surface_destroy (surface);
+
+  return NULL;
+}
+
 void
 _gdk_windowing_window_destroy_foreign (GdkWindow *window)
 {
@@ -2986,6 +2998,7 @@ gdk_window_impl_iface_init (GdkWindowImplIface *iface)
   iface->queue_antiexpose = _gdk_quartz_window_queue_antiexpose;
   iface->translate = _gdk_quartz_window_translate;
   iface->destroy = _gdk_quartz_window_destroy;
+  iface->resize_cairo_surface = gdk_window_quartz_resize_cairo_surface;
 }
 
 
diff --git a/gdk/win32/gdkdrawable-win32.c b/gdk/win32/gdkdrawable-win32.c
index beafd7b..d2e0348 100644
--- a/gdk/win32/gdkdrawable-win32.c
+++ b/gdk/win32/gdkdrawable-win32.c
@@ -228,15 +228,6 @@ gdk_win32_ref_cairo_surface (GdkDrawable *drawable)
   return impl->cairo_surface;
 }
 
-gboolean
-_gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface,
-				       gint width,
-				       gint height)
-{
-  // Do nothing.  The surface size is determined by the DC
-  return FALSE;
-}
-
 HGDIOBJ
 gdk_win32_drawable_get_handle (GdkDrawable *drawable)
 {
diff --git a/gdk/win32/gdkwindow-win32.c b/gdk/win32/gdkwindow-win32.c
index 9869a8e..398be8d 100644
--- a/gdk/win32/gdkwindow-win32.c
+++ b/gdk/win32/gdkwindow-win32.c
@@ -744,6 +744,18 @@ _gdk_win32_window_destroy (GdkWindow *window,
   gdk_win32_handle_table_remove (GDK_WINDOW_HWND (window));
 }
 
+static cairo_surface_t *
+gdk_win32_window_resize_cairo_surface (GdkWindow       *window,
+                                       cairo_surface_t *surface,
+                                       gint             width,
+                                       gint             height)
+{
+  /* XXX: Make Cairo surface use DC clip */
+  cairo_surface_destroy (surface);
+
+  return NULL;
+}
+
 void
 _gdk_windowing_window_destroy_foreign (GdkWindow *window)
 {
@@ -3299,6 +3311,7 @@ gdk_window_impl_iface_init (GdkWindowImplIface *iface)
   iface->queue_antiexpose = _gdk_win32_window_queue_antiexpose;
   iface->translate = _gdk_win32_window_translate;
   iface->destroy = _gdk_win32_window_destroy;
+  iface->resize_cairo_surface = gdk_win32_window_resize_cairo_surface;
 }
 
 gboolean
diff --git a/gdk/x11/gdkdrawable-x11.c b/gdk/x11/gdkdrawable-x11.c
index 9214364..2110716 100644
--- a/gdk/x11/gdkdrawable-x11.c
+++ b/gdk/x11/gdkdrawable-x11.c
@@ -194,15 +194,6 @@ gdk_x11_cairo_surface_destroy (void *data)
   impl->cairo_surface = NULL;
 }
 
-gboolean
-_gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface,
-				       int width,
-				       int height)
-{
-  cairo_xlib_surface_set_size (surface, width, height);
-  return TRUE;
-}
-
 static cairo_surface_t *
 gdk_x11_create_cairo_surface (GdkDrawable *drawable,
 			      int width,
diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c
index df634b6..66494d6 100644
--- a/gdk/x11/gdkwindow-x11.c
+++ b/gdk/x11/gdkwindow-x11.c
@@ -1028,6 +1028,17 @@ _gdk_x11_window_destroy (GdkWindow *window,
     }
 }
 
+static cairo_surface_t *
+gdk_window_x11_resize_cairo_surface (GdkWindow       *window,
+                                     cairo_surface_t *surface,
+                                     gint             width,
+                                     gint             height)
+{
+  cairo_xlib_surface_set_size (surface, width, height);
+
+  return surface;
+}
+
 void
 _gdk_windowing_window_destroy_foreign (GdkWindow *window)
 {
@@ -5514,6 +5525,7 @@ gdk_window_impl_iface_init (GdkWindowImplIface *iface)
   iface->queue_antiexpose = _gdk_x11_window_queue_antiexpose;
   iface->translate = _gdk_x11_window_translate;
   iface->destroy = _gdk_x11_window_destroy;
+  iface->resize_cairo_surface = gdk_window_x11_resize_cairo_surface;
 }
 
 static Bool



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