1 /* 2 * Copyright (C) 2006 Nikolas Zimmermann <zimmermann (at) kde.org> 3 * Copyright (C) 2008 Diego Hidalgo C. Gonzalez 4 * Copyright (C) 2009-2010 ProFUSION embedded systems 5 * Copyright (C) 2009-2010 Samsung Electronics 6 * 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 18 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 19 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 22 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 23 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 24 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 25 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 26 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #include "config.h" 32 33 #include "PlatformKeyboardEvent.h" 34 35 #include "NotImplemented.h" 36 #include "TextEncoding.h" 37 #include "WindowsKeyboardCodes.h" 38 39 #include <Evas.h> 40 #include <stdio.h> 41 #include <wtf/HashMap.h> 42 #include <wtf/text/StringConcatenate.h> 43 #include <wtf/text/StringHash.h> 44 45 namespace WebCore { 46 47 typedef HashMap<String, String> KeyMap; 48 typedef HashMap<String, int> WindowsKeyMap; 49 50 static KeyMap gKeyMap; 51 static WindowsKeyMap gWindowsKeyMap; 52 53 static void createKeyMap() 54 { 55 for (unsigned int i = 1; i < 25; i++) { 56 String key = makeString('F', String::number(i)); 57 gKeyMap.set(key, key); 58 } 59 gKeyMap.set("Alt_L", "Alt"); 60 gKeyMap.set("ISO_Level3_Shift", "Alt"); 61 gKeyMap.set("Menu", "Alt"); 62 gKeyMap.set("Shift_L", "Shift"); 63 gKeyMap.set("Shift_R", "Shift"); 64 gKeyMap.set("Down", "Down"); 65 gKeyMap.set("End", "End"); 66 gKeyMap.set("Return", "Enter"); 67 gKeyMap.set("KP_Enter", "Enter"); 68 gKeyMap.set("Home", "Home"); 69 gKeyMap.set("Insert", "Insert"); 70 gKeyMap.set("Left", "Left"); 71 gKeyMap.set("Down", "Down"); 72 gKeyMap.set("Next", "PageDown"); 73 gKeyMap.set("Prior", "PageUp"); 74 gKeyMap.set("Right", "Right"); 75 gKeyMap.set("Up", "Up"); 76 gKeyMap.set("Delete", "U+007F"); 77 gKeyMap.set("Tab", "U+0009"); 78 gKeyMap.set("ISO_Left_Tab", "U+0009"); 79 } 80 81 static void createWindowsKeyMap() 82 { 83 gWindowsKeyMap.set("Return", VK_RETURN); 84 gWindowsKeyMap.set("KP_Return", VK_RETURN); 85 gWindowsKeyMap.set("Alt_L", VK_MENU); 86 gWindowsKeyMap.set("ISO_Level3_Shift", VK_MENU); 87 gWindowsKeyMap.set("Menu", VK_MENU); 88 gWindowsKeyMap.set("Shift_L", VK_SHIFT); 89 gWindowsKeyMap.set("Shift_R", VK_SHIFT); 90 gWindowsKeyMap.set("Control_L", VK_CONTROL); 91 gWindowsKeyMap.set("Control_R", VK_CONTROL); 92 gWindowsKeyMap.set("Pause", VK_PAUSE); 93 gWindowsKeyMap.set("Break", VK_PAUSE); 94 gWindowsKeyMap.set("Caps_Lock", VK_CAPITAL); 95 gWindowsKeyMap.set("Scroll_Lock", VK_SCROLL); 96 gWindowsKeyMap.set("Num_Lock", VK_NUMLOCK); 97 gWindowsKeyMap.set("Escape", VK_ESCAPE); 98 gWindowsKeyMap.set("Tab", VK_TAB); 99 gWindowsKeyMap.set("ISO_Left_Tab", VK_TAB); 100 gWindowsKeyMap.set("BackSpace", VK_BACK); 101 gWindowsKeyMap.set("Space", VK_SPACE); 102 gWindowsKeyMap.set("Next", VK_NEXT); 103 gWindowsKeyMap.set("Prior", VK_PRIOR); 104 gWindowsKeyMap.set("Home", VK_HOME); 105 gWindowsKeyMap.set("End", VK_END); 106 gWindowsKeyMap.set("Right", VK_RIGHT); 107 gWindowsKeyMap.set("Left", VK_LEFT); 108 gWindowsKeyMap.set("Up", VK_UP); 109 gWindowsKeyMap.set("Down", VK_DOWN); 110 gWindowsKeyMap.set("Print", VK_PRINT); 111 gWindowsKeyMap.set("Insert", VK_INSERT); 112 gWindowsKeyMap.set("Delete", VK_DELETE); 113 114 gWindowsKeyMap.set("comma", VK_OEM_COMMA); 115 gWindowsKeyMap.set("less", VK_OEM_COMMA); 116 gWindowsKeyMap.set("period", VK_OEM_PERIOD); 117 gWindowsKeyMap.set("greater", VK_OEM_PERIOD); 118 gWindowsKeyMap.set("semicolon", VK_OEM_1); 119 gWindowsKeyMap.set("colon", VK_OEM_1); 120 gWindowsKeyMap.set("slash", VK_OEM_2); 121 gWindowsKeyMap.set("question", VK_OEM_2); 122 gWindowsKeyMap.set("grave", VK_OEM_3); 123 gWindowsKeyMap.set("asciitilde", VK_OEM_3); 124 gWindowsKeyMap.set("bracketleft", VK_OEM_4); 125 gWindowsKeyMap.set("braceleft", VK_OEM_4); 126 gWindowsKeyMap.set("backslash", VK_OEM_5); 127 gWindowsKeyMap.set("bar", VK_OEM_5); 128 gWindowsKeyMap.set("bracketright", VK_OEM_6); 129 gWindowsKeyMap.set("braceright", VK_OEM_6); 130 gWindowsKeyMap.set("apostrophe", VK_OEM_7); 131 gWindowsKeyMap.set("quotedbl", VK_OEM_7); 132 133 // Alphabet 134 const char* alphabet = "abcdefghijklmnopqrstuvwxyz"; 135 for (unsigned int i = 0; i < 26; i++) { 136 String key(alphabet + i, 1); 137 gWindowsKeyMap.set(key, VK_A + i); 138 } 139 140 // Digits 141 for (unsigned int i = 0; i < 10; i++) { 142 String key = String::number(i); 143 gWindowsKeyMap.set(key, VK_0 + i); 144 } 145 146 // Shifted digits 147 gWindowsKeyMap.set("exclam", VK_1); 148 gWindowsKeyMap.set("at", VK_2); 149 gWindowsKeyMap.set("numbersign", VK_3); 150 gWindowsKeyMap.set("dollar", VK_4); 151 gWindowsKeyMap.set("percent", VK_5); 152 gWindowsKeyMap.set("asciicircum", VK_6); 153 gWindowsKeyMap.set("ampersand", VK_7); 154 gWindowsKeyMap.set("asterisk", VK_8); 155 gWindowsKeyMap.set("parenleft", VK_9); 156 gWindowsKeyMap.set("parenright", VK_0); 157 gWindowsKeyMap.set("minus", VK_OEM_MINUS); 158 gWindowsKeyMap.set("underscore", VK_OEM_MINUS); 159 gWindowsKeyMap.set("equal", VK_OEM_PLUS); 160 gWindowsKeyMap.set("plus", VK_OEM_PLUS); 161 162 // F_XX 163 for (unsigned int i = 1; i < 25; i++) { 164 String key = makeString('F', String::number(i)); 165 gWindowsKeyMap.set(key, VK_F1 + i); 166 } 167 } 168 169 static String keyIdentifierForEvasKeyName(String& keyName) 170 { 171 if (gKeyMap.isEmpty()) 172 createKeyMap(); 173 174 if (gKeyMap.contains(keyName)) 175 return gKeyMap.get(keyName); 176 177 return keyName; 178 } 179 180 static int windowsKeyCodeForEvasKeyName(String& keyName) 181 { 182 if (gWindowsKeyMap.isEmpty()) 183 createWindowsKeyMap(); 184 185 if (gWindowsKeyMap.contains(keyName)) 186 return gWindowsKeyMap.get(keyName); 187 188 return 0; 189 } 190 191 PlatformKeyboardEvent::PlatformKeyboardEvent(const Evas_Event_Key_Down* event) 192 : m_type(KeyDown) 193 , m_text(String::fromUTF8(event->string)) 194 , m_shiftKey(evas_key_modifier_is_set(event->modifiers, "Shift")) 195 , m_ctrlKey(evas_key_modifier_is_set(event->modifiers, "Control")) 196 , m_altKey(evas_key_modifier_is_set(event->modifiers, "Alt")) 197 , m_metaKey(evas_key_modifier_is_set(event->modifiers, "Meta")) 198 { 199 String keyName = String(event->key); 200 m_keyIdentifier = keyIdentifierForEvasKeyName(keyName); 201 m_windowsVirtualKeyCode = windowsKeyCodeForEvasKeyName(keyName); 202 203 // FIXME: 204 m_isKeypad = false; 205 m_autoRepeat = false; 206 } 207 208 PlatformKeyboardEvent::PlatformKeyboardEvent(const Evas_Event_Key_Up* event) 209 : m_type(KeyUp) 210 , m_text(String::fromUTF8(event->string)) 211 , m_shiftKey(evas_key_modifier_is_set(event->modifiers, "Shift")) 212 , m_ctrlKey(evas_key_modifier_is_set(event->modifiers, "Control")) 213 , m_altKey(evas_key_modifier_is_set(event->modifiers, "Alt")) 214 , m_metaKey(evas_key_modifier_is_set(event->modifiers, "Meta")) 215 { 216 String keyName = String(event->key); 217 m_keyIdentifier = keyIdentifierForEvasKeyName(keyName); 218 m_windowsVirtualKeyCode = windowsKeyCodeForEvasKeyName(keyName); 219 220 // FIXME: 221 m_isKeypad = false; 222 m_autoRepeat = false; 223 } 224 225 void PlatformKeyboardEvent::disambiguateKeyDownEvent(Type type, bool) 226 { 227 ASSERT(m_type == KeyDown); 228 m_type = type; 229 230 if (type == RawKeyDown) { 231 m_text = String(); 232 m_unmodifiedText = String(); 233 } else { 234 m_keyIdentifier = String(); 235 m_windowsVirtualKeyCode = 0; 236 } 237 } 238 239 bool PlatformKeyboardEvent::currentCapsLockState() 240 { 241 notImplemented(); 242 return false; 243 } 244 245 void PlatformKeyboardEvent::getCurrentModifierState(bool& shiftKey, bool& ctrlKey, bool& altKey, bool& metaKey) 246 { 247 notImplemented(); 248 shiftKey = false; 249 ctrlKey = false; 250 altKey = false; 251 metaKey = false; 252 } 253 254 } 255