diff options
-rw-r--r-- | src/nautilus-application.c | 11 | ||||
-rw-r--r-- | src/nautilus-canvas-container.c | 22 | ||||
-rw-r--r-- | src/nautilus-canvas-container.h | 2 | ||||
-rw-r--r-- | src/nautilus-canvas-view.c | 13 | ||||
-rw-r--r-- | src/nautilus-files-view.c | 7 | ||||
-rw-r--r-- | src/nautilus-files-view.h | 5 | ||||
-rw-r--r-- | src/nautilus-list-view.c | 60 | ||||
-rw-r--r-- | src/nautilus-previewer.c | 68 | ||||
-rw-r--r-- | src/nautilus-previewer.h | 5 | ||||
-rw-r--r-- | src/nautilus-view-icon-controller.c | 18 |
10 files changed, 211 insertions, 0 deletions
diff --git a/src/nautilus-application.c b/src/nautilus-application.c index 3deae733f..d146147ed 100644 --- a/src/nautilus-application.c +++ b/src/nautilus-application.c @@ -84,6 +84,8 @@ typedef struct NautilusTagManager *tag_manager; GCancellable *tag_manager_cancellable; + + guint previewer_selection_id; } NautilusApplicationPrivate; G_DEFINE_TYPE_WITH_PRIVATE (NautilusApplication, nautilus_application, GTK_TYPE_APPLICATION); @@ -1343,6 +1345,8 @@ nautilus_application_dbus_register (GApplication *app, return FALSE; } + priv->previewer_selection_id = nautilus_previewer_connect_selection_event (connection); + return TRUE; } @@ -1366,6 +1370,13 @@ nautilus_application_dbus_unregister (GApplication *app, nautilus_shell_search_provider_unregister (priv->search_provider); g_clear_object (&priv->search_provider); } + + if (priv->previewer_selection_id != 0) + { + nautilus_previewer_disconnect_selection_event (connection, + priv->previewer_selection_id); + priv->previewer_selection_id = 0; + } } static void diff --git a/src/nautilus-canvas-container.c b/src/nautilus-canvas-container.c index 994f519a4..1035fa2b8 100644 --- a/src/nautilus-canvas-container.c +++ b/src/nautilus-canvas-container.c @@ -2869,6 +2869,28 @@ keyboard_up (NautilusCanvasContainer *container, closest_in_90_degrees); } +void +nautilus_canvas_container_preview_selection_event (NautilusCanvasContainer *container, + GtkDirectionType direction) +{ + if (direction == GTK_DIR_UP) + { + keyboard_up (container, NULL); + } + else if (direction == GTK_DIR_DOWN) + { + keyboard_down (container, NULL); + } + else if (direction == GTK_DIR_LEFT) + { + keyboard_left (container, NULL); + } + else if (direction == GTK_DIR_RIGHT) + { + keyboard_right (container, NULL); + } +} + static void keyboard_space (NautilusCanvasContainer *container, GdkEventKey *event) diff --git a/src/nautilus-canvas-container.h b/src/nautilus-canvas-container.h index bd8de5caf..7955cf34d 100644 --- a/src/nautilus-canvas-container.h +++ b/src/nautilus-canvas-container.h @@ -252,6 +252,8 @@ void nautilus_canvas_container_select_all (Nauti void nautilus_canvas_container_select_first (NautilusCanvasContainer *view); +void nautilus_canvas_container_preview_selection_event (NautilusCanvasContainer *view, + GtkDirectionType direction); /* operations on the selection */ GList * nautilus_canvas_container_get_selection (NautilusCanvasContainer *view); diff --git a/src/nautilus-canvas-view.c b/src/nautilus-canvas-view.c index dbed7586b..4b3197bd7 100644 --- a/src/nautilus-canvas-view.c +++ b/src/nautilus-canvas-view.c @@ -1277,6 +1277,18 @@ nautilus_canvas_view_sort_directories_first_changed (NautilusFilesView *director nautilus_canvas_container_sort (get_canvas_container (canvas_view)); } +static void +nautilus_canvas_view_preview_selection_event (NautilusFilesView *directory_view, + GtkDirectionType direction) +{ + NautilusCanvasView *canvas_view; + + canvas_view = NAUTILUS_CANVAS_VIEW (directory_view); + + nautilus_canvas_container_preview_selection_event (get_canvas_container (canvas_view), + direction); +} + static char * canvas_view_get_container_uri (NautilusCanvasContainer *container, NautilusFilesView *view) @@ -1566,6 +1578,7 @@ nautilus_canvas_view_class_init (NautilusCanvasViewClass *klass) nautilus_files_view_class->get_first_visible_file = canvas_view_get_first_visible_file; nautilus_files_view_class->scroll_to_file = canvas_view_scroll_to_file; nautilus_files_view_class->reveal_for_selection_context_menu = nautilus_canvas_view_reveal_for_selection_context_menu; + nautilus_files_view_class->preview_selection_event = nautilus_canvas_view_preview_selection_event; } static void diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c index 916de2581..f61b6bce9 100644 --- a/src/nautilus-files-view.c +++ b/src/nautilus-files-view.c @@ -1258,6 +1258,13 @@ nautilus_files_view_preview_files (NautilusFilesView *view, } void +nautilus_files_view_preview_selection_event (NautilusFilesView *view, + GtkDirectionType direction) +{ + NAUTILUS_FILES_VIEW_CLASS (G_OBJECT_GET_CLASS (view))->preview_selection_event (view, direction); +} + +void nautilus_files_view_activate_selection (NautilusFilesView *view) { g_autolist (NautilusFile) selection = NULL; diff --git a/src/nautilus-files-view.h b/src/nautilus-files-view.h index 954101bd6..602cf8bec 100644 --- a/src/nautilus-files-view.h +++ b/src/nautilus-files-view.h @@ -236,6 +236,9 @@ struct _NautilusFilesViewClass { /* Use this to show an optional visual feedback when the directory is empty. * By default it shows a widget overlay on top of the view */ void (* check_empty_states) (NautilusFilesView *view); + + void (* preview_selection_event) (NautilusFilesView *view, + GtkDirectionType direction); }; NautilusFilesView * nautilus_files_view_new (guint id, @@ -304,6 +307,8 @@ void nautilus_files_view_new_file_with_initial_contents (NautilusFi /* selection handling */ void nautilus_files_view_activate_selection (NautilusFilesView *view); +void nautilus_files_view_preview_selection_event (NautilusFilesView *view, + GtkDirectionType direction); void nautilus_files_view_stop_loading (NautilusFilesView *view); char * nautilus_files_view_get_first_visible_file (NautilusFilesView *view); diff --git a/src/nautilus-list-view.c b/src/nautilus-list-view.c index 9b7b7826b..60a615366 100644 --- a/src/nautilus-list-view.c +++ b/src/nautilus-list-view.c @@ -3985,6 +3985,65 @@ nautilus_list_view_reveal_for_selection_context_menu (NautilusFilesView *view) } static void +nautilus_list_view_preview_selection_event (NautilusFilesView *view, + GtkDirectionType direction) +{ + NautilusListView *list_view; + GtkTreeView *tree_view; + GtkTreeSelection *selection; + GList *list; + GtkTreeIter iter; + GtkTreePath *path; + GtkTreeModel *tree_model; + gboolean moved; + + /* We only support up and down movements for the list view */ + if (direction != GTK_DIR_UP && direction != GTK_DIR_DOWN) + { + return; + } + + list_view = NAUTILUS_LIST_VIEW (view); + tree_view = list_view->details->tree_view; + selection = gtk_tree_view_get_selection (tree_view); + list = gtk_tree_selection_get_selected_rows (selection, &tree_model); + + if (list == NULL) + { + return; + } + + /* Advance the first selected item, since that's what we use for + * the previewer */ + path = list->data; + moved = FALSE; + if (gtk_tree_model_get_iter (tree_model, &iter, path)) + { + if (direction == GTK_DIR_UP) + { + moved = gtk_tree_model_iter_previous (tree_model, &iter); + } + else + { + moved = gtk_tree_model_iter_next (tree_model, &iter); + } + } + + if (moved) + { + g_signal_handlers_block_by_func (selection, list_selection_changed_callback, view); + + gtk_tree_selection_unselect_all (selection); + gtk_tree_selection_select_iter (selection, &iter); + + g_signal_handlers_unblock_by_func (selection, list_selection_changed_callback, view); + nautilus_files_view_notify_selection_changed (view); + } + + g_list_free_full (list, (GDestroyNotify) gtk_tree_path_free); +} + +static void nautilus_list_view_class_init (NautilusListViewClass *class) { NautilusFilesViewClass *nautilus_files_view_class; @@ -4024,6 +4083,7 @@ nautilus_list_view_class_init (NautilusListViewClass *class) nautilus_files_view_class->scroll_to_file = list_view_scroll_to_file; nautilus_files_view_class->compute_rename_popover_pointing_to = nautilus_list_view_compute_rename_popover_pointing_to; nautilus_files_view_class->reveal_for_selection_context_menu = nautilus_list_view_reveal_for_selection_context_menu; + nautilus_files_view_class->preview_selection_event = nautilus_list_view_preview_selection_event; } static void diff --git a/src/nautilus-previewer.c b/src/nautilus-previewer.c index aef60e615..e2ac3e885 100644 --- a/src/nautilus-previewer.c +++ b/src/nautilus-previewer.c @@ -24,6 +24,10 @@ #include "nautilus-previewer.h" +#include "nautilus-files-view.h" +#include "nautilus-window.h" +#include "nautilus-window-slot.h" + #define DEBUG_FLAG NAUTILUS_DEBUG_PREVIEWER #include "nautilus-debug.h" @@ -94,3 +98,67 @@ nautilus_previewer_call_close (void) previewer2_method_ready_cb, NULL); } + +static void +previewer_selection_event (GDBusConnection *connection, + const gchar *sender_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ + GApplication *application = g_application_get_default (); + GList *l, *windows = gtk_application_get_windows (GTK_APPLICATION (application)); + NautilusWindow *window = NULL; + NautilusWindowSlot *slot; + NautilusView *view; + GtkDirectionType direction; + + for (l = windows; l != NULL; l = l->next) + { + if (NAUTILUS_IS_WINDOW (l->data)) + { + window = l->data; + break; + } + } + + if (window == NULL) + { + return; + } + + slot = nautilus_window_get_active_slot (window); + view = nautilus_window_slot_get_current_view (slot); + + if (!NAUTILUS_IS_FILES_VIEW (view)) + { + return; + } + + g_variant_get (parameters, "(u)", &direction); + nautilus_files_view_preview_selection_event (NAUTILUS_FILES_VIEW (view), direction); +} + +guint +nautilus_previewer_connect_selection_event (GDBusConnection *connection) +{ + return g_dbus_connection_signal_subscribe (connection, + PREVIEWER_DBUS_NAME, + PREVIEWER2_DBUS_IFACE, + "SelectionEvent", + PREVIEWER_DBUS_PATH, + NULL, + G_DBUS_SIGNAL_FLAGS_NONE, + previewer_selection_event, + NULL, + NULL); +} + +void +nautilus_previewer_disconnect_selection_event (GDBusConnection *connection, + guint event_id) +{ + g_dbus_connection_signal_unsubscribe (connection, event_id); +} diff --git a/src/nautilus-previewer.h b/src/nautilus-previewer.h index e9e399fbc..7de3d178f 100644 --- a/src/nautilus-previewer.h +++ b/src/nautilus-previewer.h @@ -22,6 +22,7 @@ #pragma once +#include <gio/gio.h> #include <glib.h> G_BEGIN_DECLS @@ -32,4 +33,8 @@ void nautilus_previewer_call_show_file (const gchar *uri, gboolean close_if_already_visible); void nautilus_previewer_call_close (void); +guint nautilus_previewer_connect_selection_event (GDBusConnection *connection); +void nautilus_previewer_disconnect_selection_event (GDBusConnection *connection, + guint event_id); + G_END_DECLS diff --git a/src/nautilus-view-icon-controller.c b/src/nautilus-view-icon-controller.c index e8e3cb1a9..6dbdf1e3e 100644 --- a/src/nautilus-view-icon-controller.c +++ b/src/nautilus-view-icon-controller.c @@ -908,6 +908,23 @@ real_select_first (NautilusFilesView *files_view) } static void +real_preview_selection_event (NautilusFilesView *files_view, + GtkDirectionType direction) +{ + NautilusViewIconController *self = NAUTILUS_VIEW_ICON_CONTROLLER (files_view); + GtkMovementStep step; + gint count; + gboolean handled; + + step = (direction == GTK_DIR_UP || direction == GTK_DIR_DOWN) ? + GTK_MOVEMENT_DISPLAY_LINES : GTK_MOVEMENT_VISUAL_POSITIONS; + count = (direction == GTK_DIR_RIGHT || direction == GTK_DIR_DOWN) ? + 1 : -1; + + g_signal_emit_by_name (self->view_ui, "move-cursor", step, count, &handled); +} + +static void action_zoom_to_level (GSimpleAction *action, GVariant *state, gpointer user_data) @@ -1056,6 +1073,7 @@ nautilus_view_icon_controller_class_init (NautilusViewIconControllerClass *klass files_view_class->is_zoom_level_default = real_is_zoom_level_default; files_view_class->compute_rename_popover_pointing_to = real_compute_rename_popover_pointing_to; files_view_class->reveal_for_selection_context_menu = real_reveal_for_selection_context_menu; + files_view_class->preview_selection_event = real_preview_selection_event; } static void |