|
@@ -28,6 +28,7 @@
|
|
#include "trace.h"
|
|
#include "trace.h"
|
|
#include "qemu/error-report.h"
|
|
#include "qemu/error-report.h"
|
|
#include "qapi/error.h"
|
|
#include "qapi/error.h"
|
|
|
|
+#include "ui/input.h"
|
|
|
|
|
|
struct keysym2code {
|
|
struct keysym2code {
|
|
uint32_t count;
|
|
uint32_t count;
|
|
@@ -188,7 +189,7 @@ kbd_layout_t *init_keyboard_layout(const name2keysym_t *table,
|
|
|
|
|
|
|
|
|
|
int keysym2scancode(kbd_layout_t *k, int keysym,
|
|
int keysym2scancode(kbd_layout_t *k, int keysym,
|
|
- QKbdState *kbd)
|
|
|
|
|
|
+ QKbdState *kbd, bool down)
|
|
{
|
|
{
|
|
static const uint32_t mask =
|
|
static const uint32_t mask =
|
|
SCANCODE_SHIFT | SCANCODE_ALTGR | SCANCODE_CTRL;
|
|
SCANCODE_SHIFT | SCANCODE_ALTGR | SCANCODE_CTRL;
|
|
@@ -212,27 +213,39 @@ int keysym2scancode(kbd_layout_t *k, int keysym,
|
|
return keysym2code->keycodes[0];
|
|
return keysym2code->keycodes[0];
|
|
}
|
|
}
|
|
|
|
|
|
- /*
|
|
|
|
- * We have multiple keysym -> keycode mappings.
|
|
|
|
- *
|
|
|
|
- * Check whenever we find one mapping where the modifier state of
|
|
|
|
- * the mapping matches the current user interface modifier state.
|
|
|
|
- * If so, prefer that one.
|
|
|
|
- */
|
|
|
|
- mods = 0;
|
|
|
|
- if (kbd && qkbd_state_modifier_get(kbd, QKBD_MOD_SHIFT)) {
|
|
|
|
- mods |= SCANCODE_SHIFT;
|
|
|
|
- }
|
|
|
|
- if (kbd && qkbd_state_modifier_get(kbd, QKBD_MOD_ALTGR)) {
|
|
|
|
- mods |= SCANCODE_ALTGR;
|
|
|
|
- }
|
|
|
|
- if (kbd && qkbd_state_modifier_get(kbd, QKBD_MOD_CTRL)) {
|
|
|
|
- mods |= SCANCODE_CTRL;
|
|
|
|
- }
|
|
|
|
|
|
+ /* We have multiple keysym -> keycode mappings. */
|
|
|
|
+ if (down) {
|
|
|
|
+ /*
|
|
|
|
+ * On keydown: Check whenever we find one mapping where the
|
|
|
|
+ * modifier state of the mapping matches the current user
|
|
|
|
+ * interface modifier state. If so, prefer that one.
|
|
|
|
+ */
|
|
|
|
+ mods = 0;
|
|
|
|
+ if (kbd && qkbd_state_modifier_get(kbd, QKBD_MOD_SHIFT)) {
|
|
|
|
+ mods |= SCANCODE_SHIFT;
|
|
|
|
+ }
|
|
|
|
+ if (kbd && qkbd_state_modifier_get(kbd, QKBD_MOD_ALTGR)) {
|
|
|
|
+ mods |= SCANCODE_ALTGR;
|
|
|
|
+ }
|
|
|
|
+ if (kbd && qkbd_state_modifier_get(kbd, QKBD_MOD_CTRL)) {
|
|
|
|
+ mods |= SCANCODE_CTRL;
|
|
|
|
+ }
|
|
|
|
|
|
- for (i = 0; i < keysym2code->count; i++) {
|
|
|
|
- if ((keysym2code->keycodes[i] & mask) == mods) {
|
|
|
|
- return keysym2code->keycodes[i];
|
|
|
|
|
|
+ for (i = 0; i < keysym2code->count; i++) {
|
|
|
|
+ if ((keysym2code->keycodes[i] & mask) == mods) {
|
|
|
|
+ return keysym2code->keycodes[i];
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ /*
|
|
|
|
+ * On keyup: Try find a key which is actually down.
|
|
|
|
+ */
|
|
|
|
+ for (i = 0; i < keysym2code->count; i++) {
|
|
|
|
+ QKeyCode qcode = qemu_input_key_number_to_qcode
|
|
|
|
+ (keysym2code->keycodes[i]);
|
|
|
|
+ if (kbd && qkbd_state_key_get(kbd, qcode)) {
|
|
|
|
+ return keysym2code->keycodes[i];
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return keysym2code->keycodes[0];
|
|
return keysym2code->keycodes[0];
|