diff --git a/sfx2/source/appl/makefile.mk b/sfx2/source/appl/makefile.mk index 72ac94a..a583102 100644 --- a/sfx2/source/appl/makefile.mk +++ b/sfx2/source/appl/makefile.mk @@ -53,6 +53,10 @@ CFLAGS+=-DENABLE_QUICKSTART_APPLET CDEFS+=-DDLL_NAME=libsfx$(DLLPOSTFIX)$(DLLPOST) .IF "$(ENABLE_SYSTRAY_GTK)"=="TRUE" PKGCONFIG_MODULES=gtk+-2.0 +.IF "$(ENABLE_GIO)"!="" + PKGCONFIG_MODULES+=gio-2.0 + CDEFS+=-DENABLE_GIO +.ENDIF .INCLUDE: pkg_config.mk CFLAGS+=$(PKGCONFIG_CFLAGS) CFLAGS+=-DENABLE_QUICKSTART_APPLET diff --git a/sfx2/source/appl/shutdowniconunx.cxx b/sfx2/source/appl/shutdowniconunx.cxx index e31c32f..1b78f9b 100644 --- a/sfx2/source/appl/shutdowniconunx.cxx +++ b/sfx2/source/appl/shutdowniconunx.cxx @@ -19,6 +19,10 @@ #include "shutdownicon.hxx" #endif +#ifdef ENABLE_GIO +#include +#endif + // Cut/paste from vcl/inc/svids.hrc #define SV_ICON_SMALL_START 25000 @@ -39,6 +43,9 @@ static EggTrayIcon *pTrayIcon; static GtkWidget *pExitMenuItem = NULL; static GtkWidget *pOpenMenuItem = NULL; static GtkWidget *pDisableMenuItem = NULL; +#ifdef ENABLE_GIO +GFileMonitor* pMonitor = NULL; +#endif static void open_url_cb( GtkWidget *, gpointer data ) { @@ -358,6 +365,22 @@ extern "C" { } } +#ifdef ENABLE_GIO +/* + * See rhbz#610103. If the quickstarter is running, then LibreOffice is + * upgraded, then the old quickstarter is still running, but is now unreliable + * as the old install has been deleted. A fairly intractable problem but we + * can avoid much of the pain if we turn off the quickstarter if we detect + * that it has been physically deleted. +*/ +static void notify_file_changed(GFileMonitor * /*gfilemonitor*/, GFile * /*arg1*/, + GFile * /*arg2*/, GFileMonitorEvent event_type, gpointer /*user_data*/) +{ + if (event_type == G_FILE_MONITOR_EVENT_DELETED) + exit_quickstarter_cb(GTK_WIDGET(pTrayIcon)); +} +#endif + void SAL_DLLPUBLIC_EXPORT plugin_init_sys_tray() { ::SolarMutexGuard aGuard; @@ -403,6 +426,20 @@ void SAL_DLLPUBLIC_EXPORT plugin_init_sys_tray() g_signal_connect(GTK_WIDGET(pTrayIcon), "destroy", G_CALLBACK(exit_quickstarter_cb), NULL); + +#ifdef ENABLE_GIO + GFile* pFile = NULL; + rtl::OUString sLibraryFileUrl; + if (osl::Module::getUrlFromAddress(plugin_init_sys_tray, sLibraryFileUrl)) + pFile = g_file_new_for_uri(rtl::OUStringToOString(sLibraryFileUrl, RTL_TEXTENCODING_UTF8).getStr()); + + if (pFile) + { + if ((pMonitor = g_file_monitor_file(pFile, G_FILE_MONITOR_NONE, NULL, NULL))) + g_signal_connect(pMonitor, "changed", (GCallback)notify_file_changed, NULL); + g_object_unref(pFile); + } +#endif } void SAL_DLLPUBLIC_EXPORT plugin_shutdown_sys_tray() @@ -411,6 +448,17 @@ void SAL_DLLPUBLIC_EXPORT plugin_shutdown_sys_tray() if( !pTrayIcon ) return; +#ifdef ENABLE_GIO + if (pMonitor) + { + g_signal_handlers_disconnect_by_func(pMonitor, + (void*)notify_file_changed, pMonitor); + g_file_monitor_cancel(pMonitor); + g_object_unref(pMonitor); + pMonitor = NULL; + } +#endif + /* we have to set pTrayIcon to NULL now, because gtk_widget_destroy * causes calling exit_quickstarter_cb (which then calls this func.) * again -> crash. @@ -419,7 +467,7 @@ void SAL_DLLPUBLIC_EXPORT plugin_shutdown_sys_tray() */ GtkWidget* const pIcon = GTK_WIDGET( pTrayIcon ); pTrayIcon = NULL; - gtk_widget_destroy( pIcon ); + gtk_widget_destroy( pIcon ); pExitMenuItem = NULL; pOpenMenuItem = NULL;