Unreviewed, rolling out r126169.
[WebKit-https.git] / Source / WebCore / platform / PlatformKeyboardEvent.h
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 "PlatformEvent.h"
31 #if OS(WINDOWS)
32 #include "WindowsExtras.h"
33 #endif
34 #include <wtf/text/WTFString.h>
35
36 #if PLATFORM(MAC)
37 #include <wtf/RetainPtr.h>
38 OBJC_CLASS NSEvent;
39 #endif
40
41 #if PLATFORM(GTK)
42 typedef struct _GdkEventKey GdkEventKey;
43 #include "CompositionResults.h"
44 #endif
45
46 #if PLATFORM(QT)
47 QT_BEGIN_NAMESPACE
48 class QKeyEvent;
49 QT_END_NAMESPACE
50 #endif
51
52 #if PLATFORM(WX)
53 class wxKeyEvent;
54 #endif
55
56 #if PLATFORM(BLACKBERRY)
57 namespace BlackBerry {
58 namespace Platform {
59 class KeyboardEvent;
60 }
61 }
62 #endif
63
64 #if PLATFORM(EFL)
65 typedef struct _Evas_Event_Key_Down Evas_Event_Key_Down;
66 typedef struct _Evas_Event_Key_Up Evas_Event_Key_Up;
67 #endif
68
69 namespace WebCore {
70
71     class PlatformKeyboardEvent : public PlatformEvent {
72     public:
73         PlatformKeyboardEvent()
74             : PlatformEvent(PlatformEvent::KeyDown)
75             , m_windowsVirtualKeyCode(0)
76             , m_nativeVirtualKeyCode(0)
77             , m_macCharCode(0)
78             , m_autoRepeat(false)
79             , m_isKeypad(false)
80             , m_isSystemKey(false)
81 #if PLATFORM(BLACKBERRY)
82             , m_unmodifiedCharacter(0)
83 #endif
84 #if PLATFORM(GTK)
85             , m_gdkEventKey(0)
86 #endif
87 #if PLATFORM(QT)
88             , m_qtEvent(0)
89 #endif
90         {
91         }
92
93         PlatformKeyboardEvent(Type type, const String& text, const String& unmodifiedText, const String& keyIdentifier, int windowsVirtualKeyCode, int nativeVirtualKeyCode, int macCharCode, bool isAutoRepeat, bool isKeypad, bool isSystemKey, Modifiers modifiers, double timestamp)
94             : PlatformEvent(type, modifiers, timestamp)
95             , m_text(text)
96             , m_unmodifiedText(unmodifiedText)
97             , m_keyIdentifier(keyIdentifier)
98             , m_windowsVirtualKeyCode(windowsVirtualKeyCode)
99             , m_nativeVirtualKeyCode(nativeVirtualKeyCode)
100             , m_macCharCode(macCharCode)
101             , m_autoRepeat(isAutoRepeat)
102             , m_isKeypad(isKeypad)
103             , m_isSystemKey(isSystemKey)
104         {
105         }
106
107         void disambiguateKeyDownEvent(Type, bool backwardCompatibilityMode = false); // Only used on platforms that need it, i.e. those that generate KeyDown events.
108
109         // Text as as generated by processing a virtual key code with a keyboard layout
110         // (in most cases, just a character code, but the layout can emit several
111         // characters in a single keypress event on some platforms).
112         // This may bear no resemblance to the ultimately inserted text if an input method
113         // processes the input.
114         // Will be null for KeyUp and RawKeyDown events.
115         String text() const { return m_text; }
116
117         // Text that would have been generated by the keyboard if no modifiers were pressed
118         // (except for Shift); useful for shortcut (accelerator) key handling.
119         // Otherwise, same as text().
120         String unmodifiedText() const { return m_unmodifiedText; }
121
122         String keyIdentifier() const { return m_keyIdentifier; }
123
124         // Most compatible Windows virtual key code associated with the event.
125         // Zero for Char events.
126         int windowsVirtualKeyCode() const { return m_windowsVirtualKeyCode; }
127         void setWindowsVirtualKeyCode(int code) { m_windowsVirtualKeyCode = code; }
128
129         int nativeVirtualKeyCode() const { return m_nativeVirtualKeyCode; }
130         int macCharCode() const { return m_macCharCode; }
131
132         bool isAutoRepeat() const { return m_autoRepeat; }
133         bool isKeypad() const { return m_isKeypad; }
134         bool isSystemKey() const { return m_isSystemKey; }
135
136         static bool currentCapsLockState();
137         static void getCurrentModifierState(bool& shiftKey, bool& ctrlKey, bool& altKey, bool& metaKey);
138
139 #if PLATFORM(BLACKBERRY)
140         unsigned short unmodifiedCharacter() const { return m_unmodifiedCharacter; }
141 #endif
142
143 #if PLATFORM(MAC)
144         NSEvent* macEvent() const { return m_macEvent.get(); }
145 #endif
146
147 #if PLATFORM(WIN)
148         PlatformKeyboardEvent(HWND, WPARAM, LPARAM, Type, bool);
149 #endif
150
151 #if PLATFORM(GTK)
152         PlatformKeyboardEvent(GdkEventKey*, const CompositionResults&);
153         GdkEventKey* gdkEventKey() const { return m_gdkEventKey; }
154         const CompositionResults& compositionResults() const { return m_compositionResults; }
155
156         // Used by WebKit2
157         static String keyIdentifierForGdkKeyCode(unsigned);
158         static int windowsKeyCodeForGdkKeyCode(unsigned);
159         static String singleCharacterString(unsigned);
160 #endif
161
162 #if PLATFORM(QT)
163         PlatformKeyboardEvent(QKeyEvent*);
164         QKeyEvent* qtEvent() const { return m_qtEvent; }
165         uint32_t nativeModifiers() const;
166         uint32_t nativeScanCode() const;
167 #endif
168
169 #if PLATFORM(WX)
170         PlatformKeyboardEvent(wxKeyEvent&);
171 #endif
172
173 #if PLATFORM(BLACKBERRY)
174         PlatformKeyboardEvent(const BlackBerry::Platform::KeyboardEvent&);
175 #endif
176
177 #if PLATFORM(EFL)
178         explicit PlatformKeyboardEvent(const Evas_Event_Key_Down*);
179         explicit PlatformKeyboardEvent(const Evas_Event_Key_Up*);
180 #endif
181
182     protected:
183         String m_text;
184         String m_unmodifiedText;
185         String m_keyIdentifier;
186         int m_windowsVirtualKeyCode;
187         int m_nativeVirtualKeyCode;
188         int m_macCharCode;
189         bool m_autoRepeat;
190         bool m_isKeypad;
191         bool m_isSystemKey;
192
193 #if PLATFORM(BLACKBERRY)
194         unsigned short m_unmodifiedCharacter;
195 #endif
196
197 #if PLATFORM(MAC)
198         RetainPtr<NSEvent> m_macEvent;
199 #endif
200 #if PLATFORM(GTK)
201         GdkEventKey* m_gdkEventKey;
202         CompositionResults m_compositionResults;
203 #endif
204 #if PLATFORM(QT)
205         QKeyEvent* m_qtEvent;
206 #endif
207     };
208     
209 #if PLATFORM(QT)
210 // Used by WebKit2.
211 String keyIdentifierForQtKeyCode(int keyCode);
212 int windowsKeyCodeForKeyEvent(unsigned int keycode, bool isKeypad = false);    
213 #endif
214
215 } // namespace WebCore
216
217 #endif // PlatformKeyboardEvent_h