framework/inc/services/desktop.hxx            |    4 +++
 framework/source/services/desktop.cxx         |   30 ++++++++++++++++++++++++++
 framework/source/services/sessionlistener.cxx |   15 ++++++++++++-
 3 files changed, 48 insertions(+), 1 deletion(-)

New commits:
commit 1baa3d0720b2ef9d12104a22ce03ed32b1e4b921
Author: Bjoern Michaelsen <bjoern.michael...@canonical.com>
Date:   Tue Feb 28 14:29:06 2012 +0100

    lp#562027: fix logout with quickstarter
    
    Signed-off-by: David Tardon <dtar...@redhat.com>

diff --git a/framework/inc/services/desktop.hxx 
b/framework/inc/services/desktop.hxx
index 8dcc872..324a056 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 5cdf44d..e3569ee 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 6dc4877..c150aa5 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() )
             {
_______________________________________________
Libreoffice-commits mailing list
Libreoffice-commits@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to