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

Side by Side Diff: ui/events/x/events_x.cc

Issue 706763003: x11: Always require XI2.2 for X11. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: tot-merge Created 6 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 unified diff | Download patch
« no previous file with comments | « ui/events/platform/x11/x11_hotplug_event_handler.cc ('k') | ui/events/x/events_x_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/events/event_constants.h" 5 #include "ui/events/event_constants.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 #include <string.h> 8 #include <string.h>
9 #include <X11/extensions/XInput.h> 9 #include <X11/extensions/XInput.h>
10 #include <X11/extensions/XInput2.h> 10 #include <X11/extensions/XInput2.h>
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 private: 102 private:
103 friend struct DefaultSingletonTraits<XModifierStateWatcher>; 103 friend struct DefaultSingletonTraits<XModifierStateWatcher>;
104 104
105 XModifierStateWatcher() : state_(0) { } 105 XModifierStateWatcher() : state_(0) { }
106 106
107 unsigned int state_; 107 unsigned int state_;
108 108
109 DISALLOW_COPY_AND_ASSIGN(XModifierStateWatcher); 109 DISALLOW_COPY_AND_ASSIGN(XModifierStateWatcher);
110 }; 110 };
111 111
112 #if defined(USE_XI2_MT)
113 // Detects if a touch event is a driver-generated 'special event'. 112 // Detects if a touch event is a driver-generated 'special event'.
114 // A 'special event' is a touch event with maximum radius and pressure at 113 // A 'special event' is a touch event with maximum radius and pressure at
115 // location (0, 0). 114 // location (0, 0).
116 // This needs to be done in a cleaner way: http://crbug.com/169256 115 // This needs to be done in a cleaner way: http://crbug.com/169256
117 bool TouchEventIsGeneratedHack(const base::NativeEvent& native_event) { 116 bool TouchEventIsGeneratedHack(const base::NativeEvent& native_event) {
118 XIDeviceEvent* event = 117 XIDeviceEvent* event =
119 static_cast<XIDeviceEvent*>(native_event->xcookie.data); 118 static_cast<XIDeviceEvent*>(native_event->xcookie.data);
120 CHECK(event->evtype == XI_TouchBegin || 119 CHECK(event->evtype == XI_TouchBegin ||
121 event->evtype == XI_TouchUpdate || 120 event->evtype == XI_TouchUpdate ||
122 event->evtype == XI_TouchEnd); 121 event->evtype == XI_TouchEnd);
123 122
124 // Force is normalized to [0, 1]. 123 // Force is normalized to [0, 1].
125 if (ui::GetTouchForce(native_event) < 1.0f) 124 if (ui::GetTouchForce(native_event) < 1.0f)
126 return false; 125 return false;
127 126
128 if (ui::EventLocationFromNative(native_event) != gfx::Point()) 127 if (ui::EventLocationFromNative(native_event) != gfx::Point())
129 return false; 128 return false;
130 129
131 // Radius is in pixels, and the valuator is the diameter in pixels. 130 // Radius is in pixels, and the valuator is the diameter in pixels.
132 double radius = ui::GetTouchRadiusX(native_event), min, max; 131 double radius = ui::GetTouchRadiusX(native_event), min, max;
133 unsigned int deviceid = 132 unsigned int deviceid =
134 static_cast<XIDeviceEvent*>(native_event->xcookie.data)->sourceid; 133 static_cast<XIDeviceEvent*>(native_event->xcookie.data)->sourceid;
135 if (!ui::DeviceDataManagerX11::GetInstance()->GetDataRange( 134 if (!ui::DeviceDataManagerX11::GetInstance()->GetDataRange(
136 deviceid, ui::DeviceDataManagerX11::DT_TOUCH_MAJOR, &min, &max)) { 135 deviceid, ui::DeviceDataManagerX11::DT_TOUCH_MAJOR, &min, &max)) {
137 return false; 136 return false;
138 } 137 }
139 138
140 return radius * 2 == max; 139 return radius * 2 == max;
141 } 140 }
142 #endif
143 141
144 int GetEventFlagsFromXState(unsigned int state) { 142 int GetEventFlagsFromXState(unsigned int state) {
145 int flags = 0; 143 int flags = 0;
146 if (state & ControlMask) 144 if (state & ControlMask)
147 flags |= ui::EF_CONTROL_DOWN; 145 flags |= ui::EF_CONTROL_DOWN;
148 if (state & ShiftMask) 146 if (state & ShiftMask)
149 flags |= ui::EF_SHIFT_DOWN; 147 flags |= ui::EF_SHIFT_DOWN;
150 if (state & Mod1Mask) 148 if (state & Mod1Mask)
151 flags |= ui::EF_ALT_DOWN; 149 flags |= ui::EF_ALT_DOWN;
152 if (state & LockMask) 150 if (state & LockMask)
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
239 ui::DeviceDataManagerX11::GetInstance()->GetMappedButton(i) : i; 237 ui::DeviceDataManagerX11::GetInstance()->GetMappedButton(i) : i;
240 buttonflags |= GetEventFlagsForButton(button); 238 buttonflags |= GetEventFlagsForButton(button);
241 } 239 }
242 } 240 }
243 return buttonflags; 241 return buttonflags;
244 } 242 }
245 243
246 ui::EventType GetTouchEventType(const base::NativeEvent& native_event) { 244 ui::EventType GetTouchEventType(const base::NativeEvent& native_event) {
247 XIDeviceEvent* event = 245 XIDeviceEvent* event =
248 static_cast<XIDeviceEvent*>(native_event->xcookie.data); 246 static_cast<XIDeviceEvent*>(native_event->xcookie.data);
249 #if defined(USE_XI2_MT)
250 switch(event->evtype) { 247 switch(event->evtype) {
251 case XI_TouchBegin: 248 case XI_TouchBegin:
252 return TouchEventIsGeneratedHack(native_event) ? ui::ET_UNKNOWN : 249 return TouchEventIsGeneratedHack(native_event) ? ui::ET_UNKNOWN :
253 ui::ET_TOUCH_PRESSED; 250 ui::ET_TOUCH_PRESSED;
254 case XI_TouchUpdate: 251 case XI_TouchUpdate:
255 return TouchEventIsGeneratedHack(native_event) ? ui::ET_UNKNOWN : 252 return TouchEventIsGeneratedHack(native_event) ? ui::ET_UNKNOWN :
256 ui::ET_TOUCH_MOVED; 253 ui::ET_TOUCH_MOVED;
257 case XI_TouchEnd: 254 case XI_TouchEnd:
258 return TouchEventIsGeneratedHack(native_event) ? ui::ET_TOUCH_CANCELLED : 255 return TouchEventIsGeneratedHack(native_event) ? ui::ET_TOUCH_CANCELLED :
259 ui::ET_TOUCH_RELEASED; 256 ui::ET_TOUCH_RELEASED;
260 } 257 }
261 #endif // defined(USE_XI2_MT)
262 258
263 DCHECK(ui::TouchFactory::GetInstance()->IsTouchDevice(event->sourceid)); 259 DCHECK(ui::TouchFactory::GetInstance()->IsTouchDevice(event->sourceid));
264 switch (event->evtype) { 260 switch (event->evtype) {
265 case XI_ButtonPress: 261 case XI_ButtonPress:
266 return ui::ET_TOUCH_PRESSED; 262 return ui::ET_TOUCH_PRESSED;
267 case XI_ButtonRelease: 263 case XI_ButtonRelease:
268 return ui::ET_TOUCH_RELEASED; 264 return ui::ET_TOUCH_RELEASED;
269 case XI_Motion: 265 case XI_Motion:
270 // Should not convert any emulated Motion event from touch device to 266 // Should not convert any emulated Motion event from touch device to
271 // touch event. 267 // touch event.
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
480 case EnterNotify: 476 case EnterNotify:
481 case LeaveNotify: 477 case LeaveNotify:
482 return GetEventFlagsFromXState(native_event->xcrossing.state); 478 return GetEventFlagsFromXState(native_event->xcrossing.state);
483 case MotionNotify: 479 case MotionNotify:
484 return GetEventFlagsFromXState(native_event->xmotion.state); 480 return GetEventFlagsFromXState(native_event->xmotion.state);
485 case GenericEvent: { 481 case GenericEvent: {
486 XIDeviceEvent* xievent = 482 XIDeviceEvent* xievent =
487 static_cast<XIDeviceEvent*>(native_event->xcookie.data); 483 static_cast<XIDeviceEvent*>(native_event->xcookie.data);
488 484
489 switch (xievent->evtype) { 485 switch (xievent->evtype) {
490 #if defined(USE_XI2_MT)
491 case XI_TouchBegin: 486 case XI_TouchBegin:
492 case XI_TouchUpdate: 487 case XI_TouchUpdate:
493 case XI_TouchEnd: 488 case XI_TouchEnd:
494 return GetButtonMaskForX2Event(xievent) | 489 return GetButtonMaskForX2Event(xievent) |
495 GetEventFlagsFromXState(xievent->mods.effective) | 490 GetEventFlagsFromXState(xievent->mods.effective) |
496 GetEventFlagsFromXState( 491 GetEventFlagsFromXState(
497 XModifierStateWatcher::GetInstance()->state()); 492 XModifierStateWatcher::GetInstance()->state());
498 break; 493 break;
499 #endif
500 case XI_ButtonPress: 494 case XI_ButtonPress:
501 case XI_ButtonRelease: { 495 case XI_ButtonRelease: {
502 const bool touch = 496 const bool touch =
503 TouchFactory::GetInstance()->IsTouchDevice(xievent->sourceid); 497 TouchFactory::GetInstance()->IsTouchDevice(xievent->sourceid);
504 int flags = GetButtonMaskForX2Event(xievent) | 498 int flags = GetButtonMaskForX2Event(xievent) |
505 GetEventFlagsFromXState(xievent->mods.effective); 499 GetEventFlagsFromXState(xievent->mods.effective);
506 if (touch) { 500 if (touch) {
507 flags |= GetEventFlagsFromXState( 501 flags |= GetEventFlagsFromXState(
508 XModifierStateWatcher::GetInstance()->state()); 502 XModifierStateWatcher::GetInstance()->state());
509 } 503 }
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after
920 xievent->detail = 914 xievent->detail =
921 UpdateX11EventButton(event->changed_button_flags(), xievent->detail); 915 UpdateX11EventButton(event->changed_button_flags(), xievent->detail);
922 break; 916 break;
923 } 917 }
924 default: 918 default:
925 break; 919 break;
926 } 920 }
927 } 921 }
928 922
929 } // namespace ui 923 } // namespace ui
OLDNEW
« no previous file with comments | « ui/events/platform/x11/x11_hotplug_event_handler.cc ('k') | ui/events/x/events_x_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698