Index: ui/platform_window/x11/x11_window_linux.cc |
diff --git a/ui/platform_window/x11/x11_window_linux.cc b/ui/platform_window/x11/x11_window_linux.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..35b6bd9735698166dae1ae86a46765cd032eefb8 |
--- /dev/null |
+++ b/ui/platform_window/x11/x11_window_linux.cc |
@@ -0,0 +1,148 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "ui/platform_window/x11/x11_window.h" |
+ |
+#include <X11/Xlib.h> |
+ |
+#include "base/macros.h" |
+#include "ui/events/devices/x11/touch_factory_x11.h" |
+#include "ui/events/event.h" |
+#include "ui/events/event_utils.h" |
+#include "ui/events/x/events_x_utils.h" |
+ |
+namespace ui { |
+ |
+void X11Window::SetCursor(PlatformCursor cursor) { |
+ XDefineCursor(xdisplay_, xwindow_, cursor); |
+} |
+ |
+void X11Window::ProcessXInput2Event(XEvent* xev) { |
+ if (!TouchFactory::GetInstance()->ShouldProcessXI2Event(xev)) |
+ return; |
+ EventType event_type = EventTypeFromNative(xev); |
+ switch (event_type) { |
+ case ET_KEY_PRESSED: |
+ case ET_KEY_RELEASED: { |
+ KeyEvent key_event(xev); |
+ delegate_->DispatchEvent(&key_event); |
+ break; |
+ } |
+ case ET_MOUSE_PRESSED: |
+ case ET_MOUSE_MOVED: |
+ case ET_MOUSE_DRAGGED: |
+ case ET_MOUSE_RELEASED: { |
+ MouseEvent mouse_event(xev); |
+ delegate_->DispatchEvent(&mouse_event); |
+ break; |
+ } |
+ case ET_MOUSEWHEEL: { |
+ MouseWheelEvent wheel_event(xev); |
+ delegate_->DispatchEvent(&wheel_event); |
+ break; |
+ } |
+ case ET_SCROLL_FLING_START: |
+ case ET_SCROLL_FLING_CANCEL: |
+ case ET_SCROLL: { |
+ ScrollEvent scroll_event(xev); |
+ delegate_->DispatchEvent(&scroll_event); |
+ break; |
+ } |
+ case ET_TOUCH_MOVED: |
+ case ET_TOUCH_PRESSED: |
+ case ET_TOUCH_CANCELLED: |
+ case ET_TOUCH_RELEASED: { |
+ TouchEvent touch_event(xev); |
+ delegate_->DispatchEvent(&touch_event); |
+ break; |
+ } |
+ default: |
+ break; |
+ } |
+} |
+ |
+bool X11Window::CanDispatchEvent(const PlatformEvent& event) { |
+ const XEvent* xevent = static_cast<const XEvent*>(event); |
+ return XWindowFromXEvent(*xevent) == xwindow_; |
+} |
+ |
+uint32_t X11Window::DispatchEvent(const PlatformEvent& event) { |
+ XEvent* xev = static_cast<XEvent*>(event); |
+ switch (xev->type) { |
+ case Expose: |
+ case FocusOut: |
+ case ConfigureNotify: |
+ case ClientMessage: { |
+ // Shared event handling implementation with ozone. |
+ ProcessXWindowEvent(*xev); |
+ break; |
+ } |
+ |
+ case EnterNotify: { |
+ // EnterNotify creates ET_MOUSE_MOVED. Mark as synthesized as this is |
+ // not real mouse move event. |
+ MouseEvent mouse_event(xev); |
+ CHECK_EQ(ET_MOUSE_MOVED, mouse_event.type()); |
+ mouse_event.set_flags(mouse_event.flags() | EF_IS_SYNTHESIZED); |
+ delegate_->DispatchEvent(&mouse_event); |
+ break; |
+ } |
+ case LeaveNotify: { |
+ MouseEvent mouse_event(xev); |
+ delegate_->DispatchEvent(&mouse_event); |
+ break; |
+ } |
+ |
+ { |
+ gfx::Rect damage_rect(xev->xexpose.x, xev->xexpose.y, |
+ xev->xexpose.width, xev->xexpose.height); |
+ delegate_->OnDamageRect(damage_rect); |
+ break; |
+ } |
+ |
+ case KeyPress: |
+ case KeyRelease: { |
+ KeyEvent key_event(xev); |
+ delegate_->DispatchEvent(&key_event); |
+ break; |
+ } |
+ |
+ case ButtonPress: |
+ case ButtonRelease: { |
+ switch (EventTypeFromNative(xev)) { |
+ case ET_MOUSEWHEEL: { |
+ MouseWheelEvent mouseev(xev); |
+ delegate_->DispatchEvent(&mouseev); |
+ break; |
+ } |
+ case ET_MOUSE_PRESSED: |
+ case ET_MOUSE_RELEASED: { |
+ MouseEvent mouseev(xev); |
+ delegate_->DispatchEvent(&mouseev); |
+ break; |
+ } |
+ case ET_UNKNOWN: |
+ // No event is created for X11-release events for mouse-wheel |
+ // buttons. |
+ break; |
+ default: |
+ NOTREACHED(); |
+ } |
+ break; |
+ } |
+ |
+ case GenericEvent: { |
+ ProcessXInput2Event(xev); |
+ break; |
+ } |
+ } |
+ return POST_DISPATCH_STOP_PROPAGATION; |
+} |
+ |
+bool X11Window::DispatchXEvent(const XEvent& xev) { |
+ NOTREACHED(); |
+ return false; |
+} |
+ |
+} // namespace ui |