messenger-gtk

Gtk+3 graphical user interfaces for GNUnet Messenger
Log | Files | Refs | Submodules | README | LICENSE

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:
Msrc/event.c | 2+-
Msrc/ui/chat.c | 26++++++++++++++------------
Msrc/ui/chat.h | 1+
Msrc/ui/chat_entry.c | 17+++++++++--------
Msrc/ui/chat_entry.h | 13+++++++------
Msrc/ui/message.c | 25++++++++++++++++---------
Msrc/ui/message.h | 16++++++++++------
Msrc/ui/messenger.c | 50++++++++++++++++++++++++++------------------------
Msrc/ui/messenger.h | 1+
Msrc/ui/new_contact.c | 14++++++++------
Msrc/ui/new_contact.h | 11++++++-----
Msrc/ui/new_platform.c | 34+++++++++++++++++++++++++++-------
Msrc/ui/new_platform.h | 16++++++++++------
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_ */