OLD | NEW |
| (Empty) |
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/macros.h" | |
6 #include "base/time/time.h" | |
7 #include "base/timer/timer.h" | |
8 #include "chrome/browser/ui/panels/panel_mouse_watcher.h" | |
9 #include "ui/display/screen.h" | |
10 #include "ui/gfx/geometry/point.h" | |
11 | |
12 // A timer based implementation of PanelMouseWatcher. Currently used for Gtk | |
13 // and Mac panels implementations. | |
14 class PanelMouseWatcherTimer : public PanelMouseWatcher { | |
15 public: | |
16 PanelMouseWatcherTimer(); | |
17 ~PanelMouseWatcherTimer() override; | |
18 | |
19 private: | |
20 void Start() override; | |
21 void Stop() override; | |
22 bool IsActive() const override; | |
23 gfx::Point GetMousePosition() const override; | |
24 | |
25 // Specifies the rate at which we want to sample the mouse position. | |
26 static const int kMousePollingIntervalMs = 250; | |
27 | |
28 // Timer callback function. | |
29 void DoWork(); | |
30 friend class base::RepeatingTimer; | |
31 | |
32 // Timer used to track mouse movements. Some OSes do not provide an easy way | |
33 // of tracking mouse movements across applications. So we use a timer to | |
34 // accomplish the same. This could also be more efficient as you end up | |
35 // getting a lot of notifications when tracking mouse movements. | |
36 base::RepeatingTimer timer_; | |
37 | |
38 DISALLOW_COPY_AND_ASSIGN(PanelMouseWatcherTimer); | |
39 }; | |
40 | |
41 // static | |
42 PanelMouseWatcher* PanelMouseWatcher::Create() { | |
43 return new PanelMouseWatcherTimer(); | |
44 } | |
45 | |
46 PanelMouseWatcherTimer::PanelMouseWatcherTimer() { | |
47 } | |
48 | |
49 PanelMouseWatcherTimer::~PanelMouseWatcherTimer() { | |
50 DCHECK(!IsActive()); | |
51 } | |
52 | |
53 void PanelMouseWatcherTimer::Start() { | |
54 DCHECK(!IsActive()); | |
55 timer_.Start(FROM_HERE, | |
56 base::TimeDelta::FromMilliseconds(kMousePollingIntervalMs), | |
57 this, &PanelMouseWatcherTimer::DoWork); | |
58 } | |
59 | |
60 void PanelMouseWatcherTimer::Stop() { | |
61 DCHECK(IsActive()); | |
62 timer_.Stop(); | |
63 } | |
64 | |
65 bool PanelMouseWatcherTimer::IsActive() const { | |
66 return timer_.IsRunning(); | |
67 } | |
68 | |
69 gfx::Point PanelMouseWatcherTimer::GetMousePosition() const { | |
70 return display::Screen::GetScreen()->GetCursorScreenPoint(); | |
71 } | |
72 | |
73 void PanelMouseWatcherTimer::DoWork() { | |
74 NotifyMouseMovement(GetMousePosition()); | |
75 } | |
OLD | NEW |