Index: ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc |
diff --git a/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc b/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc |
index 59d8735cc5371d693c5d7b16b3cec8e76eaa073f..073514dd0a3a76e30f0208a7c421684cc89c4c2a 100644 |
--- a/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc |
+++ b/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc |
@@ -11,7 +11,9 @@ |
#include "base/timer/timer.h" |
#include "ui/events/event.h" |
#include "ui/events/ozone/evdev/cursor_delegate_evdev.h" |
+#include "ui/events/ozone/evdev/event_device_util.h" |
#include "ui/events/ozone/evdev/event_modifiers_evdev.h" |
+#include "ui/events/ozone/evdev/keyboard_evdev.h" |
#include "ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.h" |
#include "ui/gfx/geometry/point_f.h" |
@@ -81,11 +83,15 @@ const int kGestureSwipeFingerCount = 3; |
GestureInterpreterLibevdevCros::GestureInterpreterLibevdevCros( |
EventModifiersEvdev* modifiers, |
CursorDelegateEvdev* cursor, |
+ KeyboardEvdev* keyboard, |
const EventDispatchCallback& callback) |
: modifiers_(modifiers), |
cursor_(cursor), |
+ keyboard_(keyboard), |
dispatch_callback_(callback), |
- interpreter_(NULL) {} |
+ interpreter_(NULL) { |
+ memset(&prev_key_state_, 0, sizeof(prev_key_state_)); |
+} |
GestureInterpreterLibevdevCros::~GestureInterpreterLibevdevCros() { |
if (interpreter_) { |
@@ -118,6 +124,9 @@ void GestureInterpreterLibevdevCros::OnLibEvdevCrosOpen( |
void GestureInterpreterLibevdevCros::OnLibEvdevCrosEvent(Evdev* evdev, |
EventStateRec* evstate, |
const timeval& time) { |
+ // If the device has keys no it, dispatch any presses/release. |
+ DispatchChangedKeys(evdev, time); |
+ |
HardwareState hwstate; |
memset(&hwstate, 0, sizeof(hwstate)); |
hwstate.timestamp = StimeFromTimeval(&time); |
@@ -395,4 +404,25 @@ void GestureInterpreterLibevdevCros::DispatchMouseButton(unsigned int modifier, |
Dispatch(&event); |
} |
+void GestureInterpreterLibevdevCros::DispatchChangedKeys(Evdev* evdev, |
+ const timeval& time) { |
+ unsigned long key_state_diff[EVDEV_BITS_TO_LONGS(KEY_CNT)]; |
+ |
+ // Find changed keys. |
+ for (unsigned long i = 0; i < arraysize(key_state_diff); ++i) |
+ key_state_diff[i] = evdev->key_state_bitmask[i] ^ prev_key_state_[i]; |
+ |
+ // Dispatch events for changed keys. |
+ for (unsigned long i = 0; i < KEY_CNT; ++i) { |
+ if (EvdevBitIsSet(key_state_diff, i)) { |
+ bool value = EvdevBitIsSet(evdev->key_state_bitmask, i); |
+ keyboard_->OnKeyChange(i, value); |
+ } |
+ } |
+ |
+ // Update internal key state. |
+ for (unsigned long i = 0; i < EVDEV_BITS_TO_LONGS(KEY_CNT); ++i) |
+ prev_key_state_[i] = evdev->key_state_bitmask[i]; |
+} |
+ |
} // namespace ui |