Index: ui/views/widget/desktop_aura/desktop_screen_x11.cc |
diff --git a/ui/views/widget/desktop_aura/desktop_screen_x11.cc b/ui/views/widget/desktop_aura/desktop_screen_x11.cc |
index 96f20cca2160c9983c4ea002fb5be5eec4dd92e0..9dec99ad80e7765559635cda06ce27b7c0785656 100644 |
--- a/ui/views/widget/desktop_aura/desktop_screen_x11.cc |
+++ b/ui/views/widget/desktop_aura/desktop_screen_x11.cc |
@@ -4,6 +4,7 @@ |
#include "ui/views/widget/desktop_aura/desktop_screen_x11.h" |
+#include <X11/extensions/XInput2.h> |
#include <X11/extensions/Xrandr.h> |
#include <X11/Xlib.h> |
@@ -22,6 +23,7 @@ |
#include "ui/display/util/display_util.h" |
#include "ui/display/util/x11/edid_parser_x11.h" |
#include "ui/events/platform/platform_event_source.h" |
+#include "ui/events/platform/x11/x11_event_source.h" |
#include "ui/gfx/font_render_params.h" |
#include "ui/gfx/geometry/point_conversions.h" |
#include "ui/gfx/geometry/size_conversions.h" |
@@ -133,20 +135,47 @@ DesktopScreenX11::~DesktopScreenX11() { |
gfx::Point DesktopScreenX11::GetCursorScreenPoint() { |
TRACE_EVENT0("views", "DesktopScreenX11::GetCursorScreenPoint()"); |
- XDisplay* display = gfx::GetXDisplay(); |
+ const XEvent* event = |
+ ui::X11EventSource::HasInstance() |
+ ? ui::X11EventSource::GetInstance()->get_dispatching_event() |
+ : nullptr; |
+ |
+ if (event) { |
+ switch (event->type) { |
+ case ButtonPress: |
+ case ButtonRelease: |
+ return gfx::Point(event->xbutton.x_root, event->xbutton.y_root); |
+ case MotionNotify: |
+ return gfx::Point(event->xmotion.x_root, event->xmotion.y_root); |
+ case EnterNotify: |
+ case LeaveNotify: |
+ return gfx::Point(event->xcrossing.x_root, event->xcrossing.y_root); |
+ case GenericEvent: |
+ const XIEvent* xi_event = |
Tom (Use chromium acct)
2016/10/07 00:23:18
Do we need to check for deviceid or sourceid here?
sadrul
2016/10/07 02:12:51
Probably check with TouchFactory first (like in ht
Tom (Use chromium acct)
2016/10/07 21:13:18
Done.
|
+ static_cast<const XIEvent*>(event->xcookie.data); |
+ switch (xi_event->evtype) { |
+ case XI_ButtonPress: |
+ case XI_ButtonRelease: |
+ case XI_Motion: { |
+ const XIDeviceEvent* device_event = |
+ static_cast<const XIDeviceEvent*>(event->xcookie.data); |
+ return gfx::Point(device_event->root_x, device_event->root_y); |
+ } |
+ case XI_Enter: |
+ case XI_Leave: { |
+ const XIEnterEvent* enter_event = |
+ static_cast<const XIEnterEvent*>(event->xcookie.data); |
+ return gfx::Point(enter_event->root_x, enter_event->root_y); |
+ } |
Tom (Use chromium acct)
2016/10/07 00:23:18
Do we also need to handle XI_Touch{Begin,Update,En
sadrul
2016/10/07 02:12:51
Let's not. chrome generally expects that touch eve
Tom (Use chromium acct)
2016/10/07 21:13:18
Acknowledged.
|
+ } |
+ } |
+ } |
::Window root, child; |
int root_x, root_y, win_x, win_y; |
unsigned int mask; |
- XQueryPointer(display, |
- DefaultRootWindow(display), |
- &root, |
- &child, |
- &root_x, |
- &root_y, |
- &win_x, |
- &win_y, |
- &mask); |
+ XQueryPointer(xdisplay_, x_root_window_, &root, &child, &root_x, &root_y, |
+ &win_x, &win_y, &mask); |
return PixelToDIPPoint(gfx::Point(root_x, root_y)); |
} |