Updating branch refs/heads/unload to 3f0fe9464763e95d44c26b858aa0f058e344121c (commit) from 2611a24803fd5af770ae779e3adbecc6f4200621 (commit)
commit 3f0fe9464763e95d44c26b858aa0f058e344121c Author: Christian Dywan <christ...@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++))) _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits