[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