xref: /openbmc/qemu/ui/input-keymap.c (revision d5938f29)
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-qcode.c"
8  #include "ui/input-keymap-linux-to-qcode.c"
9  #include "ui/input-keymap-qcode-to-atset1.c"
10  #include "ui/input-keymap-qcode-to-atset2.c"
11  #include "ui/input-keymap-qcode-to-atset3.c"
12  #include "ui/input-keymap-qcode-to-linux.c"
13  #include "ui/input-keymap-qcode-to-qnum.c"
14  #include "ui/input-keymap-qcode-to-sun.c"
15  #include "ui/input-keymap-qnum-to-qcode.c"
16  #include "ui/input-keymap-usb-to-qcode.c"
17  #include "ui/input-keymap-win32-to-qcode.c"
18  #include "ui/input-keymap-x11-to-qcode.c"
19  #include "ui/input-keymap-xorgevdev-to-qcode.c"
20  #include "ui/input-keymap-xorgkbd-to-qcode.c"
21  #include "ui/input-keymap-xorgxquartz-to-qcode.c"
22  #include "ui/input-keymap-xorgxwin-to-qcode.c"
23  #include "ui/input-keymap-osx-to-qcode.c"
24  
25  int qemu_input_linux_to_qcode(unsigned int lnx)
26  {
27      if (lnx >= qemu_input_map_linux_to_qcode_len) {
28          return 0;
29      }
30      return qemu_input_map_linux_to_qcode[lnx];
31  }
32  
33  int qemu_input_key_value_to_number(const KeyValue *value)
34  {
35      if (value->type == KEY_VALUE_KIND_QCODE) {
36          if (value->u.qcode.data >= qemu_input_map_qcode_to_qnum_len) {
37              return 0;
38          }
39          return qemu_input_map_qcode_to_qnum[value->u.qcode.data];
40      } else {
41          assert(value->type == KEY_VALUE_KIND_NUMBER);
42          return value->u.number.data;
43      }
44  }
45  
46  int qemu_input_key_number_to_qcode(unsigned int nr)
47  {
48      if (nr >= qemu_input_map_qnum_to_qcode_len) {
49          return 0;
50      }
51      return qemu_input_map_qnum_to_qcode[nr];
52  }
53  
54  int qemu_input_key_value_to_qcode(const KeyValue *value)
55  {
56      if (value->type == KEY_VALUE_KIND_QCODE) {
57          return value->u.qcode.data;
58      } else {
59          assert(value->type == KEY_VALUE_KIND_NUMBER);
60          return qemu_input_key_number_to_qcode(value->u.number.data);
61      }
62  }
63  
64  int qemu_input_key_value_to_scancode(const KeyValue *value, bool down,
65                                       int *codes)
66  {
67      int keycode = qemu_input_key_value_to_number(value);
68      int count = 0;
69  
70      if (value->type == KEY_VALUE_KIND_QCODE &&
71          value->u.qcode.data == Q_KEY_CODE_PAUSE) {
72          /* specific case */
73          int v = down ? 0 : 0x80;
74          codes[count++] = 0xe1;
75          codes[count++] = 0x1d | v;
76          codes[count++] = 0x45 | v;
77          return count;
78      }
79      if (keycode & SCANCODE_GREY) {
80          codes[count++] = SCANCODE_EMUL0;
81          keycode &= ~SCANCODE_GREY;
82      }
83      if (!down) {
84          keycode |= SCANCODE_UP;
85      }
86      codes[count++] = keycode;
87  
88      return count;
89  }
90