The open source OpenXR runtime

d/qwerty: Fix QWERTY driver using mapped keyboard keys

Fixes movement on different keyboard layouts, e.g. Colemak or Dvorak.

Part-of: <https://gitlab.freedesktop.org/monado/monado/-/merge_requests/2430>

authored by

Aleksander and committed by
Marge Bot
a2087886 a00c833e

+61 -54
+6
doc/changes/misc_fixes/mr.2430.md
··· 1 + --- 2 + - mr.2430 3 + --- 4 + 5 + - qwerty_sdl: Fix QWERTY driver using mapped keyboard keys (fixes movement on different keyboard layouts, e.g. Colemak or Dvorak) 6 + - u_debug_gui: Properly scale ImGui interface to match the display DPI (make it easy to read on 4K screens)
+55 -54
src/xrt/drivers/qwerty/qwerty_sdl.c
··· 11 11 #include "util/u_device.h" 12 12 #include "xrt/xrt_device.h" 13 13 #include <SDL2/SDL.h> 14 + #include <SDL_scancode.h> 14 15 #include <assert.h> 15 16 #include <string.h> 16 17 ··· 138 139 139 140 // clang-format off 140 141 // CTRL/ALT keys logic 141 - bool alt_down = event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_LALT; 142 - bool alt_up = event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_LALT; 143 - bool ctrl_down = event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_LCTRL; 144 - bool ctrl_up = event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_LCTRL; 142 + bool alt_down = event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_LALT; 143 + bool alt_up = event.type == SDL_KEYUP && event.key.keysym.scancode == SDL_SCANCODE_LALT; 144 + bool ctrl_down = event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_LCTRL; 145 + bool ctrl_up = event.type == SDL_KEYUP && event.key.keysym.scancode == SDL_SCANCODE_LCTRL; 145 146 if (alt_down) alt_pressed = true; 146 147 if (alt_up) alt_pressed = false; 147 148 if (ctrl_down) ctrl_pressed = true; ··· 169 170 qsys->rctrl_focused = qdev == qd_right; 170 171 171 172 // WASDQE Movement 172 - if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_a) qwerty_press_left(qdev); 173 - if (event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_a) qwerty_release_left(qdev); 174 - if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_d) qwerty_press_right(qdev); 175 - if (event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_d) qwerty_release_right(qdev); 176 - if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_w) qwerty_press_forward(qdev); 177 - if (event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_w) qwerty_release_forward(qdev); 178 - if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_s) qwerty_press_backward(qdev); 179 - if (event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_s) qwerty_release_backward(qdev); 180 - if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_e) qwerty_press_up(qdev); 181 - if (event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_e) qwerty_release_up(qdev); 182 - if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_q) qwerty_press_down(qdev); 183 - if (event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_q) qwerty_release_down(qdev); 173 + if (event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_A) qwerty_press_left(qdev); 174 + if (event.type == SDL_KEYUP && event.key.keysym.scancode == SDL_SCANCODE_A) qwerty_release_left(qdev); 175 + if (event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_D) qwerty_press_right(qdev); 176 + if (event.type == SDL_KEYUP && event.key.keysym.scancode == SDL_SCANCODE_D) qwerty_release_right(qdev); 177 + if (event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_W) qwerty_press_forward(qdev); 178 + if (event.type == SDL_KEYUP && event.key.keysym.scancode == SDL_SCANCODE_W) qwerty_release_forward(qdev); 179 + if (event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_S) qwerty_press_backward(qdev); 180 + if (event.type == SDL_KEYUP && event.key.keysym.scancode == SDL_SCANCODE_S) qwerty_release_backward(qdev); 181 + if (event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_E) qwerty_press_up(qdev); 182 + if (event.type == SDL_KEYUP && event.key.keysym.scancode == SDL_SCANCODE_E) qwerty_release_up(qdev); 183 + if (event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_Q) qwerty_press_down(qdev); 184 + if (event.type == SDL_KEYUP && event.key.keysym.scancode == SDL_SCANCODE_Q) qwerty_release_down(qdev); 184 185 185 186 // Arrow keys rotation 186 - if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_LEFT) qwerty_press_look_left(qdev); 187 - if (event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_LEFT) qwerty_release_look_left(qdev); 188 - if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_RIGHT) qwerty_press_look_right(qdev); 189 - if (event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_RIGHT) qwerty_release_look_right(qdev); 190 - if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_UP) qwerty_press_look_up(qdev); 191 - if (event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_UP) qwerty_release_look_up(qdev); 192 - if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_DOWN) qwerty_press_look_down(qdev); 193 - if (event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_DOWN) qwerty_release_look_down(qdev); 187 + if (event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_LEFT) qwerty_press_look_left(qdev); 188 + if (event.type == SDL_KEYUP && event.key.keysym.scancode == SDL_SCANCODE_LEFT) qwerty_release_look_left(qdev); 189 + if (event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_RIGHT) qwerty_press_look_right(qdev); 190 + if (event.type == SDL_KEYUP && event.key.keysym.scancode == SDL_SCANCODE_RIGHT) qwerty_release_look_right(qdev); 191 + if (event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_UP) qwerty_press_look_up(qdev); 192 + if (event.type == SDL_KEYUP && event.key.keysym.scancode == SDL_SCANCODE_UP) qwerty_release_look_up(qdev); 193 + if (event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_DOWN) qwerty_press_look_down(qdev); 194 + if (event.type == SDL_KEYUP && event.key.keysym.scancode == SDL_SCANCODE_DOWN) qwerty_release_look_down(qdev); 194 195 195 196 // Movement speed 196 197 if (event.type == SDL_MOUSEWHEEL) qwerty_change_movement_speed(qdev, event.wheel.y); 197 - if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_KP_PLUS) qwerty_change_movement_speed(qdev, 1); 198 - if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_KP_MINUS) qwerty_change_movement_speed(qdev, -1); 198 + if (event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_KP_PLUS) qwerty_change_movement_speed(qdev, 1); 199 + if (event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_KP_MINUS) qwerty_change_movement_speed(qdev, -1); 199 200 200 201 // Sprinting 201 - if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_LSHIFT) qwerty_press_sprint(qdev); 202 - if (event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_LSHIFT) qwerty_release_sprint(qdev); 202 + if (event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_LSHIFT) qwerty_press_sprint(qdev); 203 + if (event.type == SDL_KEYUP && event.key.keysym.scancode == SDL_SCANCODE_LSHIFT) qwerty_release_sprint(qdev); 203 204 204 205 // Mouse rotation 205 206 if (event.type == SDL_MOUSEBUTTONUP && event.button.button == SDL_BUTTON_RIGHT) { ··· 218 219 if (event.type == SDL_MOUSEBUTTONDOWN && event.button.button == SDL_BUTTON_MIDDLE) qwerty_press_squeeze(qctrl); 219 220 if (event.type == SDL_MOUSEBUTTONUP && event.button.button == SDL_BUTTON_MIDDLE) qwerty_release_squeeze(qctrl); 220 221 221 - if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_n) qwerty_press_menu(qctrl); 222 - if (event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_n) qwerty_release_menu(qctrl); 223 - if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_b) qwerty_press_system(qctrl); 224 - if (event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_b) qwerty_release_system(qctrl); 222 + if (event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_N) qwerty_press_menu(qctrl); 223 + if (event.type == SDL_KEYUP && event.key.keysym.scancode == SDL_SCANCODE_N) qwerty_release_menu(qctrl); 224 + if (event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_B) qwerty_press_system(qctrl); 225 + if (event.type == SDL_KEYUP && event.key.keysym.scancode == SDL_SCANCODE_B) qwerty_release_system(qctrl); 225 226 226 227 // Thumbstick 227 - if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_f) qwerty_press_thumbstick_left(qctrl); 228 - if (event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_f) qwerty_release_thumbstick_left(qctrl); 229 - if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_h) qwerty_press_thumbstick_right(qctrl); 230 - if (event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_h) qwerty_release_thumbstick_right(qctrl); 231 - if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_t) qwerty_press_thumbstick_up(qctrl); 232 - if (event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_t) qwerty_release_thumbstick_up(qctrl); 233 - if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_g) qwerty_press_thumbstick_down(qctrl); 234 - if (event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_g) qwerty_release_thumbstick_down(qctrl); 235 - if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_v) qwerty_press_thumbstick_click(qctrl); 236 - if (event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_v) qwerty_release_thumbstick_click(qctrl); 228 + if (event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_F) qwerty_press_thumbstick_left(qctrl); 229 + if (event.type == SDL_KEYUP && event.key.keysym.scancode == SDL_SCANCODE_F) qwerty_release_thumbstick_left(qctrl); 230 + if (event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_H) qwerty_press_thumbstick_right(qctrl); 231 + if (event.type == SDL_KEYUP && event.key.keysym.scancode == SDL_SCANCODE_H) qwerty_release_thumbstick_right(qctrl); 232 + if (event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_T) qwerty_press_thumbstick_up(qctrl); 233 + if (event.type == SDL_KEYUP && event.key.keysym.scancode == SDL_SCANCODE_T) qwerty_release_thumbstick_up(qctrl); 234 + if (event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_G) qwerty_press_thumbstick_down(qctrl); 235 + if (event.type == SDL_KEYUP && event.key.keysym.scancode == SDL_SCANCODE_G) qwerty_release_thumbstick_down(qctrl); 236 + if (event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_V) qwerty_press_thumbstick_click(qctrl); 237 + if (event.type == SDL_KEYUP && event.key.keysym.scancode == SDL_SCANCODE_V) qwerty_release_thumbstick_click(qctrl); 237 238 238 239 // Trackpad 239 - if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_j) qwerty_press_trackpad_left(qctrl); 240 - if (event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_j) qwerty_release_trackpad_left(qctrl); 241 - if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_l) qwerty_press_trackpad_right(qctrl); 242 - if (event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_l) qwerty_release_trackpad_right(qctrl); 243 - if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_i) qwerty_press_trackpad_up(qctrl); 244 - if (event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_i) qwerty_release_trackpad_up(qctrl); 245 - if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_k) qwerty_press_trackpad_down(qctrl); 246 - if (event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_k) qwerty_release_trackpad_down(qctrl); 247 - if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_m) qwerty_press_trackpad_click(qctrl); 248 - if (event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_m) qwerty_release_trackpad_click(qctrl); 240 + if (event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_J) qwerty_press_trackpad_left(qctrl); 241 + if (event.type == SDL_KEYUP && event.key.keysym.scancode == SDL_SCANCODE_J) qwerty_release_trackpad_left(qctrl); 242 + if (event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_L) qwerty_press_trackpad_right(qctrl); 243 + if (event.type == SDL_KEYUP && event.key.keysym.scancode == SDL_SCANCODE_L) qwerty_release_trackpad_right(qctrl); 244 + if (event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_I) qwerty_press_trackpad_up(qctrl); 245 + if (event.type == SDL_KEYUP && event.key.keysym.scancode == SDL_SCANCODE_I) qwerty_release_trackpad_up(qctrl); 246 + if (event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_K) qwerty_press_trackpad_down(qctrl); 247 + if (event.type == SDL_KEYUP && event.key.keysym.scancode == SDL_SCANCODE_K) qwerty_release_trackpad_down(qctrl); 248 + if (event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_M) qwerty_press_trackpad_click(qctrl); 249 + if (event.type == SDL_KEYUP && event.key.keysym.scancode == SDL_SCANCODE_M) qwerty_release_trackpad_click(qctrl); 249 250 250 251 // clang-format on 251 252 252 253 // Controllers follow/unfollow HMD 253 - if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_c && event.key.repeat == 0) { 254 + if (event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_C && event.key.repeat == 0) { 254 255 if (qdev != qd_hmd) { 255 256 qwerty_follow_hmd(qctrl, !qctrl->follow_hmd); 256 257 } else { // If no controller is focused, set both to the same state ··· 261 262 } 262 263 263 264 // Reset controller poses 264 - if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_r && event.key.repeat == 0) { 265 + if (event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_R && event.key.repeat == 0) { 265 266 if (qdev != qd_hmd) { 266 267 qwerty_reset_controller_pose(qctrl); 267 268 } else { // If no controller is focused, reset both