diff --git a/src/wlserver.cpp b/src/wlserver.cpp index 563effbaad..614ebe7a3e 100644 --- a/src/wlserver.cpp +++ b/src/wlserver.cpp @@ -2353,11 +2353,34 @@ void wlserver_key( uint32_t key, bool press, uint32_t time ) wlr_keyboard *keyboard = wlserver.wlr.virtual_keyboard_device; + xkb_keycode_t keycode = key + 8; + xkb_keysym_t keysym = xkb_state_key_get_one_sym( keyboard->xkb_state, keycode ); + bool forbidden_key = + keysym == XKB_KEY_XF86AudioLowerVolume || + keysym == XKB_KEY_XF86AudioRaiseVolume || + keysym == XKB_KEY_XF86PowerOff; + + uint32_t state = press ? WL_KEYBOARD_KEY_STATE_PRESSED : WL_KEYBOARD_KEY_STATE_RELEASED; + if ( forbidden_key ) + { + // Always send volume+/- to root server only, to avoid it reaching the game. + struct wlr_surface *old_kb_surf = wlserver.kb_focus_surface; + struct wlr_surface *new_kb_surf = steamcompmgr_get_server_input_surface( 0 ); + if ( new_kb_surf ) + { + wlserver_keyboardfocus( new_kb_surf, false ); + wlr_seat_set_keyboard( wlserver.wlr.seat, keyboard ); + wlr_seat_keyboard_notify_key( wlserver.wlr.seat, time, key, state ); + wlserver_keyboardfocus( old_kb_surf, false ); + return; + } + } + if ( !wlserver_process_hotkeys( keyboard, key, press ) ) { assert( keyboard != nullptr ); wlr_seat_set_keyboard( wlserver.wlr.seat, keyboard ); - wlr_seat_keyboard_notify_key( wlserver.wlr.seat, time, key, press ); + wlr_seat_keyboard_notify_key( wlserver.wlr.seat, time, key, state ); } bump_input_counter();