From 63fc21f13ae6466fc93ed4aec2aba70158ba7316 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Wed, 25 Feb 2026 20:03:21 -0800 Subject: [PATCH] [digesting_libdecor] eliminate the gtk plugin constructor function, lift gtk library init out of the plugin init path --- digesting_libdecor.c | 158 +++++++++++++++++++------------------------ digesting_libdecor.h | 11 +-- 2 files changed, 76 insertions(+), 93 deletions(-) diff --git a/digesting_libdecor.c b/digesting_libdecor.c index 872d5dd..bff17a1 100755 --- a/digesting_libdecor.c +++ b/digesting_libdecor.c @@ -74,6 +74,9 @@ const struct wl_callback_listener shm_callback_listener; const struct wl_registry_listener registry_listener; const struct wl_callback_listener globals_callback_listener; +struct libdecor_plugin_interface gtk_plugin_iface; +struct libdecor_plugin_interface fallback_plugin_iface; + // X(N:name,R:return,P:params) #define GL_FUNCS_XLIST(X)\ X(glDrawBuffer, void, (GLenum buf)) \ @@ -87,14 +90,6 @@ GL_FUNCS_XLIST(X) static Ctx ctx = {0}; - -/* (1) Appendix A: wl_registry::global -** " The event notifies the client that a global object with the given -** name is now available " -*/ -static void -init_xdg_wm_base(uint32_t id, uint32_t version); - static void wlevent__wl_registry_global(void *data, struct wl_registry *registry, uint32_t name, const char *interface, @@ -251,7 +246,25 @@ int main(){ } } + /* setup GTK context */ + int gtk_init_success = 0; + enum libdecor_color_scheme color_scheme = 0; if (ctx.wl_display != 0 && ctx.wl_compositor != 0){ + gdk_set_allowed_backends("wayland"); + gtk_disable_setlocale(); + if (gtk_init_check(0, 0)){ + gtk_init_success = 1; + } + + { + color_scheme = libdecor_get_color_scheme(); + g_object_set(gtk_settings_get_default(), + "gtk-application-prefer-dark-theme", + (color_scheme == LIBDECOR_COLOR_SCHEME_PREFER_DARK), NULL); + } + } + + if (gtk_init_success){ ctx.wl_callback = wl_display_sync(ctx.wl_display); wl_callback_add_listener(ctx.wl_callback, &init_wl_display_callback_listener, @@ -259,7 +272,44 @@ int main(){ wl_list_init(&ctx.frames); - ctx.plugin = libdecor_plugin_new(); + { + struct libdecor_plugin_gtk *plugin_gtk; + + plugin_gtk = calloc(1, sizeof *plugin_gtk); + libdecor_plugin_init(&plugin_gtk->plugin, >k_plugin_iface); + + wl_list_init(&plugin_gtk->visible_frame_list); + wl_list_init(&plugin_gtk->seat_list); + wl_list_init(&plugin_gtk->output_list); + + /* fetch cursor theme and size*/ + if (!libdecor_get_cursor_settings(&plugin_gtk->cursor_theme_name, + &plugin_gtk->cursor_size)){ + plugin_gtk->cursor_theme_name = 0; + plugin_gtk->cursor_size = 24; + } + + plugin_gtk->color_scheme_setting = color_scheme; + + plugin_gtk->wl_registry = wl_display_get_registry(ctx.wl_display); + wl_registry_add_listener(plugin_gtk->wl_registry, + ®istry_listener, plugin_gtk); + + plugin_gtk->globals_callback = wl_display_sync(ctx.wl_display); + wl_callback_add_listener(plugin_gtk->globals_callback, + &globals_callback_listener, + plugin_gtk); + wl_display_roundtrip(ctx.wl_display); + + if (!has_required_globals(plugin_gtk)) { + fprintf(stderr, "libdecor-gtk-WARNING: Could not get required globals\n"); + libdecor_plugin_gtk_destroy(&plugin_gtk->plugin); + goto plugin_failed; + } + + ctx.plugin = &plugin_gtk->plugin; + } + plugin_failed:; if (ctx.plugin == 0){ fprintf(stderr, "Failed to load static plugin: failed to init\n"); exit(1); @@ -1998,7 +2048,7 @@ libdecor_plugin_fallback_frame_get_border_size(struct libdecor_plugin *plugin, return true; } -static struct libdecor_plugin_interface fallback_plugin_iface = { +struct libdecor_plugin_interface fallback_plugin_iface = { .destroy = libdecor_plugin_fallback_destroy, .get_fd = libdecor_plugin_fallback_get_fd, .dispatch = libdecor_plugin_fallback_dispatch, @@ -3949,7 +3999,7 @@ libdecor_plugin_gtk_frame_get_border_size(struct libdecor_plugin *plugin, return true; } -static struct libdecor_plugin_interface gtk_plugin_iface = { +struct libdecor_plugin_interface gtk_plugin_iface = { .destroy = libdecor_plugin_gtk_destroy, .get_fd = libdecor_plugin_gtk_get_fd, .dispatch = libdecor_plugin_gtk_dispatch, @@ -4006,7 +4056,6 @@ struct wl_shm_listener shm_listener = { static void shm_callback(void *user_data, struct wl_callback *callback, uint32_t time){ struct libdecor_plugin_gtk *plugin_gtk = user_data; - struct libdecor *context = plugin_gtk->context; wl_callback_destroy(callback); plugin_gtk->globals_callback_shm = NULL; @@ -4029,7 +4078,6 @@ init_wl_shm(struct libdecor_plugin_gtk *plugin_gtk, uint32_t id, uint32_t version) { - struct libdecor *context = plugin_gtk->context; struct wl_display *wl_display = ctx.wl_display; plugin_gtk->wl_shm = @@ -5069,70 +5117,6 @@ const struct wl_callback_listener globals_callback_listener = { globals_callback }; -static struct libdecor_plugin * -libdecor_plugin_new(void){ - struct libdecor_plugin_gtk *plugin_gtk; - struct wl_display *wl_display; - -#ifdef HAVE_GETTID - /* Only support running on the main thread. */ - if (getpid () != gettid ()) - return NULL; -#endif - - plugin_gtk = calloc(1, sizeof *plugin_gtk); - libdecor_plugin_init(&plugin_gtk->plugin, >k_plugin_iface); - plugin_gtk->context = 0; - - wl_list_init(&plugin_gtk->visible_frame_list); - wl_list_init(&plugin_gtk->seat_list); - wl_list_init(&plugin_gtk->output_list); - - /* fetch cursor theme and size*/ - if (!libdecor_get_cursor_settings(&plugin_gtk->cursor_theme_name, - &plugin_gtk->cursor_size)) { - plugin_gtk->cursor_theme_name = NULL; - plugin_gtk->cursor_size = 24; - } - - plugin_gtk->color_scheme_setting = libdecor_get_color_scheme(); - - wl_display = ctx.wl_display; - plugin_gtk->wl_registry = wl_display_get_registry(wl_display); - wl_registry_add_listener(plugin_gtk->wl_registry, - ®istry_listener, - plugin_gtk); - - plugin_gtk->globals_callback = wl_display_sync(wl_display); - wl_callback_add_listener(plugin_gtk->globals_callback, - &globals_callback_listener, - plugin_gtk); - wl_display_roundtrip(wl_display); - - if (!has_required_globals(plugin_gtk)) { - fprintf(stderr, "libdecor-gtk-WARNING: Could not get required globals\n"); - libdecor_plugin_gtk_destroy(&plugin_gtk->plugin); - return NULL; - } - - /* setup GTK context */ - gdk_set_allowed_backends("wayland"); - gtk_disable_setlocale(); - - if (!gtk_init_check(NULL, NULL)) { - fprintf(stderr, "libdecor-gtk-WARNING: Failed to initialize GTK\n"); - libdecor_plugin_gtk_destroy(&plugin_gtk->plugin); - return NULL; - } - - g_object_set(gtk_settings_get_default(), - "gtk-application-prefer-dark-theme", - plugin_gtk->color_scheme_setting == LIBDECOR_COLOR_SCHEME_PREFER_DARK, - NULL); - - return &plugin_gtk->plugin; -} - static struct libdecor_plugin_priority priorities[] = { { NULL, LIBDECOR_PLUGIN_PRIORITY_HIGH } }; @@ -5161,8 +5145,7 @@ get_cursor_settings_from_env(char **theme, int *size) static DBusMessage * get_setting_sync(DBusConnection *const connection, - const char *key, - const char *value) + const char *key, const char *value) { DBusError error; dbus_bool_t success; @@ -5203,10 +5186,7 @@ get_setting_sync(DBusConnection *const connection, } static bool -parse_type(DBusMessage *const reply, - const int type, - void *value) -{ +parse_type(DBusMessage *const reply, const int type, void *value){ DBusMessageIter iter[3]; dbus_message_iter_init(reply, &iter[0]); @@ -5275,8 +5255,7 @@ libdecor_get_cursor_settings(char **theme, int *size){ } enum libdecor_color_scheme -libdecor_get_color_scheme() -{ +libdecor_get_color_scheme(){ static const char name[] = "org.freedesktop.appearance"; static const char key_color_scheme[] = "color-scheme"; uint32_t color = 0; @@ -5305,17 +5284,18 @@ libdecor_get_color_scheme() return color; } + #else + bool -libdecor_get_cursor_settings(char **theme, int *size) -{ +libdecor_get_cursor_settings(char **theme, int *size){ return get_cursor_settings_from_env(theme, size); } uint32_t -libdecor_get_color_scheme() -{ +libdecor_get_color_scheme(){ return LIBDECOR_COLOR_SCHEME_DEFAULT; } + #endif diff --git a/digesting_libdecor.h b/digesting_libdecor.h index af5a50a..4931bc1 100644 --- a/digesting_libdecor.h +++ b/digesting_libdecor.h @@ -438,8 +438,6 @@ struct libdecor_plugin_gtk { struct wl_callback *globals_callback; struct wl_callback *globals_callback_shm; - struct libdecor *context; - struct wl_registry *wl_registry; struct wl_subcompositor *wl_subcompositor; struct wl_compositor *wl_compositor; @@ -606,9 +604,14 @@ enum libdecor_color_scheme libdecor_get_color_scheme(); int libdecor_os_create_anonymous_file(off_t size); -// #include "plugins/gtk/libdecor-gtk.c" +// #include "libdecor.c" -static struct libdecor_plugin * libdecor_plugin_new(void); +static void init_xdg_wm_base(uint32_t id, uint32_t version); + +//#include "plugins/gtk/libdecor-gtk.c" + +static bool has_required_globals(struct libdecor_plugin_gtk *plugin_gtk); +static void libdecor_plugin_gtk_destroy(struct libdecor_plugin *plugin); // digesting_libdecor