blob: 668b1ba1d4e68da84e059438a8adaf4d7bf44533 [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <hid/usages.h>
#include "keyboard-vt100.h"
#include "keyboard.h"
uint32_t hid_key_to_vt100_code(uint8_t keycode, int modifiers,
const keychar_t* keymap, char* buf, size_t buf_size) {
// Consistency check: Max size of byte sequences we produce below.
if (buf_size != 4)
return 0;
uint8_t ch = hid_map_key(keycode, modifiers & MOD_SHIFT, keymap);
if (ch) {
if (modifiers & MOD_CTRL) {
// Handle Ctrl-A to Ctrl-Z. Ignore the Ctrl modifier on any
// other keys.
uint8_t range_start = modifiers & MOD_SHIFT ? 'A' : 'a';
uint8_t range_end = static_cast<uint8_t>(range_start + 26);
if (range_start <= ch && ch < range_end) {
buf[0] = static_cast<char>(ch - range_start + 1);
return 1;
}
}
if (modifiers & MOD_CAPSLOCK) {
if ('a' <= ch && ch <= 'z') {
ch = static_cast<char>(ch - 'a' + 'A');
} else if ('A' <= ch && ch <= 'Z') {
ch = static_cast<char>(ch - 'A' + 'a');
}
}
buf[0] = ch;
return 1;
}
switch (keycode) {
// generate special stuff for a few different keys
case HID_USAGE_KEY_ENTER:
case HID_USAGE_KEY_KP_ENTER:
buf[0] = '\n';
return 1;
case HID_USAGE_KEY_BACKSPACE:
buf[0] = '\b';
return 1;
case HID_USAGE_KEY_TAB:
buf[0] = '\t';
return 1;
case HID_USAGE_KEY_ESC:
buf[0] = 0x1b;
return 1;
// generate vt100 key codes for arrows
case HID_USAGE_KEY_UP:
buf[0] = 0x1b;
buf[1] = '[';
buf[2] = 65;
return 3;
case HID_USAGE_KEY_DOWN:
buf[0] = 0x1b;
buf[1] = '[';
buf[2] = 66;
return 3;
case HID_USAGE_KEY_RIGHT:
buf[0] = 0x1b;
buf[1] = '[';
buf[2] = 67;
return 3;
case HID_USAGE_KEY_LEFT:
buf[0] = 0x1b;
buf[1] = '[';
buf[2] = 68;
return 3;
case HID_USAGE_KEY_HOME:
buf[0] = 0x1b;
buf[1] = '[';
buf[2] = 'H';
return 3;
case HID_USAGE_KEY_END:
buf[0] = 0x1b;
buf[1] = '[';
buf[2] = 'F';
return 3;
case HID_USAGE_KEY_DELETE:
buf[0] = 0x1b;
buf[1] = '[';
buf[2] = '3';
buf[3] = '~';
return 4;
case HID_USAGE_KEY_PAGEUP:
buf[0] = 0x1b;
buf[1] = '[';
buf[2] = '5';
buf[3] = '~';
return 4;
case HID_USAGE_KEY_PAGEDOWN:
buf[0] = 0x1b;
buf[1] = '[';
buf[2] = '6';
buf[3] = '~';
return 4;
}
// ignore unknown keys; character keys were handled above
return 0;
}