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

Side by Side Diff: ui/events/platform/x11/x11_event_source_libevent.cc

Issue 1602173005: Add PlatformWindow/Event related code for Ozone X11. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Final fixes for comments + tests. Created 4 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
OLDNEW
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.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 9
9 #include "base/macros.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
11 #include "base/message_loop/message_pump_libevent.h" 11 #include "ui/events/event.h"
12 #include "ui/events/keycodes/keyboard_code_conversion_x.h"
13 #include "ui/events/platform/platform_event_dispatcher.h"
14 #include "ui/events/x/events_x_utils.h"
12 15
13 namespace ui { 16 namespace ui {
14 17
15 namespace { 18 namespace {
16 19
17 class X11EventSourceLibevent : public X11EventSource, 20 // Translates XI2 XEvent into a ui::Event.
18 public base::MessagePumpLibevent::Watcher { 21 scoped_ptr<ui::Event> TranslateXI2EventToEvent(const XEvent& xev) {
19 public: 22 EventType event_type = EventTypeFromXEvent(xev);
20 explicit X11EventSourceLibevent(XDisplay* display) 23 switch (event_type) {
21 : X11EventSource(display), 24 case ET_KEY_PRESSED:
22 initialized_(false) { 25 case ET_KEY_RELEASED:
23 AddEventWatcher(); 26 return make_scoped_ptr(new KeyEvent(event_type,
27 KeyboardCodeFromXKeyEvent(&xev),
28 EventFlagsFromXEvent(xev)));
29 case ET_MOUSE_PRESSED:
30 case ET_MOUSE_MOVED:
31 case ET_MOUSE_DRAGGED:
32 case ET_MOUSE_RELEASED:
33 return make_scoped_ptr(
34 new MouseEvent(event_type, EventLocationFromXEvent(xev),
35 EventSystemLocationFromXEvent(xev),
36 EventTimeFromXEvent(xev), EventFlagsFromXEvent(xev),
37 GetChangedMouseButtonFlagsFromXEvent(xev)));
38 case ET_MOUSEWHEEL:
39 return make_scoped_ptr(new MouseWheelEvent(
40 GetMouseWheelOffsetFromXEvent(xev), EventLocationFromXEvent(xev),
41 EventSystemLocationFromXEvent(xev), EventTimeFromXEvent(xev),
42 EventFlagsFromXEvent(xev),
43 GetChangedMouseButtonFlagsFromXEvent(xev)));
44 case ET_SCROLL_FLING_START:
45 case ET_SCROLL_FLING_CANCEL: {
46 float x_offset, y_offset, x_offset_ordinal, y_offset_ordinal;
47 GetFlingDataFromXEvent(xev, &x_offset, &y_offset, &x_offset_ordinal,
48 &y_offset_ordinal, nullptr);
49 return make_scoped_ptr(new ScrollEvent(
50 event_type, EventLocationFromXEvent(xev), EventTimeFromXEvent(xev),
51 EventFlagsFromXEvent(xev), x_offset, y_offset, x_offset_ordinal,
52 y_offset_ordinal, 0));
53 }
54 case ET_SCROLL: {
55 float x_offset, y_offset, x_offset_ordinal, y_offset_ordinal;
56 int finger_count;
57 GetScrollOffsetsFromXEvent(xev, &x_offset, &y_offset, &x_offset_ordinal,
58 &y_offset_ordinal, &finger_count);
59 return make_scoped_ptr(new ScrollEvent(
60 event_type, EventLocationFromXEvent(xev), EventTimeFromXEvent(xev),
61 EventFlagsFromXEvent(xev), x_offset, y_offset, x_offset_ordinal,
62 y_offset_ordinal, finger_count));
63 }
64 case ET_TOUCH_MOVED:
65 case ET_TOUCH_PRESSED:
66 case ET_TOUCH_CANCELLED:
67 case ET_TOUCH_RELEASED:
68 return make_scoped_ptr(
69 new TouchEvent(event_type, EventLocationFromXEvent(xev),
70 GetTouchIdFromXEvent(xev), EventTimeFromXEvent(xev)));
71 case ET_UNKNOWN:
72 return nullptr;
73 default:
74 break;
24 } 75 }
76 return nullptr;
77 }
25 78
26 ~X11EventSourceLibevent() override { 79 // Translates a XEvent into a ui::Event.
80 scoped_ptr<ui::Event> TranslateXEventToEvent(const XEvent& xev) {
81 int flags = EventFlagsFromXEvent(xev);
82 switch (xev.type) {
83 case LeaveNotify:
84 case EnterNotify:
85 // EnterNotify creates ET_MOUSE_MOVED. Mark as synthesized as this is
86 // not real mouse move event.
87 if (xev.type == EnterNotify)
88 flags |= EF_IS_SYNTHESIZED;
89 return make_scoped_ptr(
90 new MouseEvent(ET_MOUSE_MOVED, EventLocationFromXEvent(xev),
91 EventSystemLocationFromXEvent(xev),
92 EventTimeFromXEvent(xev), flags, 0));
93
94 case KeyPress:
95 case KeyRelease:
96 return make_scoped_ptr(new KeyEvent(
97 EventTypeFromXEvent(xev), KeyboardCodeFromXKeyEvent(&xev), flags));
98
99 case ButtonPress:
100 case ButtonRelease: {
101 switch (EventTypeFromXEvent(xev)) {
102 case ET_MOUSEWHEEL:
103 return make_scoped_ptr(new MouseWheelEvent(
104 GetMouseWheelOffsetFromXEvent(xev), EventLocationFromXEvent(xev),
105 EventSystemLocationFromXEvent(xev), EventTimeFromXEvent(xev),
106 flags, 0));
107 case ET_MOUSE_PRESSED:
108 case ET_MOUSE_RELEASED:
109 return make_scoped_ptr(new MouseEvent(
110 EventTypeFromXEvent(xev), EventLocationFromXEvent(xev),
111 EventSystemLocationFromXEvent(xev), EventTimeFromXEvent(xev),
112 flags, GetChangedMouseButtonFlagsFromXEvent(xev)));
113 case ET_UNKNOWN:
114 // No event is created for X11-release events for mouse-wheel
115 // buttons.
116 break;
117 default:
118 NOTREACHED();
119 }
120 break;
121 }
122
123 case GenericEvent:
124 return TranslateXI2EventToEvent(xev);
27 } 125 }
28 126 return nullptr;
29 private: 127 }
30 void AddEventWatcher() {
31 if (initialized_)
32 return;
33 if (!base::MessageLoop::current())
34 return;
35
36 int fd = ConnectionNumber(display());
37 base::MessageLoopForUI::current()->WatchFileDescriptor(fd, true,
38 base::MessagePumpLibevent::WATCH_READ, &watcher_controller_, this);
39 initialized_ = true;
40 }
41
42 // PlatformEventSource:
43 void OnDispatcherListChanged() override {
44 AddEventWatcher();
45 }
46
47 // base::MessagePumpLibevent::Watcher:
48 void OnFileCanReadWithoutBlocking(int fd) override {
49 DispatchXEvents();
50 }
51
52 void OnFileCanWriteWithoutBlocking(int fd) override {
53 NOTREACHED();
54 }
55
56 base::MessagePumpLibevent::FileDescriptorWatcher watcher_controller_;
57 bool initialized_;
58
59 DISALLOW_COPY_AND_ASSIGN(X11EventSourceLibevent);
60 };
61 128
62 } // namespace 129 } // namespace
63 130
64 scoped_ptr<PlatformEventSource> PlatformEventSource::CreateDefault() { 131 X11EventSourceLibevent::X11EventSourceLibevent(XDisplay* display)
65 return make_scoped_ptr(new X11EventSourceLibevent(gfx::GetXDisplay())); 132 : event_source_(this, display) {
133 AddEventWatcher();
134 }
135
136 X11EventSourceLibevent::~X11EventSourceLibevent() {}
137
138 void X11EventSourceLibevent::AddXEventDispatcher(XEventDispatcher* dispatcher) {
139 dispatchers_xevent_.AddObserver(dispatcher);
140 }
141
142 void X11EventSourceLibevent::RemoveXEventDispatcher(
143 XEventDispatcher* dispatcher) {
144 dispatchers_xevent_.RemoveObserver(dispatcher);
145 }
146
147 void X11EventSourceLibevent::ProcessXEvent(XEvent* xevent) {
148 scoped_ptr<ui::Event> translated_event = TranslateXEventToEvent(*xevent);
149 if (translated_event) {
150 DispatchEvent(translated_event.get());
151 } else {
152 // Only if we can't translate XEvent into ui::Event, try to dispatch XEvent
153 // directly to XEventDispatchers.
154 DispatchXEventToXEventDispatchers(xevent);
155 }
156 }
157
158 void X11EventSourceLibevent::AddEventWatcher() {
159 if (initialized_)
160 return;
161 if (!base::MessageLoop::current())
162 return;
163
164 int fd = ConnectionNumber(event_source_.display());
165 base::MessageLoopForUI::current()->WatchFileDescriptor(
166 fd, true, base::MessagePumpLibevent::WATCH_READ, &watcher_controller_,
167 this);
168 initialized_ = true;
169 }
170
171 void X11EventSourceLibevent::DispatchXEventToXEventDispatchers(XEvent* xevent) {
172 if (dispatchers_xevent_.might_have_observers()) {
173 base::ObserverList<XEventDispatcher>::Iterator iter(&dispatchers_xevent_);
174 while (XEventDispatcher* dispatcher = iter.GetNext()) {
175 if (dispatcher->DispatchXEvent(xevent))
176 break;
177 }
178 }
179 }
180
181 void X11EventSourceLibevent::StopCurrentEventStream() {
182 event_source_.StopCurrentEventStream();
183 }
184
185 void X11EventSourceLibevent::OnDispatcherListChanged() {
186 AddEventWatcher();
187 event_source_.OnDispatcherListChanged();
188 }
189
190 void X11EventSourceLibevent::OnFileCanReadWithoutBlocking(int fd) {
191 event_source_.DispatchXEvents();
192 }
193
194 void X11EventSourceLibevent::OnFileCanWriteWithoutBlocking(int fd) {
195 NOTREACHED();
66 } 196 }
67 197
68 } // namespace ui 198 } // namespace ui
OLDNEW
« no previous file with comments | « ui/events/platform/x11/x11_event_source_libevent.h ('k') | ui/events/platform/x11/x11_events_platform.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698