use signals instead of subclass override methods
This commit is contained in:
@@ -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);
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
90
src/shell.c
90
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)
|
||||
|
||||
11
src/shell.h
11
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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user