| 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 #include <linux/input.h> | 9 #include <linux/input.h> |
| 10 | 10 |
| 11 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
| 12 #include "base/timer/timer.h" | 12 #include "base/timer/timer.h" |
| 13 #include "ui/events/event.h" | 13 #include "ui/events/event.h" |
| 14 #include "ui/events/keycodes/dom4/keycode_converter.h" | 14 #include "ui/events/keycodes/dom4/keycode_converter.h" |
| 15 #include "ui/events/ozone/evdev/cursor_delegate_evdev.h" | 15 #include "ui/events/ozone/evdev/cursor_delegate_evdev.h" |
| 16 #include "ui/events/ozone/evdev/event_device_info.h" | 16 #include "ui/events/ozone/evdev/event_device_info.h" |
| 17 #include "ui/events/ozone/evdev/event_device_util.h" | 17 #include "ui/events/ozone/evdev/event_device_util.h" |
| 18 #include "ui/events/ozone/evdev/event_modifiers_evdev.h" | |
| 19 #include "ui/events/ozone/evdev/keyboard_util_evdev.h" | 18 #include "ui/events/ozone/evdev/keyboard_util_evdev.h" |
| 20 #include "ui/events/ozone/evdev/libgestures_glue/gesture_property_provider.h" | 19 #include "ui/events/ozone/evdev/libgestures_glue/gesture_property_provider.h" |
| 21 #include "ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.h" | 20 #include "ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.h" |
| 22 #include "ui/gfx/geometry/point_f.h" | 21 #include "ui/gfx/geometry/point_f.h" |
| 23 | 22 |
| 24 namespace ui { | 23 namespace ui { |
| 25 | 24 |
| 26 namespace { | 25 namespace { |
| 27 | 26 |
| 28 // Convert libevdev device class to libgestures device class. | 27 // Convert libevdev device class to libgestures device class. |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 // Number of fingers for scroll gestures. | 80 // Number of fingers for scroll gestures. |
| 82 const int kGestureScrollFingerCount = 2; | 81 const int kGestureScrollFingerCount = 2; |
| 83 | 82 |
| 84 // Number of fingers for swipe gestures. | 83 // Number of fingers for swipe gestures. |
| 85 const int kGestureSwipeFingerCount = 3; | 84 const int kGestureSwipeFingerCount = 3; |
| 86 | 85 |
| 87 } // namespace | 86 } // namespace |
| 88 | 87 |
| 89 GestureInterpreterLibevdevCros::GestureInterpreterLibevdevCros( | 88 GestureInterpreterLibevdevCros::GestureInterpreterLibevdevCros( |
| 90 int id, | 89 int id, |
| 91 EventModifiersEvdev* modifiers, | |
| 92 CursorDelegateEvdev* cursor, | 90 CursorDelegateEvdev* cursor, |
| 93 GesturePropertyProvider* property_provider, | 91 GesturePropertyProvider* property_provider, |
| 94 const KeyEventDispatchCallback& key_callback, | 92 const KeyEventDispatchCallback& key_callback, |
| 95 const MouseMoveEventDispatchCallback& mouse_move_callback, | 93 const MouseMoveEventDispatchCallback& mouse_move_callback, |
| 96 const MouseButtonEventDispatchCallback& mouse_button_callback, | 94 const MouseButtonEventDispatchCallback& mouse_button_callback, |
| 97 const EventDispatchCallback& callback) | 95 const MouseWheelEventDispatchCallback& mouse_wheel_callback, |
| 96 const ScrollEventDispatchCallback& scroll_callback) |
| 98 : id_(id), | 97 : id_(id), |
| 99 is_mouse_(false), | 98 is_mouse_(false), |
| 100 modifiers_(modifiers), | |
| 101 cursor_(cursor), | 99 cursor_(cursor), |
| 102 property_provider_(property_provider), | 100 property_provider_(property_provider), |
| 103 key_callback_(key_callback), | 101 key_callback_(key_callback), |
| 104 mouse_move_callback_(mouse_move_callback), | 102 mouse_move_callback_(mouse_move_callback), |
| 105 mouse_button_callback_(mouse_button_callback), | 103 mouse_button_callback_(mouse_button_callback), |
| 106 dispatch_callback_(callback), | 104 mouse_wheel_callback_(mouse_wheel_callback), |
| 105 scroll_callback_(scroll_callback), |
| 107 interpreter_(NULL), | 106 interpreter_(NULL), |
| 108 evdev_(NULL), | 107 evdev_(NULL), |
| 109 device_properties_(new GestureDeviceProperties) { | 108 device_properties_(new GestureDeviceProperties) { |
| 110 memset(&prev_key_state_, 0, sizeof(prev_key_state_)); | 109 memset(&prev_key_state_, 0, sizeof(prev_key_state_)); |
| 111 } | 110 } |
| 112 | 111 |
| 113 GestureInterpreterLibevdevCros::~GestureInterpreterLibevdevCros() { | 112 GestureInterpreterLibevdevCros::~GestureInterpreterLibevdevCros() { |
| 114 // Note that this destructor got called after the evdev device node has been | 113 // Note that this destructor got called after the evdev device node has been |
| 115 // closed. Therefore, all clean-up codes here shouldn't depend on the device | 114 // closed. Therefore, all clean-up codes here shouldn't depend on the device |
| 116 // information (except for the pointer address itself). | 115 // information (except for the pointer address itself). |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 287 DVLOG(3) << base::StringPrintf("Gesture Scroll: (%f, %f) [%f, %f]", | 286 DVLOG(3) << base::StringPrintf("Gesture Scroll: (%f, %f) [%f, %f]", |
| 288 scroll->dx, | 287 scroll->dx, |
| 289 scroll->dy, | 288 scroll->dy, |
| 290 scroll->ordinal_dx, | 289 scroll->ordinal_dx, |
| 291 scroll->ordinal_dy); | 290 scroll->ordinal_dy); |
| 292 if (!cursor_) | 291 if (!cursor_) |
| 293 return; // No cursor! | 292 return; // No cursor! |
| 294 | 293 |
| 295 // TODO(spang): Use scroll->start_time | 294 // TODO(spang): Use scroll->start_time |
| 296 if (is_mouse_) { | 295 if (is_mouse_) { |
| 297 Dispatch(make_scoped_ptr(new MouseWheelEvent( | 296 mouse_wheel_callback_.Run(MouseWheelEventParams( |
| 298 gfx::Vector2d(scroll->dx, scroll->dy), | 297 id_, cursor_->GetLocation(), gfx::Vector2d(scroll->dx, scroll->dy))); |
| 299 cursor_->GetLocation(), | |
| 300 cursor_->GetLocation(), | |
| 301 modifiers_->GetModifierFlags(), | |
| 302 0))); | |
| 303 } else { | 298 } else { |
| 304 Dispatch(make_scoped_ptr(new ScrollEvent( | 299 scroll_callback_.Run(ScrollEventParams( |
| 305 ET_SCROLL, | 300 id_, ET_SCROLL, cursor_->GetLocation(), |
| 306 cursor_->GetLocation(), | 301 gfx::Vector2dF(scroll->dx, scroll->dy), |
| 307 StimeToTimedelta(gesture->end_time), | 302 gfx::Vector2dF(scroll->ordinal_dx, scroll->ordinal_dy), |
| 308 modifiers_->GetModifierFlags(), | 303 kGestureScrollFingerCount, StimeToTimedelta(gesture->end_time))); |
| 309 scroll->dx, | |
| 310 scroll->dy, | |
| 311 scroll->ordinal_dx, | |
| 312 scroll->ordinal_dy, | |
| 313 kGestureScrollFingerCount))); | |
| 314 } | 304 } |
| 315 } | 305 } |
| 316 | 306 |
| 317 void GestureInterpreterLibevdevCros::OnGestureButtonsChange( | 307 void GestureInterpreterLibevdevCros::OnGestureButtonsChange( |
| 318 const Gesture* gesture, | 308 const Gesture* gesture, |
| 319 const GestureButtonsChange* buttons) { | 309 const GestureButtonsChange* buttons) { |
| 320 DVLOG(3) << base::StringPrintf("Gesture Button Change: down=0x%02x up=0x%02x", | 310 DVLOG(3) << base::StringPrintf("Gesture Button Change: down=0x%02x up=0x%02x", |
| 321 buttons->down, | 311 buttons->down, |
| 322 buttons->up); | 312 buttons->up); |
| 323 | 313 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 355 fling->fling_state); | 345 fling->fling_state); |
| 356 | 346 |
| 357 if (!cursor_) | 347 if (!cursor_) |
| 358 return; // No cursor! | 348 return; // No cursor! |
| 359 | 349 |
| 360 EventType type = | 350 EventType type = |
| 361 (fling->fling_state == GESTURES_FLING_START ? ET_SCROLL_FLING_START | 351 (fling->fling_state == GESTURES_FLING_START ? ET_SCROLL_FLING_START |
| 362 : ET_SCROLL_FLING_CANCEL); | 352 : ET_SCROLL_FLING_CANCEL); |
| 363 | 353 |
| 364 // Fling is like 2-finger scrolling but with velocity instead of displacement. | 354 // Fling is like 2-finger scrolling but with velocity instead of displacement. |
| 365 Dispatch(make_scoped_ptr(new ScrollEvent(type, | 355 scroll_callback_.Run(ScrollEventParams( |
| 366 cursor_->GetLocation(), | 356 id_, type, cursor_->GetLocation(), gfx::Vector2dF(fling->vx, fling->vy), |
| 367 StimeToTimedelta(gesture->end_time), | 357 gfx::Vector2dF(fling->ordinal_vx, fling->ordinal_vy), |
| 368 modifiers_->GetModifierFlags(), | 358 kGestureScrollFingerCount, StimeToTimedelta(gesture->end_time))); |
| 369 fling->vx, | |
| 370 fling->vy, | |
| 371 fling->ordinal_vx, | |
| 372 fling->ordinal_vy, | |
| 373 kGestureScrollFingerCount))); | |
| 374 } | 359 } |
| 375 | 360 |
| 376 void GestureInterpreterLibevdevCros::OnGestureSwipe(const Gesture* gesture, | 361 void GestureInterpreterLibevdevCros::OnGestureSwipe(const Gesture* gesture, |
| 377 const GestureSwipe* swipe) { | 362 const GestureSwipe* swipe) { |
| 378 DVLOG(3) << base::StringPrintf("Gesture Swipe: (%f, %f) [%f, %f]", | 363 DVLOG(3) << base::StringPrintf("Gesture Swipe: (%f, %f) [%f, %f]", |
| 379 swipe->dx, | 364 swipe->dx, |
| 380 swipe->dy, | 365 swipe->dy, |
| 381 swipe->ordinal_dx, | 366 swipe->ordinal_dx, |
| 382 swipe->ordinal_dy); | 367 swipe->ordinal_dy); |
| 383 | 368 |
| 384 if (!cursor_) | 369 if (!cursor_) |
| 385 return; // No cursor! | 370 return; // No cursor! |
| 386 | 371 |
| 387 // Swipe is 3-finger scrolling. | 372 // Swipe is 3-finger scrolling. |
| 388 Dispatch(make_scoped_ptr(new ScrollEvent(ET_SCROLL, | 373 scroll_callback_.Run(ScrollEventParams( |
| 389 cursor_->GetLocation(), | 374 id_, ET_SCROLL, cursor_->GetLocation(), |
| 390 StimeToTimedelta(gesture->end_time), | 375 gfx::Vector2dF(swipe->dx, swipe->dy), |
| 391 modifiers_->GetModifierFlags(), | 376 gfx::Vector2dF(swipe->ordinal_dx, swipe->ordinal_dy), |
| 392 swipe->dx, | 377 kGestureSwipeFingerCount, StimeToTimedelta(gesture->end_time))); |
| 393 swipe->dy, | |
| 394 swipe->ordinal_dx, | |
| 395 swipe->ordinal_dy, | |
| 396 kGestureSwipeFingerCount))); | |
| 397 } | 378 } |
| 398 | 379 |
| 399 void GestureInterpreterLibevdevCros::OnGestureSwipeLift( | 380 void GestureInterpreterLibevdevCros::OnGestureSwipeLift( |
| 400 const Gesture* gesture, | 381 const Gesture* gesture, |
| 401 const GestureSwipeLift* swipelift) { | 382 const GestureSwipeLift* swipelift) { |
| 402 DVLOG(3) << base::StringPrintf("Gesture Swipe Lift"); | 383 DVLOG(3) << base::StringPrintf("Gesture Swipe Lift"); |
| 403 | 384 |
| 404 if (!cursor_) | 385 if (!cursor_) |
| 405 return; // No cursor! | 386 return; // No cursor! |
| 406 | 387 |
| 407 // Turn a swipe lift into a fling start. | 388 // Turn a swipe lift into a fling start. |
| 408 // TODO(spang): Figure out why and put it in this comment. | 389 // TODO(spang): Figure out why and put it in this comment. |
| 409 | 390 |
| 410 Dispatch(make_scoped_ptr(new ScrollEvent(ET_SCROLL_FLING_START, | 391 scroll_callback_.Run(ScrollEventParams( |
| 411 cursor_->GetLocation(), | 392 id_, ET_SCROLL_FLING_START, cursor_->GetLocation(), |
| 412 StimeToTimedelta(gesture->end_time), | 393 gfx::Vector2dF() /* delta */, gfx::Vector2dF() /* ordinal_delta */, |
| 413 modifiers_->GetModifierFlags(), | 394 kGestureScrollFingerCount, StimeToTimedelta(gesture->end_time))); |
| 414 /* x_offset */ 0, | |
| 415 /* y_offset */ 0, | |
| 416 /* x_offset_ordinal */ 0, | |
| 417 /* y_offset_ordinal */ 0, | |
| 418 kGestureScrollFingerCount))); | |
| 419 } | 395 } |
| 420 | 396 |
| 421 void GestureInterpreterLibevdevCros::OnGesturePinch(const Gesture* gesture, | 397 void GestureInterpreterLibevdevCros::OnGesturePinch(const Gesture* gesture, |
| 422 const GesturePinch* pinch) { | 398 const GesturePinch* pinch) { |
| 423 DVLOG(3) << base::StringPrintf( | 399 DVLOG(3) << base::StringPrintf( |
| 424 "Gesture Pinch: dz=%f [%f]", pinch->dz, pinch->ordinal_dz); | 400 "Gesture Pinch: dz=%f [%f]", pinch->dz, pinch->ordinal_dz); |
| 425 | 401 |
| 426 if (!cursor_) | 402 if (!cursor_) |
| 427 return; // No cursor! | 403 return; // No cursor! |
| 428 | 404 |
| 429 NOTIMPLEMENTED(); | 405 NOTIMPLEMENTED(); |
| 430 } | 406 } |
| 431 | 407 |
| 432 void GestureInterpreterLibevdevCros::OnGestureMetrics( | 408 void GestureInterpreterLibevdevCros::OnGestureMetrics( |
| 433 const Gesture* gesture, | 409 const Gesture* gesture, |
| 434 const GestureMetrics* metrics) { | 410 const GestureMetrics* metrics) { |
| 435 DVLOG(3) << base::StringPrintf("Gesture Metrics: [%f, %f] type=%d", | 411 DVLOG(3) << base::StringPrintf("Gesture Metrics: [%f, %f] type=%d", |
| 436 metrics->data[0], | 412 metrics->data[0], |
| 437 metrics->data[1], | 413 metrics->data[1], |
| 438 metrics->type); | 414 metrics->type); |
| 439 NOTIMPLEMENTED(); | 415 NOTIMPLEMENTED(); |
| 440 } | 416 } |
| 441 | 417 |
| 442 void GestureInterpreterLibevdevCros::Dispatch(scoped_ptr<Event> event) { | |
| 443 dispatch_callback_.Run(event.Pass()); | |
| 444 } | |
| 445 | |
| 446 void GestureInterpreterLibevdevCros::DispatchMouseButton(unsigned int button, | 418 void GestureInterpreterLibevdevCros::DispatchMouseButton(unsigned int button, |
| 447 bool down) { | 419 bool down) { |
| 448 bool allow_remap = is_mouse_; | 420 bool allow_remap = is_mouse_; |
| 449 mouse_button_callback_.Run(MouseButtonEventParams(id_, cursor_->GetLocation(), | 421 mouse_button_callback_.Run(MouseButtonEventParams(id_, cursor_->GetLocation(), |
| 450 button, down, allow_remap)); | 422 button, down, allow_remap)); |
| 451 } | 423 } |
| 452 | 424 |
| 453 void GestureInterpreterLibevdevCros::DispatchChangedKeys(Evdev* evdev, | 425 void GestureInterpreterLibevdevCros::DispatchChangedKeys(Evdev* evdev, |
| 454 const timeval& time) { | 426 const timeval& time) { |
| 455 unsigned long key_state_diff[EVDEV_BITS_TO_LONGS(KEY_CNT)]; | 427 unsigned long key_state_diff[EVDEV_BITS_TO_LONGS(KEY_CNT)]; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 478 key_callback_.Run(KeyEventParams(id_, key, value)); | 450 key_callback_.Run(KeyEventParams(id_, key, value)); |
| 479 } | 451 } |
| 480 } | 452 } |
| 481 | 453 |
| 482 // Update internal key state. | 454 // Update internal key state. |
| 483 for (unsigned long i = 0; i < EVDEV_BITS_TO_LONGS(KEY_CNT); ++i) | 455 for (unsigned long i = 0; i < EVDEV_BITS_TO_LONGS(KEY_CNT); ++i) |
| 484 prev_key_state_[i] = evdev->key_state_bitmask[i]; | 456 prev_key_state_[i] = evdev->key_state_bitmask[i]; |
| 485 } | 457 } |
| 486 | 458 |
| 487 } // namespace ui | 459 } // namespace ui |
| OLD | NEW |