summaryrefslogtreecommitdiff
path: root/0001-Resolves-tdf-145567-restore-focus-to-the-usual-frame.patch
diff options
context:
space:
mode:
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.patch63
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
+