summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Jon McCann <jmccann@redhat.com>2013-04-20 15:41:08 -0400
committerFederico Mena Quintero <federico@gnome.org>2013-04-20 15:56:59 -0400
commitfa1f7d3f97aebf9e26453e620acc1958a517cdde (patch)
treecf923a6d47d4a9389238dcb45cc7edded4a87ec7
parent3b34e70f132ddc6794063fb84a73812b6632f05a (diff)
downloadgtk+-fa1f7d3f97aebf9e26453e620acc1958a517cdde.tar.gz
Sync nautilus commit 95400548176688f3d2f5e8888f48410756bd96b8
Switch location on hovering the places sidebar during a DnD operation - kind of for spring-loaded folders.
-rw-r--r--gtk/gtkplacessidebar.c73
1 files changed, 65 insertions, 8 deletions
diff --git a/gtk/gtkplacessidebar.c b/gtk/gtkplacessidebar.c
index acbd59e1ea..59f2ed78be 100644
--- a/gtk/gtkplacessidebar.c
+++ b/gtk/gtkplacessidebar.c
@@ -166,6 +166,8 @@ struct _GtkPlacesSidebar {
DropState drop_state;
int new_bookmark_index;
guint drag_leave_timeout_id;
+ guint switch_location_timer;
+ char *drop_target_uri;
guint show_desktop : 1;
};
@@ -1408,6 +1410,15 @@ get_drag_data (GtkTreeView *tree_view,
}
static void
+remove_switch_location_timer (GtkPlacesSidebar *sidebar)
+{
+ if (sidebar->switch_location_timer != 0) {
+ g_source_remove (sidebar->switch_location_timer);
+ sidebar->switch_location_timer = 0;
+ }
+}
+
+static void
free_drag_data (GtkPlacesSidebar *sidebar)
{
sidebar->drag_data_received = FALSE;
@@ -1416,6 +1427,49 @@ free_drag_data (GtkPlacesSidebar *sidebar)
g_list_free_full (sidebar->drag_list, g_object_unref);
sidebar->drag_list = NULL;
}
+
+ remove_switch_location_timer (sidebar);
+
+ g_free (sidebar->drop_target_uri);
+ sidebar->drop_target_uri = NULL;
+}
+
+static gboolean
+switch_location_timer (gpointer user_data)
+{
+ GtkPlacesSidebar *sidebar = GTK_PLACES_SIDEBAR (user_data);
+ GFile *location;
+
+ sidebar->switch_location_timer = 0;
+
+ location = g_file_new_for_uri (sidebar->drop_target_uri);
+ emit_open_location (sidebar, location, 0);
+ g_object_unref (location);
+
+ return FALSE;
+}
+
+static void
+check_switch_location_timer (GtkPlacesSidebar *sidebar, const char *uri)
+{
+ GtkSettings *settings;
+ guint timeout;
+
+ if (g_strcmp0 (uri, sidebar->drop_target_uri) == 0) {
+ return;
+ }
+ remove_switch_location_timer (sidebar);
+
+ settings = gtk_widget_get_settings (GTK_WIDGET (sidebar));
+ g_object_get (settings, "gtk-timeout-expand", &timeout, NULL);
+
+ g_free (sidebar->drop_target_uri);
+ sidebar->drop_target_uri = NULL;
+
+ if (uri != NULL) {
+ sidebar->drop_target_uri = g_strdup (uri);
+ sidebar->switch_location_timer = gdk_threads_add_timeout (timeout, switch_location_timer, sidebar);
+ }
}
static void
@@ -1525,6 +1579,7 @@ drag_motion_callback (GtkTreeView *tree_view,
GtkTreeIter iter;
gboolean res;
gboolean drop_as_bookmarks;
+ char *drop_target_uri = NULL;
action = 0;
drop_as_bookmarks = FALSE;
@@ -1571,30 +1626,32 @@ drag_motion_callback (GtkTreeView *tree_view,
}
if (!drop_as_bookmarks) {
- char *uri;
-
gtk_tree_model_get (GTK_TREE_MODEL (sidebar->store),
&iter,
- PLACES_SIDEBAR_COLUMN_URI, &uri,
+ PLACES_SIDEBAR_COLUMN_URI, &drop_target_uri,
-1);
- if (uri != NULL) {
- GFile *dest_file = g_file_new_for_uri (uri);
+ if (drop_target_uri != NULL) {
+ GFile *dest_file = g_file_new_for_uri (drop_target_uri);
action = emit_drag_action_requested (sidebar, context, dest_file, sidebar->drag_list);
g_object_unref (dest_file);
- g_free (uri);
} /* uri may be NULL for unmounted volumes, for example, so we don't allow drops there */
}
}
}
out:
- if (action != 0)
+ if (action != 0) {
+ check_switch_location_timer (sidebar, drop_target_uri);
start_drop_feedback (sidebar, path, pos, drop_as_bookmarks);
- else
+ } else {
+ remove_switch_location_timer (sidebar);
stop_drop_feedback (sidebar);
+ }
+
+ g_free (drop_target_uri);
if (path != NULL) {
gtk_tree_path_free (path);