diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c index 6fe183e93..401e87fb2 100644 --- a/hw/xwayland/xwayland-input.c +++ b/hw/xwayland/xwayland-input.c @@ -1692,7 +1692,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; } @@ -3656,7 +3657,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 5ccf0ee50..10b98132c 100644 --- a/hw/xwayland/xwayland-screen.c +++ b/hw/xwayland/xwayland-screen.c @@ -554,6 +554,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;