commit a0664a80213bcf5731c7ddf39d38f47171622960
parent 760976b15f400194d9264a5295e27e70b88afb73
Author: TheJackiMonster <thejackimonster@gmail.com>
Date: Mon, 15 Nov 2021 11:38:15 +0100
Fixed memory leaks regarding gtk builders
Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
Diffstat:
13 files changed, 136 insertions(+), 90 deletions(-)
diff --git a/src/event.c b/src/event.c
@@ -201,7 +201,7 @@ event_receive_message(MESSENGER_Application *app,
message->message_box
);
- g_free(message); // TODO: this is just a test!
+ ui_message_delete(message);
gtk_label_set_text(handle->text_label, text? text : "");
gtk_label_set_text(handle->timestamp_label, time? time : "");
diff --git a/src/ui/chat.c b/src/ui/chat.c
@@ -138,16 +138,16 @@ ui_chat_new(MESSENGER_Application *app)
UI_CHAT_Handle *handle = g_malloc(sizeof(UI_CHAT_Handle));
UI_MESSENGER_Handle *messenger = &(app->ui.messenger);
- GtkBuilder* builder = gtk_builder_new_from_file(
+ handle->builder = gtk_builder_new_from_file(
"resources/ui/chat.ui"
);
handle->chat_box = GTK_WIDGET(
- gtk_builder_get_object(builder, "chat_box")
+ gtk_builder_get_object(handle->builder, "chat_box")
);
handle->back_button = GTK_BUTTON(
- gtk_builder_get_object(builder, "back_button")
+ gtk_builder_get_object(handle->builder, "back_button")
);
g_object_bind_property(
@@ -166,15 +166,15 @@ ui_chat_new(MESSENGER_Application *app)
);
handle->chat_title = GTK_LABEL(
- gtk_builder_get_object(builder, "chat_title")
+ gtk_builder_get_object(handle->builder, "chat_title")
);
handle->chat_subtitle = GTK_LABEL(
- gtk_builder_get_object(builder, "chat_subtitle")
+ gtk_builder_get_object(handle->builder, "chat_subtitle")
);
handle->chat_details_button = GTK_BUTTON(
- gtk_builder_get_object(builder, "chat_details_button")
+ gtk_builder_get_object(handle->builder, "chat_details_button")
);
g_signal_connect(
@@ -185,27 +185,27 @@ ui_chat_new(MESSENGER_Application *app)
);
handle->messages_listbox = GTK_LIST_BOX(
- gtk_builder_get_object(builder, "messages_listbox")
+ gtk_builder_get_object(handle->builder, "messages_listbox")
);
handle->attach_file_button = GTK_BUTTON(
- gtk_builder_get_object(builder, "attach_file_button")
+ gtk_builder_get_object(handle->builder, "attach_file_button")
);
handle->send_text_view = GTK_TEXT_VIEW(
- gtk_builder_get_object(builder, "send_text_view")
+ gtk_builder_get_object(handle->builder, "send_text_view")
);
handle->emoji_button = GTK_BUTTON(
- gtk_builder_get_object(builder, "emoji_button")
+ gtk_builder_get_object(handle->builder, "emoji_button")
);
handle->send_record_button = GTK_BUTTON(
- gtk_builder_get_object(builder, "send_record_button")
+ gtk_builder_get_object(handle->builder, "send_record_button")
);
handle->send_record_symbol = GTK_IMAGE(
- gtk_builder_get_object(builder, "send_record_symbol")
+ gtk_builder_get_object(handle->builder, "send_record_symbol")
);
GtkTextBuffer *send_text_buffer = gtk_text_view_get_buffer(
@@ -245,5 +245,7 @@ ui_chat_new(MESSENGER_Application *app)
void
ui_chat_delete(UI_CHAT_Handle *handle)
{
+ g_object_unref(handle->builder);
+
g_free(handle);
}
diff --git a/src/ui/chat.h b/src/ui/chat.h
@@ -33,6 +33,7 @@ typedef struct MESSENGER_Application MESSENGER_Application;
typedef struct UI_CHAT_Handle
{
+ GtkBuilder *builder;
GtkWidget *chat_box;
GtkButton *back_button;
diff --git a/src/ui/chat_entry.c b/src/ui/chat_entry.c
@@ -32,31 +32,30 @@ ui_chat_entry_new(MESSENGER_Application *app)
UI_CHAT_ENTRY_Handle* handle = g_malloc(sizeof(UI_CHAT_ENTRY_Handle));
handle->chat = ui_chat_new(app);
-
- GtkBuilder* builder = gtk_builder_new_from_file("resources/ui/chat_entry.ui");
+ handle->builder = gtk_builder_new_from_file("resources/ui/chat_entry.ui");
handle->entry_box = GTK_WIDGET(
- gtk_builder_get_object(builder, "entry_box")
+ gtk_builder_get_object(handle->builder, "entry_box")
);
handle->entry_avatar = HDY_AVATAR(
- gtk_builder_get_object(builder, "entry_avatar")
+ gtk_builder_get_object(handle->builder, "entry_avatar")
);
handle->title_label = GTK_LABEL(
- gtk_builder_get_object(builder, "title_label")
+ gtk_builder_get_object(handle->builder, "title_label")
);
handle->timestamp_label = GTK_LABEL(
- gtk_builder_get_object(builder, "timestamp_label")
+ gtk_builder_get_object(handle->builder, "timestamp_label")
);
handle->text_label = GTK_LABEL(
- gtk_builder_get_object(builder, "text_label")
+ gtk_builder_get_object(handle->builder, "text_label")
);
handle->read_receipt_image = GTK_IMAGE(
- gtk_builder_get_object(builder, "read_receipt_image")
+ gtk_builder_get_object(handle->builder, "read_receipt_image")
);
return handle;
@@ -67,5 +66,7 @@ ui_chat_entry_delete(UI_CHAT_ENTRY_Handle *handle)
{
ui_chat_delete(handle->chat);
+ g_object_unref(handle->builder);
+
g_free(handle);
}
diff --git a/src/ui/chat_entry.h b/src/ui/chat_entry.h
@@ -30,16 +30,17 @@
typedef struct UI_CHAT_ENTRY_Handle
{
UI_CHAT_Handle *chat;
+ GtkBuilder *builder;
- GtkWidget* entry_box;
+ GtkWidget *entry_box;
- HdyAvatar* entry_avatar;
+ HdyAvatar *entry_avatar;
- GtkLabel* title_label;
- GtkLabel* timestamp_label;
+ GtkLabel *title_label;
+ GtkLabel *timestamp_label;
- GtkLabel* text_label;
- GtkImage* read_receipt_image;
+ GtkLabel *text_label;
+ GtkImage *read_receipt_image;
} UI_CHAT_ENTRY_Handle;
UI_CHAT_ENTRY_Handle*
diff --git a/src/ui/message.c b/src/ui/message.c
@@ -31,23 +31,22 @@ ui_message_new(MESSENGER_Application *app,
bool sent)
{
UI_MESSAGE_Handle* handle = g_malloc(sizeof(UI_MESSAGE_Handle));
- GtkBuilder* builder;
if (sent)
- builder = gtk_builder_new_from_file("resources/ui/message-sent.ui");
+ handle->builder = gtk_builder_new_from_file("resources/ui/message-sent.ui");
else
- builder = gtk_builder_new_from_file("resources/ui/message.ui");
+ handle->builder = gtk_builder_new_from_file("resources/ui/message.ui");
handle->message_box = GTK_WIDGET(
- gtk_builder_get_object(builder, "message_box")
+ gtk_builder_get_object(handle->builder, "message_box")
);
handle->sender_avatar = HDY_AVATAR(
- gtk_builder_get_object(builder, "sender_avatar")
+ gtk_builder_get_object(handle->builder, "sender_avatar")
);
handle->sender_label = GTK_LABEL(
- gtk_builder_get_object(builder, "sender_label")
+ gtk_builder_get_object(handle->builder, "sender_label")
);
if (sent)
@@ -59,16 +58,24 @@ ui_message_new(MESSENGER_Application *app,
}
handle->text_label = GTK_LABEL(
- gtk_builder_get_object(builder, "text_label")
+ gtk_builder_get_object(handle->builder, "text_label")
);
handle->timestamp_label = GTK_LABEL(
- gtk_builder_get_object(builder, "timestamp_label")
+ gtk_builder_get_object(handle->builder, "timestamp_label")
);
handle->read_receipt_image = GTK_IMAGE(
- gtk_builder_get_object(builder, "read_receipt_image")
+ gtk_builder_get_object(handle->builder, "read_receipt_image")
);
return handle;
}
+
+void
+ui_message_delete(UI_MESSAGE_Handle *handle)
+{
+ g_object_unref(handle->builder);
+
+ g_free(handle);
+}
diff --git a/src/ui/message.h b/src/ui/message.h
@@ -34,19 +34,23 @@ typedef struct MESSENGER_Application MESSENGER_Application;
typedef struct UI_MESSAGE_Handle
{
- GtkWidget* message_box;
+ GtkBuilder *builder;
+ GtkWidget *message_box;
- HdyAvatar* sender_avatar;
- GtkLabel* sender_label;
+ HdyAvatar *sender_avatar;
+ GtkLabel *sender_label;
- GtkLabel* text_label;
+ GtkLabel *text_label;
- GtkLabel* timestamp_label;
- GtkImage* read_receipt_image;
+ GtkLabel *timestamp_label;
+ GtkImage *read_receipt_image;
} UI_MESSAGE_Handle;
UI_MESSAGE_Handle*
ui_message_new(MESSENGER_Application *app,
bool sent);
+void
+ui_message_delete(UI_MESSAGE_Handle *handle);
+
#endif /* UI_MESSAGE_H_ */
diff --git a/src/ui/messenger.c b/src/ui/messenger.c
@@ -131,10 +131,10 @@ ui_messenger_init(MESSENGER_Application *app,
{
handle->chat_entries = g_list_alloc();
- GtkBuilder* builder = gtk_builder_new_from_file("resources/ui/messenger.ui");
+ handle->builder = gtk_builder_new_from_file("resources/ui/messenger.ui");
handle->main_window = GTK_APPLICATION_WINDOW(
- gtk_builder_get_object(builder, "main_window")
+ gtk_builder_get_object(handle->builder, "main_window")
);
gtk_application_add_window(
@@ -148,19 +148,19 @@ ui_messenger_init(MESSENGER_Application *app,
);
handle->leaflet_chat = HDY_LEAFLET(
- gtk_builder_get_object(builder, "leaflet_chat")
+ gtk_builder_get_object(handle->builder, "leaflet_chat")
);
handle->flap_user_details = HDY_FLAP(
- gtk_builder_get_object(builder, "flap_user_details")
+ gtk_builder_get_object(handle->builder, "flap_user_details")
);
handle->flap_chat_details = HDY_FLAP(
- gtk_builder_get_object(builder, "flap_chat_details")
+ gtk_builder_get_object(handle->builder, "flap_chat_details")
);
handle->title_bar = HDY_HEADER_BAR(
- gtk_builder_get_object(builder, "title_bar")
+ gtk_builder_get_object(handle->builder, "title_bar")
);
g_object_bind_property(
@@ -182,15 +182,15 @@ ui_messenger_init(MESSENGER_Application *app,
);
handle->profile_avatar = HDY_AVATAR(
- gtk_builder_get_object(builder, "profile_avatar")
+ gtk_builder_get_object(handle->builder, "profile_avatar")
);
handle->profile_label = GTK_LABEL(
- gtk_builder_get_object(builder, "profile_label")
+ gtk_builder_get_object(handle->builder, "profile_label")
);
handle->hide_user_details_button = GTK_BUTTON(
- gtk_builder_get_object(builder, "hide_user_details_button")
+ gtk_builder_get_object(handle->builder, "hide_user_details_button")
);
g_signal_connect(
@@ -201,19 +201,19 @@ ui_messenger_init(MESSENGER_Application *app,
);
handle->favourites_button = GTK_BUTTON(
- gtk_builder_get_object(builder, "favourites_button")
+ gtk_builder_get_object(handle->builder, "favourites_button")
);
handle->account_details_button = GTK_BUTTON(
- gtk_builder_get_object(builder, "account_details_button")
+ gtk_builder_get_object(handle->builder, "account_details_button")
);
handle->account_details_symbol = GTK_IMAGE(
- gtk_builder_get_object(builder, "account_details_symbol")
+ gtk_builder_get_object(handle->builder, "account_details_symbol")
);
handle->account_details_revealer = GTK_REVEALER(
- gtk_builder_get_object(builder, "account_details_revealer")
+ gtk_builder_get_object(handle->builder, "account_details_revealer")
);
g_signal_connect(
@@ -224,19 +224,19 @@ ui_messenger_init(MESSENGER_Application *app,
);
handle->accounts_listbox = GTK_LIST_BOX(
- gtk_builder_get_object(builder, "accounts_listbox")
+ gtk_builder_get_object(handle->builder, "accounts_listbox")
);
handle->new_contact_button = GTK_BUTTON(
- gtk_builder_get_object(builder, "new_contact_button")
+ gtk_builder_get_object(handle->builder, "new_contact_button")
);
handle->new_group_button = GTK_BUTTON(
- gtk_builder_get_object(builder, "new_group_button")
+ gtk_builder_get_object(handle->builder, "new_group_button")
);
handle->new_platform_button = GTK_BUTTON(
- gtk_builder_get_object(builder, "new_platform_button")
+ gtk_builder_get_object(handle->builder, "new_platform_button")
);
g_signal_connect(
@@ -254,15 +254,15 @@ ui_messenger_init(MESSENGER_Application *app,
);
handle->contacts_button = GTK_BUTTON(
- gtk_builder_get_object(builder, "contacts_button")
+ gtk_builder_get_object(handle->builder, "contacts_button")
);
handle->settings_button = GTK_BUTTON(
- gtk_builder_get_object(builder, "settings_button")
+ gtk_builder_get_object(handle->builder, "settings_button")
);
handle->user_details_button = GTK_BUTTON(
- gtk_builder_get_object(builder, "user_details_button")
+ gtk_builder_get_object(handle->builder, "user_details_button")
);
g_signal_connect(
@@ -273,11 +273,11 @@ ui_messenger_init(MESSENGER_Application *app,
);
handle->chats_search = GTK_SEARCH_ENTRY(
- gtk_builder_get_object(builder, "chats_search")
+ gtk_builder_get_object(handle->builder, "chats_search")
);
handle->chats_listbox = GTK_LIST_BOX(
- gtk_builder_get_object(builder, "chats_listbox")
+ gtk_builder_get_object(handle->builder, "chats_listbox")
);
g_signal_connect(
@@ -288,11 +288,11 @@ ui_messenger_init(MESSENGER_Application *app,
);
handle->chats_stack = GTK_STACK(
- gtk_builder_get_object(builder, "chats_stack")
+ gtk_builder_get_object(handle->builder, "chats_stack")
);
handle->hide_chat_details_button = GTK_BUTTON(
- gtk_builder_get_object(builder, "hide_chat_details_button")
+ gtk_builder_get_object(handle->builder, "hide_chat_details_button")
);
g_signal_connect(
@@ -315,6 +315,8 @@ ui_messenger_init(MESSENGER_Application *app,
void
ui_messenger_cleanup(UI_MESSENGER_Handle *handle)
{
+ g_object_unref(handle->builder);
+
GList *list = handle->chat_entries;
while (list) {
diff --git a/src/ui/messenger.h b/src/ui/messenger.h
@@ -35,6 +35,7 @@ typedef struct UI_MESSENGER_Handle
{
GList *chat_entries;
+ GtkBuilder *builder;
GtkApplicationWindow *main_window;
HdyLeaflet *leaflet_chat;
diff --git a/src/ui/new_contact.c b/src/ui/new_contact.c
@@ -188,10 +188,10 @@ ui_new_contact_dialog_init(MESSENGER_Application *app,
pthread_create(&(handle->video_tid), NULL, _ui_new_contact_video_thread, handle);
- GtkBuilder* builder = gtk_builder_new_from_file("resources/ui/new_contact.ui");
+ handle->builder = gtk_builder_new_from_file("resources/ui/new_contact.ui");
handle->dialog = GTK_DIALOG(
- gtk_builder_get_object(builder, "new_contact_dialog")
+ gtk_builder_get_object(handle->builder, "new_contact_dialog")
);
gtk_window_set_title(
@@ -205,7 +205,7 @@ ui_new_contact_dialog_init(MESSENGER_Application *app,
);
handle->id_drawing_area = GTK_DRAWING_AREA(
- gtk_builder_get_object(builder, "id_drawing_area")
+ gtk_builder_get_object(handle->builder, "id_drawing_area")
);
g_signal_connect(
@@ -216,11 +216,11 @@ ui_new_contact_dialog_init(MESSENGER_Application *app,
);
handle->id_entry = GTK_ENTRY(
- gtk_builder_get_object(builder, "platform_entry")
+ gtk_builder_get_object(handle->builder, "platform_entry")
);
handle->cancel_button = GTK_BUTTON(
- gtk_builder_get_object(builder, "cancel_button")
+ gtk_builder_get_object(handle->builder, "cancel_button")
);
g_signal_connect(
@@ -231,7 +231,7 @@ ui_new_contact_dialog_init(MESSENGER_Application *app,
);
handle->confirm_button = GTK_BUTTON(
- gtk_builder_get_object(builder, "confirm_button")
+ gtk_builder_get_object(handle->builder, "confirm_button")
);
g_signal_connect(
@@ -261,6 +261,8 @@ ui_new_contact_dialog_cleanup(UI_NEW_CONTACT_Handle *handle)
handle->idle_processing = 0;
+ g_object_unref(handle->builder);
+
zbar_image_scanner_destroy(handle->scanner);
zbar_video_destroy(handle->video);
}
diff --git a/src/ui/new_contact.h b/src/ui/new_contact.h
@@ -37,13 +37,14 @@ typedef struct UI_NEW_CONTACT_Handle
zbar_image_t *image;
zbar_image_scanner_t *scanner;
- GtkDialog* dialog;
+ GtkBuilder *builder;
+ GtkDialog *dialog;
- GtkDrawingArea* id_drawing_area;
- GtkEntry* id_entry;
+ GtkDrawingArea *id_drawing_area;
+ GtkEntry *id_entry;
- GtkButton* cancel_button;
- GtkButton* confirm_button;
+ GtkButton *cancel_button;
+ GtkButton *confirm_button;
pthread_t video_tid;
guint idle_processing;
diff --git a/src/ui/new_platform.c b/src/ui/new_platform.c
@@ -89,14 +89,21 @@ handle_confirm_button_click(UNUSED GtkButton *button,
gtk_window_close(GTK_WINDOW(app->ui.new_platform.dialog));
}
+static void
+handle_dialog_destroy(UNUSED GtkWidget *window,
+ gpointer user_data)
+{
+ ui_new_platform_dialog_cleanup((UI_NEW_PLATFORM_Handle*) user_data);
+}
+
void
ui_new_platform_dialog_init(MESSENGER_Application *app,
UI_NEW_PLATFORM_Handle *handle)
{
- GtkBuilder* builder = gtk_builder_new_from_file("resources/ui/new_platform.ui");
+ handle->builder = gtk_builder_new_from_file("resources/ui/new_platform.ui");
handle->dialog = GTK_DIALOG(
- gtk_builder_get_object(builder, "new_platform_dialog")
+ gtk_builder_get_object(handle->builder, "new_platform_dialog")
);
gtk_window_set_title(
@@ -110,15 +117,15 @@ ui_new_platform_dialog_init(MESSENGER_Application *app,
);
handle->platform_avatar = HDY_AVATAR(
- gtk_builder_get_object(builder, "platform_avatar")
+ gtk_builder_get_object(handle->builder, "platform_avatar")
);
handle->platform_avatar_file = GTK_FILE_CHOOSER_BUTTON(
- gtk_builder_get_object(builder, "platform_avatar_file")
+ gtk_builder_get_object(handle->builder, "platform_avatar_file")
);
handle->platform_entry = GTK_ENTRY(
- gtk_builder_get_object(builder, "platform_entry")
+ gtk_builder_get_object(handle->builder, "platform_entry")
);
g_signal_connect(
@@ -136,7 +143,7 @@ ui_new_platform_dialog_init(MESSENGER_Application *app,
);
handle->cancel_button = GTK_BUTTON(
- gtk_builder_get_object(builder, "cancel_button")
+ gtk_builder_get_object(handle->builder, "cancel_button")
);
g_signal_connect(
@@ -147,7 +154,7 @@ ui_new_platform_dialog_init(MESSENGER_Application *app,
);
handle->confirm_button = GTK_BUTTON(
- gtk_builder_get_object(builder, "confirm_button")
+ gtk_builder_get_object(handle->builder, "confirm_button")
);
g_signal_connect(
@@ -156,4 +163,17 @@ ui_new_platform_dialog_init(MESSENGER_Application *app,
G_CALLBACK(handle_confirm_button_click),
app
);
+
+ g_signal_connect(
+ handle->dialog,
+ "destroy",
+ G_CALLBACK(handle_dialog_destroy),
+ handle
+ );
+}
+
+void
+ui_new_platform_dialog_cleanup(UI_NEW_PLATFORM_Handle *handle)
+{
+ g_object_unref(handle->builder);
}
diff --git a/src/ui/new_platform.h b/src/ui/new_platform.h
@@ -29,19 +29,23 @@
typedef struct UI_NEW_PLATFORM_Handle
{
- GtkDialog* dialog;
+ GtkBuilder *builder;
+ GtkDialog *dialog;
- HdyAvatar* platform_avatar;
- GtkFileChooserButton* platform_avatar_file;
+ HdyAvatar *platform_avatar;
+ GtkFileChooserButton *platform_avatar_file;
- GtkEntry* platform_entry;
+ GtkEntry *platform_entry;
- GtkButton* cancel_button;
- GtkButton* confirm_button;
+ GtkButton *cancel_button;
+ GtkButton *confirm_button;
} UI_NEW_PLATFORM_Handle;
void
ui_new_platform_dialog_init(MESSENGER_Application *app,
UI_NEW_PLATFORM_Handle *handle);
+void
+ui_new_platform_dialog_cleanup(UI_NEW_PLATFORM_Handle *handle);
+
#endif /* UI_NEW_PLATFORM_H_ */