10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
20529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
30529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// found in the LICENSE file.
40529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.h"
60529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include <gestures/gestures.h>
80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/timer/timer.h"
100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// libgestures requires that this be in the top level namespace.
120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass GesturesTimer {
130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public:
140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  GesturesTimer() : callback_(NULL), callback_data_(NULL) {}
150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ~GesturesTimer() {}
160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void Set(stime_t delay, GesturesTimerCallback callback, void* callback_data) {
180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    callback_ = callback;
190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    callback_data_ = callback_data;
200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    timer_.Start(FROM_HERE,
210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                 base::TimeDelta::FromMicroseconds(
220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                     delay * base::Time::kMicrosecondsPerSecond),
230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                 this,
240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                 &GesturesTimer::OnTimerExpired);
250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void Cancel() { timer_.Stop(); }
280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch private:
300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void OnTimerExpired() {
310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    struct timespec ts;
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DCHECK(!clock_gettime(CLOCK_MONOTONIC, &ts));
330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    stime_t next_delay = callback_(StimeFromTimespec(&ts), callback_data_);
340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    if (next_delay >= 0) {
350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      timer_.Start(FROM_HERE,
360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                   base::TimeDelta::FromMicroseconds(
370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                       next_delay * base::Time::kMicrosecondsPerSecond),
380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                   this,
390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                   &GesturesTimer::OnTimerExpired);
400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    }
410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  GesturesTimerCallback callback_;
440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void* callback_data_;
450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  base::OneShotTimer<GesturesTimer> timer_;
460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch};
470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace ui {
490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace {
510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
520529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochGesturesTimer* GesturesTimerCreate(void* data) { return new GesturesTimer; }
530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid GesturesTimerSet(void* data,
550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                      GesturesTimer* timer,
560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                      stime_t delay,
570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                      GesturesTimerCallback callback,
580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                      void* callback_data) {
590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  timer->Set(delay, callback, callback_data);
600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid GesturesTimerCancel(void* data, GesturesTimer* timer) { timer->Cancel(); }
630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid GesturesTimerFree(void* data, GesturesTimer* timer) { delete timer; }
650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  // namespace
670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst GesturesTimerProvider kGestureTimerProvider = {
690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    GesturesTimerCreate, GesturesTimerSet, GesturesTimerCancel,
700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    GesturesTimerFree};
710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  // namespace ui
73