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