OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cr
os.h" | 5 #include "ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cr
os.h" |
6 | 6 |
7 #include <gestures/gestures.h> | 7 #include <gestures/gestures.h> |
8 #include <libevdev/libevdev.h> | 8 #include <libevdev/libevdev.h> |
9 | 9 |
10 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
213 move->dx, | 213 move->dx, |
214 move->dy, | 214 move->dy, |
215 move->ordinal_dx, | 215 move->ordinal_dx, |
216 move->ordinal_dy); | 216 move->ordinal_dy); |
217 if (!cursor_) | 217 if (!cursor_) |
218 return; // No cursor! | 218 return; // No cursor! |
219 | 219 |
220 cursor_->MoveCursor(gfx::Vector2dF(move->dx, move->dy)); | 220 cursor_->MoveCursor(gfx::Vector2dF(move->dx, move->dy)); |
221 // TODO(spang): Use move->ordinal_dx, move->ordinal_dy | 221 // TODO(spang): Use move->ordinal_dx, move->ordinal_dy |
222 // TODO(spang): Use move->start_time, move->end_time | 222 // TODO(spang): Use move->start_time, move->end_time |
223 MouseEvent event(ET_MOUSE_MOVED, | 223 Dispatch(make_scoped_ptr(new MouseEvent(ET_MOUSE_MOVED, |
224 cursor_->location(), | 224 cursor_->location(), |
225 cursor_->location(), | 225 cursor_->location(), |
226 modifiers_->GetModifierFlags(), | 226 modifiers_->GetModifierFlags(), |
227 /* changed_button_flags */ 0); | 227 /* changed_button_flags */ 0))); |
228 Dispatch(&event); | |
229 } | 228 } |
230 | 229 |
231 void GestureInterpreterLibevdevCros::OnGestureScroll( | 230 void GestureInterpreterLibevdevCros::OnGestureScroll( |
232 const Gesture* gesture, | 231 const Gesture* gesture, |
233 const GestureScroll* scroll) { | 232 const GestureScroll* scroll) { |
234 DVLOG(3) << base::StringPrintf("Gesture Scroll: (%f, %f) [%f, %f]", | 233 DVLOG(3) << base::StringPrintf("Gesture Scroll: (%f, %f) [%f, %f]", |
235 scroll->dx, | 234 scroll->dx, |
236 scroll->dy, | 235 scroll->dy, |
237 scroll->ordinal_dx, | 236 scroll->ordinal_dx, |
238 scroll->ordinal_dy); | 237 scroll->ordinal_dy); |
239 if (!cursor_) | 238 if (!cursor_) |
240 return; // No cursor! | 239 return; // No cursor! |
241 | 240 |
242 // TODO(spang): Support SetNaturalScroll | 241 // TODO(spang): Support SetNaturalScroll |
243 // TODO(spang): Use scroll->start_time | 242 // TODO(spang): Use scroll->start_time |
244 ScrollEvent event(ET_SCROLL, | 243 Dispatch(make_scoped_ptr(new ScrollEvent(ET_SCROLL, |
245 cursor_->location(), | 244 cursor_->location(), |
246 StimeToTimedelta(gesture->end_time), | 245 StimeToTimedelta(gesture->end_time), |
247 modifiers_->GetModifierFlags(), | 246 modifiers_->GetModifierFlags(), |
248 scroll->dx, | 247 scroll->dx, |
249 scroll->dy, | 248 scroll->dy, |
250 scroll->ordinal_dx, | 249 scroll->ordinal_dx, |
251 scroll->ordinal_dy, | 250 scroll->ordinal_dy, |
252 kGestureScrollFingerCount); | 251 kGestureScrollFingerCount))); |
253 Dispatch(&event); | |
254 } | 252 } |
255 | 253 |
256 void GestureInterpreterLibevdevCros::OnGestureButtonsChange( | 254 void GestureInterpreterLibevdevCros::OnGestureButtonsChange( |
257 const Gesture* gesture, | 255 const Gesture* gesture, |
258 const GestureButtonsChange* buttons) { | 256 const GestureButtonsChange* buttons) { |
259 DVLOG(3) << base::StringPrintf("Gesture Button Change: down=0x%02x up=0x%02x", | 257 DVLOG(3) << base::StringPrintf("Gesture Button Change: down=0x%02x up=0x%02x", |
260 buttons->down, | 258 buttons->down, |
261 buttons->up); | 259 buttons->up); |
262 | 260 |
263 if (!cursor_) | 261 if (!cursor_) |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
302 fling->fling_state); | 300 fling->fling_state); |
303 | 301 |
304 if (!cursor_) | 302 if (!cursor_) |
305 return; // No cursor! | 303 return; // No cursor! |
306 | 304 |
307 EventType type = | 305 EventType type = |
308 (fling->fling_state == GESTURES_FLING_START ? ET_SCROLL_FLING_START | 306 (fling->fling_state == GESTURES_FLING_START ? ET_SCROLL_FLING_START |
309 : ET_SCROLL_FLING_CANCEL); | 307 : ET_SCROLL_FLING_CANCEL); |
310 | 308 |
311 // Fling is like 2-finger scrolling but with velocity instead of displacement. | 309 // Fling is like 2-finger scrolling but with velocity instead of displacement. |
312 ScrollEvent event(type, | 310 Dispatch(make_scoped_ptr(new ScrollEvent(type, |
313 cursor_->location(), | 311 cursor_->location(), |
314 StimeToTimedelta(gesture->end_time), | 312 StimeToTimedelta(gesture->end_time), |
315 modifiers_->GetModifierFlags(), | 313 modifiers_->GetModifierFlags(), |
316 fling->vx, | 314 fling->vx, |
317 fling->vy, | 315 fling->vy, |
318 fling->ordinal_vx, | 316 fling->ordinal_vx, |
319 fling->ordinal_vy, | 317 fling->ordinal_vy, |
320 kGestureScrollFingerCount); | 318 kGestureScrollFingerCount))); |
321 Dispatch(&event); | |
322 } | 319 } |
323 | 320 |
324 void GestureInterpreterLibevdevCros::OnGestureSwipe(const Gesture* gesture, | 321 void GestureInterpreterLibevdevCros::OnGestureSwipe(const Gesture* gesture, |
325 const GestureSwipe* swipe) { | 322 const GestureSwipe* swipe) { |
326 DVLOG(3) << base::StringPrintf("Gesture Swipe: (%f, %f) [%f, %f]", | 323 DVLOG(3) << base::StringPrintf("Gesture Swipe: (%f, %f) [%f, %f]", |
327 swipe->dx, | 324 swipe->dx, |
328 swipe->dy, | 325 swipe->dy, |
329 swipe->ordinal_dx, | 326 swipe->ordinal_dx, |
330 swipe->ordinal_dy); | 327 swipe->ordinal_dy); |
331 | 328 |
332 if (!cursor_) | 329 if (!cursor_) |
333 return; // No cursor! | 330 return; // No cursor! |
334 | 331 |
335 // Swipe is 3-finger scrolling. | 332 // Swipe is 3-finger scrolling. |
336 ScrollEvent event(ET_SCROLL, | 333 Dispatch(make_scoped_ptr(new ScrollEvent(ET_SCROLL, |
337 cursor_->location(), | 334 cursor_->location(), |
338 StimeToTimedelta(gesture->end_time), | 335 StimeToTimedelta(gesture->end_time), |
339 modifiers_->GetModifierFlags(), | 336 modifiers_->GetModifierFlags(), |
340 swipe->dx, | 337 swipe->dx, |
341 swipe->dy, | 338 swipe->dy, |
342 swipe->ordinal_dx, | 339 swipe->ordinal_dx, |
343 swipe->ordinal_dy, | 340 swipe->ordinal_dy, |
344 kGestureSwipeFingerCount); | 341 kGestureSwipeFingerCount))); |
345 Dispatch(&event); | |
346 } | 342 } |
347 | 343 |
348 void GestureInterpreterLibevdevCros::OnGestureSwipeLift( | 344 void GestureInterpreterLibevdevCros::OnGestureSwipeLift( |
349 const Gesture* gesture, | 345 const Gesture* gesture, |
350 const GestureSwipeLift* swipelift) { | 346 const GestureSwipeLift* swipelift) { |
351 DVLOG(3) << base::StringPrintf("Gesture Swipe Lift"); | 347 DVLOG(3) << base::StringPrintf("Gesture Swipe Lift"); |
352 | 348 |
353 if (!cursor_) | 349 if (!cursor_) |
354 return; // No cursor! | 350 return; // No cursor! |
355 | 351 |
356 // Turn a swipe lift into a fling start. | 352 // Turn a swipe lift into a fling start. |
357 // TODO(spang): Figure out why and put it in this comment. | 353 // TODO(spang): Figure out why and put it in this comment. |
358 | 354 |
359 ScrollEvent event(ET_SCROLL_FLING_START, | 355 Dispatch(make_scoped_ptr(new ScrollEvent(ET_SCROLL_FLING_START, |
360 cursor_->location(), | 356 cursor_->location(), |
361 StimeToTimedelta(gesture->end_time), | 357 StimeToTimedelta(gesture->end_time), |
362 modifiers_->GetModifierFlags(), | 358 modifiers_->GetModifierFlags(), |
363 /* x_offset */ 0, | 359 /* x_offset */ 0, |
364 /* y_offset */ 0, | 360 /* y_offset */ 0, |
365 /* x_offset_ordinal */ 0, | 361 /* x_offset_ordinal */ 0, |
366 /* y_offset_ordinal */ 0, | 362 /* y_offset_ordinal */ 0, |
367 kGestureScrollFingerCount); | 363 kGestureScrollFingerCount))); |
368 Dispatch(&event); | |
369 | |
370 } | 364 } |
371 | 365 |
372 void GestureInterpreterLibevdevCros::OnGesturePinch(const Gesture* gesture, | 366 void GestureInterpreterLibevdevCros::OnGesturePinch(const Gesture* gesture, |
373 const GesturePinch* pinch) { | 367 const GesturePinch* pinch) { |
374 DVLOG(3) << base::StringPrintf( | 368 DVLOG(3) << base::StringPrintf( |
375 "Gesture Pinch: dz=%f [%f]", pinch->dz, pinch->ordinal_dz); | 369 "Gesture Pinch: dz=%f [%f]", pinch->dz, pinch->ordinal_dz); |
376 | 370 |
377 if (!cursor_) | 371 if (!cursor_) |
378 return; // No cursor! | 372 return; // No cursor! |
379 | 373 |
380 NOTIMPLEMENTED(); | 374 NOTIMPLEMENTED(); |
381 } | 375 } |
382 | 376 |
383 void GestureInterpreterLibevdevCros::OnGestureMetrics( | 377 void GestureInterpreterLibevdevCros::OnGestureMetrics( |
384 const Gesture* gesture, | 378 const Gesture* gesture, |
385 const GestureMetrics* metrics) { | 379 const GestureMetrics* metrics) { |
386 DVLOG(3) << base::StringPrintf("Gesture Metrics: [%f, %f] type=%d", | 380 DVLOG(3) << base::StringPrintf("Gesture Metrics: [%f, %f] type=%d", |
387 metrics->data[0], | 381 metrics->data[0], |
388 metrics->data[1], | 382 metrics->data[1], |
389 metrics->type); | 383 metrics->type); |
390 NOTIMPLEMENTED(); | 384 NOTIMPLEMENTED(); |
391 } | 385 } |
392 | 386 |
393 void GestureInterpreterLibevdevCros::Dispatch(Event* event) { | 387 void GestureInterpreterLibevdevCros::Dispatch(scoped_ptr<Event> event) { |
394 dispatch_callback_.Run(event); | 388 dispatch_callback_.Run(event.Pass()); |
395 } | 389 } |
396 | 390 |
397 void GestureInterpreterLibevdevCros::DispatchMouseButton(unsigned int modifier, | 391 void GestureInterpreterLibevdevCros::DispatchMouseButton(unsigned int modifier, |
398 bool down) { | 392 bool down) { |
399 const gfx::PointF& loc = cursor_->location(); | 393 const gfx::PointF& loc = cursor_->location(); |
400 int flag = modifiers_->GetEventFlagFromModifier(modifier); | 394 int flag = modifiers_->GetEventFlagFromModifier(modifier); |
401 EventType type = (down ? ET_MOUSE_PRESSED : ET_MOUSE_RELEASED); | 395 EventType type = (down ? ET_MOUSE_PRESSED : ET_MOUSE_RELEASED); |
402 modifiers_->UpdateModifier(modifier, down); | 396 modifiers_->UpdateModifier(modifier, down); |
403 MouseEvent event(type, loc, loc, modifiers_->GetModifierFlags() | flag, flag); | 397 Dispatch(make_scoped_ptr(new MouseEvent( |
404 Dispatch(&event); | 398 type, loc, loc, modifiers_->GetModifierFlags() | flag, flag))); |
405 } | 399 } |
406 | 400 |
407 void GestureInterpreterLibevdevCros::DispatchChangedKeys(Evdev* evdev, | 401 void GestureInterpreterLibevdevCros::DispatchChangedKeys(Evdev* evdev, |
408 const timeval& time) { | 402 const timeval& time) { |
409 unsigned long key_state_diff[EVDEV_BITS_TO_LONGS(KEY_CNT)]; | 403 unsigned long key_state_diff[EVDEV_BITS_TO_LONGS(KEY_CNT)]; |
410 | 404 |
411 // Find changed keys. | 405 // Find changed keys. |
412 for (unsigned long i = 0; i < arraysize(key_state_diff); ++i) | 406 for (unsigned long i = 0; i < arraysize(key_state_diff); ++i) |
413 key_state_diff[i] = evdev->key_state_bitmask[i] ^ prev_key_state_[i]; | 407 key_state_diff[i] = evdev->key_state_bitmask[i] ^ prev_key_state_[i]; |
414 | 408 |
415 // Dispatch events for changed keys. | 409 // Dispatch events for changed keys. |
416 for (unsigned long i = 0; i < KEY_CNT; ++i) { | 410 for (unsigned long i = 0; i < KEY_CNT; ++i) { |
417 if (EvdevBitIsSet(key_state_diff, i)) { | 411 if (EvdevBitIsSet(key_state_diff, i)) { |
418 bool value = EvdevBitIsSet(evdev->key_state_bitmask, i); | 412 bool value = EvdevBitIsSet(evdev->key_state_bitmask, i); |
419 keyboard_->OnKeyChange(i, value); | 413 keyboard_->OnKeyChange(i, value); |
420 } | 414 } |
421 } | 415 } |
422 | 416 |
423 // Update internal key state. | 417 // Update internal key state. |
424 for (unsigned long i = 0; i < EVDEV_BITS_TO_LONGS(KEY_CNT); ++i) | 418 for (unsigned long i = 0; i < EVDEV_BITS_TO_LONGS(KEY_CNT); ++i) |
425 prev_key_state_[i] = evdev->key_state_bitmask[i]; | 419 prev_key_state_[i] = evdev->key_state_bitmask[i]; |
426 } | 420 } |
427 | 421 |
428 } // namespace ui | 422 } // namespace ui |
OLD | NEW |