[gtk: 1/2] listitemfactory: Track notify manually instead of freeze/thaw
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk: 1/2] listitemfactory: Track notify manually instead of freeze/thaw
- Date: Fri, 6 May 2022 14:52:22 +0000 (UTC)
commit d65e7c9d05fbf3491f10a4ed1f9eb385e9ec25b7
Author: Ivan Molodetskikh <yalterz gmail com>
Date: Fri May 6 17:21:00 2022 +0300
listitemfactory: Track notify manually instead of freeze/thaw
freeze/thaw_notify () showed up on the perf trace for rapid ColumnView
scrolling. Track the three properties manually to make it a little
faster.
Related: https://gitlab.gnome.org/GNOME/gtk/-/issues/3334
gtk/gtklistitemfactory.c | 4 ----
gtk/gtklistitemwidget.c | 21 ++++++++++++++-------
2 files changed, 14 insertions(+), 11 deletions(-)
---
diff --git a/gtk/gtklistitemfactory.c b/gtk/gtklistitemfactory.c
index 82fa3402db..48383f29de 100644
--- a/gtk/gtklistitemfactory.c
+++ b/gtk/gtklistitemfactory.c
@@ -162,9 +162,5 @@ gtk_list_item_factory_update (GtkListItemFactory *self,
list_item = gtk_list_item_widget_get_list_item (widget);
- g_object_freeze_notify (G_OBJECT (list_item));
-
GTK_LIST_ITEM_FACTORY_GET_CLASS (self)->update (self, widget, list_item, position, item, selected);
-
- g_object_thaw_notify (G_OBJECT (list_item));
}
diff --git a/gtk/gtklistitemwidget.c b/gtk/gtklistitemwidget.c
index 0c9baea963..5ef1d357b7 100644
--- a/gtk/gtklistitemwidget.c
+++ b/gtk/gtklistitemwidget.c
@@ -554,27 +554,34 @@ gtk_list_item_widget_default_update (GtkListItemWidget *self,
gpointer item,
gboolean selected)
{
+ /* Track notify manually instead of freeze/thaw_notify for performance reasons. */
+ gboolean notify_item = FALSE, notify_position = FALSE, notify_selected = FALSE;
GtkListItemWidgetPrivate *priv = gtk_list_item_widget_get_instance_private (self);
/* FIXME: It's kinda evil to notify external objects from here... */
if (g_set_object (&priv->item, item))
- {
- if (list_item)
- g_object_notify (G_OBJECT (list_item), "item");
- }
+ notify_item = TRUE;
if (priv->position != position)
{
priv->position = position;
- if (list_item)
- g_object_notify (G_OBJECT (list_item), "position");
+ notify_position = TRUE;
}
if (priv->selected != selected)
{
priv->selected = selected;
- if (list_item)
+ notify_selected = TRUE;
+ }
+
+ if (list_item)
+ {
+ if (notify_item)
+ g_object_notify (G_OBJECT (list_item), "item");
+ if (notify_position)
+ g_object_notify (G_OBJECT (list_item), "position");
+ if (notify_selected)
g_object_notify (G_OBJECT (list_item), "selected");
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]