From 5efd25f699272de51bc828a2155282b0c8f1ba8d Mon Sep 17 00:00:00 2001 From: Dany LE Date: Wed, 5 Nov 2025 18:42:00 +0100 Subject: [PATCH] use signals instead of subclass override methods --- src/login-shell.c | 25 ++++++------- src/session-shell.c | 34 +++++++++-------- src/shell.c | 90 +++++++++++++++++++++++++++++++++------------ src/shell.h | 11 +++--- src/wayland.c | 5 +-- src/wayland.h | 2 - 6 files changed, 104 insertions(+), 63 deletions(-) diff --git a/src/login-shell.c b/src/login-shell.c index a0e96eb..911b2d9 100644 --- a/src/login-shell.c +++ b/src/login-shell.c @@ -42,15 +42,6 @@ static void diya_login_shell_dispose(GObject *object) G_OBJECT_CLASS(diya_login_shell_parent_class)->dispose(object); } -static void diya_login_shell_init(DiyaLoginShell *self) -{ - g_debug("diya_login_shell_init"); - self->username = NULL; - self->password = NULL; - self->status = NULL; - self->bus_watch_id = 0; -} - static void on_method_call_return(GObject *source_object, GAsyncResult *res, gpointer user_data) { (void)source_object; @@ -280,8 +271,16 @@ static void diya_login_shell_class_init(DiyaLoginShellClass *class) // gobject_class->get_property = diya_lock_session_get_property; DiyaShellClass *base_shell_class = DIYA_SHELL_CLASS(class); - base_shell_class->build_lock_window = diya_login_shell_create_window; - base_shell_class->startup_handle = diya_login_shell_startup; - base_shell_class->active_handle = diya_login_shell_active; - // base_shell_class->foreign_register = diya_session_shell_foreign_toplevel_register; + base_shell_class->create_lock_window = diya_login_shell_create_window; +} + +static void diya_login_shell_init(DiyaLoginShell *self) +{ + g_debug("diya_login_shell_init"); + self->username = NULL; + self->password = NULL; + self->status = NULL; + self->bus_watch_id = 0; + g_signal_connect(self, DIYA_SIGNAL_SHELL_STARTUP, G_CALLBACK(diya_login_shell_startup), NULL); + g_signal_connect(self, DIYA_SIGNAL_SHELL_ACTIVE, G_CALLBACK(diya_login_shell_active), NULL); } \ No newline at end of file diff --git a/src/session-shell.c b/src/session-shell.c index 895f8c4..72a99ea 100644 --- a/src/session-shell.c +++ b/src/session-shell.c @@ -169,6 +169,19 @@ void diya_session_init_settings(DiyaSessionShell* self) } } +static void diya_session_service_register(DiyaShell* shell, int type, gpointer user_data) +{ + (void) user_data; + switch (type) + { + case DIYA_WAYLAND_FOREIGN_TOP_LEVEL: + diya_session_shell_foreign_toplevel_register(shell); + break; + default: + break; + } +} + static void diya_session_shell_startup(DiyaShell *shell) { DiyaSessionShell* self = DIYA_SESSION_SHELL(shell); @@ -210,28 +223,14 @@ static void diya_session_shell_active(DiyaShell *shell) diya_shell_monitor_input(shell); } -static void diya_session_service_register(DiyaShell* shell, int type) -{ - switch (type) - { - case DIYA_WAYLAND_FOREIGN_TOP_LEVEL: - diya_session_shell_foreign_toplevel_register(shell); - break; - default: - break; - } -} - static void diya_session_shell_class_init(DiyaSessionShellClass *class) { GObjectClass *gobject_class = G_OBJECT_CLASS(class); // DiyaObjectClass *base_class = DIYA_OBJECT_CLASS(class); DiyaShellClass *base_shell_class = DIYA_SHELL_CLASS(class); - base_shell_class->startup_handle = diya_session_shell_startup; - base_shell_class->active_handle = diya_session_shell_active; - base_shell_class->build_lock_window = diya_session_lock_create; - base_shell_class->on_wayland_service_registered = diya_session_service_register; + base_shell_class->create_lock_window = diya_session_lock_create; + /// base_class->to_string = diya_session_shell_to_string; gobject_class->dispose = diya_session_shell_dispose; gobject_class->finalize = diya_session_shell_finalize; @@ -300,6 +299,9 @@ static void diya_session_shell_init(DiyaSessionShell *self) self->launcher = NULL; self->settings = NULL; self->windows = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_object_unref); + g_signal_connect(self, DIYA_SIGNAL_SHELL_STARTUP, G_CALLBACK(diya_session_shell_startup), NULL); + g_signal_connect(self, DIYA_SIGNAL_SHELL_ACTIVE, G_CALLBACK(diya_session_shell_active), NULL); + g_signal_connect(self, DIYA_SIGNAL_SHELL_WAYLAND_SERVICE_AVAILABLE, G_CALLBACK(diya_session_service_register), NULL); } DiyaForeignWindow *diya_session_shell_get_window(DiyaSessionShell *shell, gpointer handle) diff --git a/src/shell.c b/src/shell.c index 5fac414..6f13824 100644 --- a/src/shell.c +++ b/src/shell.c @@ -140,6 +140,7 @@ static void diya_shell_reload_theme(DiyaShell *shell) gdk_display_get_default(), GTK_STYLE_PROVIDER(priv->css_provider), GTK_STYLE_PROVIDER_PRIORITY_USER); + g_signal_emit_by_name(shell, DIYA_SIGNAL_SHELL_THEME_CHANGED); } void diya_shell_reload(DiyaShell *self) @@ -189,19 +190,13 @@ static void on_gtk_app_startup(GtkApplication *app, void *data) DiyaShell *shell = data; DiyaShellPrivate *priv = diya_shell_get_instance_private(shell); priv->wayland = diya_wayland_new(DIYA_SHELL(shell)); - DiyaShellClass *class = DIYA_SHELL_GET_CLASS(shell); - // log all environment variables in debug for (gchar **env = g_get_environ(); *env != NULL; env++) { g_debug("ENV: %s", *env); } - // diya_shell_reload(shell); - if (class->startup_handle) - { - class->startup_handle(shell); - } + g_signal_emit_by_name(shell, DIYA_SIGNAL_SHELL_STARTUP); /* if (class->monitor_changed_handle) { @@ -216,11 +211,7 @@ static void on_gtk_app_active(GtkApplication *app, void *data) { (void)app; DiyaShell *shell = data; - DiyaShellClass *class = DIYA_SHELL_GET_CLASS(shell); - if (class->active_handle) - { - class->active_handle(shell); - } + g_signal_emit_by_name(shell, DIYA_SIGNAL_SHELL_ACTIVE); DiyaShellPrivate *priv = diya_shell_get_instance_private(shell); if(!priv->theme) { @@ -245,11 +236,7 @@ static gboolean diya_shell_sighub_handle(DiyaShell *self) { // reload css file diya_shell_reload(self); - DiyaShellClass *class = DIYA_SHELL_GET_CLASS(self); - if (class->reload_handle) - { - class->reload_handle(self); - } + g_signal_emit_by_name(self, DIYA_SIGNAL_SHELL_RELOAD); return true; } @@ -400,9 +387,9 @@ static void on_monitor_present(GtkSessionLockInstance* lock, GdkMonitor *monitor assert(shell); g_debug("Build lock window for monitor"); DiyaShellClass *class = DIYA_SHELL_GET_CLASS(shell); - if(class->build_lock_window) + if(class->create_lock_window) { - GtkWindow* window = class->build_lock_window(shell); + GtkWindow* window = class->create_lock_window(shell); gtk_session_lock_instance_assign_window_to_monitor(lock, window, monitor); } } @@ -476,11 +463,7 @@ static void diya_shell_class_init(DiyaShellClass *class) DiyaObjectClass *base_class = DIYA_OBJECT_CLASS(class); base_class->to_string = diya_shell_to_string; - class->build_lock_window = NULL; - class->startup_handle = NULL; - class->active_handle = NULL; - class->reload_handle = NULL; - class->on_wayland_service_registered = NULL; + class->create_lock_window = NULL; shell_properties[PROP_SHELL_WAYLAND] = g_param_spec_pointer(DIYA_PROP_SHELL_WAYLAND, NULL, "Shell wayland", G_PARAM_READABLE); // shell_properties[PROP_SHELL_NAME] = g_param_spec_string(DIYA_PROP_SHELL_NAME, NULL, "Shell name", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); @@ -643,6 +626,65 @@ static void diya_shell_class_init(DiyaShellClass *class) NULL, G_TYPE_NONE, 0); + g_signal_new(DIYA_SIGNAL_SHELL_WAYLAND_SERVICE_AVAILABLE, + DIYA_TYPE_SHELL, + G_SIGNAL_DETAILED | + G_SIGNAL_ACTION | + G_SIGNAL_RUN_FIRST, + 0, + NULL, + NULL, + NULL, + G_TYPE_NONE, + 1, + G_TYPE_INT); + + g_signal_new(DIYA_SIGNAL_SHELL_STARTUP, + DIYA_TYPE_SHELL, + G_SIGNAL_DETAILED | + G_SIGNAL_ACTION | + G_SIGNAL_RUN_FIRST, + 0, + NULL, + NULL, + NULL, + G_TYPE_NONE, + 0); + + g_signal_new(DIYA_SIGNAL_SHELL_ACTIVE, + DIYA_TYPE_SHELL, + G_SIGNAL_DETAILED | + G_SIGNAL_ACTION | + G_SIGNAL_RUN_FIRST, + 0, + NULL, + NULL, + NULL, + G_TYPE_NONE, + 0); + + g_signal_new(DIYA_SIGNAL_SHELL_RELOAD, + DIYA_TYPE_SHELL, + G_SIGNAL_DETAILED | + G_SIGNAL_ACTION | + G_SIGNAL_RUN_FIRST, + 0, + NULL, + NULL, + NULL, + G_TYPE_NONE, + 0); + g_signal_new(DIYA_SIGNAL_SHELL_THEME_CHANGED, + DIYA_TYPE_SHELL, + G_SIGNAL_DETAILED | + G_SIGNAL_ACTION | + G_SIGNAL_RUN_FIRST, + 0, + NULL, + NULL, + NULL, + G_TYPE_NONE, + 0); } static int diya_shell_handle_local_options(GApplication *application, GVariantDict *options, gpointer user_data) diff --git a/src/shell.h b/src/shell.h index be23b3d..8cd7ac5 100644 --- a/src/shell.h +++ b/src/shell.h @@ -30,6 +30,11 @@ #define DIYA_SIGNAL_SHELL_LOCKED "locked" #define DIYA_SIGNAL_SHELL_UNLOCKED "unlocked" #define DIYA_SIGNAL_SHELL_LOCK_FAILED "lock-failed" +#define DIYA_SIGNAL_SHELL_WAYLAND_SERVICE_AVAILABLE "wayland-service-available" +#define DIYA_SIGNAL_SHELL_STARTUP "startup" +#define DIYA_SIGNAL_SHELL_ACTIVE "active" +#define DIYA_SIGNAL_SHELL_RELOAD "reload" +#define DIYA_SIGNAL_SHELL_THEME_CHANGED "theme-changed" #define DIYA_TYPE_SHELL (diya_shell_get_type()) G_DECLARE_DERIVABLE_TYPE(DiyaShell, diya_shell, DIYA, SHELL, DiyaObject) @@ -39,11 +44,7 @@ struct wl_registry; struct _DiyaShellClass { DiyaObjectClass parent_class; - GtkWindow* (*build_lock_window)(DiyaShell*); - void (*on_wayland_service_registered)(DiyaShell*, int); - void (*startup_handle)(DiyaShell*); - void (*active_handle)(DiyaShell*); - void (*reload_handle)(DiyaShell*); + GtkWindow* (*create_lock_window)(DiyaShell*); }; USE_CLASS(DiyaWayland); diff --git a/src/wayland.c b/src/wayland.c index 15cd313..50a6628 100644 --- a/src/wayland.c +++ b/src/wayland.c @@ -110,7 +110,6 @@ static void handle_global(void *data, struct wl_registry *registry, uint32_t nam (void) version; DiyaWayland *wayland = data; DiyaShell * shell = diya_shell_object_get_shell(data); - DiyaShellClass* class = DIYA_SHELL_GET_CLASS(shell); assert(DIYA_IS_WAYLAND(wayland)); assert(DIYA_IS_SHELL(shell)); gboolean enable_foreign, enable_screencopy; @@ -177,9 +176,9 @@ static void handle_global(void *data, struct wl_registry *registry, uint32_t nam service_type = DIYA_WAYLAND_SCREEN_COPY; } } - if(service_type != DIYA_WAYLAND_UNEXPORTED && class->on_wayland_service_registered) + if(service_type != DIYA_WAYLAND_UNEXPORTED) { - class->on_wayland_service_registered(shell, service_type); + g_signal_emit_by_name(shell, DIYA_SIGNAL_SHELL_WAYLAND_SERVICE_AVAILABLE, service_type); } } diff --git a/src/wayland.h b/src/wayland.h index b4a1799..c2be187 100644 --- a/src/wayland.h +++ b/src/wayland.h @@ -5,8 +5,6 @@ USE_CLASS(DiyaShell); -typedef void (*wl_protocol_manager_register_t)(gpointer,gpointer); - typedef enum { DIYA_WAYLAND_UNEXPORTED, DIYA_WAYLAND_FOREIGN_TOP_LEVEL,