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

Unified Diff: ui/platform_window/x11/x11_window_linux.cc

Issue 1602173005: Add PlatformWindow/Event related code for Ozone X11. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: XEventDispatcher added. Created 4 years, 11 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 side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698