From 68198fc5ff657755089dee5d2c29f928d7e3c1fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3nio=20Fernandes?= Date: Sat, 10 Aug 2024 22:56:53 +0100 Subject: [PATCH 1/2] previewer: Remember invoker slot When users press the arrow keys while the previewer window has focus, we emulate the same event on the files view. However, we do this by taking the most recently focused window in the NautilusApplication, which poses two problems: * there is no warranty that the most recently focused NautilusWindow is the one which the previewer was launched from. * FileChooser windows do not belong to NautilusApplication, so we are 100% sure to get the wrong window in that case. Instead of passing a GtkRoot window to show previewer, pass a slot and keep a pointer to it around to reuse when emulating arrows back. Closes https://gitlab.gnome.org/GNOME/nautilus/-/work_items/3428 --- src/nautilus-files-view.c | 12 ++++-------- src/nautilus-previewer.c | 33 +++++++++++---------------------- src/nautilus-previewer.h | 8 +++++--- 3 files changed, 20 insertions(+), 33 deletions(-) diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c index 391808a115..868e0463e8 100644 --- a/src/nautilus-files-view.c +++ b/src/nautilus-files-view.c @@ -1310,8 +1310,6 @@ static void nautilus_files_view_preview_update (NautilusFilesView *view) { NautilusFilesViewPrivate *priv = nautilus_files_view_get_instance_private (view); - GtkApplication *app; - GtkRoot *window; g_autolist (NautilusFile) selection = NULL; if (!priv->active || @@ -1320,9 +1318,7 @@ nautilus_files_view_preview_update (NautilusFilesView *view) return; } - app = GTK_APPLICATION (g_application_get_default ()); - window = gtk_widget_get_root (GTK_WIDGET (view)); - if (window == NULL || GTK_WINDOW (window) != gtk_application_get_active_window (app)) + if (gtk_widget_get_root (GTK_WIDGET (view)) == NULL) { return; } @@ -1335,7 +1331,7 @@ nautilus_files_view_preview_update (NautilusFilesView *view) g_autofree gchar *uri = nautilus_file_get_uri (selection->data); - nautilus_previewer_call_show_file (uri, window, FALSE); + nautilus_previewer_call_show_file (uri, priv->slot, FALSE); } void @@ -1839,14 +1835,14 @@ action_preview_selection (GSimpleAction *action, gpointer user_data) { NautilusFilesView *view = NAUTILUS_FILES_VIEW (user_data); + NautilusFilesViewPrivate *priv = nautilus_files_view_get_instance_private (view); g_autolist (NautilusFile) selection = NULL; - GtkRoot *window = gtk_widget_get_root (GTK_WIDGET (view)); selection = nautilus_view_get_selection (NAUTILUS_VIEW (view)); g_autofree gchar *uri = nautilus_file_get_uri (selection->data); - nautilus_previewer_call_show_file (uri, window, TRUE); + nautilus_previewer_call_show_file (uri, priv->slot, TRUE); } static void diff --git a/src/nautilus-previewer.c b/src/nautilus-previewer.c index ae69708f4c..4933124ec7 100644 --- a/src/nautilus-previewer.c +++ b/src/nautilus-previewer.c @@ -50,6 +50,7 @@ static guint subscription_id = 0; static GCancellable *cancellable = NULL; +static NautilusWindowSlot *current_slot = NULL; /* weak ref */ static GtkRoot *current_window = NULL; /* weak ref */ static gchar *exported_window_handle = NULL; @@ -239,10 +240,14 @@ previewer2_method_ready_cb (GObject *source, } void -nautilus_previewer_call_show_file (const gchar *uri, - GtkRoot *window, - gboolean close_if_already_visible) +nautilus_previewer_call_show_file (const gchar *uri, + NautilusWindowSlot *slot, + gboolean close_if_already_visible) { + g_set_weak_pointer (¤t_slot, slot); + + GtkRoot *window = gtk_widget_get_root (GTK_WIDGET (slot)); + /* Reuse existing handle if called again for the same window. */ if (current_window == window && exported_window_handle != NULL) @@ -343,29 +348,13 @@ previewer_selection_event (GDBusConnection *connection, 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) + if (current_slot == NULL) { return; } - slot = nautilus_window_get_active_slot (window); - view = nautilus_window_slot_get_current_view (slot); + NautilusView *view = nautilus_window_slot_get_current_view (current_slot); + GtkDirectionType direction; if (!NAUTILUS_IS_FILES_VIEW (view)) { diff --git a/src/nautilus-previewer.h b/src/nautilus-previewer.h index 57800e56ad..65bb10afdd 100644 --- a/src/nautilus-previewer.h +++ b/src/nautilus-previewer.h @@ -26,11 +26,13 @@ #include #include +#include "nautilus-types.h" + G_BEGIN_DECLS -void nautilus_previewer_call_show_file (const gchar *uri, - GtkRoot *window, - gboolean close_if_already_visible); +void nautilus_previewer_call_show_file (const gchar *uri, + NautilusWindowSlot *window, + gboolean close_if_already_visible); void nautilus_previewer_call_close (void); gboolean nautilus_previewer_is_visible (void); -- GitLab From d33e44f30f80356a275feba6584d08adef484187 Mon Sep 17 00:00:00 2001 From: Corey Berla Date: Fri, 16 Aug 2024 08:36:24 -0700 Subject: [PATCH 2/2] squash --- src/nautilus-previewer.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/nautilus-previewer.c b/src/nautilus-previewer.c index 4933124ec7..c361f9f245 100644 --- a/src/nautilus-previewer.c +++ b/src/nautilus-previewer.c @@ -384,6 +384,7 @@ nautilus_previewer_teardown (GDBusConnection *connection) g_clear_object (&previewer_proxy); clear_exported_window_handle (); g_clear_weak_pointer (¤t_window); + g_clear_weak_pointer (¤t_slot); } gboolean -- GitLab