]> Pileus Git - ~andy/gtk/commitdiff
Add vfuncs for process_updates_recurse and the before and after hooks
authorMatthias Clasen <mclasen@redhat.com>
Mon, 13 Dec 2010 18:30:05 +0000 (13:30 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Tue, 21 Dec 2010 17:06:58 +0000 (12:06 -0500)
gdk/gdkdisplayprivate.h
gdk/gdkwindow.c
gdk/gdkwindowimpl.h
gdk/x11/gdkdisplay-x11.c
gdk/x11/gdkprivate-x11.h
gdk/x11/gdkwindow-x11.c

index d47144c74b7c790c012e87abaaaef235244e4064..9b1f12b46bcf403558222a3541e40c748fa22d74 100644 (file)
@@ -170,6 +170,9 @@ struct _GdkDisplayClass
                                                         GdkDragProtocol *protocol,
                                                         guint           *version);
 
+  void                       (*before_process_all_updates) (GdkDisplay *display);
+  void                       (*after_process_all_updates)  (GdkDisplay *display);
+
   /* Signals */
   void (*closed) (GdkDisplay *display,
                   gboolean    is_error);
index 8773a896d145a570eb2a480cd7bca27e89c042bb..2a54023c149809b0ca59e25db208182054049df7 100644 (file)
@@ -4039,19 +4039,18 @@ gdk_window_process_updates_internal (GdkWindow *window)
          cairo_region_get_extents (update_area, &clip_box);
          end_implicit = gdk_window_begin_implicit_paint (window, &clip_box);
          expose_region = cairo_region_copy (update_area);
+         impl_class = GDK_WINDOW_IMPL_GET_CLASS (window->impl);
          if (!end_implicit)
            {
              /* Rendering is not double buffered by gdk, do outstanding
               * moves and queue antiexposure immediately. No need to do
               * any tricks */
              gdk_window_flush_outstanding_moves (window);
-             impl_class = GDK_WINDOW_IMPL_GET_CLASS (window->impl);
              save_region = impl_class->queue_antiexpose (window, update_area);
            }
-
          /* Render the invalid areas to the implicit paint, by sending exposes.
           * May flush if non-double buffered widget draw. */
-         _gdk_windowing_window_process_updates_recurse (window, expose_region);
+          impl_class->process_updates_recurse (window, expose_region);
 
          if (end_implicit)
            {
@@ -4060,17 +4059,12 @@ gdk_window_process_updates_internal (GdkWindow *window)
 
              /* By this time we know that any outstanding expose for this
               * area is invalid and we can avoid it, so queue an antiexpose.
-              * However, it may be that due to an non-double buffered expose
               * we have already started drawing to the window, so it would
               * be to late to anti-expose now. Since this is merely an
               * optimization we just avoid doing it at all in that case.
               */
-             if (window->implicit_paint != NULL &&
-                 !window->implicit_paint->flushed)
-               {
-                 impl_class = GDK_WINDOW_IMPL_GET_CLASS (window->impl);
-                 save_region = impl_class->queue_antiexpose (window, update_area);
-               }
+             if (window->implicit_paint != NULL && !window->implicit_paint->flushed)
+                save_region = impl_class->queue_antiexpose (window, update_area);
 
              gdk_window_end_implicit_paint (window);
            }
@@ -4093,11 +4087,39 @@ gdk_window_process_updates_internal (GdkWindow *window)
 static void
 flush_all_displays (void)
 {
-  GSList *displays = gdk_display_manager_list_displays (gdk_display_manager_get ());
-  GSList *tmp_list;
+  GSList *displays, *l;
+
+  displays = gdk_display_manager_list_displays (gdk_display_manager_get ());
+  for (l = displays; l; l = l->next)
+    gdk_display_flush (l->data);
+
+  g_slist_free (displays);
+}
+
+static void
+before_process_all_updates (void)
+{
+  GSList *displays, *l;
+  GdkDisplayClass *display_class;
+
+  displays = gdk_display_manager_list_displays (gdk_display_manager_get ());
+  display_class = GDK_DISPLAY_GET_CLASS (displays->data);
+  for (l = displays; l; l = l->next)
+    display_class->before_process_all_updates (l->data);
+
+  g_slist_free (displays);
+}
+
+static void
+after_process_all_updates (void)
+{
+  GSList *displays, *l;
+  GdkDisplayClass *display_class;
 
-  for (tmp_list = displays; tmp_list; tmp_list = tmp_list->next)
-    gdk_display_flush (tmp_list->data);
+  displays = gdk_display_manager_list_displays (gdk_display_manager_get ());
+  display_class = GDK_DISPLAY_GET_CLASS (displays->data);
+  for (l = displays; l; l = l->next)
+    display_class->after_process_all_updates (l->data);
 
   g_slist_free (displays);
 }
@@ -4145,7 +4167,7 @@ gdk_window_process_all_updates (void)
   update_windows = NULL;
   update_idle = 0;
 
-  _gdk_windowing_before_process_all_updates ();
+  before_process_all_updates ();
 
   g_slist_foreach (old_update_windows, (GFunc)g_object_ref, NULL);
 
@@ -4170,7 +4192,7 @@ gdk_window_process_all_updates (void)
 
   flush_all_displays ();
 
-  _gdk_windowing_after_process_all_updates ();
+  after_process_all_updates ();
 
   in_process_all_updates = FALSE;
 
index 00ecedd81fba88250e388dff6925e0c4a94e16c0..fe50b7a5ca2fc73078efa644449f6a2918624ce9 100644 (file)
@@ -251,6 +251,9 @@ struct _GdkWindowImplClass
   GdkDragContext * (*drag_begin)        (GdkWindow *window,
                                          GdkDevice *device,
                                          GList     *targets);
+
+  void         (*process_updates_recurse) (GdkWindow      *window,
+                                           cairo_region_t *region);
 };
 
 /* Interface Functions */
index dc7909602bde6762f7fa6d78fbe8191ddd1776ca..f90554010e93dd60c91ce31238ec44dac49102f2 100644 (file)
@@ -2703,5 +2703,8 @@ _gdk_display_x11_class_init (GdkDisplayX11Class * class)
   display_class->get_maximal_cursor_size = _gdk_x11_display_get_maximal_cursor_size;
   display_class->supports_cursor_alpha = _gdk_x11_display_supports_cursor_alpha;
   display_class->supports_cursor_color = _gdk_x11_display_supports_cursor_color;
+
+  display_class->before_process_all_updates = _gdk_x11_display_before_process_all_updates;
+  display_class->after_process_all_updates = _gdk_x11_display_after_process_all_updates;
 }
 
index 0d2a0cc2cced7c20f31cff39a039e04bab304ec8..50302c2188f51084705072652e29ee1efab6f34d 100644 (file)
@@ -173,6 +173,8 @@ void       _gdk_x11_display_get_default_cursor_size (GdkDisplay *display,
 void       _gdk_x11_display_get_maximal_cursor_size (GdkDisplay *display,
                                                      guint      *width,
                                                      guint      *height);
+void       _gdk_x11_display_before_process_all_updates (GdkDisplay *display);
+void       _gdk_x11_display_after_process_all_updates  (GdkDisplay *display);
 
 void _gdk_x11_precache_atoms (GdkDisplay          *display,
                              const gchar * const *atom_names,
index 527da43f3c8c174b93a549b1a33d31ba8a5c9b4d..72170e9673d506c2857cbdc6be8b95c037eed16e 100644 (file)
@@ -4862,20 +4862,20 @@ gdk_x11_window_set_composited (GdkWindow *window,
 #endif
 }
 
-void
-_gdk_windowing_window_process_updates_recurse (GdkWindow *window,
-                                               cairo_region_t *region)
+static void
+gdk_x11_window_process_updates_recurse (GdkWindow      *window,
+                                        cairo_region_t *region)
 {
   _gdk_window_process_updates_recurse (window, region);
 }
 
 void
-_gdk_windowing_before_process_all_updates (void)
+_gdk_x11_display_before_process_all_updates (GdkDisplay *display)
 {
 }
 
 void
-_gdk_windowing_after_process_all_updates (void)
+_gdk_x11_display_after_process_all_updates (GdkDisplay *display)
 {
 }
 
@@ -5051,5 +5051,5 @@ gdk_window_impl_x11_class_init (GdkWindowImplX11Class *klass)
   impl_class->destroy_notify = gdk_x11_window_destroy_notify;
   impl_class->register_dnd = _gdk_x11_window_register_dnd;
   impl_class->drag_begin = _gdk_x11_window_drag_begin;
+  impl_class->process_updates_recurse = gdk_x11_window_process_updates_recurse;
 }
-