[gtk+] gdkwindow: Don't queue a redraw when calling gdk_window_raise with no effect



commit b5eddb0aa1110e68224d5d17d0602c0fd50d5de4
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Thu Jul 3 11:48:28 2014 -0400

    gdkwindow: Don't queue a redraw when calling gdk_window_raise with no effect
    
    The resize grip code in GTK+ likes to call gdk_window_raise a lot. The
    unfortunate side effect of gdk_window_raise is that it queues an
    invalidation on the entire window, even if it's already the topmost
    child.
    
    Add a return value to gdk_window_raise_internal, and only queue the
    invalidation if the raise had an effect.

 gdk/gdkwindow.c |   26 +++++++++++++++++---------
 1 files changed, 17 insertions(+), 9 deletions(-)
---
diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c
index 15d8f0a..2ae5a69 100644
--- a/gdk/gdkwindow.c
+++ b/gdk/gdkwindow.c
@@ -4446,7 +4446,7 @@ get_all_native_children (GdkWindow *window,
 }
 
 
-static inline void
+static gboolean
 gdk_window_raise_internal (GdkWindow *window)
 {
   GdkWindow *parent = window->parent;
@@ -4454,11 +4454,13 @@ gdk_window_raise_internal (GdkWindow *window)
   GList *native_children;
   GList *l, listhead;
   GdkWindowImplClass *impl_class;
+  gboolean did_raise = FALSE;
 
-  if (parent)
+  if (parent && parent->children->data != window)
     {
       parent->children = g_list_remove (parent->children, window);
       parent->children = g_list_prepend (parent->children, window);
+      did_raise = TRUE;
     }
 
   impl_class = GDK_WINDOW_IMPL_GET_CLASS (window->impl);
@@ -4506,8 +4508,9 @@ gdk_window_raise_internal (GdkWindow *window)
 
          g_list_free (native_children);
        }
-
     }
+
+  return did_raise;
 }
 
 /* Returns TRUE If the native window was mapped or unmapped */
@@ -4598,7 +4601,7 @@ gdk_window_show_internal (GdkWindow *window, gboolean raise)
 {
   GdkWindowImplClass *impl_class;
   gboolean was_mapped, was_viewable;
-  gboolean did_show;
+  gboolean did_show, did_raise = FALSE;
 
   g_return_if_fail (GDK_IS_WINDOW (window));
 
@@ -4609,8 +4612,10 @@ gdk_window_show_internal (GdkWindow *window, gboolean raise)
   was_viewable = window->viewable;
 
   if (raise)
-    /* Keep children in (reverse) stacking order */
-    gdk_window_raise_internal (window);
+    {
+      /* Keep children in (reverse) stacking order */
+      did_raise = gdk_window_raise_internal (window);
+    }
 
   if (gdk_window_has_impl (window))
     {
@@ -4646,7 +4651,7 @@ gdk_window_show_internal (GdkWindow *window, gboolean raise)
        _gdk_make_event (window, GDK_MAP, NULL, FALSE);
     }
 
-  if (!was_mapped || raise)
+  if (!was_mapped || did_raise)
     {
       recompute_visible_regions (window, FALSE);
 
@@ -4694,15 +4699,18 @@ gdk_window_show_unraised (GdkWindow *window)
 void
 gdk_window_raise (GdkWindow *window)
 {
+  gboolean did_raise;
+
   g_return_if_fail (GDK_IS_WINDOW (window));
 
   if (window->destroyed)
     return;
 
   /* Keep children in (reverse) stacking order */
-  gdk_window_raise_internal (window);
+  did_raise = gdk_window_raise_internal (window);
 
-  if (!gdk_window_is_toplevel (window) &&
+  if (did_raise &&
+      !gdk_window_is_toplevel (window) &&
       gdk_window_is_viewable (window) &&
       !window->input_only)
     gdk_window_invalidate_region_full (window, window->clip_region, TRUE);


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