Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(496)

Unified Diff: ui/events/keycodes/keyboard_code_conversion.cc

Issue 742103002: Ozone keyboard layout (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@lite-code
Patch Set: rebase 2014/12/08 Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/events/keycodes/keyboard_code_conversion.cc
diff --git a/ui/events/keycodes/keyboard_code_conversion.cc b/ui/events/keycodes/keyboard_code_conversion.cc
index e7b067c5c9f75470a7bd654d3cabd586c3d5868a..ee41cb4849eaaeb387047ac956ed56e3fff663e3 100644
--- a/ui/events/keycodes/keyboard_code_conversion.cc
+++ b/ui/events/keycodes/keyboard_code_conversion.cc
@@ -5,112 +5,447 @@
#include "ui/events/keycodes/keyboard_code_conversion.h"
#include "ui/events/event_constants.h"
+#include "ui/events/keycodes/dom3/dom_key.h"
namespace ui {
-uint16 GetCharacterFromKeyCode(KeyboardCode key_code, int flags) {
+base::char16 GetCharacterFromKeyCode(KeyboardCode key_code, int flags) {
+ ui::DomKey dom_key;
+ base::char16 character;
+ if (GetMeaningFromKeyCode(key_code, flags, &dom_key, &character))
+ return character;
+ return 0;
+}
+
+EVENTS_BASE_EXPORT bool GetMeaningFromKeyCode(KeyboardCode key_code,
+ int flags,
+ DomKey* dom_key,
+ base::char16* character) {
const bool ctrl = (flags & EF_CONTROL_DOWN) != 0;
const bool shift = (flags & EF_SHIFT_DOWN) != 0;
const bool upper = shift ^ ((flags & EF_CAPS_LOCK_DOWN) != 0);
- // Following Windows behavior to map ctrl-a ~ ctrl-z to \x01 ~ \x1A.
- if (key_code >= VKEY_A && key_code <= VKEY_Z) {
- return static_cast<uint16>
- (key_code - VKEY_A + (ctrl ? 1 : (upper ? 'A' : 'a')));
- }
-
- // Other ctrl characters
+ // Control characters.
if (ctrl) {
+ // Following Windows behavior to map ctrl-a ~ ctrl-z to \x01 ~ \x1A.
+ if (key_code >= VKEY_A && key_code <= VKEY_Z) {
+ *character = static_cast<uint16>(key_code - VKEY_A + 1);
+ switch (key_code) {
+ case VKEY_H:
+ *dom_key = DomKey::BACKSPACE;
+ break;
+ case VKEY_I:
+ *dom_key = DomKey::TAB;
+ break;
+ case VKEY_J:
+ case VKEY_M:
+ *dom_key = DomKey::ENTER;
+ break;
+ default:
+ *dom_key = DomKey::CHARACTER;
+ break;
+ }
+ return true;
+ }
+ // Other ctrl characters
if (shift) {
// following graphics chars require shift key to input.
switch (key_code) {
// ctrl-@ maps to \x00 (Null byte)
case VKEY_2:
- return 0;
+ *dom_key = DomKey::CHARACTER;
+ *character = 0;
+ return true;
// ctrl-^ maps to \x1E (Record separator, Information separator two)
case VKEY_6:
- return 0x1E;
+ *dom_key = DomKey::CHARACTER;
+ *character = 0x1E;
+ return true;
// ctrl-_ maps to \x1F (Unit separator, Information separator one)
case VKEY_OEM_MINUS:
- return 0x1F;
+ *dom_key = DomKey::CHARACTER;
+ *character = 0x1F;
+ return true;
// Returns 0 for all other keys to avoid inputting unexpected chars.
default:
- return 0;
+ *dom_key = DomKey::UNIDENTIFIED;
+ *character = 0;
+ return false;
}
} else {
switch (key_code) {
// ctrl-[ maps to \x1B (Escape)
case VKEY_OEM_4:
- return 0x1B;
+ *dom_key = DomKey::ESCAPE;
+ *character = 0x1B;
+ return true;
// ctrl-\ maps to \x1C (File separator, Information separator four)
case VKEY_OEM_5:
- return 0x1C;
+ *dom_key = DomKey::CHARACTER;
+ *character = 0x1C;
+ return true;
// ctrl-] maps to \x1D (Group separator, Information separator three)
case VKEY_OEM_6:
- return 0x1D;
+ *dom_key = DomKey::CHARACTER;
+ *character = 0x1D;
+ return true;
// ctrl-Enter maps to \x0A (Line feed)
case VKEY_RETURN:
- return 0x0A;
+ *dom_key = DomKey::CHARACTER;
+ *character = 0x0A;
+ return true;
// Returns 0 for all other keys to avoid inputting unexpected chars.
default:
- return 0;
+ *dom_key = DomKey::UNIDENTIFIED;
+ *character = 0;
+ return false;
}
}
}
- // For IME support.
- if (key_code == ui::VKEY_PROCESSKEY)
- return 0xE5;
-
// Normal characters
+ if (key_code >= VKEY_A && key_code <= VKEY_Z) {
+ *dom_key = DomKey::CHARACTER;
+ *character = static_cast<uint16>(key_code - VKEY_A + (upper ? 'A' : 'a'));
+ return true;
+ }
if (key_code >= VKEY_0 && key_code <= VKEY_9) {
- return shift ? ")!@#$%^&*("[key_code - VKEY_0] :
- static_cast<uint16>(key_code);
- } else if (key_code >= VKEY_NUMPAD0 && key_code <= VKEY_NUMPAD9) {
- return static_cast<uint16>(key_code - VKEY_NUMPAD0 + '0');
+ *dom_key = DomKey::CHARACTER;
+ *character =
+ shift ? ")!@#$%^&*("[key_code - VKEY_0] : static_cast<uint16>(key_code);
+ return true;
+ }
+ if (key_code >= VKEY_NUMPAD0 && key_code <= VKEY_NUMPAD9) {
+ *dom_key = DomKey::CHARACTER;
+ *character = static_cast<uint16>(key_code - VKEY_NUMPAD0 + '0');
+ return true;
}
+ // Function keys
+ if (key_code >= VKEY_F1 && key_code <= VKEY_F24) {
+ *dom_key =
+ static_cast<DomKey>(key_code - VKEY_F1 + static_cast<int>(DomKey::F1));
+ *character = 0;
+ return true;
+ }
+
+ // Isolated characters.
+ *dom_key = DomKey::CHARACTER;
+ *character = 0;
switch (key_code) {
Wez 2014/12/09 07:00:33 The switches in these functions feels like they'd
kpschoedel 2014/12/09 19:58:43 OK. I agree tables are generally clearer. (Histori
+ case VKEY_BACK:
+ *dom_key = DomKey::BACKSPACE;
+ *character = '\b';
+ return true;
case VKEY_TAB:
- return '\t';
+ *dom_key = DomKey::TAB;
+ *character = '\t';
+ return true;
case VKEY_RETURN:
- return '\r';
+ *dom_key = DomKey::ENTER;
+ *character = '\r';
+ return true;
+ case VKEY_ESCAPE:
+ *dom_key = DomKey::ESCAPE;
+ *character = 0x1B;
+ return true;
+ case VKEY_SPACE:
+ *character = ' ';
+ return true;
case VKEY_MULTIPLY:
- return '*';
+ *character = '*';
+ return true;
case VKEY_ADD:
- return '+';
+ *character = '+';
+ return true;
+ case VKEY_SEPARATOR:
+ *character = ',';
+ return true;
case VKEY_SUBTRACT:
- return '-';
+ *character = '-';
+ return true;
case VKEY_DECIMAL:
- return '.';
+ *character = '.';
+ return true;
case VKEY_DIVIDE:
- return '/';
- case VKEY_SPACE:
- return ' ';
+ *character = '/';
+ return true;
case VKEY_OEM_1:
- return shift ? ':' : ';';
+ *character = shift ? ':' : ';';
+ return true;
case VKEY_OEM_PLUS:
- return shift ? '+' : '=';
+ *character = shift ? '+' : '=';
+ return true;
case VKEY_OEM_COMMA:
- return shift ? '<' : ',';
+ *character = shift ? '<' : ',';
+ return true;
case VKEY_OEM_MINUS:
- return shift ? '_' : '-';
+ *character = shift ? '_' : '-';
+ return true;
case VKEY_OEM_PERIOD:
- return shift ? '>' : '.';
+ *character = shift ? '>' : '.';
+ return true;
case VKEY_OEM_2:
- return shift ? '?' : '/';
+ *character = shift ? '?' : '/';
+ return true;
case VKEY_OEM_3:
- return shift ? '~' : '`';
+ *character = shift ? '~' : '`';
+ return true;
case VKEY_OEM_4:
- return shift ? '{' : '[';
+ *character = shift ? '{' : '[';
+ return true;
case VKEY_OEM_5:
- return shift ? '|' : '\\';
+ *character = shift ? '|' : '\\';
+ return true;
case VKEY_OEM_6:
- return shift ? '}' : ']';
+ *character = shift ? '}' : ']';
+ return true;
case VKEY_OEM_7:
- return shift ? '"' : '\'';
+ *character = shift ? '"' : '\'';
+ return true;
+ case VKEY_OEM_102:
+ *character = shift ? '>' : '<';
+ return true;
+ case VKEY_CLEAR:
+ *dom_key = DomKey::CLEAR;
+ return true;
+ case VKEY_SHIFT:
+ *dom_key = DomKey::SHIFT;
+ return true;
+ case VKEY_CONTROL:
+ *dom_key = DomKey::CONTROL;
+ return true;
+ case VKEY_MENU:
+ *dom_key = DomKey::ALT;
+ return true;
+ case VKEY_PAUSE:
+ *dom_key = DomKey::PAUSE;
+ return true;
+ case VKEY_CAPITAL:
+ *dom_key = DomKey::CAPS_LOCK;
+ return true;
+ case VKEY_KANA:
+ // Windows conflates 'KanaMode' and 'HangulMode'
+ *dom_key = DomKey::KANA_MODE;
+ return true;
+ case VKEY_JUNJA:
+ *dom_key = DomKey::JUNJA_MODE;
+ return true;
+ case VKEY_FINAL:
+ *dom_key = DomKey::FINAL_MODE;
+ return true;
+ case VKEY_HANJA:
+ // Windows conflates 'HanjaMode' and 'KanjiMode'
+ *dom_key = DomKey::HANJA_MODE;
+ return true;
+ case VKEY_CONVERT:
+ *dom_key = DomKey::CONVERT;
+ return true;
+ case VKEY_NONCONVERT:
+ *dom_key = DomKey::NON_CONVERT;
+ return true;
+ case VKEY_ACCEPT:
+ *dom_key = DomKey::ACCEPT;
+ return true;
+ case VKEY_MODECHANGE:
+ *dom_key = DomKey::MODE_CHANGE;
+ return true;
+ case VKEY_PRIOR:
+ *dom_key = DomKey::PAGE_UP;
+ return true;
+ case VKEY_NEXT:
+ *dom_key = DomKey::PAGE_DOWN;
+ return true;
+ case VKEY_END:
+ *dom_key = DomKey::END;
+ return true;
+ case VKEY_HOME:
+ *dom_key = DomKey::HOME;
+ return true;
+ case VKEY_LEFT:
+ *dom_key = DomKey::ARROW_LEFT;
+ return true;
+ case VKEY_UP:
+ *dom_key = DomKey::ARROW_UP;
+ return true;
+ case VKEY_RIGHT:
+ *dom_key = DomKey::ARROW_RIGHT;
+ return true;
+ case VKEY_DOWN:
+ *dom_key = DomKey::ARROW_DOWN;
+ return true;
+ case VKEY_SELECT:
+ *dom_key = DomKey::SELECT;
+ return true;
+ case VKEY_PRINT:
+ *dom_key = DomKey::PRINT;
+ return true;
+ case VKEY_EXECUTE:
+ *dom_key = DomKey::EXECUTE;
+ return true;
+ case VKEY_SNAPSHOT:
+ *dom_key = DomKey::PRINT_SCREEN;
+ return true;
+ case VKEY_INSERT:
+ *dom_key = DomKey::INSERT;
+ return true;
+ case VKEY_DELETE:
+ *dom_key = DomKey::DEL;
+ return true;
+ case VKEY_HELP:
+ *dom_key = DomKey::HELP;
+ return true;
+ case VKEY_LWIN:
+ case VKEY_RWIN:
+ *dom_key = DomKey::OS;
+ return true;
+ case VKEY_APPS:
+ *dom_key = DomKey::MEDIA_APPS;
+ return true;
+ case VKEY_NUMLOCK:
+ *dom_key = DomKey::NUM_LOCK;
+ return true;
+ case VKEY_SCROLL:
+ *dom_key = DomKey::SCROLL_LOCK;
+ return true;
+ case VKEY_LSHIFT:
+ case VKEY_RSHIFT:
+ *dom_key = DomKey::SHIFT;
+ return true;
+ case VKEY_LCONTROL:
+ case VKEY_RCONTROL:
+ *dom_key = DomKey::CONTROL;
+ return true;
+ case VKEY_LMENU:
+ case VKEY_RMENU:
+ *dom_key = DomKey::ALT;
+ return true;
+ case VKEY_BROWSER_BACK:
+ *dom_key = DomKey::BROWSER_BACK;
+ return true;
+ case VKEY_BROWSER_FORWARD:
+ *dom_key = DomKey::BROWSER_FORWARD;
+ return true;
+ case VKEY_BROWSER_REFRESH:
+ *dom_key = DomKey::BROWSER_REFRESH;
+ return true;
+ case VKEY_BROWSER_STOP:
+ *dom_key = DomKey::BROWSER_STOP;
+ return true;
+ case VKEY_BROWSER_SEARCH:
+ *dom_key = DomKey::BROWSER_SEARCH;
+ return true;
+ case VKEY_BROWSER_FAVORITES:
+ *dom_key = DomKey::BROWSER_FAVORITES;
+ return true;
+ case VKEY_BROWSER_HOME:
+ *dom_key = DomKey::BROWSER_HOME;
+ return true;
+ case VKEY_VOLUME_MUTE:
+ *dom_key = DomKey::VOLUME_MUTE;
+ return true;
+ case VKEY_VOLUME_DOWN:
+ *dom_key = DomKey::VOLUME_DOWN;
+ return true;
+ case VKEY_VOLUME_UP:
+ *dom_key = DomKey::VOLUME_UP;
+ return true;
+ case VKEY_MEDIA_NEXT_TRACK:
+ *dom_key = DomKey::MEDIA_TRACK_NEXT;
+ return true;
+ case VKEY_MEDIA_PREV_TRACK:
+ *dom_key = DomKey::MEDIA_TRACK_PREVIOUS;
+ return true;
+ case VKEY_MEDIA_STOP:
+ *dom_key = DomKey::MEDIA_STOP;
+ return true;
+ case VKEY_MEDIA_PLAY_PAUSE:
+ *dom_key = DomKey::MEDIA_PLAY_PAUSE;
+ return true;
+ case VKEY_MEDIA_LAUNCH_MAIL:
+ *dom_key = DomKey::LAUNCH_MAIL;
+ return true;
+ case VKEY_MEDIA_LAUNCH_MEDIA_SELECT:
+ *dom_key = DomKey::LAUNCH_MEDIA_PLAYER;
+ return true;
+ case VKEY_MEDIA_LAUNCH_APP1:
+ *dom_key = DomKey::LAUNCH_MY_COMPUTER;
+ return true;
+ case VKEY_MEDIA_LAUNCH_APP2:
+ *dom_key = DomKey::LAUNCH_CALCULATOR;
+ return true;
+ case VKEY_OEM_8:
+ // ISO Level 5 Shift in ChromeOS
+ *dom_key = DomKey::SUPER;
+ return true;
+#if defined(OS_POSIX)
+ case VKEY_OEM_103:
+ *dom_key = DomKey::MEDIA_REWIND;
+ return true;
+ case VKEY_OEM_104:
+ *dom_key = DomKey::MEDIA_FAST_FORWARD;
+ return true;
+#endif
+ case VKEY_PROCESSKEY:
+ *dom_key = DomKey::PROCESS;
+ return true;
+ case VKEY_DBE_SBCSCHAR:
+ *dom_key = DomKey::HANKAKU;
+ return true;
+ case VKEY_DBE_DBCSCHAR:
+ *dom_key = DomKey::ZENKAKU;
+ return true;
+ case VKEY_ATTN:
+ *dom_key = DomKey::ATTN;
+ return true;
+ case VKEY_CRSEL:
+ *dom_key = DomKey::CR_SEL;
+ return true;
+ case VKEY_EXSEL:
+ *dom_key = DomKey::EX_SEL;
+ return true;
+ case VKEY_EREOF:
+ *dom_key = DomKey::ERASE_EOF;
+ return true;
+ case VKEY_PLAY:
+ *dom_key = DomKey::MEDIA_PLAY;
+ return true;
+ case VKEY_ZOOM:
+ *dom_key = DomKey::ZOOM_TOGGLE;
+ return true;
+ case VKEY_OEM_CLEAR:
+ *dom_key = DomKey::CLEAR;
+ return true;
+#if defined(OS_POSIX)
+ case VKEY_POWER:
+ *dom_key = DomKey::POWER;
+ return true;
+ case VKEY_BRIGHTNESS_DOWN:
+ *dom_key = DomKey::BRIGHTNESS_DOWN;
+ return true;
+ case VKEY_BRIGHTNESS_UP:
+ *dom_key = DomKey::BRIGHTNESS_UP;
+ return true;
+#endif
+ case VKEY_ALTGR:
+ *dom_key = DomKey::ALT_GRAPH;
+ return true;
+#if defined(OS_POSIX)
+ case VKEY_COMPOSE:
+ *dom_key = DomKey::COMPOSE;
+ return true;
+#endif
+ // case VKEY_BACKTAB:
+ // case VKEY_SLEEP:
+ // case VKEY_PACKET:
+ // case VKEY_NONAME:
+ // case VKEY_PA1:
+ // case VKEY_WLAN: // Toggle wifi in ChromeOS
+ // case VKEY_KBD_BRIGHTNESS_DOWN:
+ // case VKEY_KBD_BRIGHTNESS_UP:
default:
- return 0;
+ *dom_key = DomKey::UNIDENTIFIED;
+ return false;
}
}

Powered by Google App Engine
This is Rietveld 408576698