summaryrefslogtreecommitdiff
path: root/framework/source
diff options
context:
space:
mode:
Diffstat (limited to 'framework/source')
-rw-r--r--framework/source/dispatch/closedispatcher.cxx17
-rw-r--r--framework/source/helper/persistentwindowstate.cxx29
2 files changed, 44 insertions, 2 deletions
diff --git a/framework/source/dispatch/closedispatcher.cxx b/framework/source/dispatch/closedispatcher.cxx
index ed79058194ab..1fc959734168 100644
--- a/framework/source/dispatch/closedispatcher.cxx
+++ b/framework/source/dispatch/closedispatcher.cxx
@@ -1,4 +1,4 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
/*
* This file is part of the LibreOffice project.
*
@@ -38,6 +38,7 @@
#include <vcl/window.hxx>
#include <vcl/svapp.hxx>
#include <vcl/syswin.hxx>
+#include <vcl/wrkwin.hxx>
#include <unotools/moduleoptions.hxx>
using namespace com::sun::star;
@@ -176,6 +177,20 @@ void SAL_CALL CloseDispatcher::dispatchWithNotification(const css::util::URL&
return;
}
+#ifdef MACOSX
+ // FIXME: In full-screen mode, if we call ShowFullScreenMode(false) here, it leads to a crash
+ // later, so disallow closing for now. And yes, if we don't allow closing a window that is in
+ // full-screen mode, the menu entry should be greyed out then, too. But doing that looks
+ // insanely hard, too. I am so tempted to just abort this and instead just don't even try to
+ // support the system full-screen mode.
+ if (m_pSysWindow)
+ {
+ WorkWindow *pWorkWindow = dynamic_cast<WorkWindow*>(m_pSysWindow.get());
+ if (pWorkWindow && pWorkWindow->IsFullScreenMode())
+ return;
+ }
+#endif
+
if (m_pSysWindow && m_pSysWindow->GetCloseHdl().IsSet())
{
// The closing frame has its own close handler. Call it instead.
diff --git a/framework/source/helper/persistentwindowstate.cxx b/framework/source/helper/persistentwindowstate.cxx
index ecec7f39d63c..e20a152a19d2 100644
--- a/framework/source/helper/persistentwindowstate.cxx
+++ b/framework/source/helper/persistentwindowstate.cxx
@@ -1,4 +1,4 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
/*
* This file is part of the LibreOffice project.
*
@@ -125,6 +125,11 @@ void SAL_CALL PersistentWindowState::frameAction(const css::frame::FrameActionEv
case css::frame::FrameAction_COMPONENT_DETACHING :
{
+ // FIXME: Hack: Don't save state for full-screen windows. We can't properly restore
+ // them anyway.
+ if (implst_isWindowFullScreen(xWindow))
+ break;
+
OUString sWindowState = PersistentWindowState::implst_getWindowStateFromWindow(xWindow);
PersistentWindowState::implst_setWindowStateOnConfig(xContext, sModuleName, sWindowState);
}
@@ -199,6 +204,28 @@ void PersistentWindowState::implst_setWindowStateOnConfig(
{}
}
+bool PersistentWindowState::implst_isWindowFullScreen(const css::uno::Reference< css::awt::XWindow >& xWindow)
+{
+ bool bRetval = false;
+
+ if (xWindow.is())
+ {
+ SolarMutexGuard aSolarGuard;
+
+ VclPtr<vcl::Window> pWindow = VCLUnoHelper::GetWindow(xWindow);
+ if ( pWindow && pWindow->IsSystemWindow() )
+ {
+ WindowStateData aWSD;
+ aWSD.SetMask(WindowStateMask::All);
+ static_cast<SystemWindow*>(pWindow.get())->GetWindowStateData(aWSD);
+ if (aWSD.GetState() & WindowStateState::FullScreen)
+ bRetval = true;
+ }
+ }
+
+ return bRetval;
+}
+
OUString PersistentWindowState::implst_getWindowStateFromWindow(const css::uno::Reference< css::awt::XWindow >& xWindow)
{
OUString sWindowState;