decompose wl_backend.c: extract wl_input_fwd.c + make pointer button/frame/axis non-static
This commit is contained in:
parent
a1a23099ba
commit
698d4dfba7
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,110 @@
|
|||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
#include <wayland-server-core.h>
|
||||
#include <wlr/types/wlr_keyboard.h>
|
||||
#include <wlr/types/wlr_pointer.h>
|
||||
#include <wlr/types/wlr_seat.h>
|
||||
#include <wlr/util/log.h>
|
||||
#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;
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue