[gtk+] GtkWindow: Don't needlessly resize popovers



commit b92213e49d898f3528d44452634dc14c93230e98
Author: Timm Bäder <mail baedert org>
Date:   Wed Sep 23 08:56:56 2015 +0200

    GtkWindow: Don't needlessly resize popovers
    
    Check whether the given popover even changed size in
    _gtk_window_set_popover_position. If not, just move its GdkWindow
    without calling gtk_widget_queue_resize. Using popover_get_rect here is
    still relatively costly, but popover_size_allocate would be doing that
    anyway.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=755435

 gtk/gtkwindow.c |   29 +++++++++++++++++++++--------
 1 files changed, 21 insertions(+), 8 deletions(-)
---
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index 48bd5d9..3a5adc8 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -11904,7 +11904,8 @@ _gtk_window_set_popover_position (GtkWindow                   *window,
                                   GtkPositionType              pos,
                                   const cairo_rectangle_int_t *rect)
 {
-  gboolean need_resize = TRUE;
+  gboolean need_resize;
+  gboolean need_move;
   GtkWindowPopover *data;
 
   g_return_if_fail (GTK_IS_WINDOW (window));
@@ -11919,12 +11920,16 @@ _gtk_window_set_popover_position (GtkWindow                   *window,
                  gtk_widget_get_name (GTK_WIDGET (window)));
       return;
     }
-  else
-    {
-      if (data->pos == pos &&
-          memcmp (&data->rect, rect, sizeof (cairo_rectangle_int_t)) == 0)
-        need_resize = FALSE;
-    }
+
+
+  /* Don't queue a resize if the position as well as the size are the same */
+  need_move = data->pos    != pos ||
+              data->rect.x != rect->x ||
+              data->rect.y != rect->y;
+
+  need_resize = data->pos != pos ||
+                data->rect.width  != rect->width ||
+                data->rect.height != rect->height;
 
   data->rect = *rect;
   data->pos = pos;
@@ -11936,7 +11941,15 @@ _gtk_window_set_popover_position (GtkWindow                   *window,
     }
 
   if (need_resize)
-    gtk_widget_queue_resize (popover);
+    {
+      gtk_widget_queue_resize (popover);
+    }
+  else if (need_move)
+    {
+      cairo_rectangle_int_t new_size;
+      popover_get_rect (data, window, &new_size);
+      gdk_window_move (data->window, new_size.x, new_size.y);
+    }
 }
 
 void


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