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