| 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 |