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 #include <wtf/Platform.h> 32 33 #if PLATFORM(MAC) 34 #include <wtf/RetainPtr.h> 35 #ifdef __OBJC__ 36 @class NSEvent; 37 #else 38 class NSEvent; 39 #endif 40 #endif 41 42 #if PLATFORM(WIN) 43 typedef struct HWND__ *HWND; 44 typedef unsigned WPARAM; 45 typedef long LPARAM; 46 #endif 47 48 #if PLATFORM(GTK) 49 typedef struct _GdkEventKey GdkEventKey; 50 #endif 51 52 #if PLATFORM(QT) 53 QT_BEGIN_NAMESPACE 54 class QKeyEvent; 55 QT_END_NAMESPACE 56 #endif 57 58 #if PLATFORM(WX) 59 class wxKeyEvent; 60 #endif 61 62 #if PLATFORM(HAIKU) 63 class BMessage; 64 #endif 65 66 namespace WebCore { 67 68 class PlatformKeyboardEvent : public FastAllocBase { 69 public: 70 enum Type { 71 // KeyDown is sent by platforms such as Mac OS X, gtk and Qt, and has information about both physical pressed key, and its translation. 72 // For DOM processing, it needs to be disambiguated as RawKeyDown or Char event. 73 KeyDown, 74 75 // KeyUp is sent by all platforms. 76 KeyUp, 77 78 // These events are sent by platforms such as Windows and wxWidgets. RawKeyDown only has information about a physical key, and Char 79 // only has information about a character it was translated into. 80 RawKeyDown, 81 Char 82 }; 83 84 enum ModifierKey { 85 AltKey = 1 << 0, 86 CtrlKey = 1 << 1, 87 MetaKey = 1 << 2, 88 ShiftKey = 1 << 3, 89 }; 90 type()91 Type type() const { return m_type; } 92 void disambiguateKeyDownEvent(Type, bool backwardCompatibilityMode = false); // Only used on platforms that need it, i.e. those that generate KeyDown events. 93 94 // Text as as generated by processing a virtual key code with a keyboard layout 95 // (in most cases, just a character code, but the layout can emit several 96 // characters in a single keypress event on some platforms). 97 // This may bear no resemblance to the ultimately inserted text if an input method 98 // processes the input. 99 // Will be null for KeyUp and RawKeyDown events. text()100 String text() const { return m_text; } 101 102 // Text that would have been generated by the keyboard if no modifiers were pressed 103 // (except for Shift); useful for shortcut (accelerator) key handling. 104 // Otherwise, same as text(). unmodifiedText()105 String unmodifiedText() const { return m_unmodifiedText; } 106 107 // Most compatible Windows virtual key code associated with the event. 108 // Zero for Char events. windowsVirtualKeyCode()109 int windowsVirtualKeyCode() const { return m_windowsVirtualKeyCode; } setWindowsVirtualKeyCode(int code)110 void setWindowsVirtualKeyCode(int code) { m_windowsVirtualKeyCode = code; } 111 nativeVirtualKeyCode()112 int nativeVirtualKeyCode() const { return m_nativeVirtualKeyCode; } setNativeVirtualKeyCode(int code)113 void setNativeVirtualKeyCode(int code) { m_nativeVirtualKeyCode = code; } 114 keyIdentifier()115 String keyIdentifier() const { return m_keyIdentifier; } isAutoRepeat()116 bool isAutoRepeat() const { return m_autoRepeat; } setIsAutoRepeat(bool in)117 void setIsAutoRepeat(bool in) { m_autoRepeat = in; } isKeypad()118 bool isKeypad() const { return m_isKeypad; } shiftKey()119 bool shiftKey() const { return m_shiftKey; } ctrlKey()120 bool ctrlKey() const { return m_ctrlKey; } altKey()121 bool altKey() const { return m_altKey; } metaKey()122 bool metaKey() const { return m_metaKey; } modifiers()123 unsigned modifiers() const { 124 return (altKey() ? AltKey : 0) 125 | (ctrlKey() ? CtrlKey : 0) 126 | (metaKey() ? MetaKey : 0) 127 | (shiftKey() ? ShiftKey : 0); 128 } 129 130 static bool currentCapsLockState(); 131 132 #if PLATFORM(MAC) 133 PlatformKeyboardEvent(); 134 PlatformKeyboardEvent(NSEvent*); macEvent()135 NSEvent* macEvent() const { return m_macEvent.get(); } 136 #endif 137 138 #if PLATFORM(WIN) 139 PlatformKeyboardEvent(HWND, WPARAM, LPARAM, Type, bool); 140 #endif 141 142 #if PLATFORM(GTK) 143 PlatformKeyboardEvent(GdkEventKey*); 144 GdkEventKey* gdkEventKey() const; 145 #endif 146 147 #if PLATFORM(ANDROID) 148 PlatformKeyboardEvent(int keyCode, UChar32 unichar, int repeatCount, 149 bool down, bool cap, bool alt, bool sym); unichar()150 UChar32 unichar() const { return m_unichar; } repeatCount()151 int repeatCount() const { return m_repeatCount; } 152 #endif 153 154 #if PLATFORM(QT) 155 PlatformKeyboardEvent(QKeyEvent*); qtEvent()156 QKeyEvent* qtEvent() const { return m_qtEvent; } 157 #endif 158 159 #if PLATFORM(WX) 160 PlatformKeyboardEvent(wxKeyEvent&); 161 #endif 162 163 #if PLATFORM(HAIKU) 164 PlatformKeyboardEvent(BMessage*); 165 #endif 166 167 #if PLATFORM(WIN) || PLATFORM(CHROMIUM) isSystemKey()168 bool isSystemKey() const { return m_isSystemKey; } 169 #endif 170 171 protected: 172 Type m_type; 173 String m_text; 174 String m_unmodifiedText; 175 String m_keyIdentifier; 176 bool m_autoRepeat; 177 int m_windowsVirtualKeyCode; 178 int m_nativeVirtualKeyCode; 179 bool m_isKeypad; 180 bool m_shiftKey; 181 bool m_ctrlKey; 182 bool m_altKey; 183 bool m_metaKey; 184 185 #if PLATFORM(ANDROID) 186 /* the actual repeatCount (as opposed to just a bool m_autoRepeat) 187 0 for initial down and up 188 */ 189 int m_repeatCount; 190 /* The originall unichar value. Sometimes the m_text/m_unmodifiedText 191 fields are stripped (e.g. for RawKeyDown), so we record it also here 192 in case someone (e.g. plugins) want to sniff it w/o waiting for a 193 Char event type. 194 */ 195 UChar32 m_unichar; 196 #endif 197 198 #if PLATFORM(MAC) 199 RetainPtr<NSEvent> m_macEvent; 200 #endif 201 #if PLATFORM(WIN) || PLATFORM(CHROMIUM) 202 bool m_isSystemKey; 203 #endif 204 #if PLATFORM(GTK) 205 GdkEventKey* m_gdkEventKey; 206 #endif 207 #if PLATFORM(QT) 208 QKeyEvent* m_qtEvent; 209 #endif 210 }; 211 212 } // namespace WebCore 213 214 #endif // PlatformKeyboardEvent_h 215