OLD | NEW |
(Empty) | |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "ui/platform_window/x11/x11_window.h" |
| 6 |
| 7 #include <X11/Xlib.h> |
| 8 |
| 9 #include "base/macros.h" |
| 10 #include "ui/events/devices/x11/touch_factory_x11.h" |
| 11 #include "ui/events/event.h" |
| 12 #include "ui/events/event_utils.h" |
| 13 #include "ui/events/x/events_x_utils.h" |
| 14 |
| 15 namespace ui { |
| 16 |
| 17 void X11Window::SetCursor(PlatformCursor cursor) { |
| 18 XDefineCursor(xdisplay_, xwindow_, cursor); |
| 19 } |
| 20 |
| 21 void X11Window::ProcessXInput2Event(XEvent* xev) { |
| 22 if (!TouchFactory::GetInstance()->ShouldProcessXI2Event(xev)) |
| 23 return; |
| 24 EventType event_type = EventTypeFromNative(xev); |
| 25 switch (event_type) { |
| 26 case ET_KEY_PRESSED: |
| 27 case ET_KEY_RELEASED: { |
| 28 KeyEvent key_event(xev); |
| 29 delegate_->DispatchEvent(&key_event); |
| 30 break; |
| 31 } |
| 32 case ET_MOUSE_PRESSED: |
| 33 case ET_MOUSE_MOVED: |
| 34 case ET_MOUSE_DRAGGED: |
| 35 case ET_MOUSE_RELEASED: { |
| 36 MouseEvent mouse_event(xev); |
| 37 delegate_->DispatchEvent(&mouse_event); |
| 38 break; |
| 39 } |
| 40 case ET_MOUSEWHEEL: { |
| 41 MouseWheelEvent wheel_event(xev); |
| 42 delegate_->DispatchEvent(&wheel_event); |
| 43 break; |
| 44 } |
| 45 case ET_SCROLL_FLING_START: |
| 46 case ET_SCROLL_FLING_CANCEL: |
| 47 case ET_SCROLL: { |
| 48 ScrollEvent scroll_event(xev); |
| 49 delegate_->DispatchEvent(&scroll_event); |
| 50 break; |
| 51 } |
| 52 case ET_TOUCH_MOVED: |
| 53 case ET_TOUCH_PRESSED: |
| 54 case ET_TOUCH_CANCELLED: |
| 55 case ET_TOUCH_RELEASED: { |
| 56 TouchEvent touch_event(xev); |
| 57 delegate_->DispatchEvent(&touch_event); |
| 58 break; |
| 59 } |
| 60 default: |
| 61 break; |
| 62 } |
| 63 } |
| 64 |
| 65 bool X11Window::CanDispatchEvent(const PlatformEvent& event) { |
| 66 const XEvent* xevent = static_cast<const XEvent*>(event); |
| 67 return XWindowFromXEvent(*xevent) == xwindow_; |
| 68 } |
| 69 |
| 70 uint32_t X11Window::DispatchEvent(const PlatformEvent& event) { |
| 71 XEvent* xev = static_cast<XEvent*>(event); |
| 72 switch (xev->type) { |
| 73 case Expose: |
| 74 case FocusOut: |
| 75 case ConfigureNotify: |
| 76 case ClientMessage: { |
| 77 // Shared event handling implementation with ozone. |
| 78 ProcessXWindowEvent(*xev); |
| 79 break; |
| 80 } |
| 81 |
| 82 case EnterNotify: { |
| 83 // EnterNotify creates ET_MOUSE_MOVED. Mark as synthesized as this is |
| 84 // not real mouse move event. |
| 85 MouseEvent mouse_event(xev); |
| 86 CHECK_EQ(ET_MOUSE_MOVED, mouse_event.type()); |
| 87 mouse_event.set_flags(mouse_event.flags() | EF_IS_SYNTHESIZED); |
| 88 delegate_->DispatchEvent(&mouse_event); |
| 89 break; |
| 90 } |
| 91 case LeaveNotify: { |
| 92 MouseEvent mouse_event(xev); |
| 93 delegate_->DispatchEvent(&mouse_event); |
| 94 break; |
| 95 } |
| 96 |
| 97 { |
| 98 gfx::Rect damage_rect(xev->xexpose.x, xev->xexpose.y, |
| 99 xev->xexpose.width, xev->xexpose.height); |
| 100 delegate_->OnDamageRect(damage_rect); |
| 101 break; |
| 102 } |
| 103 |
| 104 case KeyPress: |
| 105 case KeyRelease: { |
| 106 KeyEvent key_event(xev); |
| 107 delegate_->DispatchEvent(&key_event); |
| 108 break; |
| 109 } |
| 110 |
| 111 case ButtonPress: |
| 112 case ButtonRelease: { |
| 113 switch (EventTypeFromNative(xev)) { |
| 114 case ET_MOUSEWHEEL: { |
| 115 MouseWheelEvent mouseev(xev); |
| 116 delegate_->DispatchEvent(&mouseev); |
| 117 break; |
| 118 } |
| 119 case ET_MOUSE_PRESSED: |
| 120 case ET_MOUSE_RELEASED: { |
| 121 MouseEvent mouseev(xev); |
| 122 delegate_->DispatchEvent(&mouseev); |
| 123 break; |
| 124 } |
| 125 case ET_UNKNOWN: |
| 126 // No event is created for X11-release events for mouse-wheel |
| 127 // buttons. |
| 128 break; |
| 129 default: |
| 130 NOTREACHED(); |
| 131 } |
| 132 break; |
| 133 } |
| 134 |
| 135 case GenericEvent: { |
| 136 ProcessXInput2Event(xev); |
| 137 break; |
| 138 } |
| 139 } |
| 140 return POST_DISPATCH_STOP_PROPAGATION; |
| 141 } |
| 142 |
| 143 bool X11Window::DispatchXEvent(const XEvent& xev) { |
| 144 NOTREACHED(); |
| 145 return false; |
| 146 } |
| 147 |
| 148 } // namespace ui |
OLD | NEW |