| 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/device_event_dispatcher_evdev.h" |
| 16 #include "ui/events/ozone/evdev/event_device_info.h" | 17 #include "ui/events/ozone/evdev/event_device_info.h" |
| 17 #include "ui/events/ozone/evdev/event_device_util.h" | 18 #include "ui/events/ozone/evdev/event_device_util.h" |
| 18 #include "ui/events/ozone/evdev/keyboard_util_evdev.h" | 19 #include "ui/events/ozone/evdev/keyboard_util_evdev.h" |
| 19 #include "ui/events/ozone/evdev/libgestures_glue/gesture_property_provider.h" | 20 #include "ui/events/ozone/evdev/libgestures_glue/gesture_property_provider.h" |
| 20 #include "ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.h" | 21 #include "ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.h" |
| 21 #include "ui/gfx/geometry/point_f.h" | 22 #include "ui/gfx/geometry/point_f.h" |
| 22 | 23 |
| 23 namespace ui { | 24 namespace ui { |
| 24 | 25 |
| 25 namespace { | 26 namespace { |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 | 83 |
| 83 // Number of fingers for swipe gestures. | 84 // Number of fingers for swipe gestures. |
| 84 const int kGestureSwipeFingerCount = 3; | 85 const int kGestureSwipeFingerCount = 3; |
| 85 | 86 |
| 86 } // namespace | 87 } // namespace |
| 87 | 88 |
| 88 GestureInterpreterLibevdevCros::GestureInterpreterLibevdevCros( | 89 GestureInterpreterLibevdevCros::GestureInterpreterLibevdevCros( |
| 89 int id, | 90 int id, |
| 90 CursorDelegateEvdev* cursor, | 91 CursorDelegateEvdev* cursor, |
| 91 GesturePropertyProvider* property_provider, | 92 GesturePropertyProvider* property_provider, |
| 92 const KeyEventDispatchCallback& key_callback, | 93 DeviceEventDispatcherEvdev* dispatcher) |
| 93 const MouseMoveEventDispatchCallback& mouse_move_callback, | |
| 94 const MouseButtonEventDispatchCallback& mouse_button_callback, | |
| 95 const MouseWheelEventDispatchCallback& mouse_wheel_callback, | |
| 96 const ScrollEventDispatchCallback& scroll_callback) | |
| 97 : id_(id), | 94 : id_(id), |
| 98 is_mouse_(false), | 95 is_mouse_(false), |
| 99 cursor_(cursor), | 96 cursor_(cursor), |
| 100 property_provider_(property_provider), | 97 property_provider_(property_provider), |
| 101 key_callback_(key_callback), | 98 dispatcher_(dispatcher), |
| 102 mouse_move_callback_(mouse_move_callback), | |
| 103 mouse_button_callback_(mouse_button_callback), | |
| 104 mouse_wheel_callback_(mouse_wheel_callback), | |
| 105 scroll_callback_(scroll_callback), | |
| 106 interpreter_(NULL), | 99 interpreter_(NULL), |
| 107 evdev_(NULL), | 100 evdev_(NULL), |
| 108 device_properties_(new GestureDeviceProperties) { | 101 device_properties_(new GestureDeviceProperties) { |
| 109 memset(&prev_key_state_, 0, sizeof(prev_key_state_)); | 102 memset(&prev_key_state_, 0, sizeof(prev_key_state_)); |
| 110 } | 103 } |
| 111 | 104 |
| 112 GestureInterpreterLibevdevCros::~GestureInterpreterLibevdevCros() { | 105 GestureInterpreterLibevdevCros::~GestureInterpreterLibevdevCros() { |
| 113 // Note that this destructor got called after the evdev device node has been | 106 // Note that this destructor got called after the evdev device node has been |
| 114 // closed. Therefore, all clean-up codes here shouldn't depend on the device | 107 // closed. Therefore, all clean-up codes here shouldn't depend on the device |
| 115 // information (except for the pointer address itself). | 108 // information (except for the pointer address itself). |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 270 move->dx, | 263 move->dx, |
| 271 move->dy, | 264 move->dy, |
| 272 move->ordinal_dx, | 265 move->ordinal_dx, |
| 273 move->ordinal_dy); | 266 move->ordinal_dy); |
| 274 if (!cursor_) | 267 if (!cursor_) |
| 275 return; // No cursor! | 268 return; // No cursor! |
| 276 | 269 |
| 277 cursor_->MoveCursor(gfx::Vector2dF(move->dx, move->dy)); | 270 cursor_->MoveCursor(gfx::Vector2dF(move->dx, move->dy)); |
| 278 // TODO(spang): Use move->ordinal_dx, move->ordinal_dy | 271 // TODO(spang): Use move->ordinal_dx, move->ordinal_dy |
| 279 // TODO(spang): Use move->start_time, move->end_time | 272 // TODO(spang): Use move->start_time, move->end_time |
| 280 mouse_move_callback_.Run(id_, cursor_->GetLocation()); | 273 dispatcher_->DispatchMouseMoveEvent(id_, cursor_->GetLocation()); |
| 281 } | 274 } |
| 282 | 275 |
| 283 void GestureInterpreterLibevdevCros::OnGestureScroll( | 276 void GestureInterpreterLibevdevCros::OnGestureScroll( |
| 284 const Gesture* gesture, | 277 const Gesture* gesture, |
| 285 const GestureScroll* scroll) { | 278 const GestureScroll* scroll) { |
| 286 DVLOG(3) << base::StringPrintf("Gesture Scroll: (%f, %f) [%f, %f]", | 279 DVLOG(3) << base::StringPrintf("Gesture Scroll: (%f, %f) [%f, %f]", |
| 287 scroll->dx, | 280 scroll->dx, |
| 288 scroll->dy, | 281 scroll->dy, |
| 289 scroll->ordinal_dx, | 282 scroll->ordinal_dx, |
| 290 scroll->ordinal_dy); | 283 scroll->ordinal_dy); |
| 291 if (!cursor_) | 284 if (!cursor_) |
| 292 return; // No cursor! | 285 return; // No cursor! |
| 293 | 286 |
| 294 // TODO(spang): Use scroll->start_time | 287 // TODO(spang): Use scroll->start_time |
| 295 if (is_mouse_) { | 288 if (is_mouse_) { |
| 296 mouse_wheel_callback_.Run(id_, cursor_->GetLocation(), | 289 dispatcher_->DispatchMouseWheelEvent(id_, cursor_->GetLocation(), |
| 297 gfx::Vector2d(scroll->dx, scroll->dy)); | 290 gfx::Vector2d(scroll->dx, scroll->dy)); |
| 298 } else { | 291 } else { |
| 299 scroll_callback_.Run(ScrollEventParams( | 292 dispatcher_->DispatchScrollEvent(ScrollEventParams( |
| 300 id_, ET_SCROLL, cursor_->GetLocation(), | 293 id_, ET_SCROLL, cursor_->GetLocation(), |
| 301 gfx::Vector2dF(scroll->dx, scroll->dy), | 294 gfx::Vector2dF(scroll->dx, scroll->dy), |
| 302 gfx::Vector2dF(scroll->ordinal_dx, scroll->ordinal_dy), | 295 gfx::Vector2dF(scroll->ordinal_dx, scroll->ordinal_dy), |
| 303 kGestureScrollFingerCount, StimeToTimedelta(gesture->end_time))); | 296 kGestureScrollFingerCount, StimeToTimedelta(gesture->end_time))); |
| 304 } | 297 } |
| 305 } | 298 } |
| 306 | 299 |
| 307 void GestureInterpreterLibevdevCros::OnGestureButtonsChange( | 300 void GestureInterpreterLibevdevCros::OnGestureButtonsChange( |
| 308 const Gesture* gesture, | 301 const Gesture* gesture, |
| 309 const GestureButtonsChange* buttons) { | 302 const GestureButtonsChange* buttons) { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 345 fling->fling_state); | 338 fling->fling_state); |
| 346 | 339 |
| 347 if (!cursor_) | 340 if (!cursor_) |
| 348 return; // No cursor! | 341 return; // No cursor! |
| 349 | 342 |
| 350 EventType type = | 343 EventType type = |
| 351 (fling->fling_state == GESTURES_FLING_START ? ET_SCROLL_FLING_START | 344 (fling->fling_state == GESTURES_FLING_START ? ET_SCROLL_FLING_START |
| 352 : ET_SCROLL_FLING_CANCEL); | 345 : ET_SCROLL_FLING_CANCEL); |
| 353 | 346 |
| 354 // Fling is like 2-finger scrolling but with velocity instead of displacement. | 347 // Fling is like 2-finger scrolling but with velocity instead of displacement. |
| 355 scroll_callback_.Run(ScrollEventParams( | 348 dispatcher_->DispatchScrollEvent(ScrollEventParams( |
| 356 id_, type, cursor_->GetLocation(), gfx::Vector2dF(fling->vx, fling->vy), | 349 id_, type, cursor_->GetLocation(), gfx::Vector2dF(fling->vx, fling->vy), |
| 357 gfx::Vector2dF(fling->ordinal_vx, fling->ordinal_vy), | 350 gfx::Vector2dF(fling->ordinal_vx, fling->ordinal_vy), |
| 358 kGestureScrollFingerCount, StimeToTimedelta(gesture->end_time))); | 351 kGestureScrollFingerCount, StimeToTimedelta(gesture->end_time))); |
| 359 } | 352 } |
| 360 | 353 |
| 361 void GestureInterpreterLibevdevCros::OnGestureSwipe(const Gesture* gesture, | 354 void GestureInterpreterLibevdevCros::OnGestureSwipe(const Gesture* gesture, |
| 362 const GestureSwipe* swipe) { | 355 const GestureSwipe* swipe) { |
| 363 DVLOG(3) << base::StringPrintf("Gesture Swipe: (%f, %f) [%f, %f]", | 356 DVLOG(3) << base::StringPrintf("Gesture Swipe: (%f, %f) [%f, %f]", |
| 364 swipe->dx, | 357 swipe->dx, |
| 365 swipe->dy, | 358 swipe->dy, |
| 366 swipe->ordinal_dx, | 359 swipe->ordinal_dx, |
| 367 swipe->ordinal_dy); | 360 swipe->ordinal_dy); |
| 368 | 361 |
| 369 if (!cursor_) | 362 if (!cursor_) |
| 370 return; // No cursor! | 363 return; // No cursor! |
| 371 | 364 |
| 372 // Swipe is 3-finger scrolling. | 365 // Swipe is 3-finger scrolling. |
| 373 scroll_callback_.Run(ScrollEventParams( | 366 dispatcher_->DispatchScrollEvent(ScrollEventParams( |
| 374 id_, ET_SCROLL, cursor_->GetLocation(), | 367 id_, ET_SCROLL, cursor_->GetLocation(), |
| 375 gfx::Vector2dF(swipe->dx, swipe->dy), | 368 gfx::Vector2dF(swipe->dx, swipe->dy), |
| 376 gfx::Vector2dF(swipe->ordinal_dx, swipe->ordinal_dy), | 369 gfx::Vector2dF(swipe->ordinal_dx, swipe->ordinal_dy), |
| 377 kGestureSwipeFingerCount, StimeToTimedelta(gesture->end_time))); | 370 kGestureSwipeFingerCount, StimeToTimedelta(gesture->end_time))); |
| 378 } | 371 } |
| 379 | 372 |
| 380 void GestureInterpreterLibevdevCros::OnGestureSwipeLift( | 373 void GestureInterpreterLibevdevCros::OnGestureSwipeLift( |
| 381 const Gesture* gesture, | 374 const Gesture* gesture, |
| 382 const GestureSwipeLift* swipelift) { | 375 const GestureSwipeLift* swipelift) { |
| 383 DVLOG(3) << base::StringPrintf("Gesture Swipe Lift"); | 376 DVLOG(3) << base::StringPrintf("Gesture Swipe Lift"); |
| 384 | 377 |
| 385 if (!cursor_) | 378 if (!cursor_) |
| 386 return; // No cursor! | 379 return; // No cursor! |
| 387 | 380 |
| 388 // Turn a swipe lift into a fling start. | 381 // Turn a swipe lift into a fling start. |
| 389 // TODO(spang): Figure out why and put it in this comment. | 382 // TODO(spang): Figure out why and put it in this comment. |
| 390 | 383 |
| 391 scroll_callback_.Run(ScrollEventParams( | 384 dispatcher_->DispatchScrollEvent(ScrollEventParams( |
| 392 id_, ET_SCROLL_FLING_START, cursor_->GetLocation(), | 385 id_, ET_SCROLL_FLING_START, cursor_->GetLocation(), |
| 393 gfx::Vector2dF() /* delta */, gfx::Vector2dF() /* ordinal_delta */, | 386 gfx::Vector2dF() /* delta */, gfx::Vector2dF() /* ordinal_delta */, |
| 394 kGestureScrollFingerCount, StimeToTimedelta(gesture->end_time))); | 387 kGestureScrollFingerCount, StimeToTimedelta(gesture->end_time))); |
| 395 } | 388 } |
| 396 | 389 |
| 397 void GestureInterpreterLibevdevCros::OnGesturePinch(const Gesture* gesture, | 390 void GestureInterpreterLibevdevCros::OnGesturePinch(const Gesture* gesture, |
| 398 const GesturePinch* pinch) { | 391 const GesturePinch* pinch) { |
| 399 DVLOG(3) << base::StringPrintf( | 392 DVLOG(3) << base::StringPrintf( |
| 400 "Gesture Pinch: dz=%f [%f]", pinch->dz, pinch->ordinal_dz); | 393 "Gesture Pinch: dz=%f [%f]", pinch->dz, pinch->ordinal_dz); |
| 401 | 394 |
| 402 if (!cursor_) | 395 if (!cursor_) |
| 403 return; // No cursor! | 396 return; // No cursor! |
| 404 | 397 |
| 405 NOTIMPLEMENTED(); | 398 NOTIMPLEMENTED(); |
| 406 } | 399 } |
| 407 | 400 |
| 408 void GestureInterpreterLibevdevCros::OnGestureMetrics( | 401 void GestureInterpreterLibevdevCros::OnGestureMetrics( |
| 409 const Gesture* gesture, | 402 const Gesture* gesture, |
| 410 const GestureMetrics* metrics) { | 403 const GestureMetrics* metrics) { |
| 411 DVLOG(3) << base::StringPrintf("Gesture Metrics: [%f, %f] type=%d", | 404 DVLOG(3) << base::StringPrintf("Gesture Metrics: [%f, %f] type=%d", |
| 412 metrics->data[0], | 405 metrics->data[0], |
| 413 metrics->data[1], | 406 metrics->data[1], |
| 414 metrics->type); | 407 metrics->type); |
| 415 NOTIMPLEMENTED(); | 408 NOTIMPLEMENTED(); |
| 416 } | 409 } |
| 417 | 410 |
| 418 void GestureInterpreterLibevdevCros::DispatchMouseButton(unsigned int button, | 411 void GestureInterpreterLibevdevCros::DispatchMouseButton(unsigned int button, |
| 419 bool down) { | 412 bool down) { |
| 420 bool allow_remap = is_mouse_; | 413 bool allow_remap = is_mouse_; |
| 421 mouse_button_callback_.Run(id_, cursor_->GetLocation(), button, down, | 414 dispatcher_->DispatchMouseButtonEvent(id_, cursor_->GetLocation(), button, |
| 422 allow_remap); | 415 down, allow_remap); |
| 423 } | 416 } |
| 424 | 417 |
| 425 void GestureInterpreterLibevdevCros::DispatchChangedKeys(Evdev* evdev, | 418 void GestureInterpreterLibevdevCros::DispatchChangedKeys(Evdev* evdev, |
| 426 const timeval& time) { | 419 const timeval& time) { |
| 427 unsigned long key_state_diff[EVDEV_BITS_TO_LONGS(KEY_CNT)]; | 420 unsigned long key_state_diff[EVDEV_BITS_TO_LONGS(KEY_CNT)]; |
| 428 | 421 |
| 429 // Find changed keys. | 422 // Find changed keys. |
| 430 for (unsigned long i = 0; i < arraysize(key_state_diff); ++i) | 423 for (unsigned long i = 0; i < arraysize(key_state_diff); ++i) |
| 431 key_state_diff[i] = evdev->key_state_bitmask[i] ^ prev_key_state_[i]; | 424 key_state_diff[i] = evdev->key_state_bitmask[i] ^ prev_key_state_[i]; |
| 432 | 425 |
| 433 // Dispatch events for changed keys. | 426 // Dispatch events for changed keys. |
| 434 for (unsigned long key = 0; key < KEY_CNT; ++key) { | 427 for (unsigned long key = 0; key < KEY_CNT; ++key) { |
| 435 if (EvdevBitIsSet(key_state_diff, key)) { | 428 if (EvdevBitIsSet(key_state_diff, key)) { |
| 436 bool value = EvdevBitIsSet(evdev->key_state_bitmask, key); | 429 bool value = EvdevBitIsSet(evdev->key_state_bitmask, key); |
| 437 | 430 |
| 438 // Mouse buttons are handled by DispatchMouseButton. | 431 // Mouse buttons are handled by DispatchMouseButton. |
| 439 if (key >= BTN_MOUSE && key < BTN_JOYSTICK) | 432 if (key >= BTN_MOUSE && key < BTN_JOYSTICK) |
| 440 continue; | 433 continue; |
| 441 | 434 |
| 442 // Ignore digi buttons (e.g. BTN_TOOL_FINGER). | 435 // Ignore digi buttons (e.g. BTN_TOOL_FINGER). |
| 443 if (key >= BTN_DIGI && key < BTN_WHEEL) | 436 if (key >= BTN_DIGI && key < BTN_WHEEL) |
| 444 continue; | 437 continue; |
| 445 | 438 |
| 446 if (allowed_keys_ && !allowed_keys_->count(key)) | 439 if (allowed_keys_ && !allowed_keys_->count(key)) |
| 447 continue; | 440 continue; |
| 448 | 441 |
| 449 // Dispatch key press or release to keyboard. | 442 // Dispatch key press or release to keyboard. |
| 450 key_callback_.Run(id_, key, value); | 443 dispatcher_->DispatchKeyEvent(id_, key, value); |
| 451 } | 444 } |
| 452 } | 445 } |
| 453 | 446 |
| 454 // Update internal key state. | 447 // Update internal key state. |
| 455 for (unsigned long i = 0; i < EVDEV_BITS_TO_LONGS(KEY_CNT); ++i) | 448 for (unsigned long i = 0; i < EVDEV_BITS_TO_LONGS(KEY_CNT); ++i) |
| 456 prev_key_state_[i] = evdev->key_state_bitmask[i]; | 449 prev_key_state_[i] = evdev->key_state_bitmask[i]; |
| 457 } | 450 } |
| 458 | 451 |
| 459 } // namespace ui | 452 } // namespace ui |
| OLD | NEW |