OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 #include "ui/events/platform/x11/x11_event_source_libevent.h" | 5 #include "ui/events/platform/x11/x11_event_source_libevent.h" |
6 | 6 |
7 #include <X11/Xlib.h> | 7 #include <X11/Xlib.h> |
8 #include <X11/extensions/XInput2.h> | 8 #include <X11/extensions/XInput2.h> |
9 | 9 |
10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
11 #include "base/message_loop/message_loop.h" | 11 #include "base/message_loop/message_loop.h" |
12 #include "ui/events/event.h" | 12 #include "ui/events/event.h" |
13 #include "ui/events/event_utils.h" | 13 #include "ui/events/event_utils.h" |
14 #include "ui/events/keycodes/keyboard_code_conversion_x.h" | 14 #include "ui/events/keycodes/keyboard_code_conversion_x.h" |
15 #include "ui/events/platform/platform_event_dispatcher.h" | 15 #include "ui/events/platform/platform_event_dispatcher.h" |
16 #include "ui/events/x/events_x_utils.h" | 16 #include "ui/events/x/events_x_utils.h" |
17 | 17 |
18 namespace ui { | 18 namespace ui { |
19 | 19 |
20 namespace { | 20 namespace { |
21 | 21 |
22 // Translates XI2 XEvent into a ui::Event. | 22 // Translates XI2 XEvent into a ui::Event. |
23 std::unique_ptr<ui::Event> TranslateXI2EventToEvent(const XEvent& xev) { | 23 std::unique_ptr<ui::Event> TranslateXI2EventToEvent(const XEvent& xev) { |
24 EventType event_type = EventTypeFromXEvent(xev); | 24 EventType event_type = EventTypeFromXEvent(xev); |
25 switch (event_type) { | 25 switch (event_type) { |
26 case ET_KEY_PRESSED: | 26 case ET_KEY_PRESSED: |
27 case ET_KEY_RELEASED: | 27 case ET_KEY_RELEASED: |
28 return base::WrapUnique(new KeyEvent(event_type, | 28 return base::MakeUnique<KeyEvent>(event_type, |
29 KeyboardCodeFromXKeyEvent(&xev), | 29 KeyboardCodeFromXKeyEvent(&xev), |
30 EventFlagsFromXEvent(xev))); | 30 EventFlagsFromXEvent(xev)); |
31 case ET_MOUSE_PRESSED: | 31 case ET_MOUSE_PRESSED: |
32 case ET_MOUSE_MOVED: | 32 case ET_MOUSE_MOVED: |
33 case ET_MOUSE_DRAGGED: | 33 case ET_MOUSE_DRAGGED: |
34 case ET_MOUSE_RELEASED: | 34 case ET_MOUSE_RELEASED: |
35 return base::WrapUnique( | 35 return base::MakeUnique<MouseEvent>( |
36 new MouseEvent(event_type, EventLocationFromXEvent(xev), | 36 event_type, EventLocationFromXEvent(xev), |
37 EventSystemLocationFromXEvent(xev), | 37 EventSystemLocationFromXEvent(xev), EventTimeFromXEvent(xev), |
38 EventTimeFromXEvent(xev), EventFlagsFromXEvent(xev), | 38 EventFlagsFromXEvent(xev), GetChangedMouseButtonFlagsFromXEvent(xev)); |
39 GetChangedMouseButtonFlagsFromXEvent(xev))); | |
40 case ET_MOUSEWHEEL: | 39 case ET_MOUSEWHEEL: |
41 return base::WrapUnique(new MouseWheelEvent( | 40 return base::MakeUnique<MouseWheelEvent>( |
42 GetMouseWheelOffsetFromXEvent(xev), EventLocationFromXEvent(xev), | 41 GetMouseWheelOffsetFromXEvent(xev), EventLocationFromXEvent(xev), |
43 EventSystemLocationFromXEvent(xev), EventTimeFromXEvent(xev), | 42 EventSystemLocationFromXEvent(xev), EventTimeFromXEvent(xev), |
44 EventFlagsFromXEvent(xev), | 43 EventFlagsFromXEvent(xev), GetChangedMouseButtonFlagsFromXEvent(xev)); |
45 GetChangedMouseButtonFlagsFromXEvent(xev))); | |
46 case ET_SCROLL_FLING_START: | 44 case ET_SCROLL_FLING_START: |
47 case ET_SCROLL_FLING_CANCEL: { | 45 case ET_SCROLL_FLING_CANCEL: { |
48 float x_offset, y_offset, x_offset_ordinal, y_offset_ordinal; | 46 float x_offset, y_offset, x_offset_ordinal, y_offset_ordinal; |
49 GetFlingDataFromXEvent(xev, &x_offset, &y_offset, &x_offset_ordinal, | 47 GetFlingDataFromXEvent(xev, &x_offset, &y_offset, &x_offset_ordinal, |
50 &y_offset_ordinal, nullptr); | 48 &y_offset_ordinal, nullptr); |
51 return base::WrapUnique(new ScrollEvent( | 49 return base::MakeUnique<ScrollEvent>( |
52 event_type, EventLocationFromXEvent(xev), EventTimeFromXEvent(xev), | 50 event_type, EventLocationFromXEvent(xev), EventTimeFromXEvent(xev), |
53 EventFlagsFromXEvent(xev), x_offset, y_offset, x_offset_ordinal, | 51 EventFlagsFromXEvent(xev), x_offset, y_offset, x_offset_ordinal, |
54 y_offset_ordinal, 0)); | 52 y_offset_ordinal, 0); |
55 } | 53 } |
56 case ET_SCROLL: { | 54 case ET_SCROLL: { |
57 float x_offset, y_offset, x_offset_ordinal, y_offset_ordinal; | 55 float x_offset, y_offset, x_offset_ordinal, y_offset_ordinal; |
58 int finger_count; | 56 int finger_count; |
59 GetScrollOffsetsFromXEvent(xev, &x_offset, &y_offset, &x_offset_ordinal, | 57 GetScrollOffsetsFromXEvent(xev, &x_offset, &y_offset, &x_offset_ordinal, |
60 &y_offset_ordinal, &finger_count); | 58 &y_offset_ordinal, &finger_count); |
61 return base::WrapUnique(new ScrollEvent( | 59 return base::MakeUnique<ScrollEvent>( |
62 event_type, EventLocationFromXEvent(xev), EventTimeFromXEvent(xev), | 60 event_type, EventLocationFromXEvent(xev), EventTimeFromXEvent(xev), |
63 EventFlagsFromXEvent(xev), x_offset, y_offset, x_offset_ordinal, | 61 EventFlagsFromXEvent(xev), x_offset, y_offset, x_offset_ordinal, |
64 y_offset_ordinal, finger_count)); | 62 y_offset_ordinal, finger_count); |
65 } | 63 } |
66 case ET_TOUCH_MOVED: | 64 case ET_TOUCH_MOVED: |
67 case ET_TOUCH_PRESSED: | 65 case ET_TOUCH_PRESSED: |
68 case ET_TOUCH_CANCELLED: | 66 case ET_TOUCH_CANCELLED: |
69 case ET_TOUCH_RELEASED: | 67 case ET_TOUCH_RELEASED: |
70 return base::WrapUnique( | 68 return base::MakeUnique<TouchEvent>( |
71 new TouchEvent(event_type, | 69 event_type, EventLocationFromXEvent(xev), |
72 EventLocationFromXEvent(xev), | 70 /* flags */ 0, GetTouchIdFromXEvent(xev), EventTimeFromXEvent(xev), |
73 /* flags */ 0, | 71 GetTouchRadiusXFromXEvent(xev), GetTouchRadiusYFromXEvent(xev), |
74 GetTouchIdFromXEvent(xev), | 72 /* angle */ 0.f, GetTouchForceFromXEvent(xev)); |
75 EventTimeFromXEvent(xev), | |
76 GetTouchRadiusXFromXEvent(xev), | |
77 GetTouchRadiusYFromXEvent(xev), | |
78 /* angle */ 0.f, | |
79 GetTouchForceFromXEvent(xev))); | |
80 case ET_UNKNOWN: | 73 case ET_UNKNOWN: |
81 return nullptr; | 74 return nullptr; |
82 default: | 75 default: |
83 break; | 76 break; |
84 } | 77 } |
85 return nullptr; | 78 return nullptr; |
86 } | 79 } |
87 | 80 |
88 // Translates a XEvent into a ui::Event. | 81 // Translates a XEvent into a ui::Event. |
89 std::unique_ptr<ui::Event> TranslateXEventToEvent(const XEvent& xev) { | 82 std::unique_ptr<ui::Event> TranslateXEventToEvent(const XEvent& xev) { |
90 int flags = EventFlagsFromXEvent(xev); | 83 int flags = EventFlagsFromXEvent(xev); |
91 switch (xev.type) { | 84 switch (xev.type) { |
92 case LeaveNotify: | 85 case LeaveNotify: |
93 case EnterNotify: | 86 case EnterNotify: |
94 // EnterNotify creates ET_MOUSE_MOVED. Mark as synthesized as this is | 87 // EnterNotify creates ET_MOUSE_MOVED. Mark as synthesized as this is |
95 // not real mouse move event. | 88 // not real mouse move event. |
96 if (xev.type == EnterNotify) | 89 if (xev.type == EnterNotify) |
97 flags |= EF_IS_SYNTHESIZED; | 90 flags |= EF_IS_SYNTHESIZED; |
98 return base::WrapUnique( | 91 return base::MakeUnique<MouseEvent>(ET_MOUSE_MOVED, |
99 new MouseEvent(ET_MOUSE_MOVED, EventLocationFromXEvent(xev), | 92 EventLocationFromXEvent(xev), |
100 EventSystemLocationFromXEvent(xev), | 93 EventSystemLocationFromXEvent(xev), |
101 EventTimeFromXEvent(xev), flags, 0)); | 94 EventTimeFromXEvent(xev), flags, 0); |
102 | 95 |
103 case KeyPress: | 96 case KeyPress: |
104 case KeyRelease: | 97 case KeyRelease: |
105 return base::WrapUnique(new KeyEvent( | 98 return base::MakeUnique<KeyEvent>(EventTypeFromXEvent(xev), |
106 EventTypeFromXEvent(xev), KeyboardCodeFromXKeyEvent(&xev), flags)); | 99 KeyboardCodeFromXKeyEvent(&xev), flags); |
107 | 100 |
108 case ButtonPress: | 101 case ButtonPress: |
109 case ButtonRelease: { | 102 case ButtonRelease: { |
110 switch (EventTypeFromXEvent(xev)) { | 103 switch (EventTypeFromXEvent(xev)) { |
111 case ET_MOUSEWHEEL: | 104 case ET_MOUSEWHEEL: |
112 return base::WrapUnique(new MouseWheelEvent( | 105 return base::MakeUnique<MouseWheelEvent>( |
113 GetMouseWheelOffsetFromXEvent(xev), EventLocationFromXEvent(xev), | 106 GetMouseWheelOffsetFromXEvent(xev), EventLocationFromXEvent(xev), |
114 EventSystemLocationFromXEvent(xev), EventTimeFromXEvent(xev), | 107 EventSystemLocationFromXEvent(xev), EventTimeFromXEvent(xev), |
115 flags, 0)); | 108 flags, 0); |
116 case ET_MOUSE_PRESSED: | 109 case ET_MOUSE_PRESSED: |
117 case ET_MOUSE_RELEASED: | 110 case ET_MOUSE_RELEASED: |
118 return base::WrapUnique(new MouseEvent( | 111 return base::MakeUnique<MouseEvent>( |
119 EventTypeFromXEvent(xev), EventLocationFromXEvent(xev), | 112 EventTypeFromXEvent(xev), EventLocationFromXEvent(xev), |
120 EventSystemLocationFromXEvent(xev), EventTimeFromXEvent(xev), | 113 EventSystemLocationFromXEvent(xev), EventTimeFromXEvent(xev), |
121 flags, GetChangedMouseButtonFlagsFromXEvent(xev))); | 114 flags, GetChangedMouseButtonFlagsFromXEvent(xev)); |
122 case ET_UNKNOWN: | 115 case ET_UNKNOWN: |
123 // No event is created for X11-release events for mouse-wheel | 116 // No event is created for X11-release events for mouse-wheel |
124 // buttons. | 117 // buttons. |
125 break; | 118 break; |
126 default: | 119 default: |
127 NOTREACHED(); | 120 NOTREACHED(); |
128 } | 121 } |
129 break; | 122 break; |
130 } | 123 } |
131 | 124 |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 | 191 |
199 void X11EventSourceLibevent::OnFileCanReadWithoutBlocking(int fd) { | 192 void X11EventSourceLibevent::OnFileCanReadWithoutBlocking(int fd) { |
200 event_source_.DispatchXEvents(); | 193 event_source_.DispatchXEvents(); |
201 } | 194 } |
202 | 195 |
203 void X11EventSourceLibevent::OnFileCanWriteWithoutBlocking(int fd) { | 196 void X11EventSourceLibevent::OnFileCanWriteWithoutBlocking(int fd) { |
204 NOTREACHED(); | 197 NOTREACHED(); |
205 } | 198 } |
206 | 199 |
207 } // namespace ui | 200 } // namespace ui |
OLD | NEW |