summaryrefslogtreecommitdiff
path: root/src/nautilus-places-sidebar.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nautilus-places-sidebar.c')
-rw-r--r--src/nautilus-places-sidebar.c91
1 files changed, 81 insertions, 10 deletions
diff --git a/src/nautilus-places-sidebar.c b/src/nautilus-places-sidebar.c
index 0bdf71634..4f467c87c 100644
--- a/src/nautilus-places-sidebar.c
+++ b/src/nautilus-places-sidebar.c
@@ -54,6 +54,8 @@
#include "nautilus-places-sidebar.h"
#include "nautilus-window.h"
+#define EJECT_BUTTON_XPAD 6
+
#define NAUTILUS_PLACES_SIDEBAR_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), NAUTILUS_TYPE_PLACES_SIDEBAR, NautilusPlacesSidebarClass))
#define NAUTILUS_IS_PLACES_SIDEBAR(obj) (GTK_CHECK_TYPE ((obj), NAUTILUS_TYPE_PLACES_SIDEBAR))
#define NAUTILUS_IS_PLACES_SIDEBAR_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), NAUTILUS_TYPE_PLACES_SIDEBAR))
@@ -85,6 +87,11 @@ typedef struct {
GtkWidget *popup_menu_rescan_item;
GtkWidget *popup_menu_format_item;
GtkWidget *popup_menu_empty_trash_item;
+
+ /* volume mounting - delayed open process */
+ gboolean mounting;
+ NautilusWindowSlotInfo *go_to_after_mount_slot;
+ NautilusWindowOpenFlags go_to_after_mount_flags;
} NautilusPlacesSidebar;
typedef struct {
@@ -253,8 +260,8 @@ add_place (NautilusPlacesSidebar *sidebar,
PLACES_SIDEBAR_COLUMN_ROW_TYPE, place_type,
PLACES_SIDEBAR_COLUMN_INDEX, index,
PLACES_SIDEBAR_COLUMN_EJECT, (show_unmount || show_eject),
- PLACES_SIDEBAR_COLUMN_ABOVE_SEPARATOR, place_type != PLACES_BOOKMARK,
- PLACES_SIDEBAR_COLUMN_BELOW_SEPARATOR, place_type == PLACES_BOOKMARK,
+ PLACES_SIDEBAR_COLUMN_ABOVE_SEPARATOR, (show_unmount || show_eject),
+ PLACES_SIDEBAR_COLUMN_BELOW_SEPARATOR, !(show_unmount || show_eject),
-1);
if (pixbuf != NULL) {
@@ -623,17 +630,26 @@ clicked_eject_button (NautilusPlacesSidebar *sidebar,
GdkEvent *event = gtk_get_current_event ();
GdkEventButton *button_event = (GdkEventButton *) event;
GtkTreeViewColumn *column;
- int x, pos, width;
+ GtkSettings *settings;
+ int pos, renderer_width, eject_button_size;
+ int renderer_x2;
*path = NULL;
if (event->type == GDK_BUTTON_PRESS &&
gtk_tree_view_get_path_at_pos (sidebar->tree_view,
button_event->x, button_event->y,
- path, &column, &x, NULL) &&
+ path, &column, NULL, NULL) &&
gtk_tree_view_column_cell_get_position (column, sidebar->eject_cell_renderer,
- &pos, &width)) {
- if (button_event->x > pos && button_event->x < pos + width) {
+ &pos, &renderer_width)) {
+ renderer_x2 = MIN (pos + renderer_width, GTK_WIDGET (sidebar)->allocation.width);
+
+ settings = gtk_widget_get_settings (GTK_WIDGET (sidebar));
+ gtk_icon_size_lookup_for_settings (settings, GTK_ICON_SIZE_MENU,
+ &eject_button_size, NULL);
+
+ if (button_event->x > renderer_x2 - (EJECT_BUTTON_XPAD + eject_button_size) &&
+ button_event->x < renderer_x2 - EJECT_BUTTON_XPAD) {
return TRUE;
}
}
@@ -1363,12 +1379,52 @@ bookmarks_selection_changed_cb (GtkTreeSelection *selection,
}
static void
+volume_mounted_cb (GVolume *volume,
+ GObject *user_data)
+{
+ GMount *mount;
+ NautilusPlacesSidebar *sidebar;
+ GFile *location;
+
+ sidebar = NAUTILUS_PLACES_SIDEBAR (user_data);
+
+ sidebar->mounting = FALSE;
+
+ mount = g_volume_get_mount (volume);
+ if (mount != NULL) {
+ location = g_mount_get_root (mount);
+
+ if (sidebar->go_to_after_mount_slot != NULL) {
+ if ((sidebar->go_to_after_mount_flags & NAUTILUS_WINDOW_OPEN_FLAG_NEW_WINDOW) == 0) {
+ nautilus_window_slot_info_open_location (sidebar->go_to_after_mount_slot, location,
+ NAUTILUS_WINDOW_OPEN_ACCORDING_TO_MODE,
+ sidebar->go_to_after_mount_flags, NULL);
+ } else {
+ NautilusWindow *cur, *new;
+
+ cur = NAUTILUS_WINDOW (sidebar->window);
+ new = nautilus_application_create_navigation_window (cur->application,
+ NULL,
+ gtk_window_get_screen (GTK_WINDOW (cur)));
+ nautilus_window_go_to (new, location);
+ }
+ }
+
+ g_object_unref (G_OBJECT (location));
+ g_object_unref (G_OBJECT (mount));
+ }
+
+
+ eel_remove_weak_pointer (&(sidebar->go_to_after_mount_slot));
+}
+
+static void
open_selected_bookmark (NautilusPlacesSidebar *sidebar,
GtkTreeModel *model,
GtkTreePath *path,
NautilusWindowOpenFlags flags)
{
- NautilusWindowSlot *slot;
+ NautilusWindowSlotInfo *slot;
GtkTreeIter iter;
GFile *location;
char *uri;
@@ -1414,9 +1470,22 @@ open_selected_bookmark (NautilusPlacesSidebar *sidebar,
} else {
GVolume *volume;
+ NautilusWindowSlot *slot;
gtk_tree_model_get (model, &iter, PLACES_SIDEBAR_COLUMN_VOLUME, &volume, -1);
- if (volume != NULL) {
- nautilus_file_operations_mount_volume (NULL, volume, FALSE);
+ if (volume != NULL && !sidebar->mounting) {
+ sidebar->mounting = TRUE;
+
+ g_assert (sidebar->go_to_after_mount_slot == NULL);
+
+ slot = nautilus_window_info_get_active_slot (sidebar->window);
+ sidebar->go_to_after_mount_slot = slot;
+ eel_add_weak_pointer (&(sidebar->go_to_after_mount_slot));
+
+ sidebar->go_to_after_mount_flags = flags;
+
+ nautilus_file_operations_mount_volume_full (NULL, volume, FALSE,
+ volume_mounted_cb,
+ G_OBJECT (sidebar));
g_object_unref (volume);
}
}
@@ -2123,7 +2192,7 @@ nautilus_places_sidebar_init (NautilusPlacesSidebar *sidebar)
"icon-name", "media-eject",
"stock-size", GTK_ICON_SIZE_MENU,
"xalign", 1.0,
- "xpad", 6,
+ "xpad", EJECT_BUTTON_XPAD,
NULL);
gtk_tree_view_column_pack_end (col, cell, TRUE);
gtk_tree_view_column_set_attributes (col, cell,
@@ -2253,6 +2322,8 @@ nautilus_places_sidebar_dispose (GObject *object)
sidebar->volume_monitor = NULL;
}
+ eel_remove_weak_pointer (&(sidebar->go_to_after_mount_slot));
+
G_OBJECT_CLASS (nautilus_places_sidebar_parent_class)->dispose (object);
}