[libhandy/tabs: 18/62] Fixed memory errors, finally
- From: Alexander Mikhaylenko <alexm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libhandy/tabs: 18/62] Fixed memory errors, finally
- Date: Sat, 12 Sep 2020 19:27:43 +0000 (UTC)
commit a7460c967dcd8a8e9263ada9d37b8a0c6cc1b44c
Author: Alexander Mikhaylenko <alexm gnome org>
Date: Sun Sep 6 01:29:38 2020 +0500
Fixed memory errors, finally
This took a while.
src/hdy-tab-view.c | 70 +++++++++++++++++++++++++++++-------------------------
1 file changed, 37 insertions(+), 33 deletions(-)
---
diff --git a/src/hdy-tab-view.c b/src/hdy-tab-view.c
index f7932ae1..8e8d7165 100644
--- a/src/hdy-tab-view.c
+++ b/src/hdy-tab-view.c
@@ -9,6 +9,9 @@
#include "hdy-tab-view-private.h"
+// FIXME replace with groups
+static GSList *tab_view_list;
+
static const GtkTargetEntry dst_targets [] = {
{ "HDY_TAB", GTK_TARGET_SAME_APP, 0 },
};
@@ -141,21 +144,12 @@ set_page_pinned (HdyTabPage *self,
g_object_notify_by_pspec (G_OBJECT (self), page_props[PAGE_PROP_PINNED]);
}
-static void
-hdy_tab_page_dispose (GObject *object)
-{
- HdyTabPage *self = HDY_TAB_PAGE (object);
-
- g_clear_object (&self->content);
-
- G_OBJECT_CLASS (hdy_tab_page_parent_class)->dispose (object);
-}
-
static void
hdy_tab_page_finalize (GObject *object)
{
HdyTabPage *self = (HdyTabPage *)object;
+ g_clear_object (&self->content);
g_clear_pointer (&self->title, g_free);
g_clear_pointer (&self->tooltip, g_free);
g_clear_object (&self->icon);
@@ -174,7 +168,7 @@ hdy_tab_page_get_property (GObject *object,
switch (prop_id) {
case PAGE_PROP_CONTENT:
- g_value_set_object (value, hdy_tab_page_get_content (self));
+ g_set_object (&self->content, hdy_tab_page_get_content (self));
break;
case PAGE_PROP_SELECTED:
@@ -269,7 +263,6 @@ hdy_tab_page_class_init (HdyTabPageClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
- object_class->dispose = hdy_tab_page_dispose;
object_class->finalize = hdy_tab_page_finalize;
object_class->get_property = hdy_tab_page_get_property;
object_class->set_property = hdy_tab_page_set_property;
@@ -514,23 +507,32 @@ detach_page (HdyTabView *self,
HdyTabPage *page)
{
gint pos = hdy_tab_view_get_page_position (self, page);
+ GtkWidget *content;
if (page == self->selected_page)
if (!hdy_tab_view_select_next_page (self))
hdy_tab_view_select_previous_page (self);
+ g_object_ref (page);
+
g_list_store_remove (self->pages, pos);
set_n_pages (self, self->n_pages - 1);
if (hdy_tab_page_get_pinned (page))
set_n_pinned_pages (self, self->n_pinned_pages - 1);
- gtk_container_remove (GTK_CONTAINER (self->stack),
- hdy_tab_page_get_content (page));
+ content = hdy_tab_page_get_content (page);
+
+ g_object_ref (content);
+
+ gtk_container_remove (GTK_CONTAINER (self->stack), content);
g_signal_emit (self, signals[SIGNAL_PAGE_REMOVED], 0, page, pos);
check_close_window (self);
+
+ g_object_unref (content);
+ g_object_unref (page);
}
static HdyTabPage *
@@ -548,6 +550,8 @@ insert_page (HdyTabView *self,
if (!self->selected_page)
hdy_tab_view_set_selected_page (self, page);
+ g_object_unref (page);
+
return page;
}
@@ -565,15 +569,6 @@ set_group_from_view (HdyTabView *self,
hdy_tab_view_set_group (self, slist);
}
-static void
-close_page (HdyTabView *self,
- HdyTabPage *page)
-{
- detach_page (self, page);
-
- g_object_unref (page);
-}
-
static void
add_select_bindings (GtkBindingSet *binding_set,
guint keysym,
@@ -702,10 +697,7 @@ hdy_tab_view_dispose (GObject *object)
while (self->n_pages) {
HdyTabPage *page = hdy_tab_view_get_nth_page (self, 0);
- close_page (self, page);
-
- // FIXME why is this needed
- g_object_unref (page);
+ detach_page (self, page);
}
g_clear_object (&self->pages);
@@ -722,6 +714,8 @@ hdy_tab_view_finalize (GObject *object)
g_clear_object (&self->default_icon);
g_clear_object (&self->menu_model);
+ tab_view_list = g_slist_remove (tab_view_list, self);
+
G_OBJECT_CLASS (hdy_tab_view_parent_class)->finalize (object);
}
@@ -1147,6 +1141,8 @@ hdy_tab_view_init (HdyTabView *self)
g_signal_connect_object (self, "select-page", G_CALLBACK (select_page_cb), self, 0);
g_signal_connect_object (self, "reorder-page", G_CALLBACK (reorder_page_cb), self, 0);
+
+ tab_view_list = g_slist_prepend (tab_view_list, self);
}
/**
@@ -1582,7 +1578,7 @@ hdy_tab_view_start_drag (HdyTabView *self)
g_return_if_fail (HDY_IS_TAB_VIEW (self));
- for (l = self->group; l; l = l->next) {
+ for (l = tab_view_list; l; l = l->next) {
HdyTabView *view = l->data;
set_is_dragging (view, TRUE);
@@ -1596,7 +1592,7 @@ hdy_tab_view_end_drag (HdyTabView *self)
g_return_if_fail (HDY_IS_TAB_VIEW (self));
- for (l = self->group; l; l = l->next) {
+ for (l = tab_view_list; l; l = l->next) {
HdyTabView *view = l->data;
set_is_dragging (view, FALSE);
@@ -1896,7 +1892,7 @@ hdy_tab_view_get_group (HdyTabView *self)
{
g_return_val_if_fail (HDY_IS_TAB_VIEW (self), NULL);
- return self->group;
+ return tab_view_list; //self->group;
}
/**
@@ -2046,7 +2042,7 @@ hdy_tab_view_get_page (HdyTabView *self,
g_return_val_if_fail (GTK_IS_WIDGET (content), NULL);
for (i = 0; i < self->n_pages; i++) {
- HdyTabPage *page = g_list_model_get_item (G_LIST_MODEL (self->pages), (guint) i);
+ HdyTabPage *page = hdy_tab_view_get_nth_page (self, i);
if (hdy_tab_page_get_content (page) == content)
return page;
@@ -2070,11 +2066,15 @@ HdyTabPage *
hdy_tab_view_get_nth_page (HdyTabView *self,
gint position)
{
+ g_autoptr (HdyTabPage) page = NULL;
+
g_return_val_if_fail (HDY_IS_TAB_VIEW (self), NULL);
g_return_val_if_fail (position >= 0, NULL);
g_return_val_if_fail (position < self->n_pages, NULL);
- return g_list_model_get_item (G_LIST_MODEL (self->pages), (guint) position);
+ page = g_list_model_get_item (G_LIST_MODEL (self->pages), (guint) position);
+
+ return page;
}
/**
@@ -2264,7 +2264,7 @@ hdy_tab_view_close_page (HdyTabView *self,
g_signal_emit (self, signals[SIGNAL_CLOSE_PAGE], 0, page, &prevent_closing);
if (!prevent_closing)
- close_page (self, page);
+ detach_page (self, page);
return !prevent_closing;
}
@@ -2526,6 +2526,8 @@ hdy_tab_view_detach_page (HdyTabView *self,
g_return_if_fail (HDY_IS_TAB_VIEW (self));
g_return_if_fail (HDY_IS_TAB_PAGE (page));
+ g_object_ref (page);
+
detach_page (self, page);
}
@@ -2542,6 +2544,8 @@ hdy_tab_view_attach_page (HdyTabView *self,
attach_page (self, page, position);
hdy_tab_view_set_selected_page (self, page);
+
+ g_object_unref (page);
}
/**
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]