1 // Copyright 2017 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <hid/usages.h>
6
7 #include "keyboard-vt100.h"
8 #include "keyboard.h"
9
hid_key_to_vt100_code(uint8_t keycode,int modifiers,const keychar_t * keymap,char * buf,size_t buf_size)10 uint32_t hid_key_to_vt100_code(uint8_t keycode, int modifiers,
11 const keychar_t* keymap, char* buf, size_t buf_size) {
12 // Consistency check: Max size of byte sequences we produce below.
13 if (buf_size != 4)
14 return 0;
15
16 uint8_t ch = hid_map_key(keycode, modifiers & MOD_SHIFT, keymap);
17 if (ch) {
18 if (modifiers & MOD_CTRL) {
19 // Handle Ctrl-A to Ctrl-Z. Ignore the Ctrl modifier on any
20 // other keys.
21 uint8_t range_start = modifiers & MOD_SHIFT ? 'A' : 'a';
22 uint8_t range_end = static_cast<uint8_t>(range_start + 26);
23 if (range_start <= ch && ch < range_end) {
24 buf[0] = static_cast<char>(ch - range_start + 1);
25 return 1;
26 }
27 }
28 if (modifiers & MOD_CAPSLOCK) {
29 if ('a' <= ch && ch <= 'z') {
30 ch = static_cast<char>(ch - 'a' + 'A');
31 } else if ('A' <= ch && ch <= 'Z') {
32 ch = static_cast<char>(ch - 'A' + 'a');
33 }
34 }
35 buf[0] = ch;
36 return 1;
37 }
38
39 switch (keycode) {
40 // generate special stuff for a few different keys
41 case HID_USAGE_KEY_ENTER:
42 case HID_USAGE_KEY_KP_ENTER:
43 buf[0] = '\n';
44 return 1;
45 case HID_USAGE_KEY_BACKSPACE:
46 buf[0] = '\b';
47 return 1;
48 case HID_USAGE_KEY_TAB:
49 buf[0] = '\t';
50 return 1;
51 case HID_USAGE_KEY_ESC:
52 buf[0] = 0x1b;
53 return 1;
54
55 // generate vt100 key codes for arrows
56 case HID_USAGE_KEY_UP:
57 buf[0] = 0x1b;
58 buf[1] = '[';
59 buf[2] = 65;
60 return 3;
61 case HID_USAGE_KEY_DOWN:
62 buf[0] = 0x1b;
63 buf[1] = '[';
64 buf[2] = 66;
65 return 3;
66 case HID_USAGE_KEY_RIGHT:
67 buf[0] = 0x1b;
68 buf[1] = '[';
69 buf[2] = 67;
70 return 3;
71 case HID_USAGE_KEY_LEFT:
72 buf[0] = 0x1b;
73 buf[1] = '[';
74 buf[2] = 68;
75 return 3;
76 case HID_USAGE_KEY_HOME:
77 buf[0] = 0x1b;
78 buf[1] = '[';
79 buf[2] = 'H';
80 return 3;
81 case HID_USAGE_KEY_END:
82 buf[0] = 0x1b;
83 buf[1] = '[';
84 buf[2] = 'F';
85 return 3;
86 case HID_USAGE_KEY_DELETE:
87 buf[0] = 0x1b;
88 buf[1] = '[';
89 buf[2] = '3';
90 buf[3] = '~';
91 return 4;
92 case HID_USAGE_KEY_PAGEUP:
93 buf[0] = 0x1b;
94 buf[1] = '[';
95 buf[2] = '5';
96 buf[3] = '~';
97 return 4;
98 case HID_USAGE_KEY_PAGEDOWN:
99 buf[0] = 0x1b;
100 buf[1] = '[';
101 buf[2] = '6';
102 buf[3] = '~';
103 return 4;
104 }
105 // ignore unknown keys; character keys were handled above
106 return 0;
107 }
108