master
c 83 lines 2.33 KB
Raw
1 #include "qemu/osdep.h"
2 #include "keymaps.h"
3 #include "ui/input.h"
4
5 #include "standard-headers/linux/input.h"
6
7 #include "ui/input-keymap-atset1-to-linux.c.inc"
8 #include "ui/input-keymap-linux-to-qcode.c.inc"
9 #include "ui/input-keymap-linux-to-atset1.c.inc"
10 #include "ui/input-keymap-linux-to-atset2.c.inc"
11 #include "ui/input-keymap-linux-to-atset3.c.inc"
12 #include "ui/input-keymap-qcode-to-linux.c.inc"
13 #include "ui/input-keymap-linux-to-qnum.c.inc"
14 #include "ui/input-keymap-linux-to-sun.c.inc"
15 #include "ui/input-keymap-qnum-to-linux.c.inc"
16 #include "ui/input-keymap-usb-to-linux.c.inc"
17 #include "ui/input-keymap-win32-to-linux.c.inc"
18 #include "ui/input-keymap-x11-to-linux.c.inc"
19 #include "ui/input-keymap-xorgkbd-to-linux.c.inc"
20 #include "ui/input-keymap-xorgxquartz-to-linux.c.inc"
21 #include "ui/input-keymap-xorgxwin-to-linux.c.inc"
22 #include "ui/input-keymap-osx-to-linux.c.inc"
23
24 int qemu_input_linux_to_qcode(unsigned int lnx)
25 {
26 if (lnx >= qemu_input_map_linux_to_qcode_len) {
27 return 0;
28 }
29 return qemu_input_map_linux_to_qcode[lnx];
30 }
31
32 int qemu_input_key_number_to_qcode(unsigned int nr)
33 {
34 return qemu_input_linux_to_qcode(qemu_input_key_number_to_linux(nr));
35 }
36
37 unsigned int qemu_input_key_number_to_linux(unsigned int nr)
38 {
39 if (nr >= qemu_input_map_qnum_to_linux_len) {
40 return KEY_RESERVED;
41 }
42 return qemu_input_map_qnum_to_linux[nr];
43 }
44
45 unsigned int qemu_input_key_value_to_linux(const KeyValue *value)
46 {
47 switch (value->type) {
48 case KEY_VALUE_KIND_NUMBER:
49 return qemu_input_key_number_to_linux(value->u.number.data);
50
51 case KEY_VALUE_KIND_QCODE:
52 return qemu_input_map_qcode_to_linux[value->u.qcode.data];
53
54 default:
55 g_assert_not_reached();
56 }
57 }
58
59 int qemu_input_linux_to_scancode(unsigned int lnx, bool down, int *codes)
60 {
61 int keycode = lnx < qemu_input_map_linux_to_qnum_len ?
62 qemu_input_map_linux_to_qnum[lnx] : 0;
63 int count = 0;
64
65 if (lnx == KEY_PAUSE) {
66 /* specific case */
67 int v = down ? 0 : 0x80;
68 codes[count++] = 0xe1;
69 codes[count++] = 0x1d | v;
70 codes[count++] = 0x45 | v;
71 return count;
72 }
73 if (keycode & SCANCODE_GREY) {
74 codes[count++] = SCANCODE_EMUL0;
75 keycode &= ~SCANCODE_GREY;
76 }
77 if (!down) {
78 keycode |= SCANCODE_UP;
79 }
80 codes[count++] = keycode;
81
82 return count;
83 }