summaryrefslogtreecommitdiff
path: root/src/nautilus-view.c
diff options
context:
space:
mode:
authorCosimo Cecchi <cosimoc@gnome.org>2011-02-15 09:54:08 -0500
committerCosimo Cecchi <cosimoc@gnome.org>2011-02-17 11:25:17 -0500
commita572b7355b12a99083b7489bf991a8f929b1a80a (patch)
tree4af14243bace420a86351e339a7add498e8003f1 /src/nautilus-view.c
parent5a21e22cb0603a77d0a8bf89f6197c799df7ba4d (diff)
downloadnautilus-a572b7355b12a99083b7489bf991a8f929b1a80a.tar.gz
view: accumulate floating bar status setting in a timeout
We use half of the double-click-time as a good heuristic.
Diffstat (limited to 'src/nautilus-view.c')
-rw-r--r--src/nautilus-view.c76
1 files changed, 74 insertions, 2 deletions
diff --git a/src/nautilus-view.c b/src/nautilus-view.c
index c549edfc9..c541ffa8e 100644
--- a/src/nautilus-view.c
+++ b/src/nautilus-view.c
@@ -192,6 +192,7 @@ struct NautilusViewDetails
guint update_menus_timeout_id;
guint update_status_idle_id;
guint reveal_selection_idle_id;
+ guint set_status_timeout_id;
guint display_pending_source_id;
guint changes_timeout_id;
@@ -2676,6 +2677,11 @@ nautilus_view_destroy (GtkWidget *object)
view->details->delayed_rename_file_id = 0;
}
+ if (view->details->set_status_timeout_id != 0) {
+ g_source_remove (view->details->set_status_timeout_id);
+ view->details->set_status_timeout_id = 0;
+ }
+
if (view->details->model) {
nautilus_directory_unref (view->details->model);
view->details->model = NULL;
@@ -2719,9 +2725,10 @@ nautilus_view_finalize (GObject *object)
}
static void
-nautilus_view_set_status (NautilusView *view,
- const gchar *status)
+real_view_set_status (NautilusView *view,
+ const gchar *status)
{
+
gboolean show_statusbar;
nautilus_floating_bar_cleanup_actions (NAUTILUS_FLOATING_BAR (view->details->floating_bar));
@@ -2740,6 +2747,67 @@ nautilus_view_set_status (NautilusView *view,
gtk_widget_show (view->details->floating_bar);
}
+typedef struct {
+ gchar *status;
+ NautilusView *view;
+} SetStatusData;
+
+static void
+set_status_data_free (gpointer data)
+{
+ SetStatusData *status_data = data;
+
+ g_free (status_data->status);
+ g_object_unref (status_data->view);
+
+ g_slice_free (SetStatusData, data);
+}
+
+static gboolean
+set_status_timeout_cb (gpointer data)
+{
+ SetStatusData *status_data = data;
+
+ status_data->view->details->set_status_timeout_id = 0;
+ real_view_set_status (status_data->view, status_data->status);
+
+ return FALSE;
+}
+
+static void
+nautilus_view_set_status (NautilusView *view,
+ const gchar *status)
+{
+ GtkSettings *settings;
+ gint double_click_time;
+ SetStatusData *status_data;
+
+ if (view->details->set_status_timeout_id != 0) {
+ g_source_remove (view->details->set_status_timeout_id);
+ view->details->set_status_timeout_id = 0;
+ }
+
+ settings = gtk_settings_get_for_screen (gtk_widget_get_screen (GTK_WIDGET (view)));
+ g_object_get (settings,
+ "gtk-double-click-time", &double_click_time,
+ NULL);
+
+ status_data = g_slice_new0 (SetStatusData);
+ status_data->status = g_strdup (status);
+ status_data->view = g_object_ref (view);
+
+ /* waiting for half of the double-click-time before setting
+ * the status seems to be a good approximation of not setting it
+ * too often and not delaying the statusbar too much.
+ */
+ view->details->set_status_timeout_id =
+ g_timeout_add_full (G_PRIORITY_DEFAULT,
+ (guint) (double_click_time / 2),
+ set_status_timeout_cb,
+ status_data,
+ set_status_data_free);
+}
+
/**
* nautilus_view_display_selection_info:
*
@@ -9168,6 +9236,10 @@ static void
setup_loading_floating_bar (NautilusView *view)
{
/* setup loading overlay */
+ if (view->details->set_status_timeout_id != 0) {
+ g_source_remove (view->details->set_status_timeout_id);
+ view->details->set_status_timeout_id = 0;
+ }
nautilus_floating_bar_set_label (NAUTILUS_FLOATING_BAR (view->details->floating_bar),
_("Loading..."));