summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Tardon <dtardon@redhat.com>2010-11-22 09:28:34 +0100
committerDavid Tardon <dtardon@redhat.com>2010-11-22 09:50:48 +0100
commit5dfa2bcf6f4a7699c2acae87caa96de739f82636 (patch)
tree3460e0abf6362741d9d8e8abe8f407898f5806db
parent43a9042c5062374d8a7d787a5df7652b1b471682 (diff)
rhbz#650170# shutdown quickstarter at end of desktop session
-rw-r--r--framework/inc/services/desktop.hxx4
-rw-r--r--framework/source/services/desktop.cxx35
-rw-r--r--sfx2/source/appl/shutdowniconunx.cxx16
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()