OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 // Portions based heavily on: | 5 // Portions based heavily on: |
6 // third_party/WebKit/Source/WebKit/chromium/public/gtk/WebInputEventFactory.cpp | 6 // third_party/WebKit/Source/WebKit/chromium/public/gtk/WebInputEventFactory.cpp |
7 // | 7 // |
8 /* | 8 /* |
9 * Copyright (C) 2006-2011 Google Inc. All rights reserved. | 9 * Copyright (C) 2006-2011 Google Inc. All rights reserved. |
10 * | 10 * |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 namespace content { | 50 namespace content { |
51 | 51 |
52 // chromium WebKit does not provide a WebInputEventFactory for X11, so we have | 52 // chromium WebKit does not provide a WebInputEventFactory for X11, so we have |
53 // to do the work here ourselves. | 53 // to do the work here ourselves. |
54 | 54 |
55 namespace { | 55 namespace { |
56 | 56 |
57 // This matches Firefox behavior. | 57 // This matches Firefox behavior. |
58 const int kPixelsPerTick = 53; | 58 const int kPixelsPerTick = 53; |
59 | 59 |
| 60 // Normalizes event.flags() to make it Windows/Mac compatible. Since the way |
| 61 // of setting modifier mask on X is very different than Windows/Mac as shown |
| 62 // in http://crbug.com/127142#c8, the normalization is necessary. |
| 63 int NormalizeEventFlags(const aura::KeyEvent& event) { |
| 64 int mask = 0; |
| 65 switch (event.key_code()) { |
| 66 case ui::VKEY_CONTROL: |
| 67 mask = ui::EF_CONTROL_DOWN; |
| 68 break; |
| 69 case ui::VKEY_SHIFT: |
| 70 mask = ui::EF_SHIFT_DOWN; |
| 71 break; |
| 72 case ui::VKEY_MENU: |
| 73 mask = ui::EF_ALT_DOWN; |
| 74 break; |
| 75 case ui::VKEY_CAPITAL: |
| 76 mask = ui::EF_CAPS_LOCK_DOWN; |
| 77 break; |
| 78 default: |
| 79 return event.flags(); |
| 80 } |
| 81 if (event.type() == ui::ET_KEY_PRESSED) |
| 82 return event.flags() | mask; |
| 83 return event.flags() & ~mask; |
| 84 } |
| 85 |
60 int EventFlagsToWebEventModifiers(int flags) { | 86 int EventFlagsToWebEventModifiers(int flags) { |
61 int modifiers = 0; | 87 int modifiers = 0; |
62 if (flags & ui::EF_SHIFT_DOWN) | 88 if (flags & ui::EF_SHIFT_DOWN) |
63 modifiers |= WebKit::WebInputEvent::ShiftKey; | 89 modifiers |= WebKit::WebInputEvent::ShiftKey; |
64 if (flags & ui::EF_CONTROL_DOWN) | 90 if (flags & ui::EF_CONTROL_DOWN) |
65 modifiers |= WebKit::WebInputEvent::ControlKey; | 91 modifiers |= WebKit::WebInputEvent::ControlKey; |
66 if (flags & ui::EF_ALT_DOWN) | 92 if (flags & ui::EF_ALT_DOWN) |
67 modifiers |= WebKit::WebInputEvent::AltKey; | 93 modifiers |= WebKit::WebInputEvent::AltKey; |
68 // TODO(beng): MetaKey/META_MASK | 94 // TODO(beng): MetaKey/META_MASK |
69 if (flags & ui::EF_LEFT_MOUSE_BUTTON) | 95 if (flags & ui::EF_LEFT_MOUSE_BUTTON) |
70 modifiers |= WebKit::WebInputEvent::LeftButtonDown; | 96 modifiers |= WebKit::WebInputEvent::LeftButtonDown; |
71 if (flags & ui::EF_MIDDLE_MOUSE_BUTTON) | 97 if (flags & ui::EF_MIDDLE_MOUSE_BUTTON) |
72 modifiers |= WebKit::WebInputEvent::MiddleButtonDown; | 98 modifiers |= WebKit::WebInputEvent::MiddleButtonDown; |
73 if (flags & ui::EF_RIGHT_MOUSE_BUTTON) | 99 if (flags & ui::EF_RIGHT_MOUSE_BUTTON) |
74 modifiers |= WebKit::WebInputEvent::RightButtonDown; | 100 modifiers |= WebKit::WebInputEvent::RightButtonDown; |
75 if (flags & ui::EF_CAPS_LOCK_DOWN) | 101 if (flags & ui::EF_CAPS_LOCK_DOWN) |
76 modifiers |= WebKit::WebInputEvent::CapsLockOn; | 102 modifiers |= WebKit::WebInputEvent::CapsLockOn; |
77 return modifiers; | 103 return modifiers; |
78 } | 104 } |
79 | 105 |
80 int XStateToWebEventModifiers(unsigned int state) { | |
81 int modifiers = 0; | |
82 if (state & ShiftMask) | |
83 modifiers |= WebKit::WebInputEvent::ShiftKey; | |
84 if (state & ControlMask) | |
85 modifiers |= WebKit::WebInputEvent::ControlKey; | |
86 if (state & Mod1Mask) | |
87 modifiers |= WebKit::WebInputEvent::AltKey; | |
88 // TODO(beng): MetaKey/META_MASK | |
89 if (state & Button1Mask) | |
90 modifiers |= WebKit::WebInputEvent::LeftButtonDown; | |
91 if (state & Button2Mask) | |
92 modifiers |= WebKit::WebInputEvent::MiddleButtonDown; | |
93 if (state & Button3Mask) | |
94 modifiers |= WebKit::WebInputEvent::RightButtonDown; | |
95 if (state & LockMask) | |
96 modifiers |= WebKit::WebInputEvent::CapsLockOn; | |
97 if (state & Mod2Mask) | |
98 modifiers |= WebKit::WebInputEvent::NumLockOn; | |
99 return modifiers; | |
100 } | |
101 | |
102 int XKeyEventToWindowsKeyCode(XKeyEvent* event) { | 106 int XKeyEventToWindowsKeyCode(XKeyEvent* event) { |
103 return ui::KeyboardCodeFromXKeyEvent((XEvent*)event); | 107 return ui::KeyboardCodeFromXKeyEvent((XEvent*)event); |
104 } | 108 } |
105 | 109 |
106 // From | 110 // From |
107 // third_party/WebKit/Source/WebKit/chromium/src/gtk/WebInputEventFactory.cpp: | 111 // third_party/WebKit/Source/WebKit/chromium/src/gtk/WebInputEventFactory.cpp: |
108 WebKit::WebUChar GetControlCharacter(int windows_key_code, bool shift) { | 112 WebKit::WebUChar GetControlCharacter(int windows_key_code, bool shift) { |
109 if (windows_key_code >= ui::VKEY_A && | 113 if (windows_key_code >= ui::VKEY_A && |
110 windows_key_code <= ui::VKEY_Z) { | 114 windows_key_code <= ui::VKEY_Z) { |
111 // ctrl-A ~ ctrl-Z map to \x01 ~ \x1A | 115 // ctrl-A ~ ctrl-Z map to \x01 ~ \x1A |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 return webkit_event; | 280 return webkit_event; |
277 } | 281 } |
278 | 282 |
279 WebKit::WebKeyboardEvent MakeWebKeyboardEventFromAuraEvent( | 283 WebKit::WebKeyboardEvent MakeWebKeyboardEventFromAuraEvent( |
280 aura::KeyEvent* event) { | 284 aura::KeyEvent* event) { |
281 base::NativeEvent native_event = event->native_event(); | 285 base::NativeEvent native_event = event->native_event(); |
282 WebKit::WebKeyboardEvent webkit_event; | 286 WebKit::WebKeyboardEvent webkit_event; |
283 XKeyEvent* native_key_event = &native_event->xkey; | 287 XKeyEvent* native_key_event = &native_event->xkey; |
284 | 288 |
285 webkit_event.timeStampSeconds = event->time_stamp().InSecondsF(); | 289 webkit_event.timeStampSeconds = event->time_stamp().InSecondsF(); |
286 webkit_event.modifiers = XStateToWebEventModifiers(native_key_event->state); | 290 webkit_event.modifiers = |
| 291 EventFlagsToWebEventModifiers(NormalizeEventFlags(*event)); |
287 | 292 |
288 switch (native_event->type) { | 293 switch (native_event->type) { |
289 case KeyPress: | 294 case KeyPress: |
290 webkit_event.type = event->is_char() ? WebKit::WebInputEvent::Char : | 295 webkit_event.type = event->is_char() ? WebKit::WebInputEvent::Char : |
291 WebKit::WebInputEvent::RawKeyDown; | 296 WebKit::WebInputEvent::RawKeyDown; |
292 break; | 297 break; |
293 case KeyRelease: | 298 case KeyRelease: |
294 webkit_event.type = WebKit::WebInputEvent::KeyUp; | 299 webkit_event.type = WebKit::WebInputEvent::KeyUp; |
295 break; | 300 break; |
296 default: | 301 default: |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
448 | 453 |
449 // Update the type of the touch event. | 454 // Update the type of the touch event. |
450 web_event->type = TouchEventTypeFromEvent(event); | 455 web_event->type = TouchEventTypeFromEvent(event); |
451 web_event->timeStampSeconds = event->time_stamp().InSecondsF(); | 456 web_event->timeStampSeconds = event->time_stamp().InSecondsF(); |
452 web_event->modifiers = EventFlagsToWebEventModifiers(event->flags()); | 457 web_event->modifiers = EventFlagsToWebEventModifiers(event->flags()); |
453 | 458 |
454 return point; | 459 return point; |
455 } | 460 } |
456 | 461 |
457 } // namespace content | 462 } // namespace content |
OLD | NEW |