Index: ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.cc |
diff --git a/ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.cc b/ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..92f15b77825ee1e0c073d1753b8763c8aca5e567 |
--- /dev/null |
+++ b/ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.cc |
@@ -0,0 +1,72 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.h" |
+ |
+#include <gestures/gestures.h> |
+ |
+#include "base/timer/timer.h" |
+ |
+// libgestures requires that this be in the top level namespace. |
+class GesturesTimer { |
+ public: |
+ GesturesTimer() : callback_(NULL), callback_data_(NULL) {} |
+ ~GesturesTimer() {} |
+ |
+ void Set(stime_t delay, GesturesTimerCallback callback, void* callback_data) { |
+ callback_ = callback; |
+ callback_data_ = callback_data; |
+ timer_.Start(FROM_HERE, |
+ base::TimeDelta::FromMicroseconds( |
+ delay * base::Time::kMicrosecondsPerSecond), |
+ this, |
+ &GesturesTimer::OnTimerExpired); |
+ } |
+ |
+ void Cancel() { timer_.Stop(); } |
+ |
+ private: |
+ void OnTimerExpired() { |
+ struct timespec ts; |
+ CHECK(!clock_gettime(CLOCK_MONOTONIC, &ts)); |
+ stime_t next_delay = callback_(StimeFromTimespec(&ts), callback_data_); |
+ if (next_delay >= 0) { |
+ timer_.Start(FROM_HERE, |
+ base::TimeDelta::FromMicroseconds( |
+ next_delay * base::Time::kMicrosecondsPerSecond), |
+ this, |
+ &GesturesTimer::OnTimerExpired); |
+ } |
+ } |
+ |
+ GesturesTimerCallback callback_; |
+ void* callback_data_; |
+ base::OneShotTimer<GesturesTimer> timer_; |
+}; |
+ |
+namespace ui { |
+ |
+namespace { |
+ |
+GesturesTimer* GesturesTimerCreate(void* data) { return new GesturesTimer; } |
+ |
+void GesturesTimerSet(void* data, |
+ GesturesTimer* timer, |
+ stime_t delay, |
+ GesturesTimerCallback callback, |
+ void* callback_data) { |
+ timer->Set(delay, callback, callback_data); |
+} |
+ |
+void GesturesTimerCancel(void* data, GesturesTimer* timer) { timer->Cancel(); } |
+ |
+void GesturesTimerFree(void* data, GesturesTimer* timer) { delete timer; } |
+ |
+} // namespace |
+ |
+const GesturesTimerProvider kGestureTimerProvider = { |
+ GesturesTimerCreate, GesturesTimerSet, GesturesTimerCancel, |
+ GesturesTimerFree}; |
+ |
+} // namespace ui |