From 698d4dfba750ec481e9efff69e36a287ac803182 Mon Sep 17 00:00:00 2001 From: Window Maker Date: Tue, 2 Jun 2026 15:47:08 +0200 Subject: [PATCH] decompose wl_backend.c: extract wl_input_fwd.c + make pointer button/frame/axis non-static --- src/Makefile.am | 3 +- src/backend/wayland/wl_backend.c | 120 ++--------------------------- src/backend/wayland/wl_input_fwd.c | 110 ++++++++++++++++++++++++++ 3 files changed, 119 insertions(+), 114 deletions(-) create mode 100644 src/backend/wayland/wl_input_fwd.c diff --git a/src/Makefile.am b/src/Makefile.am index 1d5d843..5612f67 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -188,7 +188,8 @@ wmaker_SOURCES += \ backend/wayland/wl_pointer_motion.c \ backend/wayland/wl_pointer_focus.c \ backend/wayland/wl_grab.c \ - backend/wayland/wl_keyboard.c + backend/wayland/wl_keyboard.c \ + backend/wayland/wl_input_fwd.c endif if USE_NESTED_FUNC diff --git a/src/backend/wayland/wl_backend.c b/src/backend/wayland/wl_backend.c index 7ea7298..b8596c7 100644 --- a/src/backend/wayland/wl_backend.c +++ b/src/backend/wayland/wl_backend.c @@ -320,7 +320,7 @@ void wl_drag_cursor_feedback(Bool accepted); /* Phase 28: idle inhibitor created/destroyed handler. */ static void handle_idle_new_inhibitor(struct wl_listener *listener, void *data); /* Phase 29: scroll-wheel axis event handler. */ -static void handle_pointer_axis(struct wl_listener *listener, void *data); +extern void handle_pointer_axis(struct wl_listener *listener, void *data); /* Phase 30: new pointer constraint handler. */ static void handle_new_pointer_constraint(struct wl_listener *listener, void *data); /* Phase 31: new keyboard shortcuts inhibitor handler. */ @@ -343,15 +343,15 @@ static void handle_virtual_pointer_new(struct wl_listener *listener, void *data) static void handle_xwayland_new_surface(struct wl_listener *listener, void *data); static void wm_dock_create(WScreen *scr); /* Phase 20: nested backend real input device forward declaration. */ -static void handle_backend_new_input(struct wl_listener *listener, void *data); +extern void handle_backend_new_input(struct wl_listener *listener, void *data); /* Phase 18: output lifecycle and frame rendering forward declarations. */ static void handle_backend_new_output(struct wl_listener *listener, void *data); static void handle_output_frame(struct wl_listener *listener, void *data); extern void handle_pointer_motion_absolute(struct wl_listener *listener, void *data); -static void handle_pointer_button(struct wl_listener *listener, void *data); +extern void handle_pointer_button(struct wl_listener *listener, void *data); extern void handle_keyboard_key(struct wl_listener *listener, void *data); extern void handle_keyboard_modifiers(struct wl_listener *listener, void *data); -static void handle_pointer_frame(struct wl_listener *listener, void *data); +extern void handle_pointer_frame(struct wl_listener *listener, void *data); extern void wl_grab_begin_move(struct wl_toplevel_view *view); extern void wl_grab_begin_resize(struct wl_toplevel_view *view, uint32_t edges); extern void wl_grab_end(void); @@ -1518,112 +1518,6 @@ handle_xdg_new_toplevel(struct wl_listener *listener, void *data) } -/* ------------------------------------------------------------------ */ -/* Phase 20: real input device forwarding for nested mode */ -/* ------------------------------------------------------------------ */ - -/* - * handle_backend_new_input — fired for every input device added to any - * sub-backend. Headless synthetic devices (which never generate events) - * are skipped; the explicit setup code in wl_display_open handles those. - * Real devices from wlr_wl_backend (the nested compositor path) carry - * events from the host compositor's seat and must be wired so key presses - * and mouse motion reach focused Wayland clients. - */ -static void -handle_keyboard_destroy(struct wl_listener *listener, void *data) -{ - (void)listener; (void)data; - wl_list_remove(&wl_state.real_keyboard_key_listener.link); - wl_list_remove(&wl_state.real_keyboard_modifiers_listener.link); - wl_list_remove(&wl_state.real_keyboard_destroy_listener.link); - wl_list_init(&wl_state.real_keyboard_key_listener.link); - wl_list_init(&wl_state.real_keyboard_modifiers_listener.link); - wl_list_init(&wl_state.real_keyboard_destroy_listener.link); - wl_state.real_keyboard_dev = NULL; - wl_state.keyboard_dev = NULL; -} - -static void -handle_pointer_destroy(struct wl_listener *listener, void *data) -{ - (void)listener; (void)data; - wl_list_remove(&wl_state.pointer_motion_listener.link); - wl_list_remove(&wl_state.real_pointer_motion_abs_listener.link); - wl_list_remove(&wl_state.real_pointer_button_listener.link); - wl_list_remove(&wl_state.real_pointer_frame_listener.link); - wl_list_remove(&wl_state.real_pointer_axis_listener.link); - wl_list_remove(&wl_state.real_pointer_destroy_listener.link); - wl_list_init(&wl_state.pointer_motion_listener.link); - wl_list_init(&wl_state.real_pointer_motion_abs_listener.link); - wl_list_init(&wl_state.real_pointer_button_listener.link); - wl_list_init(&wl_state.real_pointer_frame_listener.link); - wl_list_init(&wl_state.real_pointer_axis_listener.link); - wl_list_init(&wl_state.real_pointer_destroy_listener.link); - wl_state.real_pointer_dev = NULL; - wl_state.pointer_dev = NULL; -} - -static void -handle_backend_new_input(struct wl_listener *listener, void *data) -{ - struct wlr_input_device *dev = data; - (void)listener; - - /* In wlroots 0.19 the headless backend has no input devices, so every - * device that arrives here is a real device from the nested Wayland - * backend (or a virtual device). No need to skip headless devices. */ - switch (dev->type) { - case WLR_INPUT_DEVICE_KEYBOARD: { - struct wlr_keyboard *kb = wlr_keyboard_from_input_device(dev); - if (wl_state.xkb_keymap && !kb->xkb_state) - wlr_keyboard_set_keymap(kb, wl_state.xkb_keymap); - wl_state.real_keyboard_dev = dev; - wl_state.keyboard_dev = dev; - if (wl_state.seat) - wlr_seat_set_keyboard(wl_state.seat, kb); - wl_state.real_keyboard_key_listener.notify = handle_keyboard_key; - wl_signal_add(&kb->events.key, - &wl_state.real_keyboard_key_listener); - wl_state.real_keyboard_modifiers_listener.notify = handle_keyboard_modifiers; - wl_signal_add(&kb->events.modifiers, - &wl_state.real_keyboard_modifiers_listener); - wl_state.real_keyboard_destroy_listener.notify = handle_keyboard_destroy; - wl_signal_add(&dev->events.destroy, - &wl_state.real_keyboard_destroy_listener); - wwarning("wl_backend: real keyboard wired"); - break; - } - case WLR_INPUT_DEVICE_POINTER: { - struct wlr_pointer *ptr = wlr_pointer_from_input_device(dev); - wl_state.real_pointer_dev = dev; - wl_state.pointer_dev = dev; - wl_state.pointer_motion_listener.notify = handle_pointer_motion; - wl_signal_add(&ptr->events.motion, - &wl_state.pointer_motion_listener); - wl_state.real_pointer_motion_abs_listener.notify = - handle_pointer_motion_absolute; - wl_signal_add(&ptr->events.motion_absolute, - &wl_state.real_pointer_motion_abs_listener); - wl_state.real_pointer_button_listener.notify = handle_pointer_button; - wl_signal_add(&ptr->events.button, - &wl_state.real_pointer_button_listener); - wl_state.real_pointer_frame_listener.notify = handle_pointer_frame; - wl_signal_add(&ptr->events.frame, - &wl_state.real_pointer_frame_listener); - wl_state.real_pointer_axis_listener.notify = handle_pointer_axis; - wl_signal_add(&ptr->events.axis, - &wl_state.real_pointer_axis_listener); - wl_state.real_pointer_destroy_listener.notify = handle_pointer_destroy; - wl_signal_add(&dev->events.destroy, - &wl_state.real_pointer_destroy_listener); - wwarning("wl_backend: real pointer wired"); - break; - } - default: - break; - } -} /* ------------------------------------------------------------------ */ /* Phase 18: output frame rendering and backend new-output handler */ @@ -3339,7 +3233,7 @@ handle_idle_new_inhibitor(struct wl_listener *listener, void *data) * to the seat so the focused Wayland client receives wl_pointer.axis events. * Without this, scrolling is silently dropped in every Wayland client. */ -static void +void handle_pointer_axis(struct wl_listener *listener, void *data) { (void)listener; @@ -3749,7 +3643,7 @@ handle_virtual_pointer_new(struct wl_listener *listener, void *data) wwarning("wl_backend: virtual pointer created"); } -static void +void handle_pointer_button(struct wl_listener *listener, void *data) { (void)listener; @@ -3891,7 +3785,7 @@ handle_pointer_button(struct wl_listener *listener, void *data) wlr_seat_pointer_notify_frame(wl_state.seat); } -static void +void handle_pointer_frame(struct wl_listener *listener, void *data) { (void)listener; (void)data; diff --git a/src/backend/wayland/wl_input_fwd.c b/src/backend/wayland/wl_input_fwd.c new file mode 100644 index 0000000..61de948 --- /dev/null +++ b/src/backend/wayland/wl_input_fwd.c @@ -0,0 +1,110 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#include +#include +#include +#include +#include "wl_types.h" + +/* Forward declarations */ +void handle_keyboard_key(struct wl_listener *listener, void *data); +void handle_keyboard_modifiers(struct wl_listener *listener, void *data); +void handle_pointer_motion(struct wl_listener *listener, void *data); +void handle_pointer_motion_absolute(struct wl_listener *listener, void *data); +void handle_pointer_button(struct wl_listener *listener, void *data); +void handle_pointer_frame(struct wl_listener *listener, void *data); +void handle_pointer_axis(struct wl_listener *listener, void *data); + +static void +handle_keyboard_destroy(struct wl_listener *listener, void *data) +{ + (void)listener; (void)data; + wl_list_remove(&wl_state.real_keyboard_key_listener.link); + wl_list_remove(&wl_state.real_keyboard_modifiers_listener.link); + wl_list_remove(&wl_state.real_keyboard_destroy_listener.link); + wl_list_init(&wl_state.real_keyboard_key_listener.link); + wl_list_init(&wl_state.real_keyboard_modifiers_listener.link); + wl_list_init(&wl_state.real_keyboard_destroy_listener.link); + wl_state.real_keyboard_dev = NULL; + wl_state.keyboard_dev = NULL; +} + +static void +handle_pointer_destroy(struct wl_listener *listener, void *data) +{ + (void)listener; (void)data; + wl_list_remove(&wl_state.pointer_motion_listener.link); + wl_list_remove(&wl_state.real_pointer_motion_abs_listener.link); + wl_list_remove(&wl_state.real_pointer_button_listener.link); + wl_list_remove(&wl_state.real_pointer_frame_listener.link); + wl_list_remove(&wl_state.real_pointer_axis_listener.link); + wl_list_remove(&wl_state.real_pointer_destroy_listener.link); + wl_list_init(&wl_state.pointer_motion_listener.link); + wl_list_init(&wl_state.real_pointer_motion_abs_listener.link); + wl_list_init(&wl_state.real_pointer_button_listener.link); + wl_list_init(&wl_state.real_pointer_frame_listener.link); + wl_list_init(&wl_state.real_pointer_axis_listener.link); + wl_list_init(&wl_state.real_pointer_destroy_listener.link); + wl_state.real_pointer_dev = NULL; + wl_state.pointer_dev = NULL; +} + +void +handle_backend_new_input(struct wl_listener *listener, void *data) +{ + struct wlr_input_device *dev = data; + (void)listener; + + switch (dev->type) { + case WLR_INPUT_DEVICE_KEYBOARD: { + struct wlr_keyboard *kb = wlr_keyboard_from_input_device(dev); + if (wl_state.xkb_keymap && !kb->xkb_state) + wlr_keyboard_set_keymap(kb, wl_state.xkb_keymap); + wl_state.real_keyboard_dev = dev; + wl_state.keyboard_dev = dev; + if (wl_state.seat) + wlr_seat_set_keyboard(wl_state.seat, kb); + wl_state.real_keyboard_key_listener.notify = handle_keyboard_key; + wl_signal_add(&kb->events.key, + &wl_state.real_keyboard_key_listener); + wl_state.real_keyboard_modifiers_listener.notify = handle_keyboard_modifiers; + wl_signal_add(&kb->events.modifiers, + &wl_state.real_keyboard_modifiers_listener); + wl_state.real_keyboard_destroy_listener.notify = handle_keyboard_destroy; + wl_signal_add(&dev->events.destroy, + &wl_state.real_keyboard_destroy_listener); + wwarning("wl_backend: real keyboard wired"); + break; + } + case WLR_INPUT_DEVICE_POINTER: { + struct wlr_pointer *ptr = wlr_pointer_from_input_device(dev); + wl_state.real_pointer_dev = dev; + wl_state.pointer_dev = dev; + wl_state.pointer_motion_listener.notify = handle_pointer_motion; + wl_signal_add(&ptr->events.motion, + &wl_state.pointer_motion_listener); + wl_state.real_pointer_motion_abs_listener.notify = + handle_pointer_motion_absolute; + wl_signal_add(&ptr->events.motion_absolute, + &wl_state.real_pointer_motion_abs_listener); + wl_state.real_pointer_button_listener.notify = handle_pointer_button; + wl_signal_add(&ptr->events.button, + &wl_state.real_pointer_button_listener); + wl_state.real_pointer_frame_listener.notify = handle_pointer_frame; + wl_signal_add(&ptr->events.frame, + &wl_state.real_pointer_frame_listener); + wl_state.real_pointer_axis_listener.notify = handle_pointer_axis; + wl_signal_add(&ptr->events.axis, + &wl_state.real_pointer_axis_listener); + wl_state.real_pointer_destroy_listener.notify = handle_pointer_destroy; + wl_signal_add(&dev->events.destroy, + &wl_state.real_pointer_destroy_listener); + wwarning("wl_backend: real pointer wired"); + break; + } + default: + break; + } +}