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

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

Issue 1287103004: Sync ui/events to chromium @ https://codereview.chromium.org/1210203002 (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: rebased Created 5 years, 4 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 unified diff | Download patch
« no previous file with comments | « ui/events/touchscreen_device.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/platform/platform_event_utils.h" 5 #include "ui/events/event_constants.h"
6 6
7 #include <string.h> 7 #include <string.h>
8 #include <X11/extensions/XInput.h> 8 #include <X11/extensions/XInput.h>
9 #include <X11/extensions/XInput2.h> 9 #include <X11/extensions/XInput2.h>
10 #include <X11/XKBlib.h> 10 #include <X11/XKBlib.h>
11 #include <X11/Xlib.h> 11 #include <X11/Xlib.h>
12 #include <X11/Xutil.h> 12 #include <X11/Xutil.h>
13 #include <cmath> 13 #include <cmath>
14 14
15 #include "base/logging.h" 15 #include "base/logging.h"
16 #include "base/memory/singleton.h" 16 #include "base/memory/singleton.h"
17 #include "ui/events/devices/x11/device_data_manager_x11.h"
18 #include "ui/events/devices/x11/device_list_cache_x11.h"
19 #include "ui/events/devices/x11/touch_factory_x11.h"
17 #include "ui/events/event.h" 20 #include "ui/events/event.h"
18 #include "ui/events/event_constants.h"
19 #include "ui/events/event_utils.h" 21 #include "ui/events/event_utils.h"
20 #include "ui/events/platform/x11/device_data_manager_x11.h" 22 #include "ui/events/keycodes/keyboard_code_conversion_x.h"
21 #include "ui/events/platform/x11/device_list_cache_x.h"
22 #include "ui/events/platform/x11/keyboard_code_conversion_x11.h"
23 #include "ui/events/platform/x11/touch_factory_x11.h"
24 #include "ui/gfx/display.h" 23 #include "ui/gfx/display.h"
25 #include "ui/gfx/point.h" 24 #include "ui/gfx/geometry/point.h"
26 #include "ui/gfx/rect.h" 25 #include "ui/gfx/geometry/rect.h"
26 #include "ui/gfx/screen.h"
27 #include "ui/gfx/x/x11_atom_cache.h" 27 #include "ui/gfx/x/x11_atom_cache.h"
28 #include "ui/gfx/x/x11_types.h" 28 #include "ui/gfx/x/x11_types.h"
29 29
30 namespace { 30 namespace {
31 31
32 // Scroll amount for each wheelscroll event. 53 is also the value used for GTK+. 32 // Scroll amount for each wheelscroll event. 53 is also the value used for GTK+.
33 const int kWheelScrollAmount = 53; 33 const int kWheelScrollAmount = 53;
34 34
35 const int kMinWheelButton = 4; 35 const int kMinWheelButton = 4;
36 const int kMaxWheelButton = 7; 36 const int kMaxWheelButton = 7;
37 37
38 // A class to track current modifier state on master device. Only track ctrl, 38 // A class to track current modifier state on master device. Only track ctrl,
39 // alt, shift and caps lock keys currently. The tracked state can then be used 39 // alt, shift and caps lock keys currently. The tracked state can then be used
40 // by floating device. 40 // by floating device.
41 class XModifierStateWatcher { 41 class XModifierStateWatcher{
42 public: 42 public:
43 static XModifierStateWatcher* GetInstance() { 43 static XModifierStateWatcher* GetInstance() {
44 return Singleton<XModifierStateWatcher>::get(); 44 return Singleton<XModifierStateWatcher>::get();
45 } 45 }
46 46
47 int StateFromKeyboardCode(ui::KeyboardCode keyboard_code) { 47 int StateFromKeyboardCode(ui::KeyboardCode keyboard_code) {
48 switch (keyboard_code) { 48 switch (keyboard_code) {
49 case ui::VKEY_CONTROL: 49 case ui::VKEY_CONTROL:
50 return ControlMask; 50 return ControlMask;
51 case ui::VKEY_SHIFT: 51 case ui::VKEY_SHIFT:
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 } 95 }
96 } 96 }
97 97
98 // Returns the current modifer state in master device. It only contains the 98 // Returns the current modifer state in master device. It only contains the
99 // state of ctrl, shift, alt and caps lock keys. 99 // state of ctrl, shift, alt and caps lock keys.
100 unsigned int state() { return state_; } 100 unsigned int state() { return state_; }
101 101
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 || event->evtype == XI_TouchUpdate || 119 CHECK(event->evtype == XI_TouchBegin ||
120 event->evtype == XI_TouchUpdate ||
121 event->evtype == XI_TouchEnd); 121 event->evtype == XI_TouchEnd);
122 122
123 // Force is normalized to [0, 1]. 123 // Force is normalized to [0, 1].
124 if (ui::GetTouchForce(native_event) < 1.0f) 124 if (ui::GetTouchForce(native_event) < 1.0f)
125 return false; 125 return false;
126 126
127 if (ui::EventLocationFromNative(native_event) != gfx::Point()) 127 if (ui::EventLocationFromNative(native_event) != gfx::Point())
128 return false; 128 return false;
129 129
130 // 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.
131 double radius = ui::GetTouchRadiusX(native_event), min, max; 131 double radius = ui::GetTouchRadiusX(native_event), min, max;
132 unsigned int deviceid = 132 unsigned int deviceid =
133 static_cast<XIDeviceEvent*>(native_event->xcookie.data)->sourceid; 133 static_cast<XIDeviceEvent*>(native_event->xcookie.data)->sourceid;
134 if (!ui::DeviceDataManagerX11::GetInstance()->GetDataRange( 134 if (!ui::DeviceDataManagerX11::GetInstance()->GetDataRange(
135 deviceid, ui::DeviceDataManagerX11::DT_TOUCH_MAJOR, &min, &max)) { 135 deviceid, ui::DeviceDataManagerX11::DT_TOUCH_MAJOR, &min, &max)) {
136 return false; 136 return false;
137 } 137 }
138 138
139 return radius * 2 == max; 139 return radius * 2 == max;
140 } 140 }
141 #endif
142 141
143 int GetEventFlagsFromXState(unsigned int state) { 142 int GetEventFlagsFromXState(unsigned int state) {
144 int flags = 0; 143 int flags = 0;
145 if (state & ControlMask) 144 if (state & ControlMask)
146 flags |= ui::EF_CONTROL_DOWN; 145 flags |= ui::EF_CONTROL_DOWN;
147 if (state & ShiftMask) 146 if (state & ShiftMask)
148 flags |= ui::EF_SHIFT_DOWN; 147 flags |= ui::EF_SHIFT_DOWN;
149 if (state & Mod1Mask) 148 if (state & Mod1Mask)
150 flags |= ui::EF_ALT_DOWN; 149 flags |= ui::EF_ALT_DOWN;
151 if (state & LockMask) 150 if (state & LockMask)
152 flags |= ui::EF_CAPS_LOCK_DOWN; 151 flags |= ui::EF_CAPS_LOCK_DOWN;
153 if (state & Mod3Mask) 152 if (state & Mod3Mask)
154 flags |= ui::EF_MOD3_DOWN; 153 flags |= ui::EF_MOD3_DOWN;
155 if (state & Mod4Mask) 154 if (state & Mod4Mask)
156 flags |= ui::EF_COMMAND_DOWN; 155 flags |= ui::EF_COMMAND_DOWN;
157 if (state & Mod5Mask) 156 if (state & Mod5Mask)
158 flags |= ui::EF_ALTGR_DOWN; 157 flags |= ui::EF_ALTGR_DOWN;
159 if (state & Button1Mask) 158 if (state & Button1Mask)
160 flags |= ui::EF_LEFT_MOUSE_BUTTON; 159 flags |= ui::EF_LEFT_MOUSE_BUTTON;
161 if (state & Button2Mask) 160 if (state & Button2Mask)
162 flags |= ui::EF_MIDDLE_MOUSE_BUTTON; 161 flags |= ui::EF_MIDDLE_MOUSE_BUTTON;
163 if (state & Button3Mask) 162 if (state & Button3Mask)
164 flags |= ui::EF_RIGHT_MOUSE_BUTTON; 163 flags |= ui::EF_RIGHT_MOUSE_BUTTON;
164 // There are no masks for EF_BACK_MOUSE_BUTTON and
165 // EF_FORWARD_MOUSE_BUTTON.
165 return flags; 166 return flags;
166 } 167 }
167 168
168 int GetEventFlagsFromXKeyEvent(XEvent* xevent) { 169 int GetEventFlagsFromXKeyEvent(XEvent* xevent) {
169 DCHECK(xevent->type == KeyPress || xevent->type == KeyRelease); 170 DCHECK(xevent->type == KeyPress || xevent->type == KeyRelease);
170 171
171 #if defined(OS_CHROMEOS) 172 #if defined(OS_CHROMEOS)
172 const int ime_fabricated_flag = 0; 173 const int ime_fabricated_flag = 0;
173 #else 174 #else
174 // XIM fabricates key events for the character compositions by XK_Multi_key. 175 // XIM fabricates key events for the character compositions by XK_Multi_key.
175 // For example, when a user hits XK_Multi_key, XK_apostrophe, and XK_e in 176 // For example, when a user hits XK_Multi_key, XK_apostrophe, and XK_e in
176 // order to input "é", then XIM generates a key event with keycode=0 and 177 // order to input "é", then XIM generates a key event with keycode=0 and
177 // state=0 for the composition, and the sequence of X11 key events will be 178 // state=0 for the composition, and the sequence of X11 key events will be
178 // XK_Multi_key, XK_apostrophe, **NoSymbol**, and XK_e. If the user used 179 // XK_Multi_key, XK_apostrophe, **NoSymbol**, and XK_e. If the user used
179 // shift key and/or caps lock key, state can be ShiftMask, LockMask or both. 180 // shift key and/or caps lock key, state can be ShiftMask, LockMask or both.
180 // 181 //
181 // We have to send these fabricated key events to XIM so it can correctly 182 // We have to send these fabricated key events to XIM so it can correctly
182 // handle the character compositions. 183 // handle the character compositions.
183 const unsigned int shift_lock_mask = ShiftMask | LockMask; 184 const unsigned int shift_lock_mask = ShiftMask | LockMask;
184 const bool fabricated_by_xim = 185 const bool fabricated_by_xim =
185 xevent->xkey.keycode == 0 && (xevent->xkey.state & ~shift_lock_mask) == 0; 186 xevent->xkey.keycode == 0 &&
187 (xevent->xkey.state & ~shift_lock_mask) == 0;
186 const int ime_fabricated_flag = 188 const int ime_fabricated_flag =
187 fabricated_by_xim ? ui::EF_IME_FABRICATED_KEY : 0; 189 fabricated_by_xim ? ui::EF_IME_FABRICATED_KEY : 0;
188 #endif 190 #endif
189 191
190 return GetEventFlagsFromXState(xevent->xkey.state) | 192 return GetEventFlagsFromXState(xevent->xkey.state) |
191 (xevent->xkey.send_event ? ui::EF_FINAL : 0) | 193 (xevent->xkey.send_event ? ui::EF_FINAL : 0) |
192 (IsKeypadKey(XLookupKeysym(&xevent->xkey, 0)) ? ui::EF_NUMPAD_KEY 194 ime_fabricated_flag;
193 : 0) |
194 (IsFunctionKey(XLookupKeysym(&xevent->xkey, 0)) ? ui::EF_FUNCTION_KEY
195 : 0) |
196 ime_fabricated_flag;
197 } 195 }
198 196
199 int GetEventFlagsFromXGenericEvent(XEvent* xevent) { 197 int GetEventFlagsFromXGenericEvent(XEvent* xevent) {
200 DCHECK(xevent->type == GenericEvent); 198 DCHECK(xevent->type == GenericEvent);
201 XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xevent->xcookie.data); 199 XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xevent->xcookie.data);
202 DCHECK((xievent->evtype == XI_KeyPress) || 200 DCHECK((xievent->evtype == XI_KeyPress) ||
203 (xievent->evtype == XI_KeyRelease)); 201 (xievent->evtype == XI_KeyRelease));
204 return GetEventFlagsFromXState(xievent->mods.effective) | 202 return GetEventFlagsFromXState(xievent->mods.effective) |
205 (xevent->xkey.send_event ? ui::EF_FINAL : 0) | 203 (xevent->xkey.send_event ? ui::EF_FINAL : 0);
206 (IsKeypadKey(
207 XkbKeycodeToKeysym(xievent->display, xievent->detail, 0, 0))
208 ? ui::EF_NUMPAD_KEY
209 : 0);
210 } 204 }
211 205
212 // Get the event flag for the button in XButtonEvent. During a ButtonPress 206 // Get the event flag for the button in XButtonEvent. During a ButtonPress
213 // event, |state| in XButtonEvent does not include the button that has just been 207 // event, |state| in XButtonEvent does not include the button that has just been
214 // pressed. Instead |state| contains flags for the buttons (if any) that had 208 // pressed. Instead |state| contains flags for the buttons (if any) that had
215 // already been pressed before the current button, and |button| stores the most 209 // already been pressed before the current button, and |button| stores the most
216 // current pressed button. So, if you press down left mouse button, and while 210 // current pressed button. So, if you press down left mouse button, and while
217 // pressing it down, press down the right mouse button, then for the latter 211 // pressing it down, press down the right mouse button, then for the latter
218 // event, |state| would have Button1Mask set but not Button3Mask, and |button| 212 // event, |state| would have Button1Mask set but not Button3Mask, and |button|
219 // would be 3. 213 // would be 3.
220 int GetEventFlagsForButton(int button) { 214 int GetEventFlagsForButton(int button) {
221 switch (button) { 215 switch (button) {
222 case 1: 216 case 1:
223 return ui::EF_LEFT_MOUSE_BUTTON; 217 return ui::EF_LEFT_MOUSE_BUTTON;
224 case 2: 218 case 2:
225 return ui::EF_MIDDLE_MOUSE_BUTTON; 219 return ui::EF_MIDDLE_MOUSE_BUTTON;
226 case 3: 220 case 3:
227 return ui::EF_RIGHT_MOUSE_BUTTON; 221 return ui::EF_RIGHT_MOUSE_BUTTON;
222 case 8:
223 return ui::EF_BACK_MOUSE_BUTTON;
224 case 9:
225 return ui::EF_FORWARD_MOUSE_BUTTON;
228 default: 226 default:
229 return 0; 227 return 0;
230 } 228 }
231 } 229 }
232 230
233 int GetButtonMaskForX2Event(XIDeviceEvent* xievent) { 231 int GetButtonMaskForX2Event(XIDeviceEvent* xievent) {
234 int buttonflags = 0; 232 int buttonflags = 0;
235 for (int i = 0; i < 8 * xievent->buttons.mask_len; i++) { 233 for (int i = 0; i < 8 * xievent->buttons.mask_len; i++) {
236 if (XIMaskIsSet(xievent->buttons.mask, i)) { 234 if (XIMaskIsSet(xievent->buttons.mask, i)) {
237 int button = 235 int button = (xievent->sourceid == xievent->deviceid) ?
238 (xievent->sourceid == xievent->deviceid) 236 ui::DeviceDataManagerX11::GetInstance()->GetMappedButton(i) : i;
239 ? ui::DeviceDataManagerX11::GetInstance()->GetMappedButton(i)
240 : i;
241 buttonflags |= GetEventFlagsForButton(button); 237 buttonflags |= GetEventFlagsForButton(button);
242 } 238 }
243 } 239 }
244 return buttonflags; 240 return buttonflags;
245 } 241 }
246 242
247 ui::EventType GetTouchEventType(const base::NativeEvent& native_event) { 243 ui::EventType GetTouchEventType(const base::NativeEvent& native_event) {
248 XIDeviceEvent* event = 244 XIDeviceEvent* event =
249 static_cast<XIDeviceEvent*>(native_event->xcookie.data); 245 static_cast<XIDeviceEvent*>(native_event->xcookie.data);
250 #if defined(USE_XI2_MT) 246 switch(event->evtype) {
251 switch (event->evtype) {
252 case XI_TouchBegin: 247 case XI_TouchBegin:
253 return TouchEventIsGeneratedHack(native_event) ? ui::ET_UNKNOWN 248 return TouchEventIsGeneratedHack(native_event) ? ui::ET_UNKNOWN :
254 : ui::ET_TOUCH_PRESSED; 249 ui::ET_TOUCH_PRESSED;
255 case XI_TouchUpdate: 250 case XI_TouchUpdate:
256 return TouchEventIsGeneratedHack(native_event) ? ui::ET_UNKNOWN 251 return TouchEventIsGeneratedHack(native_event) ? ui::ET_UNKNOWN :
257 : ui::ET_TOUCH_MOVED; 252 ui::ET_TOUCH_MOVED;
258 case XI_TouchEnd: 253 case XI_TouchEnd:
259 return TouchEventIsGeneratedHack(native_event) ? ui::ET_TOUCH_CANCELLED 254 return TouchEventIsGeneratedHack(native_event) ? ui::ET_TOUCH_CANCELLED :
260 : ui::ET_TOUCH_RELEASED; 255 ui::ET_TOUCH_RELEASED;
261 } 256 }
262 #endif // defined(USE_XI2_MT)
263 257
264 DCHECK(ui::TouchFactory::GetInstance()->IsTouchDevice(event->sourceid)); 258 DCHECK(ui::TouchFactory::GetInstance()->IsTouchDevice(event->sourceid));
265 switch (event->evtype) { 259 switch (event->evtype) {
266 case XI_ButtonPress: 260 case XI_ButtonPress:
267 return ui::ET_TOUCH_PRESSED; 261 return ui::ET_TOUCH_PRESSED;
268 case XI_ButtonRelease: 262 case XI_ButtonRelease:
269 return ui::ET_TOUCH_RELEASED; 263 return ui::ET_TOUCH_RELEASED;
270 case XI_Motion: 264 case XI_Motion:
271 // Should not convert any emulated Motion event from touch device to 265 // Should not convert any emulated Motion event from touch device to
272 // touch event. 266 // touch event.
273 if (!(event->flags & XIPointerEmulated) && GetButtonMaskForX2Event(event)) 267 if (!(event->flags & XIPointerEmulated) &&
268 GetButtonMaskForX2Event(event))
274 return ui::ET_TOUCH_MOVED; 269 return ui::ET_TOUCH_MOVED;
275 return ui::ET_UNKNOWN; 270 return ui::ET_UNKNOWN;
276 default: 271 default:
277 NOTREACHED(); 272 NOTREACHED();
278 } 273 }
279 return ui::ET_UNKNOWN; 274 return ui::ET_UNKNOWN;
280 } 275 }
281 276
282 double GetTouchParamFromXEvent(XEvent* xev, 277 double GetTouchParamFromXEvent(XEvent* xev,
283 ui::DeviceDataManagerX11::DataType val, 278 ui::DeviceDataManagerX11::DataType val,
284 double default_value) { 279 double default_value) {
285 ui::DeviceDataManagerX11::GetInstance()->GetEventData(*xev, val, 280 ui::DeviceDataManagerX11::GetInstance()->GetEventData(
286 &default_value); 281 *xev, val, &default_value);
287 return default_value; 282 return default_value;
288 } 283 }
289 284
290 void ScaleTouchRadius(XEvent* xev, double* radius) { 285 void ScaleTouchRadius(XEvent* xev, double* radius) {
291 DCHECK_EQ(GenericEvent, xev->type); 286 DCHECK_EQ(GenericEvent, xev->type);
292 XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(xev->xcookie.data); 287 XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(xev->xcookie.data);
293 ui::DeviceDataManagerX11::GetInstance()->ApplyTouchRadiusScale(xiev->sourceid, 288 ui::DeviceDataManagerX11::GetInstance()->ApplyTouchRadiusScale(
294 radius); 289 xiev->sourceid, radius);
290 }
291
292 unsigned int UpdateX11EventFlags(int ui_flags, unsigned int old_x_flags) {
293 static struct {
294 int ui;
295 int x;
296 } flags[] = {
297 {ui::EF_CONTROL_DOWN, ControlMask},
298 {ui::EF_SHIFT_DOWN, ShiftMask},
299 {ui::EF_ALT_DOWN, Mod1Mask},
300 {ui::EF_CAPS_LOCK_DOWN, LockMask},
301 {ui::EF_ALTGR_DOWN, Mod5Mask},
302 {ui::EF_COMMAND_DOWN, Mod4Mask},
303 {ui::EF_MOD3_DOWN, Mod3Mask},
304 {ui::EF_LEFT_MOUSE_BUTTON, Button1Mask},
305 {ui::EF_MIDDLE_MOUSE_BUTTON, Button2Mask},
306 {ui::EF_RIGHT_MOUSE_BUTTON, Button3Mask},
307 };
308 unsigned int new_x_flags = old_x_flags;
309 for (size_t i = 0; i < arraysize(flags); ++i) {
310 if (ui_flags & flags[i].ui)
311 new_x_flags |= flags[i].x;
312 else
313 new_x_flags &= ~flags[i].x;
314 }
315 return new_x_flags;
316 }
317
318 unsigned int UpdateX11EventButton(int ui_flag, unsigned int old_x_button) {
319 switch (ui_flag) {
320 case ui::EF_LEFT_MOUSE_BUTTON:
321 return Button1;
322 case ui::EF_MIDDLE_MOUSE_BUTTON:
323 return Button2;
324 case ui::EF_RIGHT_MOUSE_BUTTON:
325 return Button3;
326 default:
327 return old_x_button;
328 }
329 NOTREACHED();
295 } 330 }
296 331
297 bool GetGestureTimes(const base::NativeEvent& native_event, 332 bool GetGestureTimes(const base::NativeEvent& native_event,
298 double* start_time, 333 double* start_time,
299 double* end_time) { 334 double* end_time) {
300 if (!ui::DeviceDataManagerX11::GetInstance()->HasGestureTimes(native_event)) 335 if (!ui::DeviceDataManagerX11::GetInstance()->HasGestureTimes(native_event))
301 return false; 336 return false;
302 337
303 double start_time_, end_time_; 338 double start_time_, end_time_;
304 if (!start_time) 339 if (!start_time)
305 start_time = &start_time_; 340 start_time = &start_time_;
306 if (!end_time) 341 if (!end_time)
307 end_time = &end_time_; 342 end_time = &end_time_;
308 343
309 ui::DeviceDataManagerX11::GetInstance()->GetGestureTimes( 344 ui::DeviceDataManagerX11::GetInstance()->GetGestureTimes(
310 native_event, start_time, end_time); 345 native_event, start_time, end_time);
311 return true; 346 return true;
312 } 347 }
313 348
314 } // namespace 349 } // namespace
315 350
316 namespace ui { 351 namespace ui {
317 352
318 void UpdateDeviceList() { 353 void UpdateDeviceList() {
319 XDisplay* display = gfx::GetXDisplay(); 354 XDisplay* display = gfx::GetXDisplay();
320 DeviceListCacheX::GetInstance()->UpdateDeviceList(display); 355 DeviceListCacheX11::GetInstance()->UpdateDeviceList(display);
321 TouchFactory::GetInstance()->UpdateDeviceList(display); 356 TouchFactory::GetInstance()->UpdateDeviceList(display);
322 DeviceDataManagerX11::GetInstance()->UpdateDeviceList(display); 357 DeviceDataManagerX11::GetInstance()->UpdateDeviceList(display);
323 } 358 }
324 359
325 EventType EventTypeFromNative(const base::NativeEvent& native_event) { 360 EventType EventTypeFromNative(const base::NativeEvent& native_event) {
326 // Allow the DeviceDataManager to block the event. If blocked return 361 // Allow the DeviceDataManager to block the event. If blocked return
327 // ET_UNKNOWN as the type so this event will not be further processed. 362 // ET_UNKNOWN as the type so this event will not be further processed.
328 // NOTE: During some events unittests there is no device data manager. 363 // NOTE: During some events unittests there is no device data manager.
329 if (DeviceDataManager::HasInstance() && 364 if (DeviceDataManager::HasInstance() &&
330 static_cast<DeviceDataManagerX11*>(DeviceDataManager::GetInstance()) 365 static_cast<DeviceDataManagerX11*>(DeviceDataManager::GetInstance())->
331 ->IsEventBlocked(native_event)) { 366 IsEventBlocked(native_event)) {
332 return ET_UNKNOWN; 367 return ET_UNKNOWN;
333 } 368 }
334 369
335 switch (native_event->type) { 370 switch (native_event->type) {
336 case KeyPress: 371 case KeyPress:
337 return ET_KEY_PRESSED; 372 return ET_KEY_PRESSED;
338 case KeyRelease: 373 case KeyRelease:
339 return ET_KEY_RELEASED; 374 return ET_KEY_RELEASED;
340 case ButtonPress: 375 case ButtonPress:
341 if (static_cast<int>(native_event->xbutton.button) >= kMinWheelButton && 376 if (static_cast<int>(native_event->xbutton.button) >= kMinWheelButton &&
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 if (GetFlingData(native_event, NULL, NULL, NULL, NULL, &is_cancel)) 435 if (GetFlingData(native_event, NULL, NULL, NULL, NULL, &is_cancel))
401 return is_cancel ? ET_SCROLL_FLING_CANCEL : ET_SCROLL_FLING_START; 436 return is_cancel ? ET_SCROLL_FLING_CANCEL : ET_SCROLL_FLING_START;
402 if (devices->IsScrollEvent(native_event)) { 437 if (devices->IsScrollEvent(native_event)) {
403 return devices->IsTouchpadXInputEvent(native_event) ? ET_SCROLL 438 return devices->IsTouchpadXInputEvent(native_event) ? ET_SCROLL
404 : ET_MOUSEWHEEL; 439 : ET_MOUSEWHEEL;
405 } 440 }
406 if (devices->IsCMTMetricsEvent(native_event)) 441 if (devices->IsCMTMetricsEvent(native_event))
407 return ET_UMA_DATA; 442 return ET_UMA_DATA;
408 if (GetButtonMaskForX2Event(xievent)) 443 if (GetButtonMaskForX2Event(xievent))
409 return ET_MOUSE_DRAGGED; 444 return ET_MOUSE_DRAGGED;
445 if (DeviceDataManagerX11::GetInstance()->HasEventData(
446 xievent, DeviceDataManagerX11::DT_CMT_SCROLL_X) ||
447 DeviceDataManagerX11::GetInstance()->HasEventData(
448 xievent, DeviceDataManagerX11::DT_CMT_SCROLL_Y)) {
449 // Don't produce mouse move events for mousewheel scrolls.
450 return ET_UNKNOWN;
451 }
452
410 return ET_MOUSE_MOVED; 453 return ET_MOUSE_MOVED;
411 } 454 }
412 case XI_KeyPress: 455 case XI_KeyPress:
413 return ET_KEY_PRESSED; 456 return ET_KEY_PRESSED;
414 case XI_KeyRelease: 457 case XI_KeyRelease:
415 return ET_KEY_RELEASED; 458 return ET_KEY_RELEASED;
416 } 459 }
417 } 460 }
418 default: 461 default:
419 break; 462 break;
(...skipping 19 matching lines...) Expand all
439 case EnterNotify: 482 case EnterNotify:
440 case LeaveNotify: 483 case LeaveNotify:
441 return GetEventFlagsFromXState(native_event->xcrossing.state); 484 return GetEventFlagsFromXState(native_event->xcrossing.state);
442 case MotionNotify: 485 case MotionNotify:
443 return GetEventFlagsFromXState(native_event->xmotion.state); 486 return GetEventFlagsFromXState(native_event->xmotion.state);
444 case GenericEvent: { 487 case GenericEvent: {
445 XIDeviceEvent* xievent = 488 XIDeviceEvent* xievent =
446 static_cast<XIDeviceEvent*>(native_event->xcookie.data); 489 static_cast<XIDeviceEvent*>(native_event->xcookie.data);
447 490
448 switch (xievent->evtype) { 491 switch (xievent->evtype) {
449 #if defined(USE_XI2_MT)
450 case XI_TouchBegin: 492 case XI_TouchBegin:
451 case XI_TouchUpdate: 493 case XI_TouchUpdate:
452 case XI_TouchEnd: 494 case XI_TouchEnd:
453 return GetButtonMaskForX2Event(xievent) | 495 return GetButtonMaskForX2Event(xievent) |
454 GetEventFlagsFromXState(xievent->mods.effective) | 496 GetEventFlagsFromXState(xievent->mods.effective) |
455 GetEventFlagsFromXState( 497 GetEventFlagsFromXState(
456 XModifierStateWatcher::GetInstance()->state()); 498 XModifierStateWatcher::GetInstance()->state());
457 break; 499 break;
458 #endif
459 case XI_ButtonPress: 500 case XI_ButtonPress:
460 case XI_ButtonRelease: { 501 case XI_ButtonRelease: {
461 const bool touch = 502 const bool touch =
462 TouchFactory::GetInstance()->IsTouchDevice(xievent->sourceid); 503 TouchFactory::GetInstance()->IsTouchDevice(xievent->sourceid);
463 int flags = GetButtonMaskForX2Event(xievent) | 504 int flags = GetButtonMaskForX2Event(xievent) |
464 GetEventFlagsFromXState(xievent->mods.effective); 505 GetEventFlagsFromXState(xievent->mods.effective);
465 if (touch) { 506 if (touch) {
466 flags |= GetEventFlagsFromXState( 507 flags |= GetEventFlagsFromXState(
467 XModifierStateWatcher::GetInstance()->state()); 508 XModifierStateWatcher::GetInstance()->state());
468 } 509 }
(...skipping 13 matching lines...) Expand all
482 native_event); 523 native_event);
483 return GetEventFlagsFromXGenericEvent(native_event); 524 return GetEventFlagsFromXGenericEvent(native_event);
484 } 525 }
485 } 526 }
486 } 527 }
487 } 528 }
488 return 0; 529 return 0;
489 } 530 }
490 531
491 base::TimeDelta EventTimeFromNative(const base::NativeEvent& native_event) { 532 base::TimeDelta EventTimeFromNative(const base::NativeEvent& native_event) {
492 switch (native_event->type) { 533 switch(native_event->type) {
493 case KeyPress: 534 case KeyPress:
494 case KeyRelease: 535 case KeyRelease:
495 return base::TimeDelta::FromMilliseconds(native_event->xkey.time); 536 return base::TimeDelta::FromMilliseconds(native_event->xkey.time);
496 case ButtonPress: 537 case ButtonPress:
497 case ButtonRelease: 538 case ButtonRelease:
498 return base::TimeDelta::FromMilliseconds(native_event->xbutton.time); 539 return base::TimeDelta::FromMilliseconds(native_event->xbutton.time);
499 break; 540 break;
500 case MotionNotify: 541 case MotionNotify:
501 return base::TimeDelta::FromMilliseconds(native_event->xmotion.time); 542 return base::TimeDelta::FromMilliseconds(native_event->xmotion.time);
502 break; 543 break;
503 case EnterNotify: 544 case EnterNotify:
504 case LeaveNotify: 545 case LeaveNotify:
505 return base::TimeDelta::FromMilliseconds(native_event->xcrossing.time); 546 return base::TimeDelta::FromMilliseconds(native_event->xcrossing.time);
506 break; 547 break;
507 case GenericEvent: { 548 case GenericEvent: {
508 double start, end; 549 double start, end;
509 double touch_timestamp; 550 double touch_timestamp;
510 if (GetGestureTimes(native_event, &start, &end)) { 551 if (GetGestureTimes(native_event, &start, &end)) {
511 // If the driver supports gesture times, use them. 552 // If the driver supports gesture times, use them.
512 return base::TimeDelta::FromMicroseconds(end * 1000000); 553 return base::TimeDelta::FromMicroseconds(end * 1000000);
513 } else if (DeviceDataManagerX11::GetInstance()->GetEventData( 554 } else if (DeviceDataManagerX11::GetInstance()->GetEventData(
514 *native_event, 555 *native_event,
515 DeviceDataManagerX11::DT_TOUCH_RAW_TIMESTAMP, 556 DeviceDataManagerX11::DT_TOUCH_RAW_TIMESTAMP,
516 &touch_timestamp)) { 557 &touch_timestamp)) {
517 return base::TimeDelta::FromMicroseconds(touch_timestamp * 1000000); 558 return base::TimeDelta::FromMicroseconds(touch_timestamp * 1000000);
518 } else { 559 } else {
519 XIDeviceEvent* xide = 560 XIDeviceEvent* xide =
520 static_cast<XIDeviceEvent*>(native_event->xcookie.data); 561 static_cast<XIDeviceEvent*>(native_event->xcookie.data);
521 return base::TimeDelta::FromMilliseconds(xide->time); 562 return base::TimeDelta::FromMilliseconds(xide->time);
522 } 563 }
523 break; 564 break;
524 } 565 }
525 } 566 }
526 NOTREACHED(); 567 NOTREACHED();
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
586 627
587 return gfx::Point(); 628 return gfx::Point();
588 } 629 }
589 630
590 int EventButtonFromNative(const base::NativeEvent& native_event) { 631 int EventButtonFromNative(const base::NativeEvent& native_event) {
591 CHECK_EQ(GenericEvent, native_event->type); 632 CHECK_EQ(GenericEvent, native_event->type);
592 XIDeviceEvent* xievent = 633 XIDeviceEvent* xievent =
593 static_cast<XIDeviceEvent*>(native_event->xcookie.data); 634 static_cast<XIDeviceEvent*>(native_event->xcookie.data);
594 int button = xievent->detail; 635 int button = xievent->detail;
595 636
596 return (xievent->sourceid == xievent->deviceid) 637 return (xievent->sourceid == xievent->deviceid) ?
597 ? DeviceDataManagerX11::GetInstance()->GetMappedButton(button) 638 DeviceDataManagerX11::GetInstance()->GetMappedButton(button) : button;
598 : button;
599 } 639 }
600 640
601 KeyboardCode KeyboardCodeFromNative(const base::NativeEvent& native_event) { 641 KeyboardCode KeyboardCodeFromNative(const base::NativeEvent& native_event) {
602 return KeyboardCodeFromXKeyEvent(native_event); 642 return KeyboardCodeFromXKeyEvent(native_event);
603 } 643 }
604 644
605 const char* CodeFromNative(const base::NativeEvent& native_event) { 645 DomCode CodeFromNative(const base::NativeEvent& native_event) {
606 return CodeFromXEvent(native_event); 646 return CodeFromXEvent(native_event);
607 } 647 }
608 648
609 uint32 PlatformKeycodeFromNative(const base::NativeEvent& native_event) { 649 uint32 PlatformKeycodeFromNative(const base::NativeEvent& native_event) {
610 XKeyEvent* xkey = NULL; 650 XKeyEvent* xkey = NULL;
611 XEvent xkey_from_xi2; 651 XEvent xkey_from_xi2;
612 switch (native_event->type) { 652 switch (native_event->type) {
613 case KeyPress: 653 case KeyPress:
614 case KeyRelease: 654 case KeyRelease:
615 xkey = &native_event->xkey; 655 xkey = &native_event->xkey;
(...skipping 27 matching lines...) Expand all
643 683
644 bool IsCharFromNative(const base::NativeEvent& native_event) { 684 bool IsCharFromNative(const base::NativeEvent& native_event) {
645 return false; 685 return false;
646 } 686 }
647 687
648 int GetChangedMouseButtonFlagsFromNative( 688 int GetChangedMouseButtonFlagsFromNative(
649 const base::NativeEvent& native_event) { 689 const base::NativeEvent& native_event) {
650 switch (native_event->type) { 690 switch (native_event->type) {
651 case ButtonPress: 691 case ButtonPress:
652 case ButtonRelease: 692 case ButtonRelease:
653 return GetEventFlagsFromXState(native_event->xbutton.state); 693 return GetEventFlagsForButton(native_event->xbutton.button);
654 case GenericEvent: { 694 case GenericEvent: {
655 XIDeviceEvent* xievent = 695 XIDeviceEvent* xievent =
656 static_cast<XIDeviceEvent*>(native_event->xcookie.data); 696 static_cast<XIDeviceEvent*>(native_event->xcookie.data);
657 switch (xievent->evtype) { 697 switch (xievent->evtype) {
658 case XI_ButtonPress: 698 case XI_ButtonPress:
659 case XI_ButtonRelease: 699 case XI_ButtonRelease:
660 return GetEventFlagsForButton(EventButtonFromNative(native_event)); 700 return GetEventFlagsForButton(EventButtonFromNative(native_event));
661 default: 701 default:
662 break; 702 break;
663 } 703 }
664 } 704 }
665 default: 705 default:
666 break; 706 break;
667 } 707 }
668 return 0; 708 return 0;
669 } 709 }
670 710
671 gfx::Vector2d GetMouseWheelOffset(const base::NativeEvent& native_event) { 711 gfx::Vector2d GetMouseWheelOffset(const base::NativeEvent& native_event) {
672 float x_offset, y_offset; 712 float x_offset, y_offset;
673 if (GetScrollOffsets(native_event, &x_offset, &y_offset, NULL, NULL, NULL)) { 713 if (GetScrollOffsets(
714 native_event, &x_offset, &y_offset, NULL, NULL, NULL)) {
674 return gfx::Vector2d(static_cast<int>(x_offset), 715 return gfx::Vector2d(static_cast<int>(x_offset),
675 static_cast<int>(y_offset)); 716 static_cast<int>(y_offset));
676 } 717 }
677 718
678 int button = native_event->type == GenericEvent 719 int button = native_event->type == GenericEvent ?
679 ? EventButtonFromNative(native_event) 720 EventButtonFromNative(native_event) : native_event->xbutton.button;
680 : native_event->xbutton.button;
681 721
682 switch (button) { 722 switch (button) {
683 case 4: 723 case 4:
684 return gfx::Vector2d(0, kWheelScrollAmount); 724 return gfx::Vector2d(0, kWheelScrollAmount);
685 case 5: 725 case 5:
686 return gfx::Vector2d(0, -kWheelScrollAmount); 726 return gfx::Vector2d(0, -kWheelScrollAmount);
687 case 6: 727 case 6:
688 return gfx::Vector2d(kWheelScrollAmount, 0); 728 return gfx::Vector2d(kWheelScrollAmount, 0);
689 case 7: 729 case 7:
690 return gfx::Vector2d(-kWheelScrollAmount, 0); 730 return gfx::Vector2d(-kWheelScrollAmount, 0);
691 default: 731 default:
692 return gfx::Vector2d(); 732 return gfx::Vector2d();
693 } 733 }
694 } 734 }
695 735
696 void IncrementTouchIdRefCount(const base::NativeEvent& xev) { 736 base::NativeEvent CopyNativeEvent(const base::NativeEvent& event) {
697 ui::DeviceDataManagerX11* manager = ui::DeviceDataManagerX11::GetInstance(); 737 if (!event || event->type == GenericEvent)
698 double tracking_id; 738 return NULL;
699 if (!manager->GetEventData( 739 XEvent* copy = new XEvent;
700 *xev, ui::DeviceDataManagerX11::DT_TOUCH_TRACKING_ID, &tracking_id)) { 740 *copy = *event;
701 return; 741 return copy;
702 } 742 }
703 743
704 ui::TouchFactory* factory = ui::TouchFactory::GetInstance(); 744 void ReleaseCopiedNativeEvent(const base::NativeEvent& event) {
705 factory->AcquireSlotForTrackingID(tracking_id); 745 delete event;
706 } 746 }
707 747
708 void ClearTouchIdIfReleased(const base::NativeEvent& xev) { 748 void ClearTouchIdIfReleased(const base::NativeEvent& xev) {
709 ui::EventType type = ui::EventTypeFromNative(xev); 749 ui::EventType type = ui::EventTypeFromNative(xev);
710 if (type == ui::ET_TOUCH_CANCELLED || type == ui::ET_TOUCH_RELEASED) { 750 if (type == ui::ET_TOUCH_CANCELLED ||
751 type == ui::ET_TOUCH_RELEASED) {
711 ui::TouchFactory* factory = ui::TouchFactory::GetInstance(); 752 ui::TouchFactory* factory = ui::TouchFactory::GetInstance();
712 ui::DeviceDataManagerX11* manager = ui::DeviceDataManagerX11::GetInstance(); 753 ui::DeviceDataManagerX11* manager = ui::DeviceDataManagerX11::GetInstance();
713 double tracking_id; 754 double tracking_id;
714 if (manager->GetEventData(*xev, 755 if (manager->GetEventData(
715 ui::DeviceDataManagerX11::DT_TOUCH_TRACKING_ID, 756 *xev, ui::DeviceDataManagerX11::DT_TOUCH_TRACKING_ID, &tracking_id)) {
716 &tracking_id)) {
717 factory->ReleaseSlotForTrackingID(tracking_id); 757 factory->ReleaseSlotForTrackingID(tracking_id);
718 } 758 }
719 } 759 }
720 } 760 }
721 761
722 int GetTouchId(const base::NativeEvent& xev) { 762 int GetTouchId(const base::NativeEvent& xev) {
723 double slot = 0; 763 double slot = 0;
724 ui::DeviceDataManagerX11* manager = ui::DeviceDataManagerX11::GetInstance(); 764 ui::DeviceDataManagerX11* manager = ui::DeviceDataManagerX11::GetInstance();
725 double tracking_id; 765 double tracking_id;
726 if (!manager->GetEventData( 766 if (!manager->GetEventData(
727 *xev, ui::DeviceDataManagerX11::DT_TOUCH_TRACKING_ID, &tracking_id)) { 767 *xev, ui::DeviceDataManagerX11::DT_TOUCH_TRACKING_ID, &tracking_id)) {
728 LOG(ERROR) << "Could not get the tracking ID for the event. Using 0."; 768 LOG(ERROR) << "Could not get the tracking ID for the event. Using 0.";
729 } else { 769 } else {
730 ui::TouchFactory* factory = ui::TouchFactory::GetInstance(); 770 ui::TouchFactory* factory = ui::TouchFactory::GetInstance();
731 slot = factory->GetSlotForTrackingID(tracking_id); 771 slot = factory->GetSlotForTrackingID(tracking_id);
732 } 772 }
733 return slot; 773 return slot;
734 } 774 }
735 775
736 float GetTouchRadiusX(const base::NativeEvent& native_event) { 776 float GetTouchRadiusX(const base::NativeEvent& native_event) {
737 double radius = 777 double radius = GetTouchParamFromXEvent(native_event,
738 GetTouchParamFromXEvent(native_event, 778 ui::DeviceDataManagerX11::DT_TOUCH_MAJOR, 0.0) / 2.0;
739 ui::DeviceDataManagerX11::DT_TOUCH_MAJOR, 0.0) /
740 2.0;
741 ScaleTouchRadius(native_event, &radius); 779 ScaleTouchRadius(native_event, &radius);
742 return radius; 780 return radius;
743 } 781 }
744 782
745 float GetTouchRadiusY(const base::NativeEvent& native_event) { 783 float GetTouchRadiusY(const base::NativeEvent& native_event) {
746 double radius = 784 double radius = GetTouchParamFromXEvent(native_event,
747 GetTouchParamFromXEvent(native_event, 785 ui::DeviceDataManagerX11::DT_TOUCH_MINOR, 0.0) / 2.0;
748 ui::DeviceDataManagerX11::DT_TOUCH_MINOR, 0.0) /
749 2.0;
750 ScaleTouchRadius(native_event, &radius); 786 ScaleTouchRadius(native_event, &radius);
751 return radius; 787 return radius;
752 } 788 }
753 789
754 float GetTouchAngle(const base::NativeEvent& native_event) { 790 float GetTouchAngle(const base::NativeEvent& native_event) {
755 return GetTouchParamFromXEvent(native_event, 791 return GetTouchParamFromXEvent(native_event,
756 ui::DeviceDataManagerX11::DT_TOUCH_ORIENTATION, 792 ui::DeviceDataManagerX11::DT_TOUCH_ORIENTATION, 0.0) / 2.0;
757 0.0) /
758 2.0;
759 } 793 }
760 794
761 float GetTouchForce(const base::NativeEvent& native_event) { 795 float GetTouchForce(const base::NativeEvent& native_event) {
762 double force = 0.0; 796 double force = 0.0;
763 force = GetTouchParamFromXEvent( 797 force = GetTouchParamFromXEvent(native_event,
764 native_event, ui::DeviceDataManagerX11::DT_TOUCH_PRESSURE, 0.0); 798 ui::DeviceDataManagerX11::DT_TOUCH_PRESSURE, 0.0);
765 unsigned int deviceid = 799 unsigned int deviceid =
766 static_cast<XIDeviceEvent*>(native_event->xcookie.data)->sourceid; 800 static_cast<XIDeviceEvent*>(native_event->xcookie.data)->sourceid;
767 // Force is normalized to fall into [0, 1] 801 // Force is normalized to fall into [0, 1]
768 if (!ui::DeviceDataManagerX11::GetInstance()->NormalizeData( 802 if (!ui::DeviceDataManagerX11::GetInstance()->NormalizeData(
769 deviceid, ui::DeviceDataManagerX11::DT_TOUCH_PRESSURE, &force)) 803 deviceid, ui::DeviceDataManagerX11::DT_TOUCH_PRESSURE, &force))
770 force = 0.0; 804 force = 0.0;
771 return force; 805 return force;
772 } 806 }
773 807
774 bool GetScrollOffsets(const base::NativeEvent& native_event, 808 bool GetScrollOffsets(const base::NativeEvent& native_event,
775 float* x_offset, 809 float* x_offset,
776 float* y_offset, 810 float* y_offset,
777 float* x_offset_ordinal, 811 float* x_offset_ordinal,
778 float* y_offset_ordinal, 812 float* y_offset_ordinal,
779 int* finger_count) { 813 int* finger_count) {
780 if (!DeviceDataManagerX11::GetInstance()->IsScrollEvent(native_event)) 814 if (!DeviceDataManagerX11::GetInstance()->IsScrollEvent(native_event))
781 return false; 815 return false;
782 816
783 // Temp values to prevent passing NULLs to DeviceDataManager. 817 // Temp values to prevent passing NULLs to DeviceDataManager.
784 float x_offset_, y_offset_; 818 float x_offset_, y_offset_;
785 float x_offset_ordinal_, y_offset_ordinal_; 819 float x_offset_ordinal_, y_offset_ordinal_;
786 int finger_count_; 820 int finger_count_;
787 if (!x_offset) 821 if (!x_offset)
788 x_offset = &x_offset_; 822 x_offset = &x_offset_;
789 if (!y_offset) 823 if (!y_offset)
790 y_offset = &y_offset_; 824 y_offset = &y_offset_;
791 if (!x_offset_ordinal) 825 if (!x_offset_ordinal)
792 x_offset_ordinal = &x_offset_ordinal_; 826 x_offset_ordinal = &x_offset_ordinal_;
793 if (!y_offset_ordinal) 827 if (!y_offset_ordinal)
794 y_offset_ordinal = &y_offset_ordinal_; 828 y_offset_ordinal = &y_offset_ordinal_;
795 if (!finger_count) 829 if (!finger_count)
796 finger_count = &finger_count_; 830 finger_count = &finger_count_;
797 831
798 DeviceDataManagerX11::GetInstance()->GetScrollOffsets( 832 DeviceDataManagerX11::GetInstance()->GetScrollOffsets(
799 native_event, x_offset, y_offset, x_offset_ordinal, y_offset_ordinal, 833 native_event,
834 x_offset, y_offset,
835 x_offset_ordinal, y_offset_ordinal,
800 finger_count); 836 finger_count);
801 return true; 837 return true;
802 } 838 }
803 839
804 bool GetFlingData(const base::NativeEvent& native_event, 840 bool GetFlingData(const base::NativeEvent& native_event,
805 float* vx, 841 float* vx,
806 float* vy, 842 float* vy,
807 float* vx_ordinal, 843 float* vx_ordinal,
808 float* vy_ordinal, 844 float* vy_ordinal,
809 bool* is_cancel) { 845 bool* is_cancel) {
(...skipping 12 matching lines...) Expand all
822 if (!vy_ordinal) 858 if (!vy_ordinal)
823 vy_ordinal = &vy_ordinal_; 859 vy_ordinal = &vy_ordinal_;
824 if (!is_cancel) 860 if (!is_cancel)
825 is_cancel = &is_cancel_; 861 is_cancel = &is_cancel_;
826 862
827 DeviceDataManagerX11::GetInstance()->GetFlingData( 863 DeviceDataManagerX11::GetInstance()->GetFlingData(
828 native_event, vx, vy, vx_ordinal, vy_ordinal, is_cancel); 864 native_event, vx, vy, vx_ordinal, vy_ordinal, is_cancel);
829 return true; 865 return true;
830 } 866 }
831 867
868 void UpdateX11EventForFlags(Event* event) {
869 XEvent* xev = event->native_event();
870 if (!xev)
871 return;
872 switch (xev->type) {
873 case KeyPress:
874 case KeyRelease:
875 xev->xkey.state = UpdateX11EventFlags(event->flags(), xev->xkey.state);
876 break;
877 case ButtonPress:
878 case ButtonRelease:
879 xev->xbutton.state =
880 UpdateX11EventFlags(event->flags(), xev->xbutton.state);
881 break;
882 case GenericEvent: {
883 XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xev->xcookie.data);
884 DCHECK(xievent);
885 xievent->mods.effective =
886 UpdateX11EventFlags(event->flags(), xievent->mods.effective);
887 break;
888 }
889 default:
890 break;
891 }
892 }
893
894 void UpdateX11EventForChangedButtonFlags(MouseEvent* event) {
895 XEvent* xev = event->native_event();
896 if (!xev)
897 return;
898 switch (xev->type) {
899 case ButtonPress:
900 case ButtonRelease:
901 xev->xbutton.button = UpdateX11EventButton(event->changed_button_flags(),
902 xev->xbutton.button);
903 break;
904 case GenericEvent: {
905 XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xev->xcookie.data);
906 CHECK(xievent && (xievent->evtype == XI_ButtonPress ||
907 xievent->evtype == XI_ButtonRelease));
908 xievent->detail =
909 UpdateX11EventButton(event->changed_button_flags(), xievent->detail);
910 break;
911 }
912 default:
913 break;
914 }
915 }
916
832 } // namespace ui 917 } // namespace ui
OLDNEW
« no previous file with comments | « ui/events/touchscreen_device.cc ('k') | ui/events/x/events_x_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698