diff --git a/include/input/cursor.h b/include/input/cursor.h index 1c67f78..1271e6f 100644 --- a/include/input/cursor.h +++ b/include/input/cursor.h @@ -39,7 +39,6 @@ struct kiwmi_cursor { struct wl_listener cursor_button; struct wl_listener cursor_axis; struct wl_listener cursor_frame; - struct wl_listener seat_request_set_cursor; struct { struct wl_signal button_down; diff --git a/include/input/input.h b/include/input/input.h index f81d44c..7c47c99 100644 --- a/include/input/input.h +++ b/include/input/input.h @@ -14,7 +14,7 @@ struct kiwmi_input { struct wl_list keyboards; // struct kiwmi_keyboard::link struct wl_listener new_input; struct kiwmi_cursor *cursor; - struct wlr_seat *seat; + struct kiwmi_seat *seat; struct { struct wl_signal keyboard_new; diff --git a/include/input/seat.h b/include/input/seat.h new file mode 100644 index 0000000..2b9ffcb --- /dev/null +++ b/include/input/seat.h @@ -0,0 +1,25 @@ +/* Copyright (c), Charlotte Meyer + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +#ifndef KIWMI_INPUT_SEAT_H +#define KIWMI_INPUT_SEAT_H + +#include + +#include "input/input.h" + +struct kiwmi_seat { + struct kiwmi_input *input; + struct wlr_seat *seat; + + struct wl_listener request_set_cursor; +}; + +struct kiwmi_seat *seat_create(struct kiwmi_input *input); +void seat_destroy(struct kiwmi_seat *seat); + +#endif /* KIWMI_INPUT_SEAT_H */ diff --git a/kiwmi/desktop/view.c b/kiwmi/desktop/view.c index 220f0e0..39aa4bd 100644 --- a/kiwmi/desktop/view.c +++ b/kiwmi/desktop/view.c @@ -12,6 +12,7 @@ #include "desktop/output.h" #include "input/cursor.h" +#include "input/seat.h" #include "server.h" void @@ -89,7 +90,7 @@ view_focus(struct kiwmi_view *view) struct kiwmi_desktop *desktop = view->desktop; struct kiwmi_server *server = wl_container_of(desktop, server, desktop); - struct wlr_seat *seat = server->input.seat; + struct wlr_seat *seat = server->input.seat->seat; if (view == desktop->focused_view) { return; @@ -174,7 +175,7 @@ view_begin_interactive( struct kiwmi_server *server = wl_container_of(desktop, server, desktop); struct kiwmi_cursor *cursor = server->input.cursor; struct wlr_surface *focused_surface = - server->input.seat->pointer_state.focused_surface; + server->input.seat->seat->pointer_state.focused_surface; struct wlr_surface *wlr_surface = view->wlr_surface; if (wlr_surface != focused_surface) { diff --git a/kiwmi/input/cursor.c b/kiwmi/input/cursor.c index 21a40b3..07ce0e5 100644 --- a/kiwmi/input/cursor.c +++ b/kiwmi/input/cursor.c @@ -19,8 +19,8 @@ #include "desktop/desktop.h" #include "desktop/view.h" +#include "input/seat.h" #include "server.h" -#include "wlr/util/edges.h" static void process_cursor_motion(struct kiwmi_server *server, uint32_t time) @@ -28,7 +28,7 @@ process_cursor_motion(struct kiwmi_server *server, uint32_t time) struct kiwmi_desktop *desktop = &server->desktop; struct kiwmi_input *input = &server->input; struct kiwmi_cursor *cursor = input->cursor; - struct wlr_seat *seat = input->seat; + struct wlr_seat *seat = input->seat->seat; switch (cursor->cursor_mode) { case KIWMI_CURSOR_MOVE: { @@ -174,7 +174,7 @@ cursor_button_notify(struct wl_listener *listener, void *data) if (!new_event.handled) { wlr_seat_pointer_notify_button( - input->seat, event->time_msec, event->button, event->state); + input->seat->seat, event->time_msec, event->button, event->state); } cursor->cursor_mode = KIWMI_CURSOR_PASSTHROUGH; @@ -190,7 +190,7 @@ cursor_axis_notify(struct wl_listener *listener, void *data) struct wlr_event_pointer_axis *event = data; wlr_seat_pointer_notify_axis( - input->seat, + input->seat->seat, event->time_msec, event->orientation, event->delta, @@ -206,32 +206,7 @@ cursor_frame_notify(struct wl_listener *listener, void *UNUSED(data)) struct kiwmi_server *server = cursor->server; struct kiwmi_input *input = &server->input; - wlr_seat_pointer_notify_frame(input->seat); -} - -static void -seat_request_set_cursor_notify(struct wl_listener *listener, void *data) -{ - struct kiwmi_cursor *cursor = - wl_container_of(listener, cursor, seat_request_set_cursor); - struct wlr_seat_pointer_request_set_cursor_event *event = data; - - struct wlr_surface *focused_surface = - event->seat_client->seat->pointer_state.focused_surface; - struct wl_client *focused_client = NULL; - - if (focused_surface && focused_surface->resource) { - focused_client = wl_resource_get_client(focused_surface->resource); - } - - if (event->seat_client->client != focused_client) { - wlr_log( - WLR_DEBUG, "Ignoring request to set cursor on unfocused client"); - return; - } - - wlr_cursor_set_surface( - cursor->cursor, event->surface, event->hotspot_x, event->hotspot_y); + wlr_seat_pointer_notify_frame(input->seat->seat); } struct kiwmi_cursor * @@ -278,11 +253,6 @@ cursor_create( cursor->cursor_frame.notify = cursor_frame_notify; wl_signal_add(&cursor->cursor->events.frame, &cursor->cursor_frame); - cursor->seat_request_set_cursor.notify = seat_request_set_cursor_notify; - wl_signal_add( - &server->input.seat->events.request_set_cursor, - &cursor->seat_request_set_cursor); - wl_signal_init(&cursor->events.button_down); wl_signal_init(&cursor->events.button_up); wl_signal_init(&cursor->events.motion); @@ -301,7 +271,6 @@ cursor_destroy(struct kiwmi_cursor *cursor) wl_list_remove(&cursor->cursor_button.link); wl_list_remove(&cursor->cursor_axis.link); wl_list_remove(&cursor->cursor_frame.link); - wl_list_remove(&cursor->seat_request_set_cursor.link); free(cursor); } diff --git a/kiwmi/input/input.c b/kiwmi/input/input.c index 76acbfa..6f684ec 100644 --- a/kiwmi/input/input.c +++ b/kiwmi/input/input.c @@ -19,6 +19,7 @@ #include "desktop/desktop.h" #include "input/cursor.h" #include "input/keyboard.h" +#include "input/seat.h" #include "server.h" static void @@ -65,7 +66,7 @@ new_input_notify(struct wl_listener *listener, void *data) caps |= WL_SEAT_CAPABILITY_KEYBOARD; } - wlr_seat_set_capabilities(input->seat, caps); + wlr_seat_set_capabilities(input->seat->seat, caps); } bool @@ -73,7 +74,10 @@ input_init(struct kiwmi_input *input) { struct kiwmi_server *server = wl_container_of(input, server, input); - input->seat = wlr_seat_create(server->wl_display, "seat-0"); + input->seat = seat_create(input); + if (!input->seat) { + return false; + } input->cursor = cursor_create(server, server->desktop.output_layout); if (!input->cursor) { @@ -100,5 +104,7 @@ input_fini(struct kiwmi_input *input) free(keyboard); } + seat_destroy(input->seat); + cursor_destroy(input->cursor); } diff --git a/kiwmi/input/keyboard.c b/kiwmi/input/keyboard.c index fdc8ac9..8e8fedf 100644 --- a/kiwmi/input/keyboard.c +++ b/kiwmi/input/keyboard.c @@ -18,6 +18,7 @@ #include #include +#include "input/seat.h" #include "server.h" static bool @@ -46,9 +47,10 @@ keyboard_modifiers_notify(struct wl_listener *listener, void *UNUSED(data)) { struct kiwmi_keyboard *keyboard = wl_container_of(listener, keyboard, modifiers); - wlr_seat_set_keyboard(keyboard->server->input.seat, keyboard->device); + wlr_seat_set_keyboard(keyboard->server->input.seat->seat, keyboard->device); wlr_seat_keyboard_notify_modifiers( - keyboard->server->input.seat, &keyboard->device->keyboard->modifiers); + keyboard->server->input.seat->seat, + &keyboard->device->keyboard->modifiers); } static void @@ -87,9 +89,12 @@ keyboard_key_notify(struct wl_listener *listener, void *data) } if (!handled) { - wlr_seat_set_keyboard(server->input.seat, keyboard->device); + wlr_seat_set_keyboard(server->input.seat->seat, keyboard->device); wlr_seat_keyboard_notify_key( - server->input.seat, event->time_msec, event->keycode, event->state); + server->input.seat->seat, + event->time_msec, + event->keycode, + event->state); } } @@ -141,7 +146,7 @@ keyboard_create(struct kiwmi_server *server, struct wlr_input_device *device) xkb_context_unref(context); wlr_keyboard_set_repeat_info(device->keyboard, 25, 600); - wlr_seat_set_keyboard(server->input.seat, device); + wlr_seat_set_keyboard(server->input.seat->seat, device); wl_signal_init(&keyboard->events.key_down); wl_signal_init(&keyboard->events.key_up); diff --git a/kiwmi/input/seat.c b/kiwmi/input/seat.c new file mode 100644 index 0000000..91347ed --- /dev/null +++ b/kiwmi/input/seat.c @@ -0,0 +1,73 @@ +/* Copyright (c), Charlotte Meyer + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +#include "input/seat.h" + +#include + +#include +#include +#include +#include + +#include "input/cursor.h" +#include "server.h" + +static void +request_set_cursor_notify(struct wl_listener *listener, void *data) +{ + struct kiwmi_seat *seat = + wl_container_of(listener, seat, request_set_cursor); + struct kiwmi_cursor *cursor = seat->input->cursor; + struct wlr_seat_pointer_request_set_cursor_event *event = data; + + struct wlr_surface *focused_surface = + event->seat_client->seat->pointer_state.focused_surface; + struct wl_client *focused_client = NULL; + + if (focused_surface && focused_surface->resource) { + focused_client = wl_resource_get_client(focused_surface->resource); + } + + if (event->seat_client->client != focused_client) { + wlr_log( + WLR_DEBUG, "Ignoring request to set cursor on unfocused client"); + return; + } + + wlr_cursor_set_surface( + cursor->cursor, event->surface, event->hotspot_x, event->hotspot_y); +} + +struct kiwmi_seat * +seat_create(struct kiwmi_input *input) +{ + struct kiwmi_server *server = wl_container_of(input, server, input); + + struct kiwmi_seat *seat = malloc(sizeof(*seat)); + if (!seat) { + wlr_log(WLR_ERROR, "Failed to allocate kiwmi_seat"); + return NULL; + } + + seat->input = input; + seat->seat = wlr_seat_create(server->wl_display, "seat-0"); + + seat->request_set_cursor.notify = request_set_cursor_notify; + wl_signal_add( + &seat->seat->events.request_set_cursor, &seat->request_set_cursor); + + return seat; +} + +void +seat_destroy(struct kiwmi_seat *seat) +{ + wl_list_remove(&seat->request_set_cursor.link); + + free(seat); +} diff --git a/kiwmi/meson.build b/kiwmi/meson.build index 9d4d613..498873b 100644 --- a/kiwmi/meson.build +++ b/kiwmi/meson.build @@ -9,6 +9,7 @@ kiwmi_sources = files( 'input/cursor.c', 'input/input.c', 'input/keyboard.c', + 'input/seat.c', 'luak/ipc.c', 'luak/kiwmi_cursor.c', 'luak/kiwmi_keyboard.c',