summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nautilus-application.c11
-rw-r--r--src/nautilus-canvas-container.c22
-rw-r--r--src/nautilus-canvas-container.h2
-rw-r--r--src/nautilus-canvas-view.c13
-rw-r--r--src/nautilus-files-view.c7
-rw-r--r--src/nautilus-files-view.h5
-rw-r--r--src/nautilus-list-view.c60
-rw-r--r--src/nautilus-previewer.c68
-rw-r--r--src/nautilus-previewer.h5
-rw-r--r--src/nautilus-view-icon-controller.c18
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