[gnome-builder] load-directory-task: deal with missing special dirs more gracefully



commit a6bfe621c71413ba7d9ec49a70e1ecdd883ad636
Author: Christian Hergert <christian hergert me>
Date:   Wed Apr 1 11:51:12 2015 -0700

    load-directory-task: deal with missing special dirs more gracefully
    
    g_get_user_special_dir() can return NULL values for various special dirs.
    So we will use g_strcmp0() instead. Additionally, cache the values to
    avoid the extra function calls for every directory.

 libide/tasks/ide-load-directory-task.c |   35 ++++++++++++++++++++++++-------
 1 files changed, 27 insertions(+), 8 deletions(-)
---
diff --git a/libide/tasks/ide-load-directory-task.c b/libide/tasks/ide-load-directory-task.c
index de4d515..e697479 100644
--- a/libide/tasks/ide-load-directory-task.c
+++ b/libide/tasks/ide-load-directory-task.c
@@ -39,6 +39,21 @@ typedef struct
   gsize           current_files;
 } IdeLoadDirectoryTask;
 
+static gboolean gSpecialDirsInit;
+static const gchar *gSpecialDirs [7];
+
+static void
+load_special_dirs (void)
+{
+  gSpecialDirs [0] = g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP);
+  gSpecialDirs [1] = g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS);
+  gSpecialDirs [2] = g_get_user_special_dir (G_USER_DIRECTORY_DOWNLOAD);
+  gSpecialDirs [3] = g_get_user_special_dir (G_USER_DIRECTORY_MUSIC);
+  gSpecialDirs [4] = g_get_user_special_dir (G_USER_DIRECTORY_PICTURES);
+  gSpecialDirs [5] = g_get_user_special_dir (G_USER_DIRECTORY_TEMPLATES);
+  gSpecialDirs [6] = g_get_user_special_dir (G_USER_DIRECTORY_VIDEOS);
+}
+
 static void
 ide_load_directory_task_free (gpointer data)
 {
@@ -61,6 +76,7 @@ is_special_directory (GFile *directory)
 {
   g_autofree gchar *path = NULL;
   g_autofree gchar *name = NULL;
+  guint i;
 
   /* ignore dot directories */
   name = g_file_get_basename (directory);
@@ -73,14 +89,11 @@ is_special_directory (GFile *directory)
     return FALSE;
 
   /* check for various xdg special dirs */
-  if (g_str_equal (path, g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP)) ||
-      g_str_equal (path, g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS)) ||
-      g_str_equal (path, g_get_user_special_dir (G_USER_DIRECTORY_DOWNLOAD)) ||
-      g_str_equal (path, g_get_user_special_dir (G_USER_DIRECTORY_MUSIC)) ||
-      g_str_equal (path, g_get_user_special_dir (G_USER_DIRECTORY_PICTURES)) ||
-      g_str_equal (path, g_get_user_special_dir (G_USER_DIRECTORY_TEMPLATES)) ||
-      g_str_equal (path, g_get_user_special_dir (G_USER_DIRECTORY_VIDEOS)))
-    return TRUE;
+  for (i = 0; i < G_N_ELEMENTS (gSpecialDirs); i++)
+    {
+      if (0 == g_strcmp0 (path, gSpecialDirs [i]))
+        return TRUE;
+    }
 
   return FALSE;
 }
@@ -391,6 +404,12 @@ ide_load_directory_task_new (gpointer             source_object,
   g_return_val_if_fail (IDE_IS_PROJECT_ITEM (parent), NULL);
   g_return_val_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable), NULL);
 
+  if (gSpecialDirsInit == FALSE)
+    {
+      load_special_dirs ();
+      gSpecialDirsInit = TRUE;
+    }
+
   context = ide_object_get_context (IDE_OBJECT (parent));
 
   task = g_task_new (source_object, cancellable, callback, user_data);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]