From 5ce61f48171c9b95e8b89e0d2c53a7bfbeb9ac93 Mon Sep 17 00:00:00 2001 From: Jannis Pohlmann <jannis@xfce.org> Date: Thu, 26 May 2011 01:16:10 +0200 Subject: [PATCH] Speed up initial start by adding the Network item later (bug #7313). There are other ways to achieve the same effect: load the icon and the name of items in the side pane first and only resolve the real files when users click on them. But this was easier. Also, I expect the side pane to be redesigned soon and this fix makes it easier to apply the change to the 4.8 branch. --- NEWS | 1 + thunar/thunar-shortcuts-model.c | 113 +++++++++++++++++++++++++++----- 2 files changed, 97 insertions(+), 17 deletions(-) diff --git a/NEWS b/NEWS index 91e65683c..fe84e7d80 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,7 @@ - Avoid segfaults due to interpreting display names as format strings. - Improve the UI according to bugs #7496 and #7497. - Treat backup files as hidden as with thunar-vfs (bug #7615). +- Speed up initial start by loading the network item later (bug #7313). 1.3.0 ===== diff --git a/thunar/thunar-shortcuts-model.c b/thunar/thunar-shortcuts-model.c index 2aae5755b..767064af3 100644 --- a/thunar/thunar-shortcuts-model.c +++ b/thunar/thunar-shortcuts-model.c @@ -1,23 +1,25 @@ -/* $Id$ */ +/* vi:set et ai sw=2 sts=2 ts=2: */ /*- * Copyright (c) 2005-2006 Benedikt Meurer <benny@xfce.org> - * Copyright (c) 2009 Jannis Pohlmann <jannis@xfce.org> + * Copyright (c) 2009-2011 Jannis Pohlmann <jannis@xfce.org> * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., 59 Temple - * Place, Suite 330, Boston, MA 02111-1307 USA + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. */ + #ifdef HAVE_CONFIG_H #include <config.h> #endif @@ -217,6 +219,84 @@ thunar_shortcuts_model_drag_source_init (GtkTreeDragSourceIface *iface) +static gboolean +thunar_shortcuts_model_add_network_idle (gpointer user_data) +{ + ThunarShortcutsModel *model = THUNAR_SHORTCUTS_MODEL (user_data); + ThunarShortcut *shortcut = NULL; + GtkTreePath *path; + GtkTreeIter iter; + ThunarFile *file = NULL; + GVolume *volume = NULL; + gboolean have_iter = FALSE; + gboolean is_separator = FALSE; + gboolean position_found = FALSE; + GFile *location = NULL; + + /* append the network icon if browsing the network is supported */ + if (thunar_g_vfs_is_uri_scheme_supported ("network")) + { + /* load the network root file */ + location = g_file_new_for_uri ("network://"); + file = thunar_file_get (location, NULL); + g_object_unref (location); + + /* create the shortcut */ + shortcut = g_slice_new0 (ThunarShortcut); + shortcut->type = THUNAR_SHORTCUT_SYSTEM_DEFINED; + shortcut->file = file; + + /* iterate over all rows in the model in order to find the + * first one with a volume or a separator */ + have_iter = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (model), &iter); + while (have_iter && !position_found) + { + /* read volume and separator flag from the current row */ + gtk_tree_model_get (GTK_TREE_MODEL (model), &iter, + THUNAR_SHORTCUTS_MODEL_COLUMN_VOLUME, &volume, + THUNAR_SHORTCUTS_MODEL_COLUMN_SEPARATOR, &is_separator, + -1); + + /* check if a volume row was found */ + if (volume != NULL) + { + /* stop searching */ + position_found = TRUE; + + /* release the volume */ + g_object_unref (volume); + } + else if (is_separator) + { + /* stop searching */ + position_found = TRUE; + } + else + { + /* advance to the next row */ + have_iter = gtk_tree_model_iter_next (GTK_TREE_MODEL (model), &iter); + } + } + + /* we always have a volume or separator row */ + g_assert (position_found); + + /* get the path of the iter */ + path = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter); + + /* append the shortcut to the list */ + thunar_shortcuts_model_add_shortcut (model, shortcut, path); + + /* release the path */ + gtk_tree_path_free (path); + } + + /* remove this idle handler */ + return FALSE; +} + + + static void thunar_shortcuts_model_init (ThunarShortcutsModel *model) { @@ -259,10 +339,6 @@ thunar_shortcuts_model_init (ThunarShortcutsModel *model) /* append the root file system */ system_paths = g_list_append (system_paths, thunar_g_file_new_for_root ()); - /* append the network icon if browsing the network is supported */ - if (thunar_g_vfs_is_uri_scheme_supported ("network")) - system_paths = g_list_append (system_paths, g_file_new_for_uri ("network://")); - /* will be used to append the shortcuts to the list */ path = gtk_tree_path_new_from_indices (0, -1); @@ -340,6 +416,9 @@ thunar_shortcuts_model_init (ThunarShortcutsModel *model) g_object_unref (bookmarks); g_object_unref (home); gtk_tree_path_free (path); + + /* add the network item (and other slow items) in an idle handler */ + g_idle_add_full (G_PRIORITY_LOW, thunar_shortcuts_model_add_network_idle, model, NULL); } -- GitLab