Index: apps/moterm/key_util.cc |
diff --git a/apps/moterm/key_util.cc b/apps/moterm/key_util.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ab39d2746f5b8aba4f118590f89cdddd3f05c17a |
--- /dev/null |
+++ b/apps/moterm/key_util.cc |
@@ -0,0 +1,249 @@ |
+// 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/public/interfaces/input_events.mojom.h" |
+#include "mojo/services/input_events/public/interfaces/input_key_codes.mojom.h" |
+ |
+// TODO(vtl): Handle more stuff and verify that we're consistent about the |
+// sequences we generate. |
+std::string GetInputSequenceForKeyPressedEvent(const mojo::Event& key_event) { |
+ DCHECK_EQ(key_event.action, mojo::EVENT_TYPE_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::KEYBOARD_CODE_BACK: |
+ // Have backspace send DEL instead of BS. |
+ return std::string("\x7f"); |
+ case mojo::KEYBOARD_CODE_ESCAPE: |
+ return std::string("\x1b"); |
+ case mojo::KEYBOARD_CODE_PRIOR: |
+ return std::string("\x1b[5~"); |
+ case mojo::KEYBOARD_CODE_NEXT: |
+ return std::string("\x1b[6~"); |
+ case mojo::KEYBOARD_CODE_END: |
+ return std::string("\x1b[F"); |
+ case mojo::KEYBOARD_CODE_HOME: |
+ return std::string("\x1b[H"); |
+ case mojo::KEYBOARD_CODE_LEFT: |
+ return std::string("\x1b[D"); |
+ case mojo::KEYBOARD_CODE_UP: |
+ return std::string("\x1b[A"); |
+ case mojo::KEYBOARD_CODE_RIGHT: |
+ return std::string("\x1b[C"); |
+ case mojo::KEYBOARD_CODE_DOWN: |
+ return std::string("\x1b[B"); |
+ case mojo::KEYBOARD_CODE_INSERT: |
+ return std::string("\x1b[2~"); |
+ case mojo::KEYBOARD_CODE_DELETE: |
+ return std::string("\x1b[3~"); |
+ |
+ // Should have |character| set: |
+ case mojo::KEYBOARD_CODE_TAB: |
+ case mojo::KEYBOARD_CODE_RETURN: |
+ case mojo::KEYBOARD_CODE_SPACE: |
+ case mojo::KEYBOARD_CODE_NUM_0: |
+ case mojo::KEYBOARD_CODE_NUM_1: |
+ case mojo::KEYBOARD_CODE_NUM_2: |
+ case mojo::KEYBOARD_CODE_NUM_3: |
+ case mojo::KEYBOARD_CODE_NUM_4: |
+ case mojo::KEYBOARD_CODE_NUM_5: |
+ case mojo::KEYBOARD_CODE_NUM_6: |
+ case mojo::KEYBOARD_CODE_NUM_7: |
+ case mojo::KEYBOARD_CODE_NUM_8: |
+ case mojo::KEYBOARD_CODE_NUM_9: |
+ case mojo::KEYBOARD_CODE_A: |
+ case mojo::KEYBOARD_CODE_B: |
+ case mojo::KEYBOARD_CODE_C: |
+ case mojo::KEYBOARD_CODE_D: |
+ case mojo::KEYBOARD_CODE_E: |
+ case mojo::KEYBOARD_CODE_F: |
+ case mojo::KEYBOARD_CODE_G: |
+ case mojo::KEYBOARD_CODE_H: |
+ case mojo::KEYBOARD_CODE_I: |
+ case mojo::KEYBOARD_CODE_J: |
+ case mojo::KEYBOARD_CODE_K: |
+ case mojo::KEYBOARD_CODE_L: |
+ case mojo::KEYBOARD_CODE_M: |
+ case mojo::KEYBOARD_CODE_N: |
+ case mojo::KEYBOARD_CODE_O: |
+ case mojo::KEYBOARD_CODE_P: |
+ case mojo::KEYBOARD_CODE_Q: |
+ case mojo::KEYBOARD_CODE_R: |
+ case mojo::KEYBOARD_CODE_S: |
+ case mojo::KEYBOARD_CODE_T: |
+ case mojo::KEYBOARD_CODE_U: |
+ case mojo::KEYBOARD_CODE_V: |
+ case mojo::KEYBOARD_CODE_W: |
+ case mojo::KEYBOARD_CODE_X: |
+ case mojo::KEYBOARD_CODE_Y: |
+ case mojo::KEYBOARD_CODE_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::KEYBOARD_CODE_SHIFT: |
+ case mojo::KEYBOARD_CODE_CONTROL: |
+ case mojo::KEYBOARD_CODE_LSHIFT: |
+ case mojo::KEYBOARD_CODE_RSHIFT: |
+ case mojo::KEYBOARD_CODE_LCONTROL: |
+ case mojo::KEYBOARD_CODE_RCONTROL: |
+ break; |
+ |
+ // TODO(vtl): Figure these out. |
+ case mojo::KEYBOARD_CODE_CLEAR: |
+ case mojo::KEYBOARD_CODE_MENU: |
+ case mojo::KEYBOARD_CODE_PAUSE: |
+ case mojo::KEYBOARD_CODE_CAPITAL: |
+ case mojo::KEYBOARD_CODE_KANA: // A.k.a. |KEYBOARD_CODE_HANGUL|. |
+ case mojo::KEYBOARD_CODE_JUNJA: |
+ case mojo::KEYBOARD_CODE_FINAL: |
+ case mojo::KEYBOARD_CODE_HANJA: // A.k.a. |KEYBOARD_CODE_KANJI|. |
+ case mojo::KEYBOARD_CODE_CONVERT: |
+ case mojo::KEYBOARD_CODE_NONCONVERT: |
+ case mojo::KEYBOARD_CODE_ACCEPT: |
+ case mojo::KEYBOARD_CODE_MODECHANGE: |
+ case mojo::KEYBOARD_CODE_SELECT: |
+ case mojo::KEYBOARD_CODE_PRINT: |
+ case mojo::KEYBOARD_CODE_EXECUTE: |
+ case mojo::KEYBOARD_CODE_SNAPSHOT: |
+ case mojo::KEYBOARD_CODE_HELP: |
+ case mojo::KEYBOARD_CODE_LWIN: // A.k.a. |KEYBOARD_CODE_COMMAND|. |
+ case mojo::KEYBOARD_CODE_RWIN: |
+ case mojo::KEYBOARD_CODE_APPS: |
+ case mojo::KEYBOARD_CODE_SLEEP: |
+ case mojo::KEYBOARD_CODE_NUMPAD0: |
+ case mojo::KEYBOARD_CODE_NUMPAD1: |
+ case mojo::KEYBOARD_CODE_NUMPAD2: |
+ case mojo::KEYBOARD_CODE_NUMPAD3: |
+ case mojo::KEYBOARD_CODE_NUMPAD4: |
+ case mojo::KEYBOARD_CODE_NUMPAD5: |
+ case mojo::KEYBOARD_CODE_NUMPAD6: |
+ case mojo::KEYBOARD_CODE_NUMPAD7: |
+ case mojo::KEYBOARD_CODE_NUMPAD8: |
+ case mojo::KEYBOARD_CODE_NUMPAD9: |
+ case mojo::KEYBOARD_CODE_MULTIPLY: |
+ case mojo::KEYBOARD_CODE_ADD: |
+ case mojo::KEYBOARD_CODE_SEPARATOR: |
+ case mojo::KEYBOARD_CODE_SUBTRACT: |
+ case mojo::KEYBOARD_CODE_DECIMAL: |
+ case mojo::KEYBOARD_CODE_DIVIDE: |
+ case mojo::KEYBOARD_CODE_F1: |
+ case mojo::KEYBOARD_CODE_F2: |
+ case mojo::KEYBOARD_CODE_F3: |
+ case mojo::KEYBOARD_CODE_F4: |
+ case mojo::KEYBOARD_CODE_F5: |
+ case mojo::KEYBOARD_CODE_F6: |
+ case mojo::KEYBOARD_CODE_F7: |
+ case mojo::KEYBOARD_CODE_F8: |
+ case mojo::KEYBOARD_CODE_F9: |
+ case mojo::KEYBOARD_CODE_F10: |
+ case mojo::KEYBOARD_CODE_F11: |
+ case mojo::KEYBOARD_CODE_F12: |
+ case mojo::KEYBOARD_CODE_F13: |
+ case mojo::KEYBOARD_CODE_F14: |
+ case mojo::KEYBOARD_CODE_F15: |
+ case mojo::KEYBOARD_CODE_F16: |
+ case mojo::KEYBOARD_CODE_F17: |
+ case mojo::KEYBOARD_CODE_F18: |
+ case mojo::KEYBOARD_CODE_F19: |
+ case mojo::KEYBOARD_CODE_F20: |
+ case mojo::KEYBOARD_CODE_F21: |
+ case mojo::KEYBOARD_CODE_F22: |
+ case mojo::KEYBOARD_CODE_F23: |
+ case mojo::KEYBOARD_CODE_F24: |
+ case mojo::KEYBOARD_CODE_NUMLOCK: |
+ case mojo::KEYBOARD_CODE_SCROLL: |
+ case mojo::KEYBOARD_CODE_LMENU: |
+ case mojo::KEYBOARD_CODE_RMENU: |
+ case mojo::KEYBOARD_CODE_BROWSER_BACK: |
+ case mojo::KEYBOARD_CODE_BROWSER_FORWARD: |
+ case mojo::KEYBOARD_CODE_BROWSER_REFRESH: |
+ case mojo::KEYBOARD_CODE_BROWSER_STOP: |
+ case mojo::KEYBOARD_CODE_BROWSER_SEARCH: |
+ case mojo::KEYBOARD_CODE_BROWSER_FAVORITES: |
+ case mojo::KEYBOARD_CODE_BROWSER_HOME: |
+ case mojo::KEYBOARD_CODE_VOLUME_MUTE: |
+ case mojo::KEYBOARD_CODE_VOLUME_DOWN: |
+ case mojo::KEYBOARD_CODE_VOLUME_UP: |
+ case mojo::KEYBOARD_CODE_MEDIA_NEXT_TRACK: |
+ case mojo::KEYBOARD_CODE_MEDIA_PREV_TRACK: |
+ case mojo::KEYBOARD_CODE_MEDIA_STOP: |
+ case mojo::KEYBOARD_CODE_MEDIA_PLAY_PAUSE: |
+ case mojo::KEYBOARD_CODE_MEDIA_LAUNCH_MAIL: |
+ case mojo::KEYBOARD_CODE_MEDIA_LAUNCH_MEDIA_SELECT: |
+ case mojo::KEYBOARD_CODE_MEDIA_LAUNCH_APP1: |
+ case mojo::KEYBOARD_CODE_MEDIA_LAUNCH_APP2: |
+ case mojo::KEYBOARD_CODE_OEM_1: |
+ case mojo::KEYBOARD_CODE_OEM_PLUS: |
+ case mojo::KEYBOARD_CODE_OEM_COMMA: |
+ case mojo::KEYBOARD_CODE_OEM_MINUS: |
+ case mojo::KEYBOARD_CODE_OEM_PERIOD: |
+ case mojo::KEYBOARD_CODE_OEM_2: |
+ case mojo::KEYBOARD_CODE_OEM_3: |
+ case mojo::KEYBOARD_CODE_OEM_4: |
+ case mojo::KEYBOARD_CODE_OEM_5: |
+ case mojo::KEYBOARD_CODE_OEM_6: |
+ case mojo::KEYBOARD_CODE_OEM_7: |
+ case mojo::KEYBOARD_CODE_OEM_8: |
+ case mojo::KEYBOARD_CODE_OEM_102: |
+ case mojo::KEYBOARD_CODE_PROCESSKEY: |
+ case mojo::KEYBOARD_CODE_PACKET: |
+ case mojo::KEYBOARD_CODE_DBE_SBCSCHAR: |
+ case mojo::KEYBOARD_CODE_DBE_DBCSCHAR: |
+ case mojo::KEYBOARD_CODE_ATTN: |
+ case mojo::KEYBOARD_CODE_CRSEL: |
+ case mojo::KEYBOARD_CODE_EXSEL: |
+ case mojo::KEYBOARD_CODE_EREOF: |
+ case mojo::KEYBOARD_CODE_PLAY: |
+ case mojo::KEYBOARD_CODE_ZOOM: |
+ case mojo::KEYBOARD_CODE_NONAME: |
+ case mojo::KEYBOARD_CODE_PA1: |
+ case mojo::KEYBOARD_CODE_OEM_CLEAR: |
+ case mojo::KEYBOARD_CODE_UNKNOWN: |
+ case mojo::KEYBOARD_CODE_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(); |
+} |