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