sc/source/ui/cctrl/checklistmenu.cxx |   17 +++++++++++++----
 sc/source/ui/inc/checklistmenu.hxx   |    2 ++
 sc/source/ui/view/gridwin.cxx        |    1 +
 3 files changed, 16 insertions(+), 4 deletions(-)

New commits:
commit 10600d1988665bd950166891fa9df314bb847ac3
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Fri Jan 28 09:58:05 2022 +0000
Commit:     Adolfo Jayme Barrientos <fit...@ubuntu.com>
CommitDate: Sun Jan 30 22:01:20 2022 +0100

    Resolves: tdf#147016 ensure focus returns to document after popup closes
    
    Change-Id: I67e59afc08bc5983d473cb9dceb4fcefedeec117
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129095
    Tested-by: Jenkins
    Reviewed-by: Adolfo Jayme Barrientos <fit...@ubuntu.com>

diff --git a/sc/source/ui/cctrl/checklistmenu.cxx 
b/sc/source/ui/cctrl/checklistmenu.cxx
index f62b2369da27..88366b2ff0ac 100644
--- a/sc/source/ui/cctrl/checklistmenu.cxx
+++ b/sc/source/ui/cctrl/checklistmenu.cxx
@@ -283,6 +283,8 @@ void ScCheckListMenuControl::queueCloseSubMenu()
 
     maCloseTimer.mpSubMenu = maOpenTimer.mpSubMenu;
     maCloseTimer.mnMenuPos = maOpenTimer.mnMenuPos;
+    maOpenTimer.mpSubMenu = nullptr;
+    maOpenTimer.mnMenuPos = MENU_NOT_SELECTED;
     maCloseTimer.maTimer.Start();
 }
 
@@ -570,11 +572,8 @@ void ScCheckListMenuControl::GrabFocus()
     }
 }
 
-ScCheckListMenuControl::~ScCheckListMenuControl()
+void ScCheckListMenuControl::DropPendingEvents()
 {
-    EndPopupMode();
-    for (auto& rMenuItem : maMenuItems)
-        rMenuItem.mxSubMenuWin.reset();
     if (mnAsyncPostPopdownId)
     {
         Application::RemoveUserEvent(mnAsyncPostPopdownId);
@@ -587,6 +586,14 @@ ScCheckListMenuControl::~ScCheckListMenuControl()
     }
 }
 
+ScCheckListMenuControl::~ScCheckListMenuControl()
+{
+    EndPopupMode();
+    for (auto& rMenuItem : maMenuItems)
+        rMenuItem.mxSubMenuWin.reset();
+    DropPendingEvents();
+}
+
 void ScCheckListMenuControl::prepWindow()
 {
     mxMenu->set_size_request(-1, mxMenu->get_preferred_size().Height() + 2);
@@ -1427,6 +1434,8 @@ IMPL_LINK_NOARG(ScCheckListMenuControl, PopupModeEndHdl, 
weld::Popover&, void)
     if (mxPopupEndAction)
         mxPopupEndAction->execute();
 
+    DropPendingEvents();
+
     if (comphelper::LibreOfficeKit::isActive())
         NotifyCloseLOK();
 }
diff --git a/sc/source/ui/inc/checklistmenu.hxx 
b/sc/source/ui/inc/checklistmenu.hxx
index 961fddceac58..8d135870d871 100644
--- a/sc/source/ui/inc/checklistmenu.hxx
+++ b/sc/source/ui/inc/checklistmenu.hxx
@@ -254,6 +254,8 @@ private:
 
     DECL_LINK(SetDropdownPosHdl, void*, void);
 
+    void DropPendingEvents();
+
 private:
     std::unique_ptr<weld::Builder> mxBuilder;
     std::unique_ptr<weld::Popover> mxPopover;
diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx
index 42b02d4b9743..2e4fcf0bc38d 100644
--- a/sc/source/ui/view/gridwin.cxx
+++ b/sc/source/ui/view/gridwin.cxx
@@ -524,6 +524,7 @@ public:
     virtual bool execute() override
     {
         mpWindow->RefreshAutoFilterButton(maPos);
+        mpWindow->GrabFocus();
         return false; // this is called after the popup has been closed
     }
 };

Reply via email to