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

Unified Diff: ui/views/widget/desktop_aura/desktop_screen_x11.cc

Issue 2398343002: X11: Avoid round-tripping to get the cursor position (Closed)
Patch Set: Revert install-sysroot thing Created 4 years, 2 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/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));
}
« ui/events/platform/x11/x11_event_source.cc ('K') | « ui/events/platform/x11/x11_event_source.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698