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/message_loop/message_loop.h" | 11 #include "base/message_loop/message_loop.h" |
11 #include "ui/events/event.h" | 12 #include "ui/events/event.h" |
12 #include "ui/events/event_utils.h" | 13 #include "ui/events/event_utils.h" |
13 #include "ui/events/keycodes/keyboard_code_conversion_x.h" | 14 #include "ui/events/keycodes/keyboard_code_conversion_x.h" |
14 #include "ui/events/platform/platform_event_dispatcher.h" | 15 #include "ui/events/platform/platform_event_dispatcher.h" |
15 #include "ui/events/x/events_x_utils.h" | 16 #include "ui/events/x/events_x_utils.h" |
16 | 17 |
17 namespace ui { | 18 namespace ui { |
18 | 19 |
19 namespace { | 20 namespace { |
20 | 21 |
21 // Translates XI2 XEvent into a ui::Event. | 22 // Translates XI2 XEvent into a ui::Event. |
22 scoped_ptr<ui::Event> TranslateXI2EventToEvent(const XEvent& xev) { | 23 std::unique_ptr<ui::Event> TranslateXI2EventToEvent(const XEvent& xev) { |
23 EventType event_type = EventTypeFromXEvent(xev); | 24 EventType event_type = EventTypeFromXEvent(xev); |
24 switch (event_type) { | 25 switch (event_type) { |
25 case ET_KEY_PRESSED: | 26 case ET_KEY_PRESSED: |
26 case ET_KEY_RELEASED: | 27 case ET_KEY_RELEASED: |
27 return make_scoped_ptr(new KeyEvent(event_type, | 28 return base::WrapUnique(new KeyEvent(event_type, |
28 KeyboardCodeFromXKeyEvent(&xev), | 29 KeyboardCodeFromXKeyEvent(&xev), |
29 EventFlagsFromXEvent(xev))); | 30 EventFlagsFromXEvent(xev))); |
30 case ET_MOUSE_PRESSED: | 31 case ET_MOUSE_PRESSED: |
31 case ET_MOUSE_MOVED: | 32 case ET_MOUSE_MOVED: |
32 case ET_MOUSE_DRAGGED: | 33 case ET_MOUSE_DRAGGED: |
33 case ET_MOUSE_RELEASED: | 34 case ET_MOUSE_RELEASED: |
34 return make_scoped_ptr( | 35 return base::WrapUnique( |
35 new MouseEvent(event_type, EventLocationFromXEvent(xev), | 36 new MouseEvent(event_type, EventLocationFromXEvent(xev), |
36 EventSystemLocationFromXEvent(xev), | 37 EventSystemLocationFromXEvent(xev), |
37 EventTimeFromXEvent(xev), EventFlagsFromXEvent(xev), | 38 EventTimeFromXEvent(xev), EventFlagsFromXEvent(xev), |
38 GetChangedMouseButtonFlagsFromXEvent(xev))); | 39 GetChangedMouseButtonFlagsFromXEvent(xev))); |
39 case ET_MOUSEWHEEL: | 40 case ET_MOUSEWHEEL: |
40 return make_scoped_ptr(new MouseWheelEvent( | 41 return base::WrapUnique(new MouseWheelEvent( |
41 GetMouseWheelOffsetFromXEvent(xev), EventLocationFromXEvent(xev), | 42 GetMouseWheelOffsetFromXEvent(xev), EventLocationFromXEvent(xev), |
42 EventSystemLocationFromXEvent(xev), EventTimeFromXEvent(xev), | 43 EventSystemLocationFromXEvent(xev), EventTimeFromXEvent(xev), |
43 EventFlagsFromXEvent(xev), | 44 EventFlagsFromXEvent(xev), |
44 GetChangedMouseButtonFlagsFromXEvent(xev))); | 45 GetChangedMouseButtonFlagsFromXEvent(xev))); |
45 case ET_SCROLL_FLING_START: | 46 case ET_SCROLL_FLING_START: |
46 case ET_SCROLL_FLING_CANCEL: { | 47 case ET_SCROLL_FLING_CANCEL: { |
47 float x_offset, y_offset, x_offset_ordinal, y_offset_ordinal; | 48 float x_offset, y_offset, x_offset_ordinal, y_offset_ordinal; |
48 GetFlingDataFromXEvent(xev, &x_offset, &y_offset, &x_offset_ordinal, | 49 GetFlingDataFromXEvent(xev, &x_offset, &y_offset, &x_offset_ordinal, |
49 &y_offset_ordinal, nullptr); | 50 &y_offset_ordinal, nullptr); |
50 return make_scoped_ptr(new ScrollEvent( | 51 return base::WrapUnique(new ScrollEvent( |
51 event_type, EventLocationFromXEvent(xev), EventTimeFromXEvent(xev), | 52 event_type, EventLocationFromXEvent(xev), EventTimeFromXEvent(xev), |
52 EventFlagsFromXEvent(xev), x_offset, y_offset, x_offset_ordinal, | 53 EventFlagsFromXEvent(xev), x_offset, y_offset, x_offset_ordinal, |
53 y_offset_ordinal, 0)); | 54 y_offset_ordinal, 0)); |
54 } | 55 } |
55 case ET_SCROLL: { | 56 case ET_SCROLL: { |
56 float x_offset, y_offset, x_offset_ordinal, y_offset_ordinal; | 57 float x_offset, y_offset, x_offset_ordinal, y_offset_ordinal; |
57 int finger_count; | 58 int finger_count; |
58 GetScrollOffsetsFromXEvent(xev, &x_offset, &y_offset, &x_offset_ordinal, | 59 GetScrollOffsetsFromXEvent(xev, &x_offset, &y_offset, &x_offset_ordinal, |
59 &y_offset_ordinal, &finger_count); | 60 &y_offset_ordinal, &finger_count); |
60 return make_scoped_ptr(new ScrollEvent( | 61 return base::WrapUnique(new ScrollEvent( |
61 event_type, EventLocationFromXEvent(xev), EventTimeFromXEvent(xev), | 62 event_type, EventLocationFromXEvent(xev), EventTimeFromXEvent(xev), |
62 EventFlagsFromXEvent(xev), x_offset, y_offset, x_offset_ordinal, | 63 EventFlagsFromXEvent(xev), x_offset, y_offset, x_offset_ordinal, |
63 y_offset_ordinal, finger_count)); | 64 y_offset_ordinal, finger_count)); |
64 } | 65 } |
65 case ET_TOUCH_MOVED: | 66 case ET_TOUCH_MOVED: |
66 case ET_TOUCH_PRESSED: | 67 case ET_TOUCH_PRESSED: |
67 case ET_TOUCH_CANCELLED: | 68 case ET_TOUCH_CANCELLED: |
68 case ET_TOUCH_RELEASED: | 69 case ET_TOUCH_RELEASED: |
69 return make_scoped_ptr( | 70 return base::WrapUnique( |
70 new TouchEvent(event_type, EventLocationFromXEvent(xev), | 71 new TouchEvent(event_type, EventLocationFromXEvent(xev), |
71 GetTouchIdFromXEvent(xev), EventTimeFromXEvent(xev))); | 72 GetTouchIdFromXEvent(xev), EventTimeFromXEvent(xev))); |
72 case ET_UNKNOWN: | 73 case ET_UNKNOWN: |
73 return nullptr; | 74 return nullptr; |
74 default: | 75 default: |
75 break; | 76 break; |
76 } | 77 } |
77 return nullptr; | 78 return nullptr; |
78 } | 79 } |
79 | 80 |
80 // Translates a XEvent into a ui::Event. | 81 // Translates a XEvent into a ui::Event. |
81 scoped_ptr<ui::Event> TranslateXEventToEvent(const XEvent& xev) { | 82 std::unique_ptr<ui::Event> TranslateXEventToEvent(const XEvent& xev) { |
82 int flags = EventFlagsFromXEvent(xev); | 83 int flags = EventFlagsFromXEvent(xev); |
83 switch (xev.type) { | 84 switch (xev.type) { |
84 case LeaveNotify: | 85 case LeaveNotify: |
85 case EnterNotify: | 86 case EnterNotify: |
86 // EnterNotify creates ET_MOUSE_MOVED. Mark as synthesized as this is | 87 // EnterNotify creates ET_MOUSE_MOVED. Mark as synthesized as this is |
87 // not real mouse move event. | 88 // not real mouse move event. |
88 if (xev.type == EnterNotify) | 89 if (xev.type == EnterNotify) |
89 flags |= EF_IS_SYNTHESIZED; | 90 flags |= EF_IS_SYNTHESIZED; |
90 return make_scoped_ptr( | 91 return base::WrapUnique( |
91 new MouseEvent(ET_MOUSE_MOVED, EventLocationFromXEvent(xev), | 92 new MouseEvent(ET_MOUSE_MOVED, EventLocationFromXEvent(xev), |
92 EventSystemLocationFromXEvent(xev), | 93 EventSystemLocationFromXEvent(xev), |
93 EventTimeFromXEvent(xev), flags, 0)); | 94 EventTimeFromXEvent(xev), flags, 0)); |
94 | 95 |
95 case KeyPress: | 96 case KeyPress: |
96 case KeyRelease: | 97 case KeyRelease: |
97 return make_scoped_ptr(new KeyEvent( | 98 return base::WrapUnique(new KeyEvent( |
98 EventTypeFromXEvent(xev), KeyboardCodeFromXKeyEvent(&xev), flags)); | 99 EventTypeFromXEvent(xev), KeyboardCodeFromXKeyEvent(&xev), flags)); |
99 | 100 |
100 case ButtonPress: | 101 case ButtonPress: |
101 case ButtonRelease: { | 102 case ButtonRelease: { |
102 switch (EventTypeFromXEvent(xev)) { | 103 switch (EventTypeFromXEvent(xev)) { |
103 case ET_MOUSEWHEEL: | 104 case ET_MOUSEWHEEL: |
104 return make_scoped_ptr(new MouseWheelEvent( | 105 return base::WrapUnique(new MouseWheelEvent( |
105 GetMouseWheelOffsetFromXEvent(xev), EventLocationFromXEvent(xev), | 106 GetMouseWheelOffsetFromXEvent(xev), EventLocationFromXEvent(xev), |
106 EventSystemLocationFromXEvent(xev), EventTimeFromXEvent(xev), | 107 EventSystemLocationFromXEvent(xev), EventTimeFromXEvent(xev), |
107 flags, 0)); | 108 flags, 0)); |
108 case ET_MOUSE_PRESSED: | 109 case ET_MOUSE_PRESSED: |
109 case ET_MOUSE_RELEASED: | 110 case ET_MOUSE_RELEASED: |
110 return make_scoped_ptr(new MouseEvent( | 111 return base::WrapUnique(new MouseEvent( |
111 EventTypeFromXEvent(xev), EventLocationFromXEvent(xev), | 112 EventTypeFromXEvent(xev), EventLocationFromXEvent(xev), |
112 EventSystemLocationFromXEvent(xev), EventTimeFromXEvent(xev), | 113 EventSystemLocationFromXEvent(xev), EventTimeFromXEvent(xev), |
113 flags, GetChangedMouseButtonFlagsFromXEvent(xev))); | 114 flags, GetChangedMouseButtonFlagsFromXEvent(xev))); |
114 case ET_UNKNOWN: | 115 case ET_UNKNOWN: |
115 // No event is created for X11-release events for mouse-wheel | 116 // No event is created for X11-release events for mouse-wheel |
116 // buttons. | 117 // buttons. |
117 break; | 118 break; |
118 default: | 119 default: |
119 NOTREACHED(); | 120 NOTREACHED(); |
120 } | 121 } |
(...skipping 18 matching lines...) Expand all Loading... |
139 void X11EventSourceLibevent::AddXEventDispatcher(XEventDispatcher* dispatcher) { | 140 void X11EventSourceLibevent::AddXEventDispatcher(XEventDispatcher* dispatcher) { |
140 dispatchers_xevent_.AddObserver(dispatcher); | 141 dispatchers_xevent_.AddObserver(dispatcher); |
141 } | 142 } |
142 | 143 |
143 void X11EventSourceLibevent::RemoveXEventDispatcher( | 144 void X11EventSourceLibevent::RemoveXEventDispatcher( |
144 XEventDispatcher* dispatcher) { | 145 XEventDispatcher* dispatcher) { |
145 dispatchers_xevent_.RemoveObserver(dispatcher); | 146 dispatchers_xevent_.RemoveObserver(dispatcher); |
146 } | 147 } |
147 | 148 |
148 void X11EventSourceLibevent::ProcessXEvent(XEvent* xevent) { | 149 void X11EventSourceLibevent::ProcessXEvent(XEvent* xevent) { |
149 scoped_ptr<ui::Event> translated_event = TranslateXEventToEvent(*xevent); | 150 std::unique_ptr<ui::Event> translated_event = TranslateXEventToEvent(*xevent); |
150 if (translated_event) { | 151 if (translated_event) { |
151 DispatchEvent(translated_event.get()); | 152 DispatchEvent(translated_event.get()); |
152 } else { | 153 } else { |
153 // Only if we can't translate XEvent into ui::Event, try to dispatch XEvent | 154 // Only if we can't translate XEvent into ui::Event, try to dispatch XEvent |
154 // directly to XEventDispatchers. | 155 // directly to XEventDispatchers. |
155 DispatchXEventToXEventDispatchers(xevent); | 156 DispatchXEventToXEventDispatchers(xevent); |
156 } | 157 } |
157 } | 158 } |
158 | 159 |
159 void X11EventSourceLibevent::AddEventWatcher() { | 160 void X11EventSourceLibevent::AddEventWatcher() { |
(...skipping 30 matching lines...) Expand all Loading... |
190 | 191 |
191 void X11EventSourceLibevent::OnFileCanReadWithoutBlocking(int fd) { | 192 void X11EventSourceLibevent::OnFileCanReadWithoutBlocking(int fd) { |
192 event_source_.DispatchXEvents(); | 193 event_source_.DispatchXEvents(); |
193 } | 194 } |
194 | 195 |
195 void X11EventSourceLibevent::OnFileCanWriteWithoutBlocking(int fd) { | 196 void X11EventSourceLibevent::OnFileCanWriteWithoutBlocking(int fd) { |
196 NOTREACHED(); | 197 NOTREACHED(); |
197 } | 198 } |
198 | 199 |
199 } // namespace ui | 200 } // namespace ui |
OLD | NEW |