]> spindle.queued.net Git - midori/commitdiff
Ensure REMOVE_TAB emission, don't alter session when destroying
authorChristian Dywan <christian@twotoasts.de>
Fri, 25 Jul 2008 10:45:50 +0000 (12:45 +0200)
committerChristian Dywan <christian@twotoasts.de>
Fri, 25 Jul 2008 10:45:50 +0000 (12:45 +0200)
midori/main.c
midori/midori-browser.c

index e0138ac5f6fe61a87cab7bf78fe028da4a3d54fa..32f14517593982e5faf1745785a1ca1944543f45 100644 (file)
@@ -358,6 +358,15 @@ midori_browser_session_cb (MidoriBrowser* browser,
     g_free (config_path);
 }
 
+void
+midori_browser_weak_notify_cb (MidoriBrowser* browser,
+                               KatzeXbelItem* session)
+{
+    g_object_disconnect (browser, "any-signal",
+                         G_CALLBACK (midori_browser_session_cb), session, NULL);
+}
+
+
 int
 main (int argc,
       char** argv)
@@ -598,6 +607,8 @@ main (int argc,
         G_CALLBACK (midori_browser_session_cb), session);
     g_signal_connect_after (browser, "remove-tab",
         G_CALLBACK (midori_browser_session_cb), session);
+    g_object_weak_ref (G_OBJECT (session),
+        (GWeakNotify)(midori_browser_weak_notify_cb), browser);
 
     /* Load extensions */
     JSGlobalContextRef js_context = gjs_global_context_new ();
index 059d27c747022b2e712d4e92687d4b1b1a9092e8..1d23ec7be0e026190e21ed6e6d1622b9a409ec1a 100644 (file)
@@ -115,6 +115,9 @@ enum
 
 static guint signals[LAST_SIGNAL];
 
+static void
+midori_browser_dispose (GObject* object);
+
 static void
 midori_browser_finalize (GObject* object);
 
@@ -787,6 +790,13 @@ midori_browser_tab_destroy_cb (GtkWidget*     widget,
     }
 
     _midori_browser_update_actions (browser);
+
+    /* This callback must only be called once, but we need to ensure
+       that "remove-tab" is emitted in any case */
+    g_signal_handlers_disconnect_by_func (widget,
+        midori_browser_tab_destroy_cb, browser);
+
+    g_signal_emit (browser, signals[REMOVE_TAB], 0, widget);
     return FALSE;
 }
 
@@ -1190,6 +1200,7 @@ midori_browser_class_init (MidoriBrowserClass* class)
     class->quit = _midori_browser_quit;
 
     GObjectClass* gobject_class = G_OBJECT_CLASS (class);
+    gobject_class->dispose = midori_browser_dispose;
     gobject_class->finalize = midori_browser_finalize;
     gobject_class->set_property = midori_browser_set_property;
     gobject_class->get_property = midori_browser_get_property;
@@ -2898,7 +2909,7 @@ midori_browser_size_allocate_cb (MidoriBrowser* browser,
 static void
 midori_browser_destroy_cb (MidoriBrowser* browser)
 {
-    /* Destroy tabs first, so widgets can still see window elements on destroy */
+    /* Destroy tabs first, so child widgets don't need special care */
     gtk_container_foreach (GTK_CONTAINER (browser->notebook),
                            (GtkCallback) gtk_widget_destroy, NULL);
 }
@@ -3560,6 +3571,18 @@ midori_browser_init (MidoriBrowser* browser)
     browser->close_buttons = NULL;
 }
 
+static void
+midori_browser_dispose (GObject* object)
+{
+    MidoriBrowser* browser = MIDORI_BROWSER (object);
+
+    /* We are done, the session mustn't change anymore */
+    if (browser->proxy_xbel_folder)
+        katze_object_assign (browser->proxy_xbel_folder, NULL);
+
+    G_OBJECT_CLASS (midori_browser_parent_class)->dispose (object);
+}
+
 static void
 midori_browser_finalize (GObject* object)
 {
@@ -3569,9 +3592,6 @@ midori_browser_finalize (GObject* object)
     g_list_free (browser->tab_titles);
     g_list_free (browser->close_buttons);
 
-    if (browser->proxy_xbel_folder)
-        katze_xbel_item_unref (browser->proxy_xbel_folder);
-
     if (browser->settings)
         g_object_unref (browser->settings);
     if (browser->trash)
@@ -4133,6 +4153,9 @@ midori_browser_get_current_web_view (MidoriBrowser* browser)
  *
  * Note that this implicitly creates proxy xbel items of all web views.
  *
+ * Note: Calling this function doesn't add a reference and the browser
+ *       may release its reference at some point.
+ *
  * Return value: the proxy #KatzeXbelItem
  **/
 KatzeXbelItem*