From be7a573befa6096eece2501494b015c4741a512e Mon Sep 17 00:00:00 2001 From: Dany LE Date: Tue, 24 Jun 2025 17:52:35 +0200 Subject: [PATCH] refactor: allocated memeory should be in finalize method instead of dispose method --- src/base.c | 14 ++++++++++++++ src/files-monitor.c | 12 ++++++++++-- src/foreign.c | 12 ++++++++++-- src/input.c | 12 ++++++++++-- src/launcher.c | 2 ++ src/login-shell.c | 14 +++++++++++++- src/session-shell.c | 11 ++++++++++- src/shell.c | 23 ++++++++++++++++------- src/virtual-keyboard.c | 32 ++++++++++++++++++++++++-------- 9 files changed, 109 insertions(+), 23 deletions(-) diff --git a/src/base.c b/src/base.c index 9f65007..2f5fe0a 100644 --- a/src/base.c +++ b/src/base.c @@ -4,6 +4,12 @@ G_DEFINE_ABSTRACT_TYPE(DiyaObject, diya_object, G_TYPE_OBJECT) +static void diya_object_finalize(GObject* object) +{ + g_debug("diya_object_finalize: %s", diya_object_to_string(object)); + G_OBJECT_CLASS (diya_object_parent_class)->finalize(object); +} + static void diya_object_dispose(GObject* object) { g_debug("diya_object_dispose: %s", diya_object_to_string(object)); @@ -15,6 +21,7 @@ static void diya_object_class_init(DiyaObjectClass *class) GObjectClass *gobject_class = G_OBJECT_CLASS(class); class->to_string = NULL; gobject_class->dispose = diya_object_dispose; + gobject_class->finalize = diya_object_finalize; } static void diya_object_init(DiyaObject *self) @@ -43,6 +50,12 @@ typedef struct _DiyaShellObjectPrivate } DiyaShellObjectPrivate; G_DEFINE_TYPE_WITH_PRIVATE(DiyaShellObject, diya_shell_object, DIYA_TYPE_OBJECT); +static void diya_shell_object_finalize(GObject* object) +{ + g_debug("diya_shell_object_finalize: %s", diya_object_to_string(object)); + G_OBJECT_CLASS(diya_shell_object_parent_class)->finalize(object); +} + static void diya_shell_object_dispose(GObject* object) { g_debug("diya_shell_object_dispose: %s", diya_object_to_string(object)); @@ -91,6 +104,7 @@ static void diya_shell_object_class_init(DiyaShellObjectClass *class) { GObjectClass *gobject_class = G_OBJECT_CLASS(class); gobject_class->dispose = diya_shell_object_dispose; + gobject_class->finalize = diya_shell_object_finalize; gobject_class->set_property = diya_shell_object_set_property; gobject_class->get_property = diya_shell_object_get_property; g_so_prop[SO_SHELL] = g_param_spec_pointer(DIYA_PROP_SHELL, NULL, "Reference to global shell", G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY); // diff --git a/src/files-monitor.c b/src/files-monitor.c index b60e8bf..854dca8 100644 --- a/src/files-monitor.c +++ b/src/files-monitor.c @@ -13,11 +13,18 @@ struct _DiyaFilesMonitor G_DEFINE_FINAL_TYPE(DiyaFilesMonitor, diya_files_monitor, DIYA_TYPE_OBJECT) -static void diya_files_monitor_dispose(GObject *object) +static void diya_files_monitor_finalize(GObject *object) { DiyaFilesMonitor *self = DIYA_FILES_MONITOR(object); - g_debug("diya_files_monitor_dispose: %s", diya_object_to_string(object)); + g_debug("diya_files_monitor_finalize: %s", diya_object_to_string(object)); g_hash_table_destroy(self->watch_table); + G_OBJECT_CLASS(diya_files_monitor_parent_class)->finalize(object); +} + +static void diya_files_monitor_dispose(GObject *object) +{ + // DiyaFilesMonitor *self = DIYA_FILES_MONITOR(object); + g_debug("diya_files_monitor_dispose: %s", diya_object_to_string(object)); G_OBJECT_CLASS(diya_files_monitor_parent_class)->dispose(object); } @@ -37,6 +44,7 @@ static void diya_files_monitor_class_init(DiyaFilesMonitorClass *class) GObjectClass *gobject_class = G_OBJECT_CLASS(class); DiyaObjectClass *base_class = DIYA_OBJECT_CLASS(class); + gobject_class->finalize = diya_files_monitor_finalize; gobject_class->dispose = diya_files_monitor_dispose; base_class->to_string = diya_files_monitor_to_string; } diff --git a/src/foreign.c b/src/foreign.c index 8a34c39..11223cb 100644 --- a/src/foreign.c +++ b/src/foreign.c @@ -31,10 +31,10 @@ struct _DiyaForeignWindow }; G_DEFINE_FINAL_TYPE(DiyaForeignWindow, diya_foreign_window, DIYA_TYPE_SHELL_OBJECT) -static void diya_foreign_window_dispose(GObject* object) +static void diya_foreign_window_finalize(GObject* object) { DiyaForeignWindow * self = DIYA_FOREIGN_WINDOW(object); - g_debug("diya_foreign_window_dispose: %s", diya_object_to_string(self)); + g_debug("diya_foreign_window_finalize: %s", diya_object_to_string(self)); if(self->appid) { g_free(self->appid); @@ -45,6 +45,13 @@ static void diya_foreign_window_dispose(GObject* object) g_free(self->title); self->title = NULL; } + G_OBJECT_CLASS(diya_foreign_window_parent_class)->finalize(object); +} + +static void diya_foreign_window_dispose(GObject* object) +{ + DiyaForeignWindow * self = DIYA_FOREIGN_WINDOW(object); + g_debug("diya_foreign_window_dispose: %s", diya_object_to_string(self)); G_OBJECT_CLASS(diya_foreign_window_parent_class)->dispose(object); } @@ -133,6 +140,7 @@ static void diya_foreign_window_class_init(DiyaForeignWindowClass *class) DiyaObjectClass *base_class = DIYA_OBJECT_CLASS(class); gobject_class->dispose = diya_foreign_window_dispose; + gobject_class->finalize = diya_foreign_window_finalize; gobject_class->set_property = diya_foreign_window_set_property; gobject_class->get_property = diya_foreign_window_get_property; base_class->to_string = diya_foreign_window_to_string; diff --git a/src/input.c b/src/input.c index bac628f..bc63442 100644 --- a/src/input.c +++ b/src/input.c @@ -31,9 +31,9 @@ struct _DiyaInput }; G_DEFINE_FINAL_TYPE(DiyaInput, diya_input, DIYA_TYPE_SHELL_OBJECT) -static void diya_input_dispose(GObject *object) +static void diya_input_finalize(GObject *object) { - g_debug("diya_input_dispose: %s", diya_object_to_string(object)); + g_debug("diya_input_finalize: %s", diya_object_to_string(object)); DiyaInput *self = DIYA_INPUT(object); if (self->name) { @@ -45,6 +45,13 @@ static void diya_input_dispose(GObject *object) wl_keyboard_release(self->keyboard); self->keyboard = NULL; } + G_OBJECT_CLASS(diya_input_parent_class)->finalize(object); +} + +static void diya_input_dispose(GObject *object) +{ + g_debug("diya_input_dispose: %s", diya_object_to_string(object)); + DiyaInput *self = DIYA_INPUT(object); if (self->xkb_keymap) { xkb_keymap_unref(self->xkb_keymap); @@ -88,6 +95,7 @@ static void diya_input_class_init(DiyaInputClass *class) DiyaObjectClass *base_class = DIYA_OBJECT_CLASS(class); gobject_class->dispose = diya_input_dispose; + gobject_class->finalize = diya_input_finalize; // gobject_class->set_property = diya_input_set_property; // gobject_class->get_property = diya_input_get_property; base_class->to_string = diya_input_to_string; diff --git a/src/launcher.c b/src/launcher.c index 588aca7..8e05820 100644 --- a/src/launcher.c +++ b/src/launcher.c @@ -72,10 +72,12 @@ static void diya_launcher_dispose(GObject* object) if(self->dashboard) { gtk_window_destroy(GTK_WINDOW(self->dashboard)); + self->dashboard = NULL; } if(self->taskbar) { gtk_window_destroy(GTK_WINDOW(self->taskbar)); + self->taskbar = NULL; } G_OBJECT_CLASS(diya_launcher_parent_class)->dispose(object); } diff --git a/src/login-shell.c b/src/login-shell.c index 18c4b0d..3be0730 100644 --- a/src/login-shell.c +++ b/src/login-shell.c @@ -25,6 +25,17 @@ struct _DiyaLoginShell G_DEFINE_FINAL_TYPE(DiyaLoginShell, diya_login_shell, DIYA_TYPE_SHELL); +static void diya_login_shell_finalize(GObject *object) +{ + DiyaLoginShell *self = DIYA_LOGIN_SHELL(object); + g_debug("diya_login_shell_finalize: %s", diya_object_to_string(self)); + if (self->windows) + { + g_list_free(self->windows); + } + G_OBJECT_CLASS(diya_login_shell_parent_class)->finalize(object); +} + static void diya_login_shell_dispose(GObject *object) { DiyaLoginShell *self = DIYA_LOGIN_SHELL(object); @@ -48,7 +59,7 @@ static void diya_login_shell_dispose(GObject *object) gtk_window_destroy(GTK_WINDOW(it->data)); } } - g_list_free(self->windows); + // g_list_free(self->windows); } if (self->bus_watch_id > 0) { @@ -306,6 +317,7 @@ static void diya_login_shell_class_init(DiyaLoginShellClass *class) { GObjectClass *gobject_class = G_OBJECT_CLASS(class); gobject_class->dispose = diya_login_shell_dispose; + gobject_class->finalize = diya_login_shell_finalize; // gobject_class->set_property = diya_lock_session_set_property; // gobject_class->get_property = diya_lock_session_get_property; diff --git a/src/session-shell.c b/src/session-shell.c index 80e7cf8..52d32c4 100644 --- a/src/session-shell.c +++ b/src/session-shell.c @@ -32,10 +32,18 @@ struct _DiyaSessionShell }; G_DEFINE_FINAL_TYPE(DiyaSessionShell, diya_session_shell, DIYA_TYPE_SHELL) -static void diya_session_shell_dispose(GObject *object) +static void diya_session_shell_finalize(GObject *object) { DiyaSessionShell *self = DIYA_SESSION_SHELL(object); g_hash_table_destroy(self->windows); + g_debug("diya_session_shell_finalize: %s", diya_object_to_string(object)); + G_OBJECT_CLASS(diya_session_shell_parent_class)->finalize(object); +} + +static void diya_session_shell_dispose(GObject *object) +{ + DiyaSessionShell *self = DIYA_SESSION_SHELL(object); + // g_hash_table_destroy(self->windows); g_debug("diya_session_shell_dispose: %s", diya_object_to_string(object)); if (self->lock) { @@ -152,6 +160,7 @@ static void diya_session_shell_class_init(DiyaSessionShellClass *class) /// base_class->to_string = diya_session_shell_to_string; gobject_class->dispose = diya_session_shell_dispose; + gobject_class->finalize = diya_session_shell_finalize; gobject_class->set_property = diya_session_shell_set_property; gobject_class->get_property = diya_session_shell_get_property; diff --git a/src/shell.c b/src/shell.c index 984dee2..01cd8e4 100644 --- a/src/shell.c +++ b/src/shell.c @@ -34,15 +34,11 @@ typedef struct _DiyaShellPrivate G_DEFINE_TYPE_WITH_PRIVATE(DiyaShell, diya_shell, DIYA_TYPE_OBJECT); -static void diya_shell_dispose(GObject *object) +static void diya_shell_finalize(GObject *object) { - g_debug("diya_shell_dispose: %s", diya_object_to_string(object)); + g_debug("diya_shell_finalize: %s", diya_object_to_string(object)); DiyaShell *self = DIYA_SHELL(object); DiyaShellPrivate *priv = diya_shell_get_instance_private(self); - if (priv->wayland) - { - g_object_unref(priv->wayland); - } if (priv->name) { g_free(priv->name); @@ -53,6 +49,19 @@ static void diya_shell_dispose(GObject *object) g_free(priv->theme); priv->name = NULL; } + g_hash_table_destroy(priv->vkbs); + G_OBJECT_CLASS(diya_shell_parent_class)->finalize(object); +} + +static void diya_shell_dispose(GObject *object) +{ + g_debug("diya_shell_dispose: %s", diya_object_to_string(object)); + DiyaShell *self = DIYA_SHELL(object); + DiyaShellPrivate *priv = diya_shell_get_instance_private(self); + if (priv->wayland) + { + g_object_unref(priv->wayland); + } if (priv->css_provider) { g_object_unref(priv->css_provider); @@ -61,7 +70,6 @@ static void diya_shell_dispose(GObject *object) { g_object_unref(priv->input); } - g_hash_table_destroy(priv->vkbs); if (priv->files_watchdog) { g_object_unref(priv->files_watchdog); @@ -321,6 +329,7 @@ static void diya_shell_class_init(DiyaShellClass *class) { GObjectClass *gobject_class = G_OBJECT_CLASS(class); gobject_class->dispose = diya_shell_dispose; + gobject_class->finalize = diya_shell_finalize; gobject_class->set_property = diya_shell_set_property; gobject_class->get_property = diya_shell_get_property; diff --git a/src/virtual-keyboard.c b/src/virtual-keyboard.c index f06aa87..ce3fccb 100644 --- a/src/virtual-keyboard.c +++ b/src/virtual-keyboard.c @@ -37,10 +37,10 @@ struct _DiyaVkbKey G_DEFINE_FINAL_TYPE(DiyaVkbKey, diya_vkb_key, DIYA_TYPE_OBJECT) -static void diya_vkb_key_dispose(GObject *object) +static void diya_vkb_key_finalize(GObject *object) { DiyaVkbKey *self = DIYA_VKB_KEY(object); - g_debug("diya_vkb_key_dispose: %s", diya_object_to_string(object)); + g_debug("diya_vkb_key_finalize: %s", diya_object_to_string(object)); for (int i = 0; i < 3; i++) { if (self->key_caps[i]) @@ -54,6 +54,13 @@ static void diya_vkb_key_dispose(GObject *object) free(self->info); self->info = NULL; } + G_OBJECT_CLASS(diya_vkb_key_parent_class)->finalize(object); +} + +static void diya_vkb_key_dispose(GObject *object) +{ + // DiyaVkbKey *self = DIYA_VKB_KEY(object); + g_debug("diya_vkb_key_dispose: %s", diya_object_to_string(object)); G_OBJECT_CLASS(diya_vkb_key_parent_class)->dispose(object); } @@ -91,6 +98,7 @@ static void diya_vkb_key_class_init(DiyaVkbKeyClass *class) DiyaObjectClass *base_class = DIYA_OBJECT_CLASS(class); gobject_class->dispose = diya_vkb_key_dispose; + gobject_class->finalize = diya_vkb_key_finalize; // gobject_class->set_property = diya_lock_session_set_property; // gobject_class->get_property = diya_lock_session_get_property; base_class->to_string = diya_vkb_key_to_string; @@ -141,11 +149,23 @@ struct _DiyaVirtualKeyboard G_DEFINE_FINAL_TYPE(DiyaVirtualKeyboard, diya_virtual_keyboard, DIYA_TYPE_SHELL_OBJECT); +static void diya_virtual_keyboard_finalize(GObject *object) +{ + DiyaVirtualKeyboard *self = DIYA_VIRTUAL_KEYBOARD(object); + g_debug("diya_virtual_keyboard_finalize: %s", diya_object_to_string(object)); + g_hash_table_destroy(self->keys); + if (self->keyboard) + { + zwp_virtual_keyboard_v1_destroy(self->keyboard); + self->keyboard = NULL; + } + G_OBJECT_CLASS(diya_virtual_keyboard_parent_class)->finalize(object); +} + static void diya_virtual_keyboard_dispose(GObject *object) { DiyaVirtualKeyboard *self = DIYA_VIRTUAL_KEYBOARD(object); g_debug("diya_virtual_keyboard_dispose: %s", diya_object_to_string(object)); - g_hash_table_destroy(self->keys); if (self->vkb_keymap) { xkb_keymap_unref(self->vkb_keymap); @@ -156,11 +176,6 @@ static void diya_virtual_keyboard_dispose(GObject *object) xkb_context_unref(self->vkb_ctx); self->vkb_ctx = NULL; } - if (self->keyboard) - { - zwp_virtual_keyboard_v1_destroy(self->keyboard); - self->keyboard = NULL; - } G_OBJECT_CLASS(diya_virtual_keyboard_parent_class)->dispose(object); } @@ -189,6 +204,7 @@ static void diya_virtual_keyboard_class_init(DiyaVirtualKeyboardClass *class) DiyaObjectClass *base_class = DIYA_OBJECT_CLASS(class); gobject_class->dispose = diya_virtual_keyboard_dispose; + gobject_class->finalize = diya_virtual_keyboard_finalize; // gobject_class->set_property = diya_lock_session_set_property; // gobject_class->get_property = diya_lock_session_get_property; base_class->to_string = diya_virtual_keyboard_to_string;