From 91fbb22bda68d069cb71aed589ef946ae61687ef Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Wed, 19 Oct 2022 00:16:38 +0100 Subject: [PATCH] wlserver, ime: Port to wlroots 0.16.0 Co-authored-by: Simon Ser --- meson.build | 4 +-- src/ime.cpp | 28 +++++---------- src/wlserver.cpp | 83 ++++++++++++++++++++++----------------------- src/wlserver.hpp | 8 ++--- subprojects/wlroots | 2 +- 5 files changed, 56 insertions(+), 69 deletions(-) diff --git a/meson.build b/meson.build index 66814cc..2e97d5c 100644 --- a/meson.build +++ b/meson.build @@ -50,9 +50,9 @@ stb_dep = dependency('stb') wlroots_dep = dependency( 'wlroots', - version: ['>= 0.15.0', '< 0.16.0'], + version: ['>= 0.16.0', '< 0.17.0'], fallback: ['wlroots', 'wlroots'], - default_options: ['default_library=static', 'examples=false', 'xwayland=enabled', 'backends=libinput', 'renderers=[]'], + default_options: ['default_library=static', 'examples=false', 'xwayland=enabled', 'backends=libinput', 'renderers=[]', 'allocators=[]'], ) required_wlroots_features = ['xwayland', 'libinput_backend'] diff --git a/src/ime.cpp b/src/ime.cpp index 802579f..461e04a 100644 --- a/src/ime.cpp +++ b/src/ime.cpp @@ -14,7 +14,6 @@ extern "C" { #define delete delete_ -#include #include #include #include @@ -106,7 +105,6 @@ struct wlserver_input_method { // Used to send emulated input events struct wlr_keyboard keyboard; - struct wlr_input_device keyboard_device; std::deque keys; uint32_t next_keycode_index; int32_t held_keycode; @@ -317,9 +315,9 @@ static void press_key(struct wlserver_input_method *ime, uint32_t keycode, struc static bool try_type_keysym(struct wlserver_input_method *ime, xkb_keysym_t keysym) { struct wlr_seat *seat = ime->manager->server->wlr.seat; - struct wlr_input_device *device = ime->manager->server->wlr.virtual_keyboard_device; + struct wlr_keyboard *keyboard = ime->manager->server->wlr.virtual_keyboard_device; - struct xkb_keymap *keymap = device->keyboard->keymap; + struct xkb_keymap *keymap = keyboard->keymap; xkb_keycode_t min_keycode = xkb_keymap_min_keycode(keymap); xkb_keycode_t max_keycode = xkb_keymap_max_keycode(keymap); for (xkb_keycode_t keycode = min_keycode; keycode <= max_keycode; keycode++) { @@ -348,7 +346,7 @@ static bool try_type_keysym(struct wlserver_input_method *ime, xkb_keysym_t keys } release_key_if_needed(ime); // before keymap change - wlr_seat_set_keyboard(seat, device); + wlr_seat_set_keyboard(seat, keyboard); struct wlr_keyboard_modifiers mods = { .depressed = mask, @@ -398,7 +396,7 @@ static void type_text(struct wlserver_input_method *ime, const char *text) struct wlr_seat *seat = ime->manager->server->wlr.seat; release_key_if_needed(ime); // before keymap change - wlr_seat_set_keyboard(seat, &ime->keyboard_device); + wlr_seat_set_keyboard(seat, &ime->keyboard); // Note: Xwayland doesn't care about the time field of the events for (size_t i = 0; i < keycodes.size(); i++) { @@ -434,7 +432,7 @@ static void perform_action(struct wlserver_input_method *ime, enum gamescope_inp struct wlr_seat *seat = ime->manager->server->wlr.seat; release_key_if_needed(ime); // before keymap change - wlr_seat_set_keyboard(seat, &ime->keyboard_device); + wlr_seat_set_keyboard(seat, &ime->keyboard); press_key(ime, key.keycode); @@ -501,21 +499,15 @@ static void ime_handle_resource_destroy(struct wl_resource *ime_resource) active_input_method = nullptr; - wlr_input_device_destroy(&ime->keyboard_device); + wlr_keyboard_finish(&ime->keyboard); delete ime; } -static void keyboard_destroy(struct wlr_keyboard *kyeboard) {} +static void handle_led_update(struct wlr_keyboard *keyboard, uint32_t leds) {} static const struct wlr_keyboard_impl keyboard_impl = { - .destroy = keyboard_destroy, -}; - -static void keyboard_device_destroy(struct wlr_input_device *dev) {} - -static const struct wlr_input_device_impl keyboard_device_impl = { - .destroy = keyboard_device_destroy, + .led_update = handle_led_update, }; static int reset_ime_keyboard(void *data) @@ -551,9 +543,7 @@ static void manager_handle_create_input_method(struct wl_client *client, struct ime->held_modifier_mask = 0; ime->prev_mods = wlr_keyboard_modifiers{0}; - wlr_keyboard_init(&ime->keyboard, &keyboard_impl); - wlr_input_device_init(&ime->keyboard_device, WLR_INPUT_DEVICE_KEYBOARD, &keyboard_device_impl, "ime", 0, 0); - ime->keyboard_device.keyboard = &ime->keyboard; + wlr_keyboard_init(&ime->keyboard, &keyboard_impl, "ime"); wlr_keyboard_set_repeat_info(&ime->keyboard, 0, 0); diff --git a/src/wlserver.cpp b/src/wlserver.cpp index 466ffca..3a9074e 100644 --- a/src/wlserver.cpp +++ b/src/wlserver.cpp @@ -20,16 +20,17 @@ extern "C" { #define class class_ #include #include -#include #include -#include +#include #include #include +#include #include #include +#include #include -#include #include +#include #undef static #undef class } @@ -141,7 +142,7 @@ void xwayland_surface_role_commit(struct wlr_surface *wlr_surface) { } } -static void xwayland_surface_role_precommit(struct wlr_surface *wlr_surface) { +static void xwayland_surface_role_precommit(struct wlr_surface *wlr_surface, const wlr_surface_state *wlr_surface_state) { assert(wlr_surface->role == &xwayland_surface_role); } @@ -177,8 +178,8 @@ static void wlserver_handle_modifiers(struct wl_listener *listener, void *data) { struct wlserver_keyboard *keyboard = wl_container_of( listener, keyboard, modifiers ); - wlr_seat_set_keyboard( wlserver.wlr.seat, keyboard->device ); - wlr_seat_keyboard_notify_modifiers( wlserver.wlr.seat, &keyboard->device->keyboard->modifiers ); + wlr_seat_set_keyboard( wlserver.wlr.seat, keyboard->wlr ); + wlr_seat_keyboard_notify_modifiers( wlserver.wlr.seat, &keyboard->wlr->modifiers ); bump_input_counter(); } @@ -186,10 +187,10 @@ static void wlserver_handle_modifiers(struct wl_listener *listener, void *data) static void wlserver_handle_key(struct wl_listener *listener, void *data) { struct wlserver_keyboard *keyboard = wl_container_of( listener, keyboard, key ); - struct wlr_event_keyboard_key *event = (struct wlr_event_keyboard_key *) data; + struct wlr_keyboard_key_event *event = (struct wlr_keyboard_key_event *) data; xkb_keycode_t keycode = event->keycode + 8; - xkb_keysym_t keysym = xkb_state_key_get_one_sym(keyboard->device->keyboard->xkb_state, keycode); + xkb_keysym_t keysym = xkb_state_key_get_one_sym(keyboard->wlr->xkb_state, keycode); if (wlserver.wlr.session && event->state == WL_KEYBOARD_KEY_STATE_PRESSED && keysym >= XKB_KEY_XF86Switch_VT_1 && keysym <= XKB_KEY_XF86Switch_VT_12) { unsigned vt = keysym - XKB_KEY_XF86Switch_VT_1 + 1; @@ -205,14 +206,14 @@ static void wlserver_handle_key(struct wl_listener *listener, void *data) if ( new_kb_surf ) { wlserver_keyboardfocus( new_kb_surf ); - wlr_seat_set_keyboard( wlserver.wlr.seat, keyboard->device ); + wlr_seat_set_keyboard( wlserver.wlr.seat, keyboard->wlr ); wlr_seat_keyboard_notify_key( wlserver.wlr.seat, event->time_msec, event->keycode, event->state ); wlserver_keyboardfocus( old_kb_surf ); return; } } - wlr_seat_set_keyboard( wlserver.wlr.seat, keyboard->device); + wlr_seat_set_keyboard( wlserver.wlr.seat, keyboard->wlr ); wlr_seat_keyboard_notify_key( wlserver.wlr.seat, event->time_msec, event->keycode, event->state ); bump_input_counter(); @@ -220,7 +221,7 @@ static void wlserver_handle_key(struct wl_listener *listener, void *data) static void wlserver_handle_pointer_motion(struct wl_listener *listener, void *data) { - struct wlr_event_pointer_motion *event = (struct wlr_event_pointer_motion *) data; + struct wlr_pointer_motion_event *event = (struct wlr_pointer_motion_event *) data; // TODO: Pick the xwayland_server with active focus auto server = steamcompmgr_get_focused_server(); @@ -241,7 +242,7 @@ static void wlserver_handle_pointer_motion(struct wl_listener *listener, void *d static void wlserver_handle_pointer_button(struct wl_listener *listener, void *data) { struct wlserver_pointer *pointer = wl_container_of( listener, pointer, button ); - struct wlr_event_pointer_button *event = (struct wlr_event_pointer_button *) data; + struct wlr_pointer_button_event *event = (struct wlr_pointer_button_event *) data; wlr_seat_pointer_notify_button( wlserver.wlr.seat, event->time_msec, event->button, event->state ); } @@ -249,7 +250,7 @@ static void wlserver_handle_pointer_button(struct wl_listener *listener, void *d static void wlserver_handle_pointer_axis(struct wl_listener *listener, void *data) { struct wlserver_pointer *pointer = wl_container_of( listener, pointer, axis ); - struct wlr_event_pointer_axis *event = (struct wlr_event_pointer_axis *) data; + struct wlr_pointer_axis_event *event = (struct wlr_pointer_axis_event *) data; wlr_seat_pointer_notify_axis( wlserver.wlr.seat, event->time_msec, event->orientation, event->delta, event->delta_discrete, event->source ); } @@ -282,7 +283,7 @@ std::atomic g_bPendingTouchMovement = { false }; static void wlserver_handle_touch_down(struct wl_listener *listener, void *data) { struct wlserver_touch *touch = wl_container_of( listener, touch, down ); - struct wlr_event_touch_down *event = (struct wlr_event_touch_down *) data; + struct wlr_touch_down_event *event = (struct wlr_touch_down_event *) data; wlserver_touchdown( event->x, event->y, event->touch_id, event->time_msec ); } @@ -290,7 +291,7 @@ static void wlserver_handle_touch_down(struct wl_listener *listener, void *data) static void wlserver_handle_touch_up(struct wl_listener *listener, void *data) { struct wlserver_touch *touch = wl_container_of( listener, touch, up ); - struct wlr_event_touch_up *event = (struct wlr_event_touch_up *) data; + struct wlr_touch_up_event *event = (struct wlr_touch_up_event *) data; wlserver_touchup( event->touch_id, event->time_msec ); } @@ -298,7 +299,7 @@ static void wlserver_handle_touch_up(struct wl_listener *listener, void *data) static void wlserver_handle_touch_motion(struct wl_listener *listener, void *data) { struct wlserver_touch *touch = wl_container_of( listener, touch, motion ); - struct wlr_event_touch_motion *event = (struct wlr_event_touch_motion *) data; + struct wlr_touch_motion_event *event = (struct wlr_touch_motion_event *) data; wlserver_touchmotion( event->x, event->y, event->touch_id, event->time_msec ); } @@ -311,9 +312,9 @@ static void wlserver_new_input(struct wl_listener *listener, void *data) { case WLR_INPUT_DEVICE_KEYBOARD: { - struct wlserver_keyboard *pKB = (struct wlserver_keyboard *) calloc( 1, sizeof( struct wlserver_keyboard ) ); + struct wlserver_keyboard *keyboard = (struct wlserver_keyboard *) calloc( 1, sizeof( struct wlserver_keyboard ) ); - pKB->device = device; + keyboard->wlr = (struct wlr_keyboard *)device; struct xkb_rule_names rules = { 0 }; struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); @@ -325,48 +326,48 @@ static void wlserver_new_input(struct wl_listener *listener, void *data) struct xkb_keymap *keymap = xkb_keymap_new_from_names(context, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS); - wlr_keyboard_set_keymap(device->keyboard, keymap); + wlr_keyboard_set_keymap(keyboard->wlr, keymap); xkb_keymap_unref(keymap); xkb_context_unref(context); - wlr_keyboard_set_repeat_info(device->keyboard, 25, 600); + wlr_keyboard_set_repeat_info(keyboard->wlr, 25, 600); - device->keyboard->data = pKB; + keyboard->wlr->data = keyboard; - pKB->modifiers.notify = wlserver_handle_modifiers; - wl_signal_add( &device->keyboard->events.modifiers, &pKB->modifiers ); + keyboard->modifiers.notify = wlserver_handle_modifiers; + wl_signal_add( &keyboard->wlr->events.modifiers, &keyboard->modifiers ); - pKB->key.notify = wlserver_handle_key; - wl_signal_add( &device->keyboard->events.key, &pKB->key ); + keyboard->key.notify = wlserver_handle_key; + wl_signal_add( &keyboard->wlr->events.key, &keyboard->key ); } break; case WLR_INPUT_DEVICE_POINTER: { struct wlserver_pointer *pointer = (struct wlserver_pointer *) calloc( 1, sizeof( struct wlserver_pointer ) ); - pointer->device = device; + pointer->wlr = (struct wlr_pointer *)device; pointer->motion.notify = wlserver_handle_pointer_motion; - wl_signal_add( &device->pointer->events.motion, &pointer->motion ); + wl_signal_add( &pointer->wlr->events.motion, &pointer->motion ); pointer->button.notify = wlserver_handle_pointer_button; - wl_signal_add( &device->pointer->events.button, &pointer->button ); + wl_signal_add( &pointer->wlr->events.button, &pointer->button ); pointer->axis.notify = wlserver_handle_pointer_axis; - wl_signal_add( &device->pointer->events.axis, &pointer->axis); + wl_signal_add( &pointer->wlr->events.axis, &pointer->axis); pointer->frame.notify = wlserver_handle_pointer_frame; - wl_signal_add( &device->pointer->events.frame, &pointer->frame); + wl_signal_add( &pointer->wlr->events.frame, &pointer->frame); } break; case WLR_INPUT_DEVICE_TOUCH: { struct wlserver_touch *touch = (struct wlserver_touch *) calloc( 1, sizeof( struct wlserver_touch ) ); - touch->device = device; + touch->wlr = (struct wlr_touch *)device; touch->down.notify = wlserver_handle_touch_down; - wl_signal_add( &device->touch->events.down, &touch->down ); + wl_signal_add( &touch->wlr->events.down, &touch->down ); touch->up.notify = wlserver_handle_touch_up; - wl_signal_add( &device->touch->events.up, &touch->up ); + wl_signal_add( &touch->wlr->events.up, &touch->up ); touch->motion.notify = wlserver_handle_touch_motion; - wl_signal_add( &device->touch->events.motion, &touch->motion ); + wl_signal_add( &touch->wlr->events.motion, &touch->motion ); } break; default: @@ -756,8 +757,8 @@ gamescope_xwayland_server_t::gamescope_xwayland_server_t(wl_display *display) wl_signal_add(&xwayland_server->events.ready, &xwayland_ready_listener); output = wlr_headless_add_output(wlserver.wlr.headless_backend, 1280, 720); - strncpy(output->make, "gamescope", sizeof(output->make)); - strncpy(output->model, "gamescope", sizeof(output->model)); + output->make = strdup("gamescope"); // freed by wlroots + output->model = strdup("gamescope"); // freed by wlroots wlr_output_set_name(output, "gamescope"); int refresh = g_nNestedRefresh; @@ -830,13 +831,9 @@ bool wlserver_init( void ) { // Create a stub wlr_keyboard only used to set the keymap // We need to wait for the backend to be started before adding the device struct wlr_keyboard *kbd = (struct wlr_keyboard *) calloc(1, sizeof(*kbd)); - wlr_keyboard_init(kbd, nullptr); + wlr_keyboard_init(kbd, nullptr, "virtual"); - struct wlr_input_device *kbd_dev = (struct wlr_input_device *) calloc(1, sizeof(*kbd_dev)); - wlr_input_device_init(kbd_dev, WLR_INPUT_DEVICE_KEYBOARD, nullptr, "virtual", 0, 0); - kbd_dev->keyboard = kbd; - - wlserver.wlr.virtual_keyboard_device = kbd_dev; + wlserver.wlr.virtual_keyboard_device = kbd; wlserver.wlr.renderer = vulkan_renderer_create(); @@ -886,7 +883,7 @@ bool wlserver_init( void ) { return false; } - wl_signal_emit( &wlserver.wlr.multi_backend->events.new_input, kbd_dev ); + wl_signal_emit( &wlserver.wlr.multi_backend->events.new_input, kbd ); for (int i = 0; i < g_nXWaylandCount; i++) { diff --git a/src/wlserver.hpp b/src/wlserver.hpp index 50a83a3..e1d8c74 100644 --- a/src/wlserver.hpp +++ b/src/wlserver.hpp @@ -83,7 +83,7 @@ struct wlserver_t { struct wlr_seat *seat; // Used to simulate key events and set the keymap - struct wlr_input_device *virtual_keyboard_device; + struct wlr_keyboard *virtual_keyboard_device; std::vector> xwayland_servers; } wlr; @@ -107,14 +107,14 @@ struct wlserver_t { }; struct wlserver_keyboard { - struct wlr_input_device *device; + struct wlr_keyboard *wlr; struct wl_listener modifiers; struct wl_listener key; }; struct wlserver_pointer { - struct wlr_input_device *device; + struct wlr_pointer *wlr; struct wl_listener motion; struct wl_listener button; @@ -123,7 +123,7 @@ struct wlserver_pointer { }; struct wlserver_touch { - struct wlr_input_device *device; + struct wlr_touch *wlr; struct wl_listener down; struct wl_listener up; diff --git a/subprojects/wlroots b/subprojects/wlroots index 9f41627..1712a7d 160000 --- a/subprojects/wlroots +++ b/subprojects/wlroots @@ -1 +1 @@ -Subproject commit 9f41627aa10a94d9427bc315fa3d363a61b94d7c +Subproject commit 1712a7d27444d62f8da8eeedf0840b386a810e96