diff options
author | David Tardon <dtardon@redhat.com> | 2010-11-22 09:28:34 +0100 |
---|---|---|
committer | David Tardon <dtardon@redhat.com> | 2010-11-22 09:50:48 +0100 |
commit | 5dfa2bcf6f4a7699c2acae87caa96de739f82636 (patch) | |
tree | 3460e0abf6362741d9d8e8abe8f407898f5806db | |
parent | 43a9042c5062374d8a7d787a5df7652b1b471682 (diff) |
rhbz#650170# shutdown quickstarter at end of desktop session
-rw-r--r-- | framework/inc/services/desktop.hxx | 4 | ||||
-rw-r--r-- | framework/source/services/desktop.cxx | 35 | ||||
-rw-r--r-- | sfx2/source/appl/shutdowniconunx.cxx | 16 |
3 files changed, 50 insertions, 5 deletions
diff --git a/framework/inc/services/desktop.hxx b/framework/inc/services/desktop.hxx index c1cc855323..45e91d0831 100644 --- a/framework/inc/services/desktop.hxx +++ b/framework/inc/services/desktop.hxx @@ -429,6 +429,8 @@ class Desktop : // interfaces */ ::sal_Bool impl_closeFrames(::sal_Bool bAllowUI); + sal_Bool impl_terminate(); + //------------------------------------------------------------------------------------------------------------- // debug methods // (should be private everytime!) @@ -507,6 +509,8 @@ class Desktop : // interfaces css::uno::Reference< css::frame::XUntitledNumbers > m_xTitleNumberGenerator; + bool m_bTerminating; // we are in the process of terminating already + }; // class Desktop } // namespace framework diff --git a/framework/source/services/desktop.cxx b/framework/source/services/desktop.cxx index d0a4a8e8bb..d59b361794 100644 --- a/framework/source/services/desktop.cxx +++ b/framework/source/services/desktop.cxx @@ -83,6 +83,7 @@ //_________________________________________________________________________________________________________________ // includes of other projects //_________________________________________________________________________________________________________________ +#include <cppuhelper/exc_hlp.hxx> #include <cppuhelper/queryinterface.hxx> #include <cppuhelper/typeprovider.hxx> #include <cppuhelper/factory.hxx> @@ -264,6 +265,7 @@ Desktop::Desktop( const css::uno::Reference< css::lang::XMultiServiceFactory >& , m_xSWThreadManager ( ) , m_xSfxTerminator ( ) , m_xTitleNumberGenerator ( ) + , m_bTerminating(false) { // Safe impossible cases // We don't accept all incoming parameter. @@ -291,6 +293,39 @@ Desktop::~Desktop() sal_Bool SAL_CALL Desktop::terminate() throw( css::uno::RuntimeException ) { + bool bTerminating(false); + { + WriteGuard aGuard(m_aLock); + bTerminating = m_bTerminating; + m_bTerminating = true; + } + if (bTerminating) + return false; + + css::uno::Any aException; + sal_Bool bTerminate(false); + try + { + bTerminate = impl_terminate(); + } + catch (const css::uno::RuntimeException& rEx) + { + aException <<= rEx; + } + + { + WriteGuard aGuard(m_aLock); + m_bTerminating = false; + } + + if (aException.hasValue()) + cppu::throwException(aException); + + return bTerminate; +} + +sal_Bool Desktop::impl_terminate() +{ TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS ); SYNCHRONIZED_START diff --git a/sfx2/source/appl/shutdowniconunx.cxx b/sfx2/source/appl/shutdowniconunx.cxx index 510c6ca967..3bb5b7729c 100644 --- a/sfx2/source/appl/shutdowniconunx.cxx +++ b/sfx2/source/appl/shutdowniconunx.cxx @@ -66,11 +66,14 @@ static void systray_disable_cb() static void exit_quickstarter_cb( GtkWidget * ) { - egg_tray_icon_cancel_message (pTrayIcon, 1 ); - plugin_shutdown_sys_tray(); - //terminate may cause this .so to be unloaded. So we must be hands off - //all calls into this .so after this call - ShutdownIcon::terminateDesktop(); + if (pTrayIcon) + { + egg_tray_icon_cancel_message (pTrayIcon, 1 ); + plugin_shutdown_sys_tray(); + //terminate may cause this .so to be unloaded. So we must be hands off + //all calls into this .so after this call + ShutdownIcon::terminateDesktop(); + } } static void menu_deactivate_cb( GtkWidget *pMenu ) @@ -396,6 +399,9 @@ void SAL_DLLPUBLIC_EXPORT plugin_init_sys_tray() // disable shutdown pShutdownIcon->SetVeto( true ); pShutdownIcon->addTerminateListener(); + + g_signal_connect(GTK_WIDGET(pTrayIcon), "destroy", + G_CALLBACK(exit_quickstarter_cb), NULL); } void SAL_DLLPUBLIC_EXPORT plugin_shutdown_sys_tray() |