summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCosimo Cecchi <cosimoc@gnome.org>2013-04-21 12:43:03 -0400
committerFederico Mena Quintero <federico@gnome.org>2013-04-21 12:43:03 -0400
commitb510da34fbf5451d4189343d2e7cc9b5ad3908b6 (patch)
tree46e372f18b632093b88edb20d641ca18d693d9b9
parentc1bf2d5dd352e00af1b6e5b2d4c85846745cb3d1 (diff)
downloadnautilus-places-sidebar.tar.gz
Implement a Format menu item for volumes in the sidebarplaces-sidebar
This is about doing it from the populate-popup signal from the sidebar, analogous to commit a73c8c7736cee89bf5470de47aec876b86878bcd. Signed-off-by: Federico Mena Quintero <federico@gnome.org>
-rw-r--r--src/nautilus-window.c120
1 files changed, 101 insertions, 19 deletions
diff --git a/src/nautilus-window.c b/src/nautilus-window.c
index 5a634688d..1aa3fed82 100644
--- a/src/nautilus-window.c
+++ b/src/nautilus-window.c
@@ -718,39 +718,121 @@ properties_cb (GtkMenuItem *item,
nautilus_file_list_free (list);
}
+static gboolean
+check_have_gnome_disks (void)
+{
+ gchar *disks_path;
+ gboolean res;
+
+ disks_path = g_find_program_in_path ("gnome-disks");
+ res = (disks_path != NULL);
+ g_free (disks_path);
+
+ return res;
+}
+
+static gboolean
+should_show_format_command (GVolume *volume)
+{
+ gchar *unix_device_id;
+ gboolean show_format;
+
+ unix_device_id = g_volume_get_identifier (volume, G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE);
+ show_format = (unix_device_id != NULL) && check_have_gnome_disks ();
+ g_free (unix_device_id);
+
+ return show_format;
+}
+
+static void
+format_cb (GtkMenuItem *item,
+ gpointer user_data)
+{
+ NautilusWindow *window = NAUTILUS_WINDOW (user_data);
+ GAppInfo *app_info;
+ gchar *cmdline, *device_identifier, *xid_string;
+ GVolume *volume;
+ gint xid;
+
+ volume = g_object_get_data (G_OBJECT (item), "nautilus-volume");
+
+ g_assert (volume != NULL && G_IS_VOLUME (volume));
+
+ device_identifier = g_volume_get_identifier (volume, G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE);
+ xid = (gint) gdk_x11_window_get_xid (gtk_widget_get_window (GTK_WIDGET (window)));
+ xid_string = g_strdup_printf ("%d", xid);
+
+ cmdline = g_strconcat ("gnome-disks ",
+ "--block-device ", device_identifier, " ",
+ "--format-device ",
+ "--xid ", xid_string,
+ NULL);
+ app_info = g_app_info_create_from_commandline (cmdline, NULL, 0, NULL);
+ g_app_info_launch (app_info, NULL, NULL, NULL);
+
+ g_free (cmdline);
+ g_free (device_identifier);
+ g_free (xid_string);
+ g_clear_object (&app_info);
+}
+
+/* Destroy notification function used from g_object_set_data_full() */
+static void
+menu_item_destroy_notify_cb (gpointer data)
+{
+ GVolume *volume;
+
+ volume = G_VOLUME (data);
+ g_object_unref (volume);
+}
+
static void
places_sidebar_populate_popup_cb (GtkPlacesSidebar *sidebar,
GtkMenu *menu,
GFile *selected_item,
+ GVolume *selected_volume,
gpointer user_data)
{
NautilusWindow *window = NAUTILUS_WINDOW (user_data);
GtkWidget *item;
GFile *trash;
- trash = g_file_new_for_uri ("trash:///");
- if (g_file_equal (trash, selected_item)) {
- eel_gtk_menu_append_separator (menu);
+ if (selected_item) {
+ trash = g_file_new_for_uri ("trash:///");
+ if (g_file_equal (trash, selected_item)) {
+ eel_gtk_menu_append_separator (menu);
- item = gtk_menu_item_new_with_mnemonic (_("Empty _Trash"));
- g_signal_connect (item, "activate",
- G_CALLBACK (empty_trash_cb), window);
- gtk_widget_show (item);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ item = gtk_menu_item_new_with_mnemonic (_("Empty _Trash"));
+ g_signal_connect (item, "activate",
+ G_CALLBACK (empty_trash_cb), window);
+ gtk_widget_show (item);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- if (nautilus_trash_monitor_is_empty ())
- gtk_widget_set_sensitive (item, FALSE);
- }
- g_object_unref (trash);
+ if (nautilus_trash_monitor_is_empty ())
+ gtk_widget_set_sensitive (item, FALSE);
+ }
+ g_object_unref (trash);
- if (g_file_is_native (selected_item)) {
- eel_gtk_menu_append_separator (menu);
+ if (g_file_is_native (selected_item)) {
+ eel_gtk_menu_append_separator (menu);
- item = gtk_menu_item_new_with_mnemonic (_("_Properties"));
- g_signal_connect (item, "activate",
- G_CALLBACK (properties_cb), window);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- gtk_widget_show (item);
+ item = gtk_menu_item_new_with_mnemonic (_("_Properties"));
+ g_signal_connect (item, "activate",
+ G_CALLBACK (properties_cb), window);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ gtk_widget_show (item);
+ }
+ } else if (selected_volume) {
+ if (should_show_format_command (selected_volume)) {
+ item = gtk_menu_item_new_with_mnemonic (_("_Format…"));
+ g_object_set_data_full (G_OBJECT (item), "nautilus-volume",
+ g_object_ref (selected_volume),
+ menu_item_destroy_notify_cb);
+ g_signal_connect (item, "activate",
+ G_CALLBACK (format_cb), window);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ gtk_widget_show (item);
+ }
}
}