1 /* 2 * Copyright (C) 2010 Company 100, Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #include "config.h" 27 #include "PlatformKeyboardEvent.h" 28 29 #include "NotImplemented.h" 30 #include "WindowsKeyboardCodes.h" 31 32 #include <AEEEvent.h> 33 #include <AEEIKeysMapping.h> 34 #include <AEEKeysMapping.bid> 35 #include <AEEStdDef.h> 36 #include <AEEVCodes.h> 37 38 #include <wtf/brew/RefPtrBrew.h> 39 #include <wtf/brew/ShellBrew.h> 40 41 namespace WebCore { 42 43 static String keyIdentifierForBrewKeyCode(uint16 keyCode) 44 { 45 switch (keyCode) { 46 case AVK_LALT: 47 case AVK_RALT: 48 return "Alt"; 49 case AVK_LCTRL: 50 case AVK_RCTRL: 51 return "Control"; 52 case AVK_LSHIFT: 53 case AVK_RSHIFT: 54 return "Shift"; 55 case AVK_CAPLK: 56 return "CapsLock"; 57 case AVK_FUNCTION1: 58 return "F1"; 59 case AVK_FUNCTION2: 60 return "F2"; 61 case AVK_FUNCTION3: 62 return "F3"; 63 case AVK_FUNCTION4: 64 return "F4"; 65 case AVK_FUNCTION5: 66 return "F5"; 67 case AVK_FUNCTION6: 68 return "F6"; 69 case AVK_FUNCTION7: 70 return "F7"; 71 case AVK_FUNCTION8: 72 return "F8"; 73 case AVK_FUNCTION9: 74 return "F9"; 75 case AVK_FUNCTION10: 76 return "F10"; 77 case AVK_FUNCTION11: 78 return "F11"; 79 case AVK_FUNCTION12: 80 return "F12"; 81 case AVK_PRSCRN: 82 return "PrintScreen"; 83 case AVK_LEFT: 84 return "Left"; 85 case AVK_RIGHT: 86 return "Right"; 87 case AVK_UP: 88 return "Up"; 89 case AVK_DOWN: 90 return "Down"; 91 case AVK_TXINSERT: 92 return "Insert"; 93 case AVK_ENTER: 94 return "Enter"; 95 case AVK_TXHOME: 96 return "Home"; 97 case AVK_TXDELETE: 98 // Standard says that DEL becomes U+007F. 99 return "U+007F"; 100 case AVK_TXEND: 101 return "End"; 102 case AVK_TXPGUP: 103 return "PageUp"; 104 case AVK_TXPGDOWN: 105 return "PageDown"; 106 case AVK_FUNCTION: 107 return "U+0009"; 108 default: 109 return String::format("U+%04X", toASCIIUpper(keyCode)); 110 } 111 } 112 113 static int windowsKeyCodeForKeyEvent(uint16 code) 114 { 115 switch (code) { 116 case AVK_CLR: 117 return VK_BACK; // (08) BACKSPACE key 118 case AVK_ENTER: 119 return VK_RETURN; // (0D) Return key 120 case AVK_SPACE: 121 return VK_SPACE; // (20) SPACEBAR 122 case AVK_TXPGUP: 123 return VK_PRIOR; // (21) PAGE UP key 124 case AVK_TXPGDOWN: 125 return VK_NEXT; // (22) PAGE DOWN key 126 case AVK_TXEND: 127 return VK_END; // (23) END key 128 case AVK_TXHOME: 129 return VK_HOME; // (24) HOME key 130 case AVK_LEFT: 131 return VK_LEFT; // (25) LEFT ARROW key 132 case AVK_UP: 133 return VK_UP; // (26) UP ARROW key 134 case AVK_RIGHT: 135 return VK_RIGHT; // (27) RIGHT ARROW key 136 case AVK_DOWN: 137 return VK_DOWN; // (28) DOWN ARROW key 138 case AVK_TXINSERT: 139 return VK_INSERT; // (2D) INS key 140 case AVK_TXDELETE: 141 return VK_DELETE; // (2E) DEL key 142 case AVK_FUNCTION: 143 return VK_TAB; // (09) TAB key 144 default: 145 return 0; 146 } 147 } 148 149 static inline String singleCharacterString(UChar c) 150 { 151 UChar text; 152 153 // Some key codes are not mapped to Unicode characters. Convert them to Unicode characters here. 154 switch (c) { 155 case AVK_0: 156 text = VK_0; 157 break; 158 case AVK_1: 159 text = VK_1; 160 break; 161 case AVK_2: 162 text = VK_2; 163 break; 164 case AVK_3: 165 text = VK_3; 166 break; 167 case AVK_4: 168 text = VK_4; 169 break; 170 case AVK_5: 171 text = VK_5; 172 break; 173 case AVK_6: 174 text = VK_6; 175 break; 176 case AVK_7: 177 text = VK_7; 178 break; 179 case AVK_8: 180 text = VK_8; 181 break; 182 case AVK_9: 183 text = VK_9; 184 break; 185 case AVK_STAR: 186 text = '*'; 187 break; 188 case AVK_POUND: 189 text = '#'; 190 break; 191 case AVK_FUNCTION1: 192 text = '='; 193 break; 194 case AVK_FUNCTION2: 195 text = '/'; 196 break; 197 case AVK_FUNCTION3: 198 text = '_'; 199 break; 200 case AVK_PUNC1: 201 text = ','; 202 break; 203 case AVK_PUNC2: 204 text = '.'; 205 break; 206 case AVK_SPACE: 207 text = VK_SPACE; 208 break; 209 default: 210 text = c; 211 break; 212 } 213 214 return String(&text, 1); 215 } 216 217 PlatformKeyboardEvent::PlatformKeyboardEvent(AEEEvent event, uint16 code, uint32 modifiers, Type type) 218 : m_type(type) 219 , m_isKeypad(false) 220 , m_metaKey(false) 221 , m_windowsVirtualKeyCode((type == RawKeyDown || type == KeyUp) ? windowsKeyCodeForKeyEvent(code) : 0) 222 { 223 if ((m_type == Char) && modifiers) { 224 RefPtr<IKeysMapping> keysMapping = createRefPtrInstance<IKeysMapping>(AEECLSID_KeysMapping); 225 int result = IKeysMapping_GetMapping(keysMapping.get(), code, modifiers, reinterpret_cast<AECHAR*>(&code)); 226 if (result == AEE_SUCCESS) // Reset the modifier when key code is successfully mapped. 227 modifiers = 0; 228 } 229 230 m_text = (type == Char) ? singleCharacterString(code) : String(); 231 m_unmodifiedText = (type == Char) ? singleCharacterString(code) : String(); 232 m_keyIdentifier = (type == Char) ? String() : keyIdentifierForBrewKeyCode(code); 233 m_nativeVirtualKeyCode = code; 234 m_autoRepeat = modifiers & KB_AUTOREPEAT; 235 m_shiftKey = modifiers & (KB_LSHIFT | KB_RSHIFT); 236 m_ctrlKey = modifiers & (KB_LCTRL | KB_RCTRL); 237 m_altKey = modifiers & (KB_LALT | KB_RALT); 238 } 239 240 void PlatformKeyboardEvent::disambiguateKeyDownEvent(Type type, bool) 241 { 242 // No KeyDown events on BREW to disambiguate. 243 ASSERT_NOT_REACHED(); 244 } 245 246 bool PlatformKeyboardEvent::currentCapsLockState() 247 { 248 notImplemented(); 249 return false; 250 } 251 252 void PlatformKeyboardEvent::getCurrentModifierState(bool& shiftKey, bool& ctrlKey, bool& altKey, bool& metaKey) 253 { 254 notImplemented(); 255 shiftKey = false; 256 ctrlKey = false; 257 altKey = false; 258 metaKey = false; 259 } 260 261 } // namespace WebCore 262