--- file_not_specified_in_diff +++ file_not_specified_in_diff @@ -, +, @@ --- sfx2/source/appl/shutdownicon.cxx +++ sfx2/source/appl/shutdownicon.cxx @@ -69,6 +69,7 @@ #include #include #endif +#include #include "sfxresid.hxx" @@ -186,6 +187,23 @@ return true; } +class IdleUnloader : Timer +{ + ::osl::Module *m_pModule; +public: + IdleUnloader (::osl::Module **pModule) : + m_pModule (*pModule) + { + *pModule = NULL; + Start(); + } + virtual void Timeout() + { + delete m_pModule; + delete this; + } +}; + void ShutdownIcon::initSystray() { if (m_bInitialized) @@ -201,15 +221,15 @@ { if (!m_bInitialized) return; + if (m_pDeInitSystray) m_pDeInitSystray(); m_bVeto = false; m_pInitSystray = 0; m_pDeInitSystray = 0; - if (m_pPlugin) - delete m_pPlugin; - m_pPlugin = 0; + new IdleUnloader (&m_pPlugin); + delete m_pFileDlg; m_pFileDlg = NULL; m_bInitialized = false; @@ -228,6 +249,7 @@ ShutdownIcon::~ShutdownIcon() { deInitSystray(); + new IdleUnloader (&m_pPlugin); } // --------------------------------------------------------------------------- @@ -853,9 +884,11 @@ ::osl::File::getFileURLFromSystemPath( aShortcut, aShortcutUrl ); ::osl::File::remove( aShortcutUrl ); #ifdef UNX - ShutdownIcon *pIcon = getInstance(); - if( pIcon ) - pIcon->deInitSystray(); + if (pShutdownIcon) + { + ShutdownIcon *pIcon = getInstance(); + pIcon->deInitSystray(); + } #endif } #elif defined OS2 --- libegg/source/eggtrayicon.c +++ libegg/source/eggtrayicon.c @@ -76,6 +76,14 @@ static void egg_tray_icon_manager_window_destroyed (EggTrayIcon *icon); #endif +/* + * This is made somewhat more 'interesting' by the facts that: + * a) GTypePlugin is a foul & tangled mess + * b) We may have been unloaded, and left an invalid + * EggTrayIcon class lying around in the GType database, + * we could use GTypePlugin to fix this, but see a) - + * this is far easier and simpler. + */ GType egg_tray_icon_get_type (void) { @@ -88,18 +96,23 @@ sizeof (EggTrayIconClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, - (GClassInitFunc) egg_tray_icon_class_init, + (GClassInitFunc) NULL, /* class_init */ NULL, /* class_finalize */ NULL, /* class_data */ sizeof (EggTrayIcon), 0, /* n_preallocs */ - (GInstanceInitFunc) egg_tray_icon_init, + (GInstanceInitFunc) NULL, /* instance_init */ NULL }; - our_type = g_type_register_static (GTK_TYPE_PLUG, "EggTrayIcon", &our_info, 0); + our_type = g_type_from_name ("EggTrayIcon"); + if (!our_type) + our_type = g_type_register_static (GTK_TYPE_PLUG, "EggTrayIcon", &our_info, 0); } + /* always overwrite the function pointers */ + egg_tray_icon_class_init (g_type_class_ref (our_type)); + return our_type; } @@ -128,22 +141,15 @@ container_class->add = egg_tray_icon_add; - g_object_class_install_property (gobject_class, - PROP_ORIENTATION, - g_param_spec_enum ("orientation", - _("Orientation"), - _("The orientation of the tray."), - GTK_TYPE_ORIENTATION, - GTK_ORIENTATION_HORIZONTAL, - G_PARAM_READABLE)); - -#if defined (GDK_WINDOWING_X11) - /* Nothing */ -#elif defined (GDK_WINDOWING_WIN32) - g_warning ("Port eggtrayicon to Win32"); -#else - g_warning ("Port eggtrayicon to this GTK+ backend"); -#endif + if (!g_object_class_find_property (gobject_class, "orientation")) + g_object_class_install_property (gobject_class, + PROP_ORIENTATION, + g_param_spec_enum ("orientation", + "Orientation", + "The orientation of the tray.", + GTK_TYPE_ORIENTATION, + GTK_ORIENTATION_HORIZONTAL, + G_PARAM_READABLE)); } static void @@ -471,7 +477,9 @@ EggTrayIcon* egg_tray_icon_new (const gchar *name) { - return g_object_new (EGG_TYPE_TRAY_ICON, "title", name, NULL); + EggTrayIcon *icon = g_object_new (EGG_TYPE_TRAY_ICON, "title", name, NULL); + egg_tray_icon_init (icon); + return icon; } guint