1/* 2 * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc. All rights reserved. 3 * Copyright (C) 2008 Collabora, Ltd. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27#ifndef PlatformKeyboardEvent_h 28#define PlatformKeyboardEvent_h 29 30#include "PlatformString.h" 31 32#if PLATFORM(MAC) 33#include <wtf/RetainPtr.h> 34#ifdef __OBJC__ 35@class NSEvent; 36#else 37class NSEvent; 38#endif 39#endif 40 41#if PLATFORM(WIN) 42typedef struct HWND__ *HWND; 43typedef unsigned WPARAM; 44typedef long LPARAM; 45#endif 46 47#if PLATFORM(GTK) 48typedef struct _GdkEventKey GdkEventKey; 49#endif 50 51#if PLATFORM(QT) 52QT_BEGIN_NAMESPACE 53class QKeyEvent; 54QT_END_NAMESPACE 55#endif 56 57#if PLATFORM(WX) 58class wxKeyEvent; 59#endif 60 61#if PLATFORM(HAIKU) 62class BMessage; 63#endif 64 65#if PLATFORM(EFL) 66typedef struct _Evas_Event_Key_Down Evas_Event_Key_Down; 67typedef struct _Evas_Event_Key_Up Evas_Event_Key_Up; 68#endif 69 70#if PLATFORM(BREWMP) 71typedef unsigned short uint16; 72typedef unsigned long int uint32; 73#define AEEEvent uint16 74#endif 75 76namespace WebCore { 77 78 class PlatformKeyboardEvent { 79 WTF_MAKE_FAST_ALLOCATED; 80 public: 81 enum Type { 82 // KeyDown is sent by platforms such as Mac OS X, gtk and Qt, and has information about both physical pressed key, and its translation. 83 // For DOM processing, it needs to be disambiguated as RawKeyDown or Char event. 84 KeyDown, 85 86 // KeyUp is sent by all platforms. 87 KeyUp, 88 89 // These events are sent by platforms such as Windows and wxWidgets. RawKeyDown only has information about a physical key, and Char 90 // only has information about a character it was translated into. 91 RawKeyDown, 92 Char 93 }; 94 95 enum ModifierKey { 96 AltKey = 1 << 0, 97 CtrlKey = 1 << 1, 98 MetaKey = 1 << 2, 99 ShiftKey = 1 << 3 100 }; 101 102 PlatformKeyboardEvent() 103 : m_type(KeyDown) 104 , m_autoRepeat(false) 105 , m_windowsVirtualKeyCode(0) 106 , m_nativeVirtualKeyCode(0) 107 , m_isKeypad(false) 108 , m_shiftKey(false) 109 , m_ctrlKey(false) 110 , m_altKey(false) 111 , m_metaKey(false) 112#if PLATFORM(WIN) || PLATFORM(CHROMIUM) 113 , m_isSystemKey(false) 114#endif 115#if PLATFORM(GTK) 116 , m_gdkEventKey(0) 117#endif 118#if PLATFORM(QT) 119 , m_qtEvent(0) 120#endif 121 { 122 } 123 124 Type type() const { return m_type; } 125 void disambiguateKeyDownEvent(Type, bool backwardCompatibilityMode = false); // Only used on platforms that need it, i.e. those that generate KeyDown events. 126 127 // Text as as generated by processing a virtual key code with a keyboard layout 128 // (in most cases, just a character code, but the layout can emit several 129 // characters in a single keypress event on some platforms). 130 // This may bear no resemblance to the ultimately inserted text if an input method 131 // processes the input. 132 // Will be null for KeyUp and RawKeyDown events. 133 String text() const { return m_text; } 134 135 // Text that would have been generated by the keyboard if no modifiers were pressed 136 // (except for Shift); useful for shortcut (accelerator) key handling. 137 // Otherwise, same as text(). 138 String unmodifiedText() const { return m_unmodifiedText; } 139 140 // Most compatible Windows virtual key code associated with the event. 141 // Zero for Char events. 142 int windowsVirtualKeyCode() const { return m_windowsVirtualKeyCode; } 143 void setWindowsVirtualKeyCode(int code) { m_windowsVirtualKeyCode = code; } 144 145 int nativeVirtualKeyCode() const { return m_nativeVirtualKeyCode; } 146 void setNativeVirtualKeyCode(int code) { m_nativeVirtualKeyCode = code; } 147 148 String keyIdentifier() const { return m_keyIdentifier; } 149 bool isAutoRepeat() const { return m_autoRepeat; } 150 void setIsAutoRepeat(bool in) { m_autoRepeat = in; } 151 bool isKeypad() const { return m_isKeypad; } 152 bool shiftKey() const { return m_shiftKey; } 153 bool ctrlKey() const { return m_ctrlKey; } 154 bool altKey() const { return m_altKey; } 155 bool metaKey() const { return m_metaKey; } 156 unsigned modifiers() const { 157 return (altKey() ? AltKey : 0) 158 | (ctrlKey() ? CtrlKey : 0) 159 | (metaKey() ? MetaKey : 0) 160 | (shiftKey() ? ShiftKey : 0); 161 } 162 163 static bool currentCapsLockState(); 164 static void getCurrentModifierState(bool& shiftKey, bool& ctrlKey, bool& altKey, bool& metaKey); 165 166#if PLATFORM(MAC) 167 PlatformKeyboardEvent(NSEvent*); 168 NSEvent* macEvent() const { return m_macEvent.get(); } 169#endif 170 171#if PLATFORM(WIN) 172 PlatformKeyboardEvent(HWND, WPARAM, LPARAM, Type, bool); 173#endif 174 175#if PLATFORM(GTK) 176 PlatformKeyboardEvent(GdkEventKey*); 177 GdkEventKey* gdkEventKey() const; 178 179 // Used by WebKit2 180 static String keyIdentifierForGdkKeyCode(unsigned); 181 static int windowsKeyCodeForGdkKeyCode(unsigned); 182 static String singleCharacterString(unsigned); 183#endif 184 185#if PLATFORM(ANDROID) 186 PlatformKeyboardEvent(int keyCode, UChar32 unichar, int repeatCount, 187 bool down, bool cap, bool alt, bool sym); 188 UChar32 unichar() const { return m_unichar; } 189 int repeatCount() const { return m_repeatCount; } 190#endif 191 192#if PLATFORM(QT) 193 PlatformKeyboardEvent(QKeyEvent*); 194 QKeyEvent* qtEvent() const { return m_qtEvent; } 195 uint32_t nativeModifiers() const; 196 uint32_t nativeScanCode() const; 197#endif 198 199#if PLATFORM(WX) 200 PlatformKeyboardEvent(wxKeyEvent&); 201#endif 202 203#if PLATFORM(HAIKU) 204 PlatformKeyboardEvent(BMessage*); 205#endif 206 207#if PLATFORM(BREWMP) 208 PlatformKeyboardEvent(AEEEvent, uint16, uint32, Type); 209#endif 210 211#if PLATFORM(WIN) || PLATFORM(CHROMIUM) 212 bool isSystemKey() const { return m_isSystemKey; } 213#endif 214 215#if PLATFORM(EFL) 216 PlatformKeyboardEvent(const Evas_Event_Key_Down*); 217 PlatformKeyboardEvent(const Evas_Event_Key_Up*); 218#endif 219 220 protected: 221 Type m_type; 222 String m_text; 223 String m_unmodifiedText; 224 String m_keyIdentifier; 225 bool m_autoRepeat; 226 int m_windowsVirtualKeyCode; 227 int m_nativeVirtualKeyCode; 228 bool m_isKeypad; 229 bool m_shiftKey; 230 bool m_ctrlKey; 231 bool m_altKey; 232 bool m_metaKey; 233 234#if PLATFORM(ANDROID) 235 /* the actual repeatCount (as opposed to just a bool m_autoRepeat) 236 0 for initial down and up 237 */ 238 int m_repeatCount; 239 /* The originall unichar value. Sometimes the m_text/m_unmodifiedText 240 fields are stripped (e.g. for RawKeyDown), so we record it also here 241 in case someone (e.g. plugins) want to sniff it w/o waiting for a 242 Char event type. 243 */ 244 UChar32 m_unichar; 245#endif 246 247#if PLATFORM(MAC) 248 RetainPtr<NSEvent> m_macEvent; 249#endif 250#if PLATFORM(WIN) || PLATFORM(CHROMIUM) 251 bool m_isSystemKey; 252#endif 253#if PLATFORM(GTK) 254 GdkEventKey* m_gdkEventKey; 255#endif 256#if PLATFORM(QT) 257 QKeyEvent* m_qtEvent; 258#endif 259 }; 260 261#if PLATFORM(QT) 262// Used by WebKit2. 263String keyIdentifierForQtKeyCode(int keyCode); 264int windowsKeyCodeForKeyEvent(unsigned int keycode, bool isKeypad = false); 265#endif 266 267} // namespace WebCore 268 269#endif // PlatformKeyboardEvent_h 270