1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "base/time/time.h" 6#include "base/timer/timer.h" 7#include "chrome/browser/ui/panels/panel_mouse_watcher.h" 8#include "ui/gfx/screen.h" 9 10// A timer based implementation of PanelMouseWatcher. Currently used for Gtk 11// and Mac panels implementations. 12class PanelMouseWatcherTimer : public PanelMouseWatcher { 13 public: 14 PanelMouseWatcherTimer(); 15 virtual ~PanelMouseWatcherTimer(); 16 17 private: 18 virtual void Start() OVERRIDE; 19 virtual void Stop() OVERRIDE; 20 virtual bool IsActive() const OVERRIDE; 21 virtual gfx::Point GetMousePosition() const OVERRIDE; 22 23 // Specifies the rate at which we want to sample the mouse position. 24 static const int kMousePollingIntervalMs = 250; 25 26 // Timer callback function. 27 void DoWork(); 28 friend class base::RepeatingTimer<PanelMouseWatcherTimer>; 29 30 // Timer used to track mouse movements. Some OSes do not provide an easy way 31 // of tracking mouse movements across applications. So we use a timer to 32 // accomplish the same. This could also be more efficient as you end up 33 // getting a lot of notifications when tracking mouse movements. 34 base::RepeatingTimer<PanelMouseWatcherTimer> timer_; 35 36 DISALLOW_COPY_AND_ASSIGN(PanelMouseWatcherTimer); 37}; 38 39// static 40PanelMouseWatcher* PanelMouseWatcher::Create() { 41 return new PanelMouseWatcherTimer(); 42} 43 44PanelMouseWatcherTimer::PanelMouseWatcherTimer() { 45} 46 47PanelMouseWatcherTimer::~PanelMouseWatcherTimer() { 48 DCHECK(!IsActive()); 49} 50 51void PanelMouseWatcherTimer::Start() { 52 DCHECK(!IsActive()); 53 timer_.Start(FROM_HERE, 54 base::TimeDelta::FromMilliseconds(kMousePollingIntervalMs), 55 this, &PanelMouseWatcherTimer::DoWork); 56} 57 58void PanelMouseWatcherTimer::Stop() { 59 DCHECK(IsActive()); 60 timer_.Stop(); 61} 62 63bool PanelMouseWatcherTimer::IsActive() const { 64 return timer_.IsRunning(); 65} 66 67gfx::Point PanelMouseWatcherTimer::GetMousePosition() const { 68 // TODO(scottmg): NativeScreen is wrong. http://crbug.com/133312 69 return gfx::Screen::GetNativeScreen()->GetCursorScreenPoint(); 70} 71 72void PanelMouseWatcherTimer::DoWork() { 73 NotifyMouseMovement(GetMousePosition()); 74} 75