include/vcl/window.hxx       |    1 +
 sfx2/source/view/frame2.cxx  |   34 ++++++++++++++++++++--------------
 vcl/inc/salframe.hxx         |    4 ++++
 vcl/source/window/dialog.cxx |    8 ++++----
 vcl/source/window/window.cxx |    5 +++++
 5 files changed, 34 insertions(+), 18 deletions(-)

New commits:
commit 64317b35feee9c4e1dfbe7d1e580c2146ad652bb
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Fri Jun 14 09:18:44 2019 +0100
Commit:     Thorsten Behrens <thorsten.behr...@cib.de>
CommitDate: Fri May 1 17:58:17 2020 +0200

    disable 'quit' menu entry when modal dialog waiting response
    
    Traditionally when a modal dialog is active, the quit menu entry of all
    LibreOffice toplevel frames, not just those which are themselves modal, is 
get
    disabled.
    
    This has come unstuck because its implemented by dialogs emitting
    MouseNotifyEvent::[END]EXECUTEDIALOG on its parent, and SfxFrameWindow_Impl
    listening for that event. But if the dialog parent is the toplevel parent of
    SfxFrameWindow_Impl then it doesn't get seen by the SfxFrameWindow_Impl 
child.
    
    Change-Id: I0c4a5472d16d9169e68f6b0c230d039f1119489a
    Reviewed-on: https://gerrit.libreoffice.org/74030
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caol...@redhat.com>
    Tested-by: Caolán McNamara <caol...@redhat.com>
    (cherry picked from commit ca525d1375ab06889ba1cf9d904652f2eb61d1bf)
    
    Conflicts:
            include/vcl/event.hxx
            include/vcl/window.hxx
            sfx2/source/view/frame2.cxx
            vcl/source/window/dialog.cxx
            vcl/source/window/window.cxx

diff --git a/include/vcl/window.hxx b/include/vcl/window.hxx
index 3a3ea99d2c0f..f0eaaff573f1 100644
--- a/include/vcl/window.hxx
+++ b/include/vcl/window.hxx
@@ -1605,6 +1605,7 @@ public:
     virtual bool IsChart() const { return false; }
 
     void SetHelpHdl(const Link<vcl::Window&, bool>& rLink);
+    void SetModalHierarchyHdl(const Link<bool, void>& rLink);
 };
 
 }
diff --git a/sfx2/source/view/frame2.cxx b/sfx2/source/view/frame2.cxx
index 6fc3cff26a7d..e003d9697358 100644
--- a/sfx2/source/view/frame2.cxx
+++ b/sfx2/source/view/frame2.cxx
@@ -58,9 +58,9 @@ using namespace ::com::sun::star::container;
 using namespace ::com::sun::star::beans;
 using ::com::sun::star::frame::XComponentLoader;
 
-
 class SfxFrameWindow_Impl : public vcl::Window
 {
+    DECL_LINK(ModalHierarchyHdl, bool, void);
 public:
     SfxFrame*           pFrame;
 
@@ -72,13 +72,21 @@ public:
     virtual bool        EventNotify( NotifyEvent& rEvt ) override;
     virtual void        Resize() override;
     virtual void        GetFocus() override;
+    virtual void        dispose() override;
     void                DoResize();
 };
 
-SfxFrameWindow_Impl::SfxFrameWindow_Impl( SfxFrame* pF, vcl::Window& 
i_rContainerWindow )
-        : Window( &i_rContainerWindow, WB_BORDER | WB_CLIPCHILDREN | 
WB_NODIALOGCONTROL | WB_3DLOOK )
-        , pFrame( pF )
+SfxFrameWindow_Impl::SfxFrameWindow_Impl(SfxFrame* pF, vcl::Window& 
i_rContainerWindow)
+    : Window(&i_rContainerWindow, WB_BORDER | WB_CLIPCHILDREN | 
WB_NODIALOGCONTROL | WB_3DLOOK)
+    , pFrame(pF)
+{
+    i_rContainerWindow.SetModalHierarchyHdl(LINK(this, SfxFrameWindow_Impl, 
ModalHierarchyHdl));
+}
+
+void SfxFrameWindow_Impl::dispose()
 {
+    GetParent()->SetModalHierarchyHdl(Link<bool, void>());
+    vcl::Window::dispose();
 }
 
 void SfxFrameWindow_Impl::DataChanged( const DataChangedEvent& rDCEvt )
@@ -116,20 +124,18 @@ bool SfxFrameWindow_Impl::EventNotify( NotifyEvent& rNEvt 
)
         if ( pView->GetViewShell()->KeyInput( *rNEvt.GetKeyEvent() ) )
             return true;
     }
-    else if ( rNEvt.GetType() == MouseNotifyEvent::EXECUTEDIALOG /*|| 
rNEvt.GetType() == MouseNotifyEvent::INPUTDISABLE*/ )
-    {
-        pView->SetModalMode( true );
-        return true;
-    }
-    else if ( rNEvt.GetType() == MouseNotifyEvent::ENDEXECUTEDIALOG /*|| 
rNEvt.GetType() == MouseNotifyEvent::INPUTENABLE*/ )
-    {
-        pView->SetModalMode( false );
-        return true;
-    }
 
     return Window::EventNotify( rNEvt );
 }
 
+IMPL_LINK(SfxFrameWindow_Impl, ModalHierarchyHdl, bool, bSetModal, void)
+{
+    SfxViewFrame* pView = pFrame->GetCurrentViewFrame();
+    if (!pView || !pView->GetObjectShell())
+        return;
+    pView->SetModalMode(bSetModal);
+}
+
 bool SfxFrameWindow_Impl::PreNotify( NotifyEvent& rNEvt )
 {
     MouseNotifyEvent nType = rNEvt.GetType();
diff --git a/vcl/inc/salframe.hxx b/vcl/inc/salframe.hxx
index f1d4a05e5662..ad60072e08cf 100644
--- a/vcl/inc/salframe.hxx
+++ b/vcl/inc/salframe.hxx
@@ -108,6 +108,7 @@ private:
     // the VCL window corresponding to this frame
     VclPtr<vcl::Window>     m_pWindow;
     SALFRAMEPROC            m_pProc;
+    Link<bool, void>        m_aModalHierarchyHdl;
 protected:
     mutable std::unique_ptr<weld::Window> m_xFrameWeld;
 public:
@@ -273,6 +274,9 @@ public:
     // returns the instance set
     vcl::Window*            GetWindow() const { return m_pWindow; }
 
+    void SetModalHierarchyHdl(const Link<bool, void>& rLink) { 
m_aModalHierarchyHdl = rLink; }
+    void NotifyModalHierarchy(bool bModal) { 
m_aModalHierarchyHdl.Call(bModal); }
+
     // Call the callback set; this sometimes necessary for implementation 
classes
     // that should not know more than necessary about the SalFrame 
implementation
     // (e.g. input methods, printer update handlers).
diff --git a/vcl/source/window/dialog.cxx b/vcl/source/window/dialog.cxx
index a1d8cf1e6a6c..898d8dbf4a99 100644
--- a/vcl/source/window/dialog.cxx
+++ b/vcl/source/window/dialog.cxx
@@ -915,8 +915,8 @@ bool Dialog::ImplStartExecuteModal()
 
     if ( GetParent() )
     {
-        NotifyEvent aNEvt( MouseNotifyEvent::EXECUTEDIALOG, this );
-        GetParent()->CompatNotify( aNEvt );
+        SalFrame* pFrame = GetParent()->ImplGetFrame();
+        pFrame->NotifyModalHierarchy(true);
     }
     mbInExecute = true;
     // no real modality in LibreOfficeKit
@@ -1119,8 +1119,8 @@ void Dialog::EndDialog( long nResult )
     Hide();
     if ( GetParent() )
     {
-        NotifyEvent aNEvt( MouseNotifyEvent::ENDEXECUTEDIALOG, this );
-        GetParent()->CompatNotify( aNEvt );
+        SalFrame* pFrame = GetParent()->ImplGetFrame();
+        pFrame->NotifyModalHierarchy(false);
     }
 
     mpDialogImpl->mnResult = nResult;
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index ce0be303d2e8..002658ba99a6 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -1766,6 +1766,11 @@ void Window::ImplNewInputContext()
         pFontInstance->Release();
 }
 
+void Window::SetModalHierarchyHdl(const Link<bool, void>& rLink)
+{
+    ImplGetFrame()->SetModalHierarchyHdl(rLink);
+}
+
 void Window::doLazyDelete()
 {
     SystemWindow* pSysWin = dynamic_cast<SystemWindow*>(this);
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to