[gtk+] gtkplacessidebar: avoid unresponsive UI while trashing
- From: Carlos Soriano Sánchez <csoriano src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] gtkplacessidebar: avoid unresponsive UI while trashing
- Date: Thu, 25 Feb 2016 13:45:23 +0000 (UTC)
commit 20cf42c9ea977fe441c297a531811990876575c7
Author: Carlos Soriano <csoriano gnome org>
Date: Thu Feb 25 14:25:40 2016 +0100
gtkplacessidebar: avoid unresponsive UI while trashing
We were updating the whole places sidebar when the trash changed.
This effectively removes all rows and create new ones for every trash
state change.
Although when using GtkTreeView it was somehow ok, with the new
implementation with GtkListBox this effectively locks the UI while the
trash operations are being performed.
When performing operations for i.e. 100 files, the UI can be locked
for more than 1 minute since gvfs-trash usually takes time.
To fix this just update the icon of the trash when the state of the
trash change instead of the whole sidebar.
https://bugzilla.gnome.org/show_bug.cgi?id=762677
gtk/gtkplacessidebar.c | 21 +++++++++++++++------
gtk/gtksidebarrow.c | 27 +++++++++++++++++++++------
gtk/gtksidebarrowprivate.h | 2 ++
3 files changed, 38 insertions(+), 12 deletions(-)
---
diff --git a/gtk/gtkplacessidebar.c b/gtk/gtkplacessidebar.c
index 3de9e2c..ba8d3c0 100644
--- a/gtk/gtkplacessidebar.c
+++ b/gtk/gtkplacessidebar.c
@@ -132,6 +132,7 @@ struct _GtkPlacesSidebar {
gchar *rename_uri;
gulong trash_monitor_changed_id;
+ GtkWidget *trash_row;
/* DND */
GList *drag_list; /* list of GFile */
@@ -879,6 +880,14 @@ is_external_volume (GVolume *volume)
}
static void
+update_trash_icon (GtkPlacesSidebar *sidebar)
+{
+ if (sidebar->trash_row)
+ gtk_sidebar_row_set_icon (GTK_SIDEBAR_ROW (sidebar->trash_row),
+ _gtk_trash_monitor_get_icon (sidebar->trash_monitor));
+}
+
+static void
update_places (GtkPlacesSidebar *sidebar)
{
GList *mounts, *l, *ll;
@@ -980,11 +989,11 @@ update_places (GtkPlacesSidebar *sidebar)
{
mount_uri = "trash:///"; /* No need to strdup */
icon = _gtk_trash_monitor_get_icon (sidebar->trash_monitor);
- add_place (sidebar, PLACES_BUILT_IN,
- SECTION_COMPUTER,
- _("Trash"), icon, mount_uri,
- NULL, NULL, NULL, 0,
- _("Open the trash"));
+ sidebar->trash_row = add_place (sidebar, PLACES_BUILT_IN,
+ SECTION_COMPUTER,
+ _("Trash"), icon, mount_uri,
+ NULL, NULL, NULL, 0,
+ _("Open the trash"));
g_object_unref (icon);
}
@@ -3773,7 +3782,7 @@ gtk_places_sidebar_init (GtkPlacesSidebar *sidebar)
sidebar->trash_monitor = _gtk_trash_monitor_get ();
sidebar->trash_monitor_changed_id = g_signal_connect_swapped (sidebar->trash_monitor,
"trash-state-changed",
- G_CALLBACK (update_places), sidebar);
+ G_CALLBACK (update_trash_icon), sidebar);
gtk_widget_set_size_request (GTK_WIDGET (sidebar), 140, 280);
diff --git a/gtk/gtksidebarrow.c b/gtk/gtksidebarrow.c
index a095bd2..3df5b02 100644
--- a/gtk/gtksidebarrow.c
+++ b/gtk/gtksidebarrow.c
@@ -156,11 +156,7 @@ gtk_sidebar_row_set_property (GObject *object,
break;
case PROP_ICON:
- g_set_object (&self->icon, g_value_get_object (value));
- if (self->icon != NULL)
- gtk_image_set_from_gicon (GTK_IMAGE (self->icon_widget), self->icon, GTK_ICON_SIZE_MENU);
- else
- gtk_image_clear (GTK_IMAGE (self->icon_widget));
+ gtk_sidebar_row_set_icon (self, g_value_get_object (value));
break;
case PROP_LABEL:
@@ -239,7 +235,7 @@ gtk_sidebar_row_set_property (GObject *object,
(GtkCallback) gtk_widget_destroy,
NULL);
- context = gtk_widget_get_style_context (GTK_WIDGET (self));
+ context = gtk_widget_get_style_context (GTK_WIDGET (self));
gtk_style_context_add_class (context, "sidebar-placeholder-row");
}
break;
@@ -283,6 +279,25 @@ gtk_sidebar_row_hide (GtkSidebarRow *self,
gtk_revealer_set_transition_duration (GTK_REVEALER (self->revealer), transition_duration);
}
+void
+gtk_sidebar_row_set_icon (GtkSidebarRow *self,
+ GIcon *icon)
+{
+ g_return_if_fail (GTK_IS_SIDEBAR_ROW (self));
+
+ if (self->icon != icon)
+ {
+ g_set_object (&self->icon, icon);
+ if (self->icon != NULL)
+ gtk_image_set_from_gicon (GTK_IMAGE (self->icon_widget), self->icon,
+ GTK_ICON_SIZE_MENU);
+ else
+ gtk_image_clear (GTK_IMAGE (self->icon_widget));
+
+ g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_ICON]);
+ }
+}
+
static void
gtk_sidebar_row_finalize (GObject *object)
{
diff --git a/gtk/gtksidebarrowprivate.h b/gtk/gtksidebarrowprivate.h
index 8042757..d13dc6d 100644
--- a/gtk/gtksidebarrowprivate.h
+++ b/gtk/gtksidebarrowprivate.h
@@ -50,6 +50,8 @@ void gtk_sidebar_row_reveal (GtkSidebarRow *self);
GtkWidget *gtk_sidebar_row_get_eject_button (GtkSidebarRow *self);
GtkWidget *gtk_sidebar_row_get_event_box (GtkSidebarRow *self);
+void gtk_sidebar_row_set_icon (GtkSidebarRow *self,
+ GIcon *icon);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]