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

Unified Diff: ui/aura/desktop_host_linux.cc

Issue 8634009: aura: Turn XInput2 back on. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: merge Created 9 years, 1 month 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
« no previous file with comments | « chrome/browser/chromeos/cros_stubs_aura.cc ('k') | ui/base/x/events_x.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/aura/desktop_host_linux.cc
diff --git a/ui/aura/desktop_host_linux.cc b/ui/aura/desktop_host_linux.cc
index 9934467fcbb2b8b49208f0a45a5fcdf60137d293..6344d69f572d34f7caa8c6f59a320dc9f8ab174d 100644
--- a/ui/aura/desktop_host_linux.cc
+++ b/ui/aura/desktop_host_linux.cc
@@ -33,6 +33,51 @@ namespace aura {
namespace {
+// The events reported for slave devices can have incorrect information for some
+// fields. This utility function is used to check for such inconsistencies.
+void CheckXEventForConsistency(XEvent* xevent) {
+ static bool expect_master_event = false;
+ static XIDeviceEvent slave_event;
+ static gfx::Point slave_location;
sky 2011/11/30 16:38:04 Statics should only be primitive types.
+
+ if (!xevent || xevent->type != GenericEvent) {
+ expect_master_event = false;
+ return;
+ }
+
+ XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xevent->xcookie.data);
+ if (xievent->evtype != XI_Motion &&
+ xievent->evtype != XI_ButtonPress &&
+ xievent->evtype != XI_ButtonRelease) {
+ expect_master_event = false;
+ return;
+ }
+
+ if (xievent->sourceid == xievent->deviceid) {
+ // This is a slave event. We shouldn't have been expecting a master event.
+ CHECK(!expect_master_event);
+ slave_event = *xievent;
+ slave_location = ui::EventLocationFromNative(xevent);
+ expect_master_event = true;
+ } else if (expect_master_event) {
+ CHECK_EQ(slave_location.x(), ui::EventLocationFromNative(xevent).x());
+ CHECK_EQ(slave_location.y(), ui::EventLocationFromNative(xevent).y());
+
+ CHECK_EQ(slave_event.type, xievent->type);
+ CHECK_EQ(slave_event.evtype, xievent->evtype);
+ CHECK_EQ(slave_event.detail, xievent->detail);
+ CHECK_EQ(slave_event.flags, xievent->flags);
+ CHECK_EQ(slave_event.buttons.mask_len, xievent->buttons.mask_len);
+ CHECK_EQ(slave_event.valuators.mask_len, xievent->valuators.mask_len);
+ CHECK_EQ(slave_event.mods.base, xievent->mods.base);
+ CHECK_EQ(slave_event.mods.latched, xievent->mods.latched);
+ CHECK_EQ(slave_event.mods.locked, xievent->mods.locked);
+ CHECK_EQ(slave_event.mods.effective, xievent->mods.effective);
+
+ expect_master_event = false;
+ }
+}
+
// Returns X font cursor shape from an Aura cursor.
int CursorShapeFromNative(gfx::NativeCursor native_cursor) {
switch (native_cursor) {
@@ -141,6 +186,7 @@ int CoalescePendingXIMotionEvents(const XEvent* xev, XEvent* last_event) {
// with one from the master and one from the slave so there will
// always be at least one pending.
if (!ui::TouchFactory::GetInstance()->ShouldProcessXI2Event(&next_event)) {
+ CheckXEventForConsistency(&next_event);
XFreeEventData(display, &next_event.xcookie);
XNextEvent(display, &next_event);
continue;
@@ -169,6 +215,7 @@ int CoalescePendingXIMotionEvents(const XEvent* xev, XEvent* last_event) {
// Get the event and its cookie data.
XNextEvent(display, last_event);
XGetEventData(display, &last_event->xcookie);
+ CheckXEventForConsistency(last_event);
++num_coalesed;
continue;
} else {
@@ -280,6 +327,7 @@ DesktopHostLinux::DesktopHostLinux(const gfx::Rect& bounds)
long event_mask = ButtonPressMask | ButtonReleaseMask |
KeyPressMask | KeyReleaseMask |
+ EnterWindowMask | LeaveWindowMask |
ExposureMask | VisibilityChangeMask |
StructureNotifyMask | PropertyChangeMask |
PointerMotionMask;
@@ -287,11 +335,8 @@ DesktopHostLinux::DesktopHostLinux(const gfx::Rect& bounds)
XSelectInput(xdisplay_, root_window_, StructureNotifyMask);
XFlush(xdisplay_);
- // TODO(sadrul): reenable once 103981 is fixed.
-#if defined(TOUCH_UI)
if (base::MessagePumpForUI::HasXInput2())
DaveMoore 2011/11/30 16:51:51 Do we ever expect to run in an environment w/out X
sadrul 2011/11/30 16:53:50 XInput2 is usually not available when running over
ui::TouchFactory::GetInstance()->SetupXI2ForXWindow(xwindow_);
-#endif
}
DesktopHostLinux::~DesktopHostLinux() {
@@ -306,6 +351,9 @@ base::MessagePumpDispatcher::DispatchStatus DesktopHostLinux::Dispatch(
DLOG(WARNING) << "DispatchEvent:" << xev->type;
bool handled = false;
+
+ CheckXEventForConsistency(xev);
+
switch (xev->type) {
case Expose:
desktop_->Draw();
« no previous file with comments | « chrome/browser/chromeos/cros_stubs_aura.cc ('k') | ui/base/x/events_x.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698