blob: b37234e68416e4b305474307c3fa9d8232659e0a [file] [log] [blame]
// Copyright 2015 The Chromium 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 "apps/moterm/key_util.h"
#include "base/logging.h"
#include "mojo/services/input_events/interfaces/input_events.mojom.h"
#include "mojo/services/input_events/interfaces/input_key_codes.mojom.h"
// TODO(vtl): Handle more stuff and verify that we're consistent about the
// sequences we generate.
// TODO(vtl): In particular, our implementation of keypad_application_mode is
// incomplete.
std::string GetInputSequenceForKeyPressedEvent(const mojo::Event& key_event,
bool keypad_application_mode) {
DCHECK_EQ(key_event.action, mojo::EventType::KEY_PRESSED);
CHECK(key_event.key_data);
const mojo::KeyData& key_data = *key_event.key_data;
DVLOG(2) << "Key pressed:"
<< "\n is_char = " << key_data.is_char
<< "\n character = " << key_data.character
<< "\n windows_key_code = " << key_data.windows_key_code
<< "\n text = " << key_data.text
<< "\n unmodified_text = " << key_data.unmodified_text;
// We'll only deal with character events (which we'll get even if |character|
// isn't set).
if (!key_data.is_char)
return std::string();
// Use |character| if that's set.
// TODO(vtl): Maybe we should use |text| instead, but it seems to be the same
// as |character|. (The comments claim that |text| will have something for
// backspace while |character| won't, but this does not appear to be true
// currently.)
if (key_data.character) {
if (key_data.character >= 128) {
// TODO(vtl): Need to UTF-8 encode.
NOTIMPLEMENTED();
return std::string();
}
return std::string(1, static_cast<char>(key_data.character));
}
// TODO(vtl): For some of these, we may need to handle modifiers (from
// |event.flags|).
switch (key_data.windows_key_code) {
// Produces input sequence:
case mojo::KeyboardCode::BACK:
// Have backspace send DEL instead of BS.
return std::string("\x7f");
case mojo::KeyboardCode::ESCAPE:
return std::string("\x1b");
case mojo::KeyboardCode::PRIOR:
return std::string("\x1b[5~");
case mojo::KeyboardCode::NEXT:
return std::string("\x1b[6~");
case mojo::KeyboardCode::END:
return std::string(keypad_application_mode ? "\x1bOF" : "\x1b[F");
case mojo::KeyboardCode::HOME:
return std::string(keypad_application_mode ? "\x1bOH" : "\x1b[H");
case mojo::KeyboardCode::LEFT:
return std::string(keypad_application_mode ? "\x1bOD" : "\x1b[D");
case mojo::KeyboardCode::UP:
return std::string(keypad_application_mode ? "\x1bOA" : "\x1b[A");
case mojo::KeyboardCode::RIGHT:
return std::string(keypad_application_mode ? "\x1bOC" : "\x1b[C");
case mojo::KeyboardCode::DOWN:
return std::string(keypad_application_mode ? "\x1bOB" : "\x1b[B");
case mojo::KeyboardCode::INSERT:
return std::string("\x1b[2~");
case mojo::KeyboardCode::DELETE:
return std::string("\x1b[3~");
// Should have |character| set:
case mojo::KeyboardCode::TAB:
case mojo::KeyboardCode::RETURN:
case mojo::KeyboardCode::SPACE:
case mojo::KeyboardCode::NUM_0:
case mojo::KeyboardCode::NUM_1:
case mojo::KeyboardCode::NUM_2:
case mojo::KeyboardCode::NUM_3:
case mojo::KeyboardCode::NUM_4:
case mojo::KeyboardCode::NUM_5:
case mojo::KeyboardCode::NUM_6:
case mojo::KeyboardCode::NUM_7:
case mojo::KeyboardCode::NUM_8:
case mojo::KeyboardCode::NUM_9:
case mojo::KeyboardCode::A:
case mojo::KeyboardCode::B:
case mojo::KeyboardCode::C:
case mojo::KeyboardCode::D:
case mojo::KeyboardCode::E:
case mojo::KeyboardCode::F:
case mojo::KeyboardCode::G:
case mojo::KeyboardCode::H:
case mojo::KeyboardCode::I:
case mojo::KeyboardCode::J:
case mojo::KeyboardCode::K:
case mojo::KeyboardCode::L:
case mojo::KeyboardCode::M:
case mojo::KeyboardCode::N:
case mojo::KeyboardCode::O:
case mojo::KeyboardCode::P:
case mojo::KeyboardCode::Q:
case mojo::KeyboardCode::R:
case mojo::KeyboardCode::S:
case mojo::KeyboardCode::T:
case mojo::KeyboardCode::U:
case mojo::KeyboardCode::V:
case mojo::KeyboardCode::W:
case mojo::KeyboardCode::X:
case mojo::KeyboardCode::Y:
case mojo::KeyboardCode::Z:
// TODO(vtl): Actually, we won't get characters for Ctrl+<number> (and
// probably other odd combinations).
DLOG(WARNING) << "Expected character for key code "
<< key_data.windows_key_code;
break;
// Purposely produce no input sequence:
case mojo::KeyboardCode::SHIFT:
case mojo::KeyboardCode::CONTROL:
case mojo::KeyboardCode::MENU:
case mojo::KeyboardCode::LSHIFT:
case mojo::KeyboardCode::RSHIFT:
case mojo::KeyboardCode::LCONTROL:
case mojo::KeyboardCode::RCONTROL:
case mojo::KeyboardCode::LMENU:
case mojo::KeyboardCode::RMENU:
break;
// TODO(vtl): Figure these out.
case mojo::KeyboardCode::CLEAR:
case mojo::KeyboardCode::PAUSE:
case mojo::KeyboardCode::CAPITAL:
case mojo::KeyboardCode::KANA: // A.k.a. |KeyboardCode::HANGUL|.
case mojo::KeyboardCode::JUNJA:
case mojo::KeyboardCode::FINAL:
case mojo::KeyboardCode::HANJA: // A.k.a. |KeyboardCode::KANJI|.
case mojo::KeyboardCode::CONVERT:
case mojo::KeyboardCode::NONCONVERT:
case mojo::KeyboardCode::ACCEPT:
case mojo::KeyboardCode::MODECHANGE:
case mojo::KeyboardCode::SELECT:
case mojo::KeyboardCode::PRINT:
case mojo::KeyboardCode::EXECUTE:
case mojo::KeyboardCode::SNAPSHOT:
case mojo::KeyboardCode::HELP:
case mojo::KeyboardCode::LWIN: // A.k.a. |KeyboardCode::COMMAND|.
case mojo::KeyboardCode::RWIN:
case mojo::KeyboardCode::APPS:
case mojo::KeyboardCode::SLEEP:
case mojo::KeyboardCode::NUMPAD0:
case mojo::KeyboardCode::NUMPAD1:
case mojo::KeyboardCode::NUMPAD2:
case mojo::KeyboardCode::NUMPAD3:
case mojo::KeyboardCode::NUMPAD4:
case mojo::KeyboardCode::NUMPAD5:
case mojo::KeyboardCode::NUMPAD6:
case mojo::KeyboardCode::NUMPAD7:
case mojo::KeyboardCode::NUMPAD8:
case mojo::KeyboardCode::NUMPAD9:
case mojo::KeyboardCode::MULTIPLY:
case mojo::KeyboardCode::ADD:
case mojo::KeyboardCode::SEPARATOR:
case mojo::KeyboardCode::SUBTRACT:
case mojo::KeyboardCode::DECIMAL:
case mojo::KeyboardCode::DIVIDE:
case mojo::KeyboardCode::F1:
case mojo::KeyboardCode::F2:
case mojo::KeyboardCode::F3:
case mojo::KeyboardCode::F4:
case mojo::KeyboardCode::F5:
case mojo::KeyboardCode::F6:
case mojo::KeyboardCode::F7:
case mojo::KeyboardCode::F8:
case mojo::KeyboardCode::F9:
case mojo::KeyboardCode::F10:
case mojo::KeyboardCode::F11:
case mojo::KeyboardCode::F12:
case mojo::KeyboardCode::F13:
case mojo::KeyboardCode::F14:
case mojo::KeyboardCode::F15:
case mojo::KeyboardCode::F16:
case mojo::KeyboardCode::F17:
case mojo::KeyboardCode::F18:
case mojo::KeyboardCode::F19:
case mojo::KeyboardCode::F20:
case mojo::KeyboardCode::F21:
case mojo::KeyboardCode::F22:
case mojo::KeyboardCode::F23:
case mojo::KeyboardCode::F24:
case mojo::KeyboardCode::NUMLOCK:
case mojo::KeyboardCode::SCROLL:
case mojo::KeyboardCode::BROWSER_BACK:
case mojo::KeyboardCode::BROWSER_FORWARD:
case mojo::KeyboardCode::BROWSER_REFRESH:
case mojo::KeyboardCode::BROWSER_STOP:
case mojo::KeyboardCode::BROWSER_SEARCH:
case mojo::KeyboardCode::BROWSER_FAVORITES:
case mojo::KeyboardCode::BROWSER_HOME:
case mojo::KeyboardCode::VOLUME_MUTE:
case mojo::KeyboardCode::VOLUME_DOWN:
case mojo::KeyboardCode::VOLUME_UP:
case mojo::KeyboardCode::MEDIA_NEXT_TRACK:
case mojo::KeyboardCode::MEDIA_PREV_TRACK:
case mojo::KeyboardCode::MEDIA_STOP:
case mojo::KeyboardCode::MEDIA_PLAY_PAUSE:
case mojo::KeyboardCode::MEDIA_LAUNCH_MAIL:
case mojo::KeyboardCode::MEDIA_LAUNCH_MEDIA_SELECT:
case mojo::KeyboardCode::MEDIA_LAUNCH_APP1:
case mojo::KeyboardCode::MEDIA_LAUNCH_APP2:
case mojo::KeyboardCode::OEM_1:
case mojo::KeyboardCode::OEM_PLUS:
case mojo::KeyboardCode::OEM_COMMA:
case mojo::KeyboardCode::OEM_MINUS:
case mojo::KeyboardCode::OEM_PERIOD:
case mojo::KeyboardCode::OEM_2:
case mojo::KeyboardCode::OEM_3:
case mojo::KeyboardCode::OEM_4:
case mojo::KeyboardCode::OEM_5:
case mojo::KeyboardCode::OEM_6:
case mojo::KeyboardCode::OEM_7:
case mojo::KeyboardCode::OEM_8:
case mojo::KeyboardCode::OEM_102:
case mojo::KeyboardCode::PROCESSKEY:
case mojo::KeyboardCode::PACKET:
case mojo::KeyboardCode::DBE_SBCSCHAR:
case mojo::KeyboardCode::DBE_DBCSCHAR:
case mojo::KeyboardCode::ATTN:
case mojo::KeyboardCode::CRSEL:
case mojo::KeyboardCode::EXSEL:
case mojo::KeyboardCode::EREOF:
case mojo::KeyboardCode::PLAY:
case mojo::KeyboardCode::ZOOM:
case mojo::KeyboardCode::NONAME:
case mojo::KeyboardCode::PA1:
case mojo::KeyboardCode::OEM_CLEAR:
case mojo::KeyboardCode::UNKNOWN:
case mojo::KeyboardCode::ALTGR:
NOTIMPLEMENTED() << "Key code " << key_data.windows_key_code;
break;
default:
LOG(WARNING) << "Unknown key code " << key_data.windows_key_code;
break;
}
return std::string();
}