From d57d3d133e4e1586b9c51a82c54775dc8e7e3a90 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Thu, 30 Oct 2025 18:04:30 +0100 Subject: [PATCH] xwayland: Run key behaviors and actions on gamescope Signed-off-by: Julian Orth --- hw/xwayland/xwayland-input.c | 6 ++++-- hw/xwayland/xwayland-screen.c | 3 +++ hw/xwayland/xwayland-screen.h | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c index cd2046e1d..7aa2d1446 100644 --- a/hw/xwayland/xwayland-input.c +++ b/hw/xwayland/xwayland-input.c @@ -1686,7 +1686,8 @@ add_device(struct xwl_seat *xwl_seat, dev->public.devicePrivate = xwl_seat; dev->type = SLAVE; dev->spriteInfo->spriteOwner = FALSE; - dev->ignoreXkbActionsBehaviors = TRUE; + if (!xwl_seat->xwl_screen->is_gamescope) + dev->ignoreXkbActionsBehaviors = TRUE; return dev; } @@ -3650,7 +3651,8 @@ InitInput(int argc, char *argv[]) mieqInit(); - inputInfo.keyboard->ignoreXkbActionsBehaviors = TRUE; + if (!xwl_screen->is_gamescope) + inputInfo.keyboard->ignoreXkbActionsBehaviors = TRUE; xwl_screen->input_registry = wl_display_get_registry(xwl_screen->display); wl_registry_add_listener(xwl_screen->input_registry, &input_listener, xwl_screen); diff --git a/hw/xwayland/xwayland-screen.c b/hw/xwayland/xwayland-screen.c index 22c500801..0ec90b6d5 100644 --- a/hw/xwayland/xwayland-screen.c +++ b/hw/xwayland/xwayland-screen.c @@ -548,6 +548,9 @@ registry_global(void *data, struct wl_registry *registry, uint32_t id, xwl_screen->fractional_scale_manager = wl_registry_bind(registry, id, &wp_fractional_scale_manager_v1_interface, 1); } + else if (strcmp(interface, "gamescope_private") == 0) { + xwl_screen->is_gamescope = TRUE; + } #ifdef XWL_HAS_GLAMOR else if (xwl_screen->glamor) { xwl_glamor_init_wl_registry(xwl_screen, registry, id, interface, diff --git a/hw/xwayland/xwayland-screen.h b/hw/xwayland/xwayland-screen.h index ffbaa09e7..71ff57334 100644 --- a/hw/xwayland/xwayland-screen.h +++ b/hw/xwayland/xwayland-screen.h @@ -54,6 +54,7 @@ struct xwl_screen { int wm_client_id; int expecting_event; enum RootClipMode root_clip_mode; + Bool is_gamescope; Bool active; int rootless;