[digseting_libdecor] put plugin_gtk into global context, eliminate plugin_gtk as parameter in wl_registry_listener helper init functions

main
Allen Webster 2026-02-25 20:56:54 -08:00
parent cdedd70a3b
commit 30ece62d04
2 changed files with 96 additions and 139 deletions

View File

@ -133,22 +133,20 @@ registry_handle_global(void *user_data,
const char *interface,
uint32_t version)
{
struct libdecor_plugin_gtk *plugin_gtk = user_data;
if (strcmp(interface, "wl_compositor") == 0){
init_wl_compositor(plugin_gtk, id, version);
init_wl_compositor(id, version);
}
else if (strcmp(interface, "wl_subcompositor") == 0){
init_wl_subcompositor(plugin_gtk, id, version);
init_wl_subcompositor(id, version);
}
else if (strcmp(interface, "wl_shm") == 0){
init_wl_shm(plugin_gtk, id, version);
init_wl_shm(id, version);
}
else if (strcmp(interface, "wl_seat") == 0){
init_wl_seat(plugin_gtk, id, version);
init_wl_seat(id, version);
}
else if (strcmp(interface, "wl_output") == 0){
init_wl_output(plugin_gtk, id, version);
init_wl_output(id, version);
}
}
@ -162,7 +160,7 @@ registry_handle_global_remove(void *user_data,
wl_list_for_each(output, &plugin_gtk->output_list, link) {
if (output->id == name) {
output_removed(plugin_gtk, output);
output_removed(output);
break;
}
}
@ -250,61 +248,15 @@ libdecorevent__frame_bounds(struct libdecor_frame *frame,
int main(){
/* get desktop settings */
{
ctx.color_scheme = libdecor_get_color_scheme();
if (libdecor_get_cursor_settings(&ctx.cursor_theme_name, &ctx.cursor_size)){
ctx.cursor_theme_name = 0;
ctx.cursor_size = 24;
}
}
/*~ NOTE:
**~ initialize Wayland, Libdecor, & EGL
*/
/* (1) Appendix B: wl_display_connect
** " Connect to a Wayland display. "
*/
ctx.wl_display = wl_display_connect(0);
if (ctx.wl_display == 0){
printf("wl_display_connect failed\n");
}
/* (1) Appendix A: wl_display::get_registry
** " creates a registry object that allows the client to list
** and bind the global objects available from the compositor "
*/
if (ctx.wl_display != 0){
ctx.wl_registry = wl_display_get_registry(ctx.wl_display);
if (ctx.wl_registry == 0){
printf("wl_display_get_registry failed\n");
}
}
if (ctx.wl_registry != 0){
/* [1] */
wl_registry_add_listener(ctx.wl_registry, &wl_registry_listener, 0);
/* (1) Appendix B: wl_display::dispatch
** " Dispatch events on the default event queue. If the default
** event queue is empty, this function blocks until there are
** events to be read from the display fd. "
*/
wl_display_dispatch(ctx.wl_display);
/* (1) Appendix B: wl_display_roundtrip
** " Block until all pending request are processed by the server "
*/
wl_display_roundtrip(ctx.wl_display);
if (ctx.wl_compositor == 0){
printf("failed to get wl_compositor\n");
}
ctx.color_scheme = libdecor_get_color_scheme();
if (libdecor_get_cursor_settings(&ctx.cursor_theme_name, &ctx.cursor_size)){
ctx.cursor_theme_name = 0;
ctx.cursor_size = 24;
}
/* setup GTK context */
int gtk_init_success = 0;
if (ctx.wl_display != 0 && ctx.wl_compositor != 0){
{
gdk_set_allowed_backends("wayland");
gtk_disable_setlocale();
if (gtk_init_check(0, 0)){
@ -320,39 +272,65 @@ int main(){
}
}
/*~ NOTE:
**~ initialize Wayland, Libdecor, & EGL
*/
{
ctx.plugin_gtk = calloc(1, sizeof *ctx.plugin_gtk);
libdecor_plugin_init(&ctx.plugin_gtk->plugin, &gtk_plugin_iface);
wl_list_init(&ctx.frames);
wl_list_init(&ctx.plugin_gtk->visible_frame_list);
wl_list_init(&ctx.plugin_gtk->seat_list);
wl_list_init(&ctx.plugin_gtk->output_list);
}
if (gtk_init_success){
ctx.wl_display = wl_display_connect(0);
if (ctx.wl_display == 0){
printf("wl_display_connect failed\n");
}
}
if (ctx.wl_display != 0){
ctx.wl_registry = wl_display_get_registry(ctx.wl_display);
if (ctx.wl_registry == 0){
printf("wl_display_get_registry failed\n");
}
}
if (ctx.wl_registry != 0){
wl_registry_add_listener(ctx.wl_registry, &wl_registry_listener, 0);
wl_display_dispatch(ctx.wl_display);
wl_display_roundtrip(ctx.wl_display);
if (ctx.wl_compositor == 0){
printf("failed to get wl_compositor\n");
}
}
if (ctx.wl_compositor != 0){
ctx.wl_callback = wl_display_sync(ctx.wl_display);
wl_callback_add_listener(ctx.wl_callback,
&init_wl_display_callback_listener,
0);
wl_list_init(&ctx.frames);
ctx.plugin_gtk->wl_registry = wl_display_get_registry(ctx.wl_display);
wl_registry_add_listener(ctx.plugin_gtk->wl_registry,
&registry_listener, ctx.plugin_gtk);
{
struct libdecor_plugin_gtk *plugin_gtk;
ctx.plugin_gtk->globals_callback = wl_display_sync(ctx.wl_display);
wl_callback_add_listener(ctx.plugin_gtk->globals_callback,
&globals_callback_listener,
ctx.plugin_gtk);
wl_display_roundtrip(ctx.wl_display);
plugin_gtk = calloc(1, sizeof *plugin_gtk);
libdecor_plugin_init(&plugin_gtk->plugin, &gtk_plugin_iface);
wl_list_init(&plugin_gtk->visible_frame_list);
wl_list_init(&plugin_gtk->seat_list);
wl_list_init(&plugin_gtk->output_list);
plugin_gtk->wl_registry = wl_display_get_registry(ctx.wl_display);
wl_registry_add_listener(plugin_gtk->wl_registry,
&registry_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 (plugin_gtk->wl_compositor != 0 &&
plugin_gtk->wl_subcompositor != 0 &&
plugin_gtk->wl_shm != 0){
ctx.plugin = &plugin_gtk->plugin;
}
if (ctx.plugin_gtk->wl_compositor != 0 &&
ctx.plugin_gtk->wl_subcompositor != 0 &&
ctx.plugin_gtk->wl_shm != 0){
ctx.plugin = &ctx.plugin_gtk->plugin;
}
if (ctx.plugin == 0){
@ -4060,31 +4038,22 @@ struct libdecor_plugin_interface gtk_plugin_iface = {
};
static void
init_wl_compositor(struct libdecor_plugin_gtk *plugin_gtk,
uint32_t id,
uint32_t version)
{
plugin_gtk->wl_compositor =
wl_registry_bind(plugin_gtk->wl_registry,
init_wl_compositor(uint32_t id, uint32_t version){
ctx.plugin_gtk->wl_compositor =
wl_registry_bind(ctx.plugin_gtk->wl_registry,
id, &wl_compositor_interface,
MIN(version, 4));
}
static void
init_wl_subcompositor(struct libdecor_plugin_gtk *plugin_gtk,
uint32_t id,
uint32_t version)
{
plugin_gtk->wl_subcompositor =
wl_registry_bind(plugin_gtk->wl_registry,
init_wl_subcompositor(uint32_t id, uint32_t version){
ctx.plugin_gtk->wl_subcompositor =
wl_registry_bind(ctx.plugin_gtk->wl_registry,
id, &wl_subcompositor_interface, 1);
}
static void
shm_format(void *user_data,
struct wl_shm *wl_shm,
uint32_t format)
{
shm_format(void *user_data, struct wl_shm *wl_shm, uint32_t format){
struct libdecor_plugin_gtk *plugin_gtk = user_data;
if (format == WL_SHM_FORMAT_ARGB8888)
@ -4116,21 +4085,18 @@ const struct wl_callback_listener shm_callback_listener = {
};
static void
init_wl_shm(struct libdecor_plugin_gtk *plugin_gtk,
uint32_t id,
uint32_t version)
{
init_wl_shm(uint32_t id, uint32_t version){
struct wl_display *wl_display = ctx.wl_display;
plugin_gtk->wl_shm =
wl_registry_bind(plugin_gtk->wl_registry,
ctx.plugin_gtk->wl_shm =
wl_registry_bind(ctx.plugin_gtk->wl_registry,
id, &wl_shm_interface, 1);
wl_shm_add_listener(plugin_gtk->wl_shm, &shm_listener, plugin_gtk);
wl_shm_add_listener(ctx.plugin_gtk->wl_shm, &shm_listener, ctx.plugin_gtk);
plugin_gtk->globals_callback_shm = wl_display_sync(wl_display);
wl_callback_add_listener(plugin_gtk->globals_callback_shm,
ctx.plugin_gtk->globals_callback_shm = wl_display_sync(wl_display);
wl_callback_add_listener(ctx.plugin_gtk->globals_callback_shm,
&shm_callback_listener,
plugin_gtk);
ctx.plugin_gtk);
}
static void
@ -4937,10 +4903,7 @@ static struct wl_seat_listener seat_listener = {
};
static void
init_wl_seat(struct libdecor_plugin_gtk *plugin_gtk,
uint32_t id,
uint32_t version)
{
init_wl_seat(uint32_t id, uint32_t version){
struct seat *seat;
if (version < 3) {
@ -4952,11 +4915,11 @@ init_wl_seat(struct libdecor_plugin_gtk *plugin_gtk,
seat = calloc(1, sizeof *seat);
seat->cursor_scale = 1;
seat->plugin_gtk = plugin_gtk;
seat->plugin_gtk = ctx.plugin_gtk;
wl_list_init(&seat->cursor_outputs);
wl_list_insert(&plugin_gtk->seat_list, &seat->link);
wl_list_insert(&ctx.plugin_gtk->seat_list, &seat->link);
seat->wl_seat =
wl_registry_bind(plugin_gtk->wl_registry,
wl_registry_bind(ctx.plugin_gtk->wl_registry,
id, &wl_seat_interface, 3);
wl_seat_add_listener(seat->wl_seat, &seat_listener, seat);
}
@ -5024,10 +4987,7 @@ static struct wl_output_listener output_listener = {
};
static void
init_wl_output(struct libdecor_plugin_gtk *plugin_gtk,
uint32_t id,
uint32_t version)
{
init_wl_output(uint32_t id, uint32_t version){
struct output *output;
if (version < 2) {
@ -5038,11 +4998,11 @@ init_wl_output(struct libdecor_plugin_gtk *plugin_gtk,
}
output = calloc(1, sizeof *output);
output->plugin_gtk = plugin_gtk;
wl_list_insert(&plugin_gtk->output_list, &output->link);
output->plugin_gtk = ctx.plugin_gtk;
wl_list_insert(&ctx.plugin_gtk->output_list, &output->link);
output->id = id;
output->wl_output =
wl_registry_bind(plugin_gtk->wl_registry,
wl_registry_bind(ctx.plugin_gtk->wl_registry,
id, &wl_output_interface,
MIN (version, 3));
wl_proxy_set_tag((struct wl_proxy *) output->wl_output,
@ -5064,16 +5024,15 @@ remove_surface_outputs(struct border_component *cmpnt, const struct output *outp
}
static void
output_removed(struct libdecor_plugin_gtk *plugin_gtk,
struct output *output)
output_removed(struct output *output)
{
struct libdecor_frame_gtk *frame_gtk;
struct seat *seat;
wl_list_for_each(frame_gtk, &plugin_gtk->visible_frame_list, link) {
wl_list_for_each(frame_gtk, &ctx.plugin_gtk->visible_frame_list, link) {
remove_surface_outputs(&frame_gtk->shadow, output);
}
wl_list_for_each(seat, &plugin_gtk->seat_list, link) {
wl_list_for_each(seat, &ctx.plugin_gtk->seat_list, link) {
struct cursor_output *cursor_output;
wl_list_for_each(cursor_output, &seat->cursor_outputs, link) {
if (cursor_output->output == output) {

View File

@ -607,14 +607,14 @@ static void init_xdg_wm_base(uint32_t id, uint32_t version);
static void libdecor_plugin_gtk_destroy(struct libdecor_plugin *plugin);
static void init_wl_compositor(struct libdecor_plugin_gtk *plugin_gtk, uint32_t id, uint32_t version);
static void init_wl_subcompositor(struct libdecor_plugin_gtk *plugin_gtk, uint32_t id, uint32_t version);
static void init_wl_shm(struct libdecor_plugin_gtk *plugin_gtk, uint32_t id, uint32_t version);
static void init_wl_seat(struct libdecor_plugin_gtk *plugin_gtk,
uint32_t id, uint32_t version);
static void init_wl_output(struct libdecor_plugin_gtk *plugin_gtk, uint32_t id, uint32_t version);
static void init_wl_compositor(uint32_t id, uint32_t version);
static void init_wl_subcompositor(uint32_t id, uint32_t version);
static void init_wl_shm(uint32_t id, uint32_t version);
static void init_wl_seat(uint32_t id, uint32_t version);
static void init_wl_output( uint32_t id, uint32_t version);
static void output_removed(struct output *output);
static void output_removed(struct libdecor_plugin_gtk *plugin_gtk, struct output *output);
// digesting_libdecor
typedef struct Ctx{
@ -632,6 +632,7 @@ typedef struct Ctx{
struct wl_list frames;
struct wl_callback *wl_callback;
struct libdecor_plugin_gtk *plugin_gtk;
struct libdecor_plugin *plugin;
bool plugin_ready;
bool init_done;
@ -645,9 +646,6 @@ typedef struct Ctx{
int w;
int h;
int close_signal;
//struct xdg_surface *xdg_surface;
//struct xdg_toplevel *xdg_toplevel;
//struct wl_region *wl_region;
EGLDisplay egl_display;
EGLContext egl_context;
EGLSurface egl_surface;