Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(189)

Side by Side Diff: webkit/glue/webinputevent.h

Issue 28136: Fixing WebKeyboardEvent. For reals this time. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « webkit/glue/glue.vcproj ('k') | webkit/glue/webinputevent_linux.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef WEBKIT_GLUE_WEBINPUTEVENT_H_ 5 #ifndef WEBKIT_GLUE_WEBINPUTEVENT_H_
6 #define WEBKIT_GLUE_WEBINPUTEVENT_H_ 6 #define WEBKIT_GLUE_WEBINPUTEVENT_H_
7 7
8 #include "base/basictypes.h" 8 #include "base/basictypes.h"
9 #include "base/string16.h"
9 10
10 #if defined(OS_WIN) 11 #if defined(OS_WIN)
11 #include <windows.h> 12 #include <windows.h>
12 #elif defined(OS_MACOSX) 13 #elif defined(OS_MACOSX)
13 #include <vector>
14 #ifdef __OBJC__ 14 #ifdef __OBJC__
15 @class NSEvent; 15 @class NSEvent;
16 @class NSView; 16 @class NSView;
17 #else 17 #else
18 class NSEvent; 18 class NSEvent;
19 class NSView; 19 class NSView;
20 #endif // __OBJC__ 20 #endif // __OBJC__
21 #elif defined(OS_LINUX) 21 #elif defined(OS_LINUX)
22 #include <glib.h>
22 typedef struct _GdkEventButton GdkEventButton; 23 typedef struct _GdkEventButton GdkEventButton;
23 typedef struct _GdkEventMotion GdkEventMotion; 24 typedef struct _GdkEventMotion GdkEventMotion;
24 typedef struct _GdkEventScroll GdkEventScroll; 25 typedef struct _GdkEventScroll GdkEventScroll;
25 typedef struct _GdkEventKey GdkEventKey; 26 typedef struct _GdkEventKey GdkEventKey;
26 #endif 27 #endif
27 28
28 // The classes defined in this file are intended to be used with WebView's 29 // The classes defined in this file are intended to be used with WebView's
29 // HandleInputEvent method. These event types are cross-platform; however, 30 // HandleInputEvent method. These event types are cross-platform; however,
30 // there are platform-specific constructors that accept native UI events. 31 // there are platform-specific constructors that accept native UI events.
31 // 32 //
32 // The fields of these event classes roughly correspond to the fields required 33 // The fields of these event classes roughly correspond to the fields required
33 // by WebCore's platform event classes. 34 // by WebCore's platform event classes.
35 //
36 // WARNING! These classes must remain PODs (plain old data). They will be
37 // "serialized" by shipping their raw bytes across the wire, so they must not
38 // contain any non-bit-copyable member variables!
34 39
35 // WebInputEvent -------------------------------------------------------------- 40 // WebInputEvent --------------------------------------------------------------
36 41
37 class WebInputEvent { 42 class WebInputEvent {
38 public: 43 public:
39 WebInputEvent() : modifiers(0) { } 44 WebInputEvent() : modifiers(0) { }
40 45
46 // There are two schemes used for keyboard input. On Windows (and,
47 // interestingly enough, on Mac Carbon) there are two events for a keypress.
48 // One is a raw keydown, which provides the keycode only. If the app doesn't
49 // handle that, then the system runs key translation to create an event
50 // containing the generated character and pumps that event. In such a scheme,
51 // those two events are translated to RAW_KEY_DOWN and CHAR events
52 // respectively. In Cocoa and Gtk, key events contain both the keycode and any
53 // translation into actual text. In such a case, WebCore will eventually need
54 // to split the events (see disambiguateKeyDownEvent and its callers) but we
55 // don't worry about that here. We just use a different type (KEY_DOWN) to
56 // indicate this.
41 enum Type { 57 enum Type {
42 // WebMouseEvent 58 // WebMouseEvent
43 MOUSE_DOWN, 59 MOUSE_DOWN,
44 MOUSE_UP, 60 MOUSE_UP,
45 MOUSE_MOVE, 61 MOUSE_MOVE,
46 MOUSE_LEAVE, 62 MOUSE_LEAVE,
47 MOUSE_DOUBLE_CLICK, 63 MOUSE_DOUBLE_CLICK,
48 64
49 // WebMouseWheelEvent 65 // WebMouseWheelEvent
50 MOUSE_WHEEL, 66 MOUSE_WHEEL,
51 67
52 // WebKeyboardEvent 68 // WebKeyboardEvent
69 RAW_KEY_DOWN,
53 KEY_DOWN, 70 KEY_DOWN,
54 KEY_UP, 71 KEY_UP,
55 CHAR 72 CHAR
56 }; 73 };
57 74
58 enum Modifiers { 75 enum Modifiers {
59 // modifiers for all events: 76 // modifiers for all events:
60 SHIFT_KEY = 1 << 0, 77 SHIFT_KEY = 1 << 0,
61 CTRL_KEY = 1 << 1, 78 CTRL_KEY = 1 << 1,
62 ALT_KEY = 1 << 2, 79 ALT_KEY = 1 << 2,
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 WebMouseWheelEvent(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam); 131 WebMouseWheelEvent(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);
115 #elif defined(OS_MACOSX) 132 #elif defined(OS_MACOSX)
116 WebMouseWheelEvent(NSEvent *event, NSView* view); 133 WebMouseWheelEvent(NSEvent *event, NSView* view);
117 #elif defined(OS_LINUX) 134 #elif defined(OS_LINUX)
118 explicit WebMouseWheelEvent(const GdkEventScroll* event); 135 explicit WebMouseWheelEvent(const GdkEventScroll* event);
119 #endif 136 #endif
120 }; 137 };
121 138
122 // WebKeyboardEvent ----------------------------------------------------------- 139 // WebKeyboardEvent -----------------------------------------------------------
123 140
141 // Caps on string lengths so we can make them static arrays and keep them PODs.
142 const size_t kTextLengthCap = 4;
143 // http://www.w3.org/TR/DOM-Level-3-Events/keyset.html lists the identifiers.
144 // The longest is 18 characters, so we'll round up to the next multiple of 4.
145 const size_t kIdentifierLengthCap = 20;
146
124 class WebKeyboardEvent : public WebInputEvent { 147 class WebKeyboardEvent : public WebInputEvent {
125 public: 148 public:
126 // The key_code field is the Windows key code associated with this key event. 149 // |windows_key_code| is the Windows key code associated with this key event.
127 // This sometimes matches the ASCII value of the key (for e.g. a-z) but 150 // Sometimes it's direct from the event (i.e. on Windows), sometimes it's via
128 // officially ignores case, and has its own set of codes for control keys as 151 // a mapping function. If you want a list, see
129 // well as other visible letters like punctuation. 152 // webkit/port/platform/chromium/KeyboardCodes* .
130 // webkit/port/platform/chromium/KeyboardCodes* is an attempt at defining all 153 int windows_key_code;
131 // of these keys, but it's not all the way there yet. (E.g., the Windows
132 // implementation there just passes through the code from the windows message
133 // directly.)
134 int key_code;
135 154
136 #if defined(OS_MACOSX) 155 // The actual key code genenerated by the platform. The DOM spec runs on
137 // text arrays extracted from the native event. On Mac, there may be 156 // Windows-equivalent codes (thus |windows_key_code| above) but it doesn't
138 // multiple keys sent as a single event if the flags don't change. 157 // hurt to have this one around.
139 std::vector<unsigned short> text; 158 int native_key_code;
140 std::vector<unsigned short> unmodified_text; 159
141 std::vector<unsigned short> key_identifier; 160 // |text| is the text generated by this keystroke. |unmodified_text| is
142 #elif defined(OS_WIN) 161 // |text|, but unmodified by an concurrently-held modifiers (except shift).
143 bool system_key; // Set if we receive a SYSKEYDOWN/WM_SYSKEYUP message. 162 // This is useful for working out shortcut keys. Linux and Windows guarantee
144 MSG actual_message; // Set to the current keyboard message. 163 // one character per event. The Mac does not, but in reality that's all it
145 #elif defined(OS_LINUX) 164 // ever gives. We're generous, and cap it a bit longer.
146 // The unicode character, if available, corresponding to this key event. 165 char16 text[kTextLengthCap];
147 // TODO(evanm): temporary hack for test_shell. Ideally we'd either manage 166 char16 unmodified_text[kTextLengthCap];
148 // to stuff everything into key_code, or make this field shared by all 167
149 // implementations, but this will have to do for now. 168 // This is a string identifying the key pressed.
150 wchar_t text; 169 char key_identifier[kIdentifierLengthCap];
170
171 // This identifies whether this event was tagged by the system as being a
172 // "system key" event (see
173 // http://msdn.microsoft.com/en-us/library/ms646286(VS.85).aspx for details).
174 // Other platforms don't have this concept, but it's just easier to leave it
175 // always false than ifdef.
176
177 bool system_key;
178
179 // References to the original event.
180 #if defined(OS_WIN)
181 MSG actual_message; // Set to the current keyboard message. TODO(avi): remove
182
183 // Stores the GDK keyval and modifier state of the GdkEventKey; this is used
184 // to transport these values across IPC so they can be used in the front end
185 // code.
186 guint gdk_keyval;
187 guint gdk_modifier;
151 #endif 188 #endif
152 189
153 WebKeyboardEvent() 190 WebKeyboardEvent() : windows_key_code(0),
154 : key_code(0) 191 native_key_code(0),
192 system_key(false) {
193 memset(&text, 0, sizeof(text));
194 memset(&unmodified_text, 0, sizeof(unmodified_text));
195 memset(&key_identifier, 0, sizeof(key_identifier));
155 #if defined(OS_WIN) 196 #if defined(OS_WIN)
156 , system_key(false) {
157 memset(&actual_message, 0, sizeof(actual_message)); 197 memset(&actual_message, 0, sizeof(actual_message));
198 #endif
158 } 199 }
159 #else
160 {}
161 #endif
162 200
163 #if defined(OS_WIN) 201 #if defined(OS_WIN)
164 WebKeyboardEvent(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam); 202 explicit WebKeyboardEvent(HWND hwnd, UINT message, WPARAM wparam,
203 LPARAM lparam);
165 #elif defined(OS_MACOSX) 204 #elif defined(OS_MACOSX)
166 WebKeyboardEvent(NSEvent *event); 205 explicit WebKeyboardEvent(NSEvent *event);
167 #elif defined(OS_LINUX) 206 #elif defined(OS_LINUX)
168 explicit WebKeyboardEvent(const GdkEventKey* event); 207 explicit WebKeyboardEvent(const GdkEventKey* event);
169 #endif 208 #endif
170 }; 209 };
171 210
172
173 #endif // WEBKIT_GLUE_WEBINPUTEVENT_H_ 211 #endif // WEBKIT_GLUE_WEBINPUTEVENT_H_
OLDNEW
« no previous file with comments | « webkit/glue/glue.vcproj ('k') | webkit/glue/webinputevent_linux.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698