summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Koegel <eric.koegel@gmail.com>2013-09-29 17:38:39 +0300
committerEric Koegel <eric.koegel@gmail.com>2013-09-29 17:40:48 +0300
commit54090ec7c836ea6e0d3484ac4afd2850e70a4f2c (patch)
tree6bacf0c3b0096e2670782370ada722ffe65d4f65
parentbd401b85c8c103ddf78b5f30442297e1dd46bff3 (diff)
downloadxfdesktop-54090ec7c836ea6e0d3484ac4afd2850e70a4f2c.tar.gz
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.
-rw-r--r--src/xfdesktop-file-icon-manager.c78
-rw-r--r--src/xfdesktop-file-utils.c68
-rw-r--r--src/xfdesktop-file-utils.h5
3 files changed, 134 insertions, 17 deletions
diff --git a/src/xfdesktop-file-icon-manager.c b/src/xfdesktop-file-icon-manager.c
index f4ae3e68..db24d6db 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 e32ea1f4..44feba14 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 a875d9fe..65bb9bcc 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);