Date: prev next · Thread: first prev next last
2010 Archives by date, by thread · List index


On Wed, 2010-11-24 at 20:50 +0000, Caolán McNamara wrote:
On Wed, 2010-11-24 at 12:04 +0100, David Tardon wrote:
Does anyone have any clever idea how to prevent that?

How about we over-engineer and..

a) use osl_getModuleURLFromFunctionAddress or something of that nature
to get the filename of the physical .so that we were originally dlopened
on
b) Get a GFileMonitor from gio via g_file_monitor for that .so and
attach to its "changed" signal to get notified when that .so has been
deleted, and turn off the quickstarter (or get it to disable its menus
and sommat like "LibreOffice upgraded restart needed!" :-0) when that
happens.

This seems to work, e.g. the attached.

C.
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 <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.
@@ -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;

Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.