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