[gtk+] GtkWindow: Don't needlessly resize popovers
- From: Timm Bäder <baedert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] GtkWindow: Don't needlessly resize popovers
- Date: Tue, 29 Sep 2015 13:29:57 +0000 (UTC)
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]