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)
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 ();
static guint signals[LAST_SIGNAL];
+static void
+midori_browser_dispose (GObject* object);
+
static void
midori_browser_finalize (GObject* object);
}
_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;
}
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;
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);
}
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)
{
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)
*
* 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*