[Xfce4-commits] <midori:unload> Actually unload extensions when deactivating
Christian Dywan
noreply at xfce.org
Fri May 7 19:24:02 CEST 2010
Updating branch refs/heads/unload
to 3f0fe9464763e95d44c26b858aa0f058e344121c (commit)
from 2611a24803fd5af770ae779e3adbecc6f4200621 (commit)
commit 3f0fe9464763e95d44c26b858aa0f058e344121c
Author: Christian Dywan <christian at twotoasts.de>
Date: Thu May 6 23:49:13 2010 +0200
Actually unload extensions when deactivating
midori/main.c | 101 ++++++++++++++++++++++++++++++++++----------
panels/midori-extensions.c | 28 ++++++++++++
2 files changed, 106 insertions(+), 23 deletions(-)
diff --git a/midori/main.c b/midori/main.c
index 628665c..7333149 100644
--- a/midori/main.c
+++ b/midori/main.c
@@ -448,6 +448,48 @@ settings_notify_cb (MidoriWebSettings* settings,
g_free (config_file);
}
+static MidoriExtension*
+extension_from_filename (MidoriExtension* extension,
+ gchar* fullname)
+{
+ GModule* module;
+ gchar* filename;
+ typedef MidoriExtension* (*extension_init_func)(void);
+ extension_init_func extension_init;
+
+ g_return_val_if_fail (fullname != NULL, NULL);
+
+ module = g_module_open (fullname, G_MODULE_BIND_LOCAL);
+ filename = g_path_get_basename (fullname);
+ g_free (fullname);
+
+ if (module && g_module_symbol (module, "extension_init",
+ (gpointer) &extension_init))
+ {
+ extension = extension_init ();
+ g_object_set_data (G_OBJECT (extension), "module", module);
+ /* Signal that we want the extension to load and save */
+ g_object_set_data_full (G_OBJECT (extension), "filename",
+ g_strdup (filename), g_free);
+ if (midori_extension_is_prepared (extension))
+ midori_extension_get_config_dir (extension);
+ }
+ else
+ {
+ if (!extension)
+ extension = g_object_new (MIDORI_TYPE_EXTENSION, NULL);
+ g_object_set (extension,
+ "name", filename,
+ "description", g_module_error (),
+ "version", NULL,
+ "author", NULL,
+ NULL);
+ g_warning ("%s", g_module_error ());
+ }
+ g_assert (extension != NULL);
+ return extension;
+}
+
static void
extension_activate_cb (MidoriExtension* extension,
MidoriApp* app)
@@ -455,6 +497,41 @@ extension_activate_cb (MidoriExtension* extension,
MidoriWebSettings* settings = katze_object_get_object (app, "settings");
settings_notify_cb (settings, NULL, app);
g_object_unref (settings);
+
+ if (midori_extension_is_deactivating (extension))
+ {
+ GModule* module = g_object_get_data (G_OBJECT (extension), "module");
+ if (module)
+ {
+ gchar* filename = g_strdup (g_module_name (module));
+ MidoriExtension* new_extension;
+ if (g_module_close (module))
+ {
+ new_extension = extension_from_filename (extension, filename);
+ if (new_extension != extension)
+ {
+ KatzeArray* extensions = katze_object_get_object (app, "extensions");
+ katze_array_remove_item (extensions, extension);
+ katze_array_add_item (extensions, new_extension);
+ g_object_unref (new_extension);
+ g_signal_connect_after (new_extension, "activate",
+ G_CALLBACK (extension_activate_cb), app);
+ g_signal_connect_after (new_extension, "deactivate",
+ G_CALLBACK (extension_activate_cb), app);
+ }
+ }
+ else
+ {
+ g_object_set (extension,
+ "name", filename,
+ "description", g_module_error (),
+ "version", NULL,
+ "author", NULL,
+ NULL);
+ g_free (filename);
+ }
+ }
+ }
}
static void
@@ -1136,9 +1213,6 @@ midori_load_extensions (gpointer data)
while ((filename = g_dir_read_name (extension_dir)))
{
gchar* fullname;
- GModule* module;
- typedef MidoriExtension* (*extension_init_func)(void);
- extension_init_func extension_init;
MidoriExtension* extension;
/* Ignore files which don't have the correct suffix */
@@ -1146,27 +1220,8 @@ midori_load_extensions (gpointer data)
continue;
fullname = g_build_filename (extension_path, filename, NULL);
- module = g_module_open (fullname, G_MODULE_BIND_LOCAL);
- g_free (fullname);
+ extension = extension_from_filename (NULL, fullname);
- if (module && g_module_symbol (module, "extension_init",
- (gpointer) &extension_init))
- {
- extension = extension_init ();
- /* Signal that we want the extension to load and save */
- g_object_set_data_full (G_OBJECT (extension), "filename",
- g_strdup (filename), g_free);
- if (midori_extension_is_prepared (extension))
- midori_extension_get_config_dir (extension);
- }
- else
- {
- extension = g_object_new (MIDORI_TYPE_EXTENSION,
- "name", filename,
- "description", g_module_error (),
- NULL);
- g_warning ("%s", g_module_error ());
- }
katze_array_add_item (extensions, extension);
if (active_extensions)
{
diff --git a/panels/midori-extensions.c b/panels/midori-extensions.c
index e03c734..4333583 100644
--- a/panels/midori-extensions.c
+++ b/panels/midori-extensions.c
@@ -155,6 +155,32 @@ midori_extensions_add_item_cb (KatzeArray* array,
}
static void
+midori_extensions_remove_item_cb (KatzeArray* array,
+ MidoriExtension* extension,
+ MidoriExtensions* extensions)
+{
+ GtkTreeIter iter;
+ GtkTreeModel* model;
+ gint n = 0;
+
+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (extensions->treeview));
+ while ((gtk_tree_model_iter_nth_child (model, &iter, NULL, n++)))
+ {
+ MidoriExtension* ext;
+ gtk_tree_model_get (model, &iter, 0, &ext, -1);
+ if (ext == extension)
+ {
+ gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
+ g_object_unref (ext);
+ break;
+ }
+ g_object_unref (ext);
+ }
+ /* FIXME: Disconnect handlers */
+}
+
+
+static void
midori_extensions_set_property (GObject* object,
guint prop_id,
const GValue* value,
@@ -175,6 +201,8 @@ midori_extensions_set_property (GObject* object,
array = katze_object_get_object (extensions->app, "extensions");
g_signal_connect (array, "add-item",
G_CALLBACK (midori_extensions_add_item_cb), extensions);
+ g_signal_connect (array, "remove-item",
+ G_CALLBACK (midori_extensions_remove_item_cb), extensions);
i = 0;
while ((extension = katze_array_get_nth_item (array, i++)))
More information about the Xfce4-commits
mailing list