[gtk+/client-side-windows: 182/284] Update for changes in the paintable interface



commit 24aa1620bffdbe4462e9fdbb1da6b6d42a3ace8c
Author: Richard Hult <richard imendio com>
Date:   Mon Jan 26 20:33:33 2009 +0100

    Update for changes in the paintable interface
    
    Get rid of invalidate_maybe_recurse and process_updates. Implement
    _gdk_windowing_{before,after}_process_all_updates(), and keep track of
    when we're inside process_all_updates in the common code so we know
    when to flush windows. Implement
    _gdk_windowing_window_process_updates_recurse by means of
    setNeedsDisplayInRect: displayIfNeeded. Use the added window argument
    in begin_paint_region to get the right window (the paintable is always
    the impl window now).
---
 gdk/quartz/gdkwindow-quartz.c |  208 ++++++++++++++---------------------------
 1 files changed, 72 insertions(+), 136 deletions(-)

diff --git a/gdk/quartz/gdkwindow-quartz.c b/gdk/quartz/gdkwindow-quartz.c
index 1aa3b87..a2541d7 100644
--- a/gdk/quartz/gdkwindow-quartz.c
+++ b/gdk/quartz/gdkwindow-quartz.c
@@ -28,8 +28,8 @@
 
 static gpointer parent_class;
 
-static GSList *update_windows;
-static guint   update_idle;
+static GSList   *update_nswindows;
+static gboolean  in_process_all_updates = FALSE;
 
 static GSList *main_window_stack;
 
@@ -176,29 +176,40 @@ gdk_window_impl_quartz_init (GdkWindowImplQuartz *impl)
 
 static void
 gdk_window_impl_quartz_begin_paint_region (GdkPaintable    *paintable,
+                                           GdkWindow       *window,
 					   const GdkRegion *region)
 {
   GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (paintable);
-  GdkDrawableImplQuartz *drawable_impl;
+  GdkWindowObject *private = (GdkWindowObject*)window;
   int n_rects;
-  GdkRectangle *rects;
+  GdkRectangle *rects = NULL;
   GdkPixmap *bg_pixmap;
-  GdkWindow *window;
+  GdkRegion *clipped_and_offset_region;
+  gboolean free_clipped_and_offset_region = TRUE;
+
+  bg_pixmap = private->bg_pixmap;
 
-  drawable_impl = GDK_DRAWABLE_IMPL_QUARTZ (impl);
-  bg_pixmap = GDK_WINDOW_OBJECT (drawable_impl->wrapper)->bg_pixmap;
+  clipped_and_offset_region = gdk_region_copy (region);
+
+  gdk_region_intersect (clipped_and_offset_region,
+                        private->clip_region_with_children);
+  gdk_region_offset (clipped_and_offset_region,
+                     private->abs_x, private->abs_y);
 
   if (impl->begin_paint_count == 0)
-    impl->paint_clip_region = gdk_region_copy (region);
+    {
+      impl->paint_clip_region = clipped_and_offset_region;
+      free_clipped_and_offset_region = FALSE;
+    }
   else
-    gdk_region_union (impl->paint_clip_region, region);
+    gdk_region_union (impl->paint_clip_region, clipped_and_offset_region);
 
   impl->begin_paint_count++;
 
   if (bg_pixmap == GDK_NO_BG)
-    return;
+    goto done;
 
-  gdk_region_get_rectangles (region, &rects, &n_rects);
+  gdk_region_get_rectangles (clipped_and_offset_region, &rects, &n_rects);
 
   if (bg_pixmap == NULL)
     {
@@ -207,9 +218,9 @@ gdk_window_impl_quartz_begin_paint_region (GdkPaintable    *paintable,
       gint i;
 
       cg_context = gdk_quartz_drawable_get_context (GDK_DRAWABLE (impl), FALSE);
-      _gdk_quartz_colormap_get_rgba_from_pixel (gdk_drawable_get_colormap (drawable_impl->wrapper),
-				      GDK_WINDOW_OBJECT (drawable_impl->wrapper)->bg_color.pixel,
-				      &r, &g, &b, &a);
+      _gdk_quartz_colormap_get_rgba_from_pixel (gdk_drawable_get_colormap (window),
+                                                private->bg_color.pixel,
+                                                &r, &g, &b, &a);
       CGContextSetRGBFillColor (cg_context, r, g, b, a);
  
       for (i = 0; i < n_rects; i++)
@@ -230,7 +241,6 @@ gdk_window_impl_quartz_begin_paint_region (GdkPaintable    *paintable,
 
       x_offset = y_offset = 0;
 
-      window = GDK_WINDOW (drawable_impl->wrapper);
       while (window && bg_pixmap == GDK_PARENT_RELATIVE_BG)
         {
           /* If this window should have the same background as the parent,
@@ -248,8 +258,7 @@ gdk_window_impl_quartz_begin_paint_region (GdkPaintable    *paintable,
           /* Parent relative background but the parent doesn't have a
            * pixmap.
            */ 
-          g_free (rects);
-          return;
+          goto done;
         }
 
       /* Note: There should be a CG API to draw tiled images, we might
@@ -279,6 +288,9 @@ gdk_window_impl_quartz_begin_paint_region (GdkPaintable    *paintable,
       g_object_unref (gc);
     }
 
+ done:
+  if (free_clipped_and_offset_region)
+    gdk_region_destroy (clipped_and_offset_region);
   g_free (rects);
 }
 
@@ -296,155 +308,83 @@ gdk_window_impl_quartz_end_paint (GdkPaintable *paintable)
     }
 }
 
-static void
-gdk_window_quartz_process_updates_internal (GdkWindow *window)
-{
-  GdkWindowObject *private = (GdkWindowObject *) window;
-  GdkWindowImplQuartz *impl = (GdkWindowImplQuartz *) private->impl;
-      
-  if (private->update_area)
-    {
-      int i, n_rects;
-      GdkRectangle *rects;
-
-      gdk_region_get_rectangles (private->update_area, &rects, &n_rects);
-
-      gdk_region_destroy (private->update_area);
-      private->update_area = NULL;
-
-      for (i = 0; i < n_rects; i++) 
-	{
-	  [impl->view setNeedsDisplayInRect:NSMakeRect (rects[i].x, rects[i].y,
-							rects[i].width, rects[i].height)];
-	}
-
-      [impl->view displayIfNeeded];
-
-      g_free (rects);
-    }
-}
-
-static void
-gdk_window_quartz_process_all_updates (void)
+void
+_gdk_windowing_window_process_updates_recurse (GdkWindow *window,
+                                               GdkRegion *region)
 {
-  GSList *old_update_windows = update_windows;
-  GSList *tmp_list = update_windows;
-  GSList *nswindows;
-
-  update_idle = 0;
-  update_windows = NULL;
-  nswindows = NULL;
-
-  g_slist_foreach (old_update_windows, (GFunc) g_object_ref, NULL);
-  
-  GDK_QUARTZ_ALLOC_POOL;
+  GdkWindowObject *private = (GdkWindowObject *)window;
+  GdkWindowImplQuartz *impl = (GdkWindowImplQuartz *)private->impl;
+  int i, n_rects;
+  GdkRectangle *rects;
 
-  while (tmp_list)
+  /* Make sure to only flush each toplevel at most once if we're called
+   * from process_all_updates.
+   */
+  if (in_process_all_updates)
     {
-      GdkWindow *window = tmp_list->data;
       GdkWindow *toplevel;
 
-      /* Only flush each toplevel at most once. */
       toplevel = gdk_window_get_toplevel (window);
       if (toplevel)
         {
-          GdkWindowObject *private;
-          GdkWindowImplQuartz *impl;
+          GdkWindowObject *toplevel_private;
+          GdkWindowImplQuartz *toplevel_impl;
           NSWindow *nswindow;
 
-          private = (GdkWindowObject *) toplevel;
-          impl = (GdkWindowImplQuartz *) private->impl;
-          nswindow = impl->toplevel;
+          toplevel_private = (GdkWindowObject *)toplevel;
+          toplevel_impl = (GdkWindowImplQuartz *)toplevel_private->impl;
+          nswindow = toplevel_impl->toplevel;
 
           if (nswindow && ![nswindow isFlushWindowDisabled]) 
             {
+              [nswindow retain];
               [nswindow disableFlushWindow];
-              nswindows = g_slist_prepend (nswindows, nswindow);
+              update_nswindows = g_slist_prepend (update_nswindows, nswindow);
             }
         }
-
-      gdk_window_quartz_process_updates_internal (tmp_list->data);
-
-      g_object_unref (tmp_list->data);
-      tmp_list = tmp_list->next;
     }
 
-  tmp_list = nswindows;
-  while (tmp_list) 
-    {
-      NSWindow *nswindow = tmp_list->data;
-
-      [nswindow enableFlushWindow];
-      [nswindow flushWindow];
+  gdk_region_get_rectangles (region, &rects, &n_rects);
 
-      tmp_list = tmp_list->next;
+  for (i = 0; i < n_rects; i++)
+    {
+      [impl->view setNeedsDisplayInRect:NSMakeRect (rects[i].x, rects[i].y,
+                                                    rects[i].width, rects[i].height)];
     }
-		    
-  GDK_QUARTZ_RELEASE_POOL;
 
-  g_slist_free (old_update_windows);
-  g_slist_free (nswindows);
+  g_free (rects);
+
+  [impl->view displayIfNeeded];
 }
 
-static gboolean
-gdk_window_quartz_update_idle (gpointer data)
+void
+_gdk_windowing_before_process_all_updates (void)
 {
-  gdk_window_quartz_process_all_updates ();
-
-  return FALSE;
+  in_process_all_updates = TRUE;
 }
 
-static void
-gdk_window_impl_quartz_invalidate_maybe_recurse (GdkPaintable    *paintable,
-						 const GdkRegion *region,
-						 gboolean        (*child_func) (GdkWindow *, gpointer),
-						 gpointer         user_data)
-{
-  GdkWindowImplQuartz *window_impl = GDK_WINDOW_IMPL_QUARTZ (paintable);
-  GdkDrawableImplQuartz *drawable_impl = (GdkDrawableImplQuartz *) window_impl;
-  GdkWindow *window = (GdkWindow *) drawable_impl->wrapper;
-  GdkWindowObject *private = (GdkWindowObject *) window;
-  GdkRegion *visible_region;
+void
+_gdk_windowing_after_process_all_updates (void)
+{
+  GSList *old_update_nswindows = update_nswindows;
+  GSList *tmp_list = update_nswindows;
 
-  visible_region = gdk_drawable_get_visible_region (window);
-  gdk_region_intersect (visible_region, region);
+  update_nswindows = NULL;
 
-  if (private->update_area)
-    {
-      gdk_region_union (private->update_area, visible_region);
-      gdk_region_destroy (visible_region);
-    }
-  else
+  while (tmp_list)
     {
-      /* FIXME: When the update_window/update_area handling is abstracted in
-       * some way, we can remove this check. Currently it might be cleared
-       * in the generic code without us knowing, see bug #530801.
-       */
-      if (!g_slist_find (update_windows, window))
-        update_windows = g_slist_prepend (update_windows, window);
-      private->update_area = visible_region;
+      NSWindow *nswindow = tmp_list->data;
 
-      if (update_idle == 0)
-        update_idle = gdk_threads_add_idle_full (GDK_PRIORITY_REDRAW,
-                                                 gdk_window_quartz_update_idle, NULL, NULL);
+      [nswindow enableFlushWindow];
+      [nswindow flushWindow];
+      [nswindow release];
+
+      tmp_list = tmp_list->next;
     }
-}
 
-static void
-gdk_window_impl_quartz_process_updates (GdkPaintable *paintable,
-					gboolean      update_children)
-{
-  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (paintable);
-  GdkDrawableImplQuartz *drawable_impl = (GdkDrawableImplQuartz *) impl;
-  GdkWindowObject *private = (GdkWindowObject *) drawable_impl->wrapper;
+  g_slist_free (old_update_nswindows);
 
-  if (private->update_area)
-    {
-      GDK_QUARTZ_ALLOC_POOL;
-      gdk_window_quartz_process_updates_internal ((GdkWindow *) private);
-      update_windows = g_slist_remove (update_windows, private);
-      GDK_QUARTZ_RELEASE_POOL;
-    }
+  in_process_all_updates = FALSE;
 }
 
 static void
@@ -452,9 +392,6 @@ gdk_window_impl_quartz_paintable_init (GdkPaintableIface *iface)
 {
   iface->begin_paint_region = gdk_window_impl_quartz_begin_paint_region;
   iface->end_paint = gdk_window_impl_quartz_end_paint;
-
-  iface->invalidate_maybe_recurse = gdk_window_impl_quartz_invalidate_maybe_recurse;
-  iface->process_updates = gdk_window_impl_quartz_process_updates;
 }
 
 GType
@@ -1000,7 +937,6 @@ _gdk_quartz_window_destroy (GdkWindow *window,
   private = GDK_WINDOW_OBJECT (window);
   impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
 
-  update_windows = g_slist_remove (update_windows, window);
   main_window_stack = g_slist_remove (main_window_stack, window);
 
   g_list_free (impl->sorted_children);



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