Resolves: rhbz#610103 exit quickstarter if physically deleted

This commit is contained in:
Caolán McNamara 2010-11-25 13:38:40 +00:00
parent d353abf5aa
commit 84c7ee1cdb
2 changed files with 52 additions and 0 deletions

View file

@ -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

View file

@ -19,6 +19,10 @@
#include "shutdownicon.hxx"
#endif
#ifdef ENABLE_GIO
#include <gio/gio.h>
#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.