summaryrefslogtreecommitdiff
path: root/framework
diff options
context:
space:
mode:
authorBjoern Michaelsen <bjoern.michaelsen@canonical.com>2012-02-28 14:29:06 +0100
committerDavid Tardon <dtardon@redhat.com>2012-03-05 09:50:10 +0100
commit1baa3d0720b2ef9d12104a22ce03ed32b1e4b921 (patch)
treed3ad9146e7779ecb0cbaeb42d557588d449ea527 /framework
parentbd52977757ea8cf71897340bc938baf183b9787f (diff)
lp#562027: fix logout with quickstarter
Signed-off-by: David Tardon <dtardon@redhat.com>
Diffstat (limited to 'framework')
-rw-r--r--framework/inc/services/desktop.hxx4
-rw-r--r--framework/source/services/desktop.cxx30
-rw-r--r--framework/source/services/sessionlistener.cxx15
3 files changed, 48 insertions, 1 deletions
diff --git a/framework/inc/services/desktop.hxx b/framework/inc/services/desktop.hxx
index 8dcc87227780..324a056b00fb 100644
--- a/framework/inc/services/desktop.hxx
+++ b/framework/inc/services/desktop.hxx
@@ -339,6 +339,10 @@ class Desktop : // interfaces
virtual ::rtl::OUString SAL_CALL getUntitledPrefix()
throw (css::uno::RuntimeException);
+ // we need this wrapped terminate()-call to terminate even the QuickStarter
+ // non-virtual and non-UNO for now
+ bool SAL_CALL terminateQuickstarterToo()
+ throw( css::uno::RuntimeException );
//-------------------------------------------------------------------------------------------------------------
// protected methods
//-------------------------------------------------------------------------------------------------------------
diff --git a/framework/source/services/desktop.cxx b/framework/source/services/desktop.cxx
index 5cdf44d80700..e3569ee53abf 100644
--- a/framework/source/services/desktop.cxx
+++ b/framework/source/services/desktop.cxx
@@ -427,6 +427,36 @@ sal_Bool SAL_CALL Desktop::terminate()
return bTerminate;
}
+namespace
+{
+ class QuickstartSuppressor
+ {
+ Desktop* const m_pDesktop;
+ css::uno::Reference< css::frame::XTerminateListener > m_xQuickLauncher;
+ public:
+ QuickstartSuppressor(Desktop* const pDesktop, css::uno::Reference< css::frame::XTerminateListener > xQuickLauncher)
+ : m_pDesktop(pDesktop)
+ , m_xQuickLauncher(xQuickLauncher)
+ {
+ SAL_INFO("fwk.desktop", "temporary removing Quickstarter");
+ if(m_xQuickLauncher.is())
+ m_pDesktop->removeTerminateListener(m_xQuickLauncher);
+ }
+ ~QuickstartSuppressor()
+ {
+ SAL_INFO("fwk.desktop", "readding Quickstarter");
+ if(m_xQuickLauncher.is())
+ m_pDesktop->addTerminateListener(m_xQuickLauncher);
+ }
+ };
+}
+
+bool SAL_CALL Desktop::terminateQuickstarterToo()
+ throw( css::uno::RuntimeException )
+{
+ QuickstartSuppressor aQuickstartSuppressor(this, m_xQuickLauncher);
+ return terminate();
+}
//=============================================================================
void SAL_CALL Desktop::addTerminateListener( const css::uno::Reference< css::frame::XTerminateListener >& xListener )
diff --git a/framework/source/services/sessionlistener.cxx b/framework/source/services/sessionlistener.cxx
index 6dc48771450d..c150aa5f7aac 100644
--- a/framework/source/services/sessionlistener.cxx
+++ b/framework/source/services/sessionlistener.cxx
@@ -30,6 +30,7 @@
// my own includes
#include <services/sessionlistener.hxx>
+#include <services/desktop.hxx>
#include <threadhelp/readguard.hxx>
#include <threadhelp/resetableguard.hxx>
#include <protocols.h>
@@ -318,7 +319,19 @@ void SAL_CALL SessionListener::approveInteraction( sal_Bool bInteractionGranted
StoreSession( sal_False );
css::uno::Reference< css::frame::XDesktop > xDesktop( m_xSMGR->createInstance(SERVICENAME_DESKTOP), css::uno::UNO_QUERY_THROW);
- m_bTerminated = xDesktop->terminate();
+ // honestly: how many implementations of XDesktop will we ever have?
+ // so casting this directly to the implementation
+ Desktop* pDesktop(dynamic_cast<Desktop*>(xDesktop.get()));
+ if(pDesktop)
+ {
+ SAL_INFO("fwk.session", "XDesktop is a framework::Desktop -- good.");
+ m_bTerminated = pDesktop->terminateQuickstarterToo();
+ }
+ else
+ {
+ SAL_WARN("fwk.session", "XDesktop is not a framework::Desktop -- this should never happen.");
+ m_bTerminated = xDesktop->terminate();
+ }
if ( m_rSessionManager.is() )
{