diff options
Diffstat (limited to '0001-Resolves-tdf-145567-restore-focus-to-the-usual-frame.patch')
-rw-r--r-- | 0001-Resolves-tdf-145567-restore-focus-to-the-usual-frame.patch | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/0001-Resolves-tdf-145567-restore-focus-to-the-usual-frame.patch b/0001-Resolves-tdf-145567-restore-focus-to-the-usual-frame.patch new file mode 100644 index 0000000..cced1b7 --- /dev/null +++ b/0001-Resolves-tdf-145567-restore-focus-to-the-usual-frame.patch @@ -0,0 +1,63 @@ +From ea6cfca48017b76bfeb8898e6d9e47b3011a3add Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com> +Date: Sat, 6 Nov 2021 21:32:21 +0000 +Subject: [PATCH] Resolves: tdf#145567 restore focus to the usual frame focus + widget + +when tearing down the start center. Don't leave the focus in an +arbitrary widget. + +Change-Id: I82c30c94121dc43b2ea1b4fbc66a0a3e79f7e664 +--- + vcl/unx/gtk3/gtk3gtkinst.cxx | 28 ++++++++++++++++++++++++++++ + 1 file changed, 28 insertions(+) + +diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx +index a5d233e2f95e..0fddb27aaa2d 100644 +--- a/vcl/unx/gtk3/gtk3gtkinst.cxx ++++ b/vcl/unx/gtk3/gtk3gtkinst.cxx +@@ -1899,6 +1899,26 @@ GdkDragAction VclToGdk(sal_Int8 dragOperation) + return eRet; + } + ++GtkWindow* get_active_window() ++{ ++ GtkWindow* pFocus = nullptr; ++ ++ GList* pList = gtk_window_list_toplevels(); ++ ++ for (GList* pEntry = pList; pEntry; pEntry = pEntry->next) ++ { ++ if (gtk_window_has_toplevel_focus(GTK_WINDOW(pEntry->data))) ++ { ++ pFocus = GTK_WINDOW(pEntry->data); ++ break; ++ } ++ } ++ ++ g_list_free(pList); ++ ++ return pFocus; ++} ++ + class GtkInstanceWidget : public virtual weld::Widget + { + protected: +@@ -16635,6 +16655,14 @@ private: + // rehook handler and let vcl cycle its own way through this widget's + // children + pFrame->AllowCycleFocusOut(); ++ ++ // tdf#145567 if the focus is in this hierarchy then, now that we are tearing down, ++ // move focus to the usual focus candidate for the frame ++ GtkWindow* pFocusWin = get_active_window(); ++ GtkWidget* pFocus = pFocusWin ? gtk_window_get_focus(pFocusWin) : nullptr; ++ bool bHasFocus = pFocus && gtk_widget_is_ancestor(pFocus, pTopLevel); ++ if (bHasFocus) ++ pFrame->GrabFocus(); + } + + static void signalUnmap(GtkWidget*, gpointer user_data) +-- +2.33.1 + |