[Xfce4-commits] <xfdesktop:master> Allow renaming of multiple icons

Eric Koegel noreply at xfce.org
Sun Sep 29 16:42:01 CEST 2013


Updating branch refs/heads/master
         to 54090ec7c836ea6e0d3484ac4afd2850e70a4f2c (commit)
       from bd401b85c8c103ddf78b5f30442297e1dd46bff3 (commit)

commit 54090ec7c836ea6e0d3484ac4afd2850e70a4f2c
Author: Eric Koegel <eric.koegel at gmail.com>
Date:   Sun Sep 29 17:38:39 2013 +0300

    Allow renaming of multiple icons
    
    Use Thunar's bulk renamer when multiple icons are selected. Pops
    up a message dialog if none of the selected icons support being
    renamed.

 src/xfdesktop-file-icon-manager.c |   78 +++++++++++++++++++++++++++++--------
 src/xfdesktop-file-utils.c        |   68 ++++++++++++++++++++++++++++++++
 src/xfdesktop-file-utils.h        |    5 +++
 3 files changed, 134 insertions(+), 17 deletions(-)

diff --git a/src/xfdesktop-file-icon-manager.c b/src/xfdesktop-file-icon-manager.c
index f4ae3e6..db24d6d 100644
--- a/src/xfdesktop-file-icon-manager.c
+++ b/src/xfdesktop-file-icon-manager.c
@@ -584,20 +584,44 @@ xfdesktop_file_icon_menu_rename(GtkWidget *widget,
 {
     XfdesktopFileIconManager *fmanager = XFDESKTOP_FILE_ICON_MANAGER(user_data);
     XfdesktopFileIcon *icon;
-    GList *selected;
-    GFile *file;
+    GList *selected, *iter, *files = NULL;
     GtkWidget *toplevel;
     
     selected = xfdesktop_icon_view_get_selected_items(fmanager->priv->icon_view);
-    g_return_if_fail(g_list_length(selected) == 1);
-    icon = XFDESKTOP_FILE_ICON(selected->data);
-    g_list_free(selected);
-    
-    file = xfdesktop_file_icon_peek_file(icon);
+
+    for(iter = selected; iter != NULL; iter = iter->next) {
+        icon = XFDESKTOP_FILE_ICON(iter->data);
+
+        /* create a list of GFiles from selected icons that can be renamed */
+        if(xfdesktop_file_icon_can_rename_file(icon))
+            files = g_list_append(files, xfdesktop_file_icon_peek_file(icon));
+    }
+
     toplevel = gtk_widget_get_toplevel(GTK_WIDGET(fmanager->priv->icon_view));
     
-    xfdesktop_file_utils_rename_file(file, fmanager->priv->gscreen, 
-                                     GTK_WINDOW(toplevel));
+    if(g_list_length(files) == 1) {
+        /* rename dialog for a single icon */
+        xfdesktop_file_utils_rename_file(g_list_first(files)->data,
+                                         fmanager->priv->gscreen,
+                                         GTK_WINDOW(toplevel));
+    } else if(g_list_length(files) > 1) {
+        /* Bulk rename for multiple icons selected */
+        GFile *desktop = xfdesktop_file_icon_peek_file(fmanager->priv->desktop_icon);
+
+        xfdesktop_file_utils_bulk_rename(desktop, files,
+                                         fmanager->priv->gscreen,
+                                         GTK_WINDOW(toplevel));
+    } else {
+        /* Nothing valid to rename */
+        xfce_message_dialog(GTK_WINDOW(toplevel),
+                            _("Rename Error"), GTK_STOCK_DIALOG_ERROR,
+                            _("The files could not be renamed"),
+                            _("None of the icons selected support being renamed."),
+                            GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT, NULL);
+    }
+
+    g_list_free(files);
+    g_list_free(selected);
 }
 
 enum
@@ -1561,6 +1585,8 @@ xfdesktop_file_icon_manager_populate_context_menu(XfceDesktop *desktop,
 #endif
         
         if(file_icon == fmanager->priv->desktop_icon) {
+            /* Menu on the root desktop window */
+            /* Paste */
             mi = gtk_image_menu_item_new_from_stock(GTK_STOCK_PASTE, NULL);
             gtk_widget_show(mi);
             gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
@@ -1571,13 +1597,16 @@ xfdesktop_file_icon_manager_populate_context_menu(XfceDesktop *desktop,
             } else
             gtk_widget_set_sensitive(mi, FALSE);
         } else {
+            /* Menu popup on an icon */
+            /* Copy */
             mi = gtk_image_menu_item_new_from_stock(GTK_STOCK_COPY, NULL);
             gtk_widget_show(mi);
             gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
             g_signal_connect(G_OBJECT(mi), "activate",
                              G_CALLBACK(xfdesktop_file_icon_menu_copy),
                              fmanager);
-            
+
+            /* Cut */
             mi = gtk_image_menu_item_new_from_stock(GTK_STOCK_CUT, NULL);
             gtk_widget_show(mi);
             gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
@@ -1587,7 +1616,8 @@ xfdesktop_file_icon_manager_populate_context_menu(XfceDesktop *desktop,
                                  fmanager);
             } else
                 gtk_widget_set_sensitive(mi, FALSE);
-            
+
+            /* Delete */
             mi = gtk_image_menu_item_new_from_stock(GTK_STOCK_DELETE, NULL);
             gtk_widget_show(mi);
             gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
@@ -1597,27 +1627,39 @@ xfdesktop_file_icon_manager_populate_context_menu(XfceDesktop *desktop,
                                  fmanager);
             } else
                 gtk_widget_set_sensitive(mi, FALSE);
-            
+
+            /* Separator */
             mi = gtk_separator_menu_item_new();
             gtk_widget_show(mi);
             gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
-            
+
+            /* Rename */
             mi = gtk_image_menu_item_new_with_mnemonic(_("_Rename..."));
             gtk_widget_show(mi);
             gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
             if(!multi_sel && xfdesktop_file_icon_can_rename_file(file_icon)) {
+                /* Rename a single icon */
                 g_signal_connect(G_OBJECT(mi), "activate",
                                  G_CALLBACK(xfdesktop_file_icon_menu_rename),
                                  fmanager);
-            } else
-                gtk_widget_set_sensitive(mi, FALSE);
+            } else {
+                /* Bulk rename for multiple icons, the callback will
+                 * handle the situation where some icons selected can't
+                 * be renamed */
+                g_signal_connect(G_OBJECT(mi), "activate",
+                                 G_CALLBACK(xfdesktop_file_icon_menu_rename),
+                                 fmanager);
+            }
         }
-        
+
+        /* Separator */
         mi = gtk_separator_menu_item_new();
         gtk_widget_show(mi);
         gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
         
         if(file_icon == fmanager->priv->desktop_icon) {
+            /* Menu on the root desktop window */
+            /* show arrange desktop icons option */
             img = gtk_image_new_from_stock(GTK_STOCK_SORT_ASCENDING, GTK_ICON_SIZE_MENU);
             gtk_widget_show(img);
             mi = gtk_image_menu_item_new_with_mnemonic(_("Arrange Desktop _Icons"));
@@ -1628,6 +1670,7 @@ xfdesktop_file_icon_manager_populate_context_menu(XfceDesktop *desktop,
                              G_CALLBACK(xfdesktop_file_icon_menu_arrange_icons),
                              fmanager);
 
+            /* Desktop settings window */
             img = gtk_image_new_from_stock(GTK_STOCK_PREFERENCES, GTK_ICON_SIZE_MENU);
             gtk_widget_show(img);
             mi = gtk_image_menu_item_new_with_mnemonic(_("Desktop _Settings..."));
@@ -1637,7 +1680,8 @@ xfdesktop_file_icon_manager_populate_context_menu(XfceDesktop *desktop,
             g_signal_connect(G_OBJECT(mi), "activate",
                              G_CALLBACK(xfdesktop_settings_launch), fmanager);
         }
-        
+
+        /* Properties - applies to desktop window or an icon on the desktop */
         img = gtk_image_new_from_stock(GTK_STOCK_PROPERTIES, GTK_ICON_SIZE_MENU);
         gtk_widget_show(img);
         mi = gtk_image_menu_item_new_with_mnemonic(_("P_roperties..."));
diff --git a/src/xfdesktop-file-utils.c b/src/xfdesktop-file-utils.c
index e32ea1f..44feba1 100644
--- a/src/xfdesktop-file-utils.c
+++ b/src/xfdesktop-file-utils.c
@@ -62,6 +62,7 @@
 #include "xfdesktop-file-manager-proxy.h"
 #include "xfdesktop-file-utils.h"
 #include "xfdesktop-trash-proxy.h"
+#include "xfdesktop-thunar-proxy.h"
 
 static void xfdesktop_file_utils_add_emblems(GdkPixbuf *pix, GList *emblems);
 
@@ -852,6 +853,59 @@ xfdesktop_file_utils_rename_file(GFile *file,
 }
 
 void
+xfdesktop_file_utils_bulk_rename(GFile *working_directory,
+                                 GList *files,
+                                 GdkScreen *screen,
+                                 GtkWindow *parent)
+{
+    DBusGProxy *thunar_proxy;
+
+    g_return_if_fail(G_IS_FILE(working_directory));
+    g_return_if_fail(GDK_IS_SCREEN(screen) || GTK_IS_WINDOW(parent));
+
+    if(!screen)
+        screen = gtk_widget_get_screen(GTK_WIDGET(parent));
+
+    thunar_proxy = xfdesktop_file_utils_peek_thunar_proxy();
+    if(thunar_proxy) {
+        gchar *directory = g_file_get_path(working_directory);
+        guint nfiles = g_list_length(files);
+        gchar **filenames = g_new0(gchar *, nfiles+1);
+        gchar *display_name = gdk_screen_make_display_name(screen);
+        gchar *startup_id = g_strdup_printf("_TIME%d", gtk_get_current_event_time());
+        GList *lp;
+        gint n;
+
+        /* convert GFile list into an array of filenames */
+        for(n = 0, lp = files; lp != NULL; ++n, lp = lp->next)
+            filenames[n] = g_file_get_basename(lp->data);
+        filenames[n] = NULL;
+
+        xfdesktop_file_utils_set_window_cursor(parent, GDK_WATCH);
+
+        xfdesktop_thunar_proxy_bulk_rename_async(thunar_proxy,
+                                                 directory, (const gchar **)filenames,
+                                                 FALSE, display_name, startup_id,
+                                                 (xfdesktop_thunar_proxy_bulk_rename_reply)xfdesktop_file_utils_async_cb,
+                                                 parent);
+
+        xfdesktop_file_utils_set_window_cursor(parent, GDK_LEFT_PTR);
+
+        g_free(directory);
+        g_free(startup_id);
+        g_strfreev(filenames);
+        g_free(display_name);
+    } else {
+        xfce_message_dialog(parent,
+                            _("Rename Error"), GTK_STOCK_DIALOG_ERROR,
+                            _("The files could not be renamed"),
+                            _("This feature requires a file manager service to "
+                              "be present (such as the one supplied by Thunar)."),
+                            GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT, NULL);
+    }
+}
+
+void
 xfdesktop_file_utils_unlink_files(GList *files,
                                   GdkScreen *screen,
                                   GtkWindow *parent)
@@ -1449,6 +1503,7 @@ static gint dbus_ref_cnt = 0;
 static DBusGConnection *dbus_gconn = NULL;
 static DBusGProxy *dbus_trash_proxy = NULL;
 static DBusGProxy *dbus_filemanager_proxy = NULL;
+static DBusGProxy *dbus_thunar_proxy = NULL;
 
 gboolean
 xfdesktop_file_utils_dbus_init(void)
@@ -1479,6 +1534,11 @@ xfdesktop_file_utils_dbus_init(void)
                                                            "org.xfce.FileManager",
                                                            "/org/xfce/FileManager",
                                                            "org.xfce.FileManager");
+
+        dbus_thunar_proxy = dbus_g_proxy_new_for_name(dbus_gconn,
+                                                      "org.xfce.FileManager",
+                                                      "/org/xfce/FileManager",
+                                                      "org.xfce.Thunar");
     } else {
         ret = FALSE;
         dbus_ref_cnt = 0;
@@ -1499,6 +1559,12 @@ xfdesktop_file_utils_peek_filemanager_proxy(void)
     return dbus_filemanager_proxy;
 }
 
+DBusGProxy *
+xfdesktop_file_utils_peek_thunar_proxy(void)
+{
+    return dbus_thunar_proxy;
+}
+
 void
 xfdesktop_file_utils_dbus_cleanup(void)
 {
@@ -1509,6 +1575,8 @@ xfdesktop_file_utils_dbus_cleanup(void)
         g_object_unref(G_OBJECT(dbus_trash_proxy));
     if(dbus_filemanager_proxy)
         g_object_unref(G_OBJECT(dbus_filemanager_proxy));
+    if(dbus_thunar_proxy)
+        g_object_unref(G_OBJECT(dbus_thunar_proxy));
 
     /* we aren't going to unref dbus_gconn because dbus appears to have a
      * memleak in dbus_connection_setup_with_g_main().  really; the comments
diff --git a/src/xfdesktop-file-utils.h b/src/xfdesktop-file-utils.h
index a875d9f..65bb9bc 100644
--- a/src/xfdesktop-file-utils.h
+++ b/src/xfdesktop-file-utils.h
@@ -70,6 +70,10 @@ void xfdesktop_file_utils_open_folder(GFile *file,
 void xfdesktop_file_utils_rename_file(GFile *file,
                                       GdkScreen *screen,
                                       GtkWindow *parent);
+void xfdesktop_file_utils_bulk_rename(GFile *working_directory,
+                                      GList *files,
+                                      GdkScreen *screen,
+                                      GtkWindow *parent);
 void xfdesktop_file_utils_trash_files(GList *files,
                                        GdkScreen *screen,
                                        GtkWindow *parent);
@@ -114,6 +118,7 @@ gboolean xfdesktop_file_utils_transfer_files(GdkDragAction action,
 gboolean xfdesktop_file_utils_dbus_init(void);
 DBusGProxy *xfdesktop_file_utils_peek_trash_proxy(void);
 DBusGProxy *xfdesktop_file_utils_peek_filemanager_proxy(void);
+DBusGProxy *xfdesktop_file_utils_peek_thunar_proxy(void);
 void xfdesktop_file_utils_dbus_cleanup(void);
 
 


More information about the Xfce4-commits mailing list