[Xfce4-commits] <xfce4-places-plugin:master> Add support for network devices in ~/.gtk-bookmarks

Andrzej noreply at xfce.org
Sun Nov 10 16:00:01 CET 2013


Updating branch refs/heads/master
         to ce1bcac0d1d019a5a3447afb66ab50ccc39057cb (commit)
       from 41dd544d4bda99c3dda8cb0b2c4ae1f14e8cb53b (commit)

commit ce1bcac0d1d019a5a3447afb66ab50ccc39057cb
Author: Alistair Buxton <a.j.buxton at gmail.com>
Date:   Sun Nov 10 07:56:37 2013 +0000

    Add support for network devices in ~/.gtk-bookmarks
    
    Most of this code comes from Thunar.

 panel-plugin/model.h      |    3 +-
 panel-plugin/model_user.c |  157 +++++++++++++++++++++++++++++++++++----------
 2 files changed, 126 insertions(+), 34 deletions(-)

diff --git a/panel-plugin/model.h b/panel-plugin/model.h
index cbbee3d..06d9d6f 100644
--- a/panel-plugin/model.h
+++ b/panel-plugin/model.h
@@ -51,7 +51,8 @@ typedef enum
 {
     PLACES_URI_SCHEME_NONE=0,
     PLACES_URI_SCHEME_FILE, 
-    PLACES_URI_SCHEME_TRASH
+    PLACES_URI_SCHEME_TRASH,
+    PLACES_URI_SCHEME_REMOTE
 } places_uri_scheme;
 
 typedef struct _PlacesBookmark PlacesBookmark;
diff --git a/panel-plugin/model_user.c b/panel-plugin/model_user.c
index f3fc290..6d25fa1 100644
--- a/panel-plugin/model_user.c
+++ b/panel-plugin/model_user.c
@@ -114,14 +114,19 @@ pbuser_destroy_bookmarks(PlacesBookmarkGroup *bookmark_group)
 static void
 pbuser_build_bookmarks(PlacesBookmarkGroup *bookmark_group)
 {
-    /* As of 2007-04-06, this is pretty much taken from/analogous to Thunar */
+    /* As of 2013-11-09, this is pretty much taken from/analogous to Thunar */
 
     GList  *bookmarks = NULL;
     PlacesBookmark *bookmark;
+    places_uri_scheme p_uri;
     gchar  *name;
-    gchar  *path;
+    gchar  *space;
+    gchar  *uri;
     gchar   line[2048];
     FILE   *fp;
+    GFile  *file;
+    GFileInfo *fileinfo;
+    GIcon  *icon;
  
     pbuser_destroy_bookmarks(bookmark_group);
 
@@ -135,44 +140,127 @@ pbuser_build_bookmarks(PlacesBookmarkGroup *bookmark_group)
 
     while( fgets(line, sizeof(line), fp) != NULL )
     {
-        /* strip leading/trailing whitespace */
-        g_strstrip(line);
-        
-        /* skip over the URI */
-        for (name = line; *name != '\0' && !g_ascii_isspace (*name); ++name)
-            /* pass */;
-        
-        /* zero-terminate the URI */
-        *name++ = '\0';
-        
-        /* check if we have a name */
-        for (; g_ascii_isspace (*name); ++name)
-            /* pass */;
-        
-        /* parse the URI */ /* TODO: trash:// URI's */
-        path = g_filename_from_uri(line, NULL, NULL);
-        if (G_UNLIKELY(path == NULL || *path == '\0'))
+        /* remove trailing spaces */
+        g_strchomp (line);
+
+        /* skip over empty lines */
+        if (*line == '\0' || *line == ' ')
             continue;
 
-        /* if we don't have a name, find it in the path */
-        if(*name == '\0'){
-            name = g_filename_display_basename(path);
-            if(*name == '\0'){
-                g_free(path);
-                continue;
+        /* check if there is a custom name in the line */
+        name = NULL;
+        space = strchr (line, ' ');
+        if (space != NULL){
+            /* break line */
+            *space++ = '\0';
+
+            /* get the custom name */
+            if (G_LIKELY (*space != '\0'))
+                name = g_strdup(space);
+        }
+
+        file = g_file_new_for_uri (line);
+
+        if(g_file_is_native(file)){
+
+            uri = g_filename_from_uri(line, NULL, NULL);
+
+            fileinfo = g_file_query_info(file,
+                                  G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME","
+                                  G_FILE_ATTRIBUTE_STANDARD_ICON,
+                                  0, NULL, NULL);
+
+            icon = g_file_info_get_icon(fileinfo);
+            if(icon == NULL)
+                icon = g_themed_icon_new ("folder");
+            g_object_ref(icon);
+            p_uri = PLACES_URI_SCHEME_FILE;
+
+            if(name == NULL) {
+                name = g_strdup(g_file_info_get_attribute_string(fileinfo,
+                                  G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME));
+                if(name == NULL)
+                    name = g_strdup(g_filename_display_basename(uri));
             }
+
+            g_object_unref (G_OBJECT (fileinfo));
+
         }else{
-            name = g_strdup(name);
+
+            uri = g_strdup(line);
+            icon = g_themed_icon_new ("folder-remote");
+            g_object_ref(icon);
+            p_uri = PLACES_URI_SCHEME_REMOTE;
+
+            if(name == NULL) {
+                /* I tried to make this into a separate function
+                   but it crashes evrytim... */
+                gchar       *scheme;
+                gchar       *parse_name;
+                const gchar *p;
+                const gchar *path;
+                gchar       *hostname;
+                gchar       *display_name = NULL;
+                const gchar *skip;
+                const gchar *firstdot;
+                const gchar  skip_chars[] = ":@";
+                guint        n;
+
+                scheme = g_file_get_uri_scheme (file);
+                parse_name = g_file_get_parse_name (file);
+
+                if (g_str_has_prefix (parse_name, scheme)) {
+                    /* extract the hostname */
+                    p = parse_name + strlen (scheme);
+                    while (*p == ':' || *p == '/')
+                        ++p;
+
+                    /* goto path part */
+                    path = strchr (p, '/');
+                    firstdot = strchr (p, '.');
+
+                    if (firstdot != NULL){
+                        /* skip password or login names in the hostname */
+                        for (n = 0; n < G_N_ELEMENTS (skip_chars) - 1; n++){
+                            skip = strchr (p, skip_chars[n]);
+                            if (skip != NULL
+                                   && (path == NULL || skip < path)
+                                   && (skip < firstdot))
+                                        p = skip + 1;
+                        }
+                    }
+
+                    /* extract the path and hostname from the string */
+                    if (G_LIKELY (path != NULL)){
+                        hostname = g_strndup (p, path - p);
+                    }else{
+                        hostname = g_strdup (p);
+                        path = "/";
+                    }
+
+                    /* TRANSLATORS: this will result in "<path> on <hostname>" */
+                    name = g_strdup_printf (_("%s on %s"), path, hostname);
+
+                    g_free (hostname);
+                }
+
+                g_free (scheme);
+                g_free (parse_name);
+
+            }
         }
 
         /* create the BookmarkInfo container */
-        bookmark        = places_bookmark_create(name);           /* label needs to be freed */
-        bookmark->uri   = path;                                   /* uri   needs to be freed */
-        bookmark->icon  = g_themed_icon_new("folder");
-        bookmark->priv  = GINT_TO_POINTER(pbuser_dir_exists(path));
+        bookmark        = places_bookmark_create(name);
+        bookmark->uri   = uri;
+        bookmark->uri_scheme   = p_uri;
+        bookmark->icon  = icon;
+        bookmark->priv  = GINT_TO_POINTER((p_uri==PLACES_URI_SCHEME_REMOTE)||pbuser_dir_exists(bookmark->uri));
         bookmark->finalize = pbuser_finalize_bookmark;
 
         bookmarks = g_list_prepend(bookmarks, bookmark);
+
+        g_object_unref (G_OBJECT (file));
     }
 
     fclose(fp);
@@ -216,8 +304,11 @@ pbuser_get_bookmarks(PlacesBookmarkGroup *bookmark_group)
             clone->icon           = g_object_ref(orig->icon);
             clone->finalize       = pbuser_finalize_bookmark;
     
-            terminal              = places_create_open_terminal_action(clone);
-            clone->actions        = g_list_prepend(clone->actions, terminal);
+            if(orig->uri_scheme == PLACES_URI_SCHEME_FILE) {
+                /* terminal action only works on native files. */
+                terminal              = places_create_open_terminal_action(clone);
+                clone->actions        = g_list_prepend(clone->actions, terminal);
+            }
             open                  = places_create_open_action(clone);
             clone->actions        = g_list_prepend(clone->actions, open);
             clone->primary_action = open;
@@ -254,7 +345,7 @@ pbuser_changed(PlacesBookmarkGroup *bookmark_group)
 
     while(bookmarks != NULL){
         bookmark = bookmarks->data;
-        if(show_bookmark(bookmark) != pbuser_dir_exists(bookmark->uri)){
+        if(bookmark->uri_scheme != PLACES_URI_SCHEME_REMOTE && show_bookmark(bookmark) != pbuser_dir_exists(bookmark->uri)){
             bookmark->priv = GINT_TO_POINTER(!show_bookmark(bookmark));
             ret = TRUE;
         }


More information about the Xfce4-commits mailing list