qt: Unify keyboard input paths

This commit is contained in:
RichardG867
2023-04-09 19:26:56 -03:00
parent 735b9b000e
commit e492640d65
2 changed files with 44 additions and 42 deletions

View File

@@ -907,37 +907,57 @@ MainWindow::on_actionSettings_triggered()
plat_pause(currentPause); plat_pause(currentPause);
} }
uint16_t void
x11_keycode_to_keysym(uint32_t keycode) MainWindow::processKeyboardInput(bool down, uint32_t keycode)
{ {
uint16_t finalkeycode; #if defined(Q_OS_WINDOWS) /* non-raw input */
#if defined(Q_OS_WINDOWS) keycode &= 0xffff;
finalkeycode = (keycode & 0xFFFF);
#elif defined(Q_OS_MACOS) #elif defined(Q_OS_MACOS)
finalkeycode = (keycode < 127) ? cocoa_keycodes[keycode] : 0; keycode = (keycode < 127) ? cocoa_keycodes[keycode] : 0;
#elif defined(__HAIKU__) #elif defined(__HAIKU__)
finalkeycode = be_keycodes[keycode]; keycode = be_keycodes[keycode];
#else #else
# ifdef XKBCOMMON # ifdef XKBCOMMON
if (xkbcommon_keymap) if (xkbcommon_keymap)
finalkeycode = xkbcommon_translate(keycode); keycode = xkbcommon_translate(keycode);
else else
# endif # endif
# ifdef EVDEV_KEYBOARD_HPP # ifdef EVDEV_KEYBOARD_HPP
finalkeycode = evdev_translate(keycode - 8); keycode = evdev_translate(keycode - 8);
# else # else
finalkeycode = 0; keycode = 0;
# endif # endif
#endif #endif
/* Special case for Alt+Print Screen and Ctrl+Pause. */
if ((finalkeycode == 0x137) && (keyboard_recv(0x38) || keyboard_recv(0x138)))
finalkeycode = 0x54;
else if ((finalkeycode == 0x145) && (keyboard_recv(0x1d) || keyboard_recv(0x11d)))
finalkeycode = 0x146;
if (rctrl_is_lalt && finalkeycode == 0x11D) /* Apply special cases. */
finalkeycode = 0x38; switch (keycode) {
return finalkeycode; case 0x11d: /* Right Ctrl */
if (rctrl_is_lalt)
keycode = 0x38; /* map to Left Alt */
break;
case 0x137: /* Print Screen */
if (keyboard_recv(0x38) || keyboard_recv(0x138)) { /* Alt+ */
keycode = 0x54;
} else if (down) {
keyboard_input(down, 0x12a);
} else {
keyboard_input(down, keycode);
keycode = 0x12a;
}
break;
case 0x145: /* Pause */
if (keyboard_recv(0x1d) || keyboard_recv(0x11d)) { /* Ctrl+ */
keycode = 0x146;
} else {
keyboard_input(down, 0xe11d);
keycode &= 0x00ff;
}
break;
}
keyboard_input(down, keycode);
} }
#ifdef Q_OS_MACOS #ifdef Q_OS_MACOS
@@ -995,11 +1015,11 @@ MainWindow::processMacKeyboardInput(bool down, const QKeyEvent *event)
// It's possible that other lock keys get delivered in this way, but // It's possible that other lock keys get delivered in this way, but
// standard Apple keyboards don't have them, so this is untested. // standard Apple keyboards don't have them, so this is untested.
if (event->key() == Qt::Key_CapsLock) { if (event->key() == Qt::Key_CapsLock) {
keyboard_input(1, 0x3A); keyboard_input(1, 0x3a);
keyboard_input(0, 0x3A); keyboard_input(0, 0x3a);
} }
} else { } else {
keyboard_input(down, x11_keycode_to_keysym(event->nativeVirtualKey())); processKeyboardInput(down, event->nativeVirtualKey());
} }
} }
#endif #endif
@@ -1146,16 +1166,7 @@ MainWindow::keyPressEvent(QKeyEvent *event)
#ifdef Q_OS_MACOS #ifdef Q_OS_MACOS
processMacKeyboardInput(true, event); processMacKeyboardInput(true, event);
#else #else
auto scan = x11_keycode_to_keysym(event->nativeScanCode()); processKeyboardInput(true, event->nativeScanCode());
if (scan == 0x137) {
/* Special case for Print Screen. */
keyboard_input(1, 0x12a);
} else if (scan == 0x145) {
/* Special case for Pause. */
keyboard_input(1, 0xe11d);
scan &= 0x00ff;
}
keyboard_input(1, scan);
#endif #endif
} }
@@ -1203,17 +1214,7 @@ MainWindow::keyReleaseEvent(QKeyEvent *event)
#ifdef Q_OS_MACOS #ifdef Q_OS_MACOS
processMacKeyboardInput(false, event); processMacKeyboardInput(false, event);
#else #else
auto scan = x11_keycode_to_keysym(event->nativeScanCode()); processKeyboardInput(false, event->nativeScanCode());
if (scan == 0x137) {
/* Special case for Print Screen. */
keyboard_input(0, scan);
scan = 0x12a;
} else if (scan == 0x145) {
/* Special case for Pause. */
keyboard_input(0, 0xe11d);
scan &= 0x00ff;
}
keyboard_input(0, scan);
#endif #endif
} }

View File

@@ -155,6 +155,7 @@ private:
std::unique_ptr<MachineStatus> status; std::unique_ptr<MachineStatus> status;
std::shared_ptr<MediaMenu> mm; std::shared_ptr<MediaMenu> mm;
void processKeyboardInput(bool down, uint32_t keycode);
#ifdef Q_OS_MACOS #ifdef Q_OS_MACOS
uint32_t last_modifiers = 0; uint32_t last_modifiers = 0;
void processMacKeyboardInput(bool down, const QKeyEvent *event); void processMacKeyboardInput(bool down, const QKeyEvent *event);