vcl/unx/gtk3/gtk3gtkframe.cxx |   30 ++++++++++++++++++++++--------
 1 file changed, 22 insertions(+), 8 deletions(-)

New commits:
commit e828b6095c30a261b830592ead10fba673175c6e
Author:     Caolán McNamara <[email protected]>
AuthorDate: Fri Apr 23 11:18:01 2021 +0100
Commit:     Aron Budea <[email protected]>
CommitDate: Wed Dec 22 17:33:21 2021 +0100

    Related: tdf#140659 improve F6 task pane switching
    
    for native gtk widgets inside vcl docking windows. Put vcl focus in
    container on F6 so cycling moves between expected panes.
    
    Change-Id: I70bd54493a345ae5bdb801caf79d567bc1ae0438
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/114543
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <[email protected]>
    (cherry picked from commit 57138e6cfa1dec2c44d7cca55171dca40d45aaa3)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127283
    Tested-by: Jenkins CollaboraOffice <[email protected]>
    Reviewed-by: Aron Budea <[email protected]>

diff --git a/vcl/unx/gtk3/gtk3gtkframe.cxx b/vcl/unx/gtk3/gtk3gtkframe.cxx
index 8637acd77684..55fc9968e927 100644
--- a/vcl/unx/gtk3/gtk3gtkframe.cxx
+++ b/vcl/unx/gtk3/gtk3gtkframe.cxx
@@ -3371,19 +3371,28 @@ gboolean GtkSalFrame::signalKey(GtkWidget* pWidget, 
GdkEventKey* pEvent, gpointe
     }
     else
     {
+        bool bRestoreDisallowCycleFocusOut = false;
+
+        VclPtr<vcl::Window> xOrigFrameFocusWin;
         VclPtr<vcl::Window> xOrigFocusWin;
         if (xTopLevelInterimWindow)
         {
-            // Focus is inside a full-app InterimItemWindow send unconsumed
+            // Focus is inside an InterimItemWindow so send unconsumed
             // keystrokes to by setting it as the mpFocusWin
             VclPtr<vcl::Window> xVclWindow = pThis->GetWindow();
             ImplFrameData* pFrameData = 
xVclWindow->ImplGetWindowImpl()->mpFrameData;
-            xOrigFocusWin = pFrameData->mpFocusWin;
+            xOrigFrameFocusWin = pFrameData->mpFocusWin;
             pFrameData->mpFocusWin = xTopLevelInterimWindow;
-            if (pEvent->keyval == GDK_KEY_F6)
+
+            ImplSVData* pSVData = ImplGetSVData();
+            xOrigFocusWin = pSVData->mpWinData->mpFocusWin;
+            pSVData->mpWinData->mpFocusWin = xTopLevelInterimWindow;
+
+            if (pEvent->keyval == GDK_KEY_F6 && 
pThis->IsCycleFocusOutDisallowed())
             {
                 // For F6, allow the focus to leave the InterimItemWindow
                 pThis->AllowCycleFocusOut();
+                bRestoreDisallowCycleFocusOut = true;
             }
         }
 
@@ -3400,14 +3409,19 @@ gboolean GtkSalFrame::signalKey(GtkWidget* pWidget, 
GdkEventKey* pEvent, gpointe
 
             if (xTopLevelInterimWindow)
             {
-                // Focus was inside a full-app InterimItemWindow, restore the 
original
-                // focus win, unless the focus was changed away from the 
InterimItemWindow
-                // which should only be possible with F6
+                // Focus was inside an InterimItemWindow, restore the original
+                // focus win, unless the focus was changed away from the
+                // InterimItemWindow which should only be possible with F6
                 VclPtr<vcl::Window> xVclWindow = pThis->GetWindow();
                 ImplFrameData* pFrameData = 
xVclWindow->ImplGetWindowImpl()->mpFrameData;
                 if (pFrameData->mpFocusWin == xTopLevelInterimWindow)
-                    pFrameData->mpFocusWin = xOrigFocusWin;
-                if (pEvent->keyval == GDK_KEY_F6)
+                    pFrameData->mpFocusWin = xOrigFrameFocusWin;
+
+                ImplSVData* pSVData = ImplGetSVData();
+                if (pSVData->mpWinData->mpFocusWin == xTopLevelInterimWindow)
+                    pSVData->mpWinData->mpFocusWin = xOrigFocusWin;
+
+                if (bRestoreDisallowCycleFocusOut)
                 {
                     // undo the above AllowCycleFocusOut for F6
                     pThis->DisallowCycleFocusOut();

Reply via email to