1 // Copyright 2014 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 "ui/views/event_monitor_aura.h"
6
7 #include <memory>
8
9 #include "base/check_op.h"
10 #include "base/scoped_observer.h"
11 #include "ui/aura/env.h"
12 #include "ui/aura/window.h"
13 #include "ui/events/event_observer.h"
14 #include "ui/events/event_target.h"
15
16 namespace views {
17
18 namespace {
19
20 // An EventMonitorAura that removes its event observer on window destruction.
21 class WindowMonitorAura : public EventMonitorAura, public aura::WindowObserver {
22 public:
WindowMonitorAura(ui::EventObserver * event_observer,aura::Window * target_window,const std::set<ui::EventType> & types)23 WindowMonitorAura(ui::EventObserver* event_observer,
24 aura::Window* target_window,
25 const std::set<ui::EventType>& types)
26 : EventMonitorAura(event_observer, target_window, types),
27 target_window_(target_window) {
28 window_observer_.Add(target_window);
29 }
30 ~WindowMonitorAura() override = default;
31
32 // aura::WindowObserver:
OnWindowDestroying(aura::Window * window)33 void OnWindowDestroying(aura::Window* window) override {
34 DCHECK_EQ(window, target_window_);
35 window_observer_.Remove(target_window_);
36 target_window_ = nullptr;
37 TearDown();
38 }
39
40 private:
41 aura::Window* target_window_;
42 ScopedObserver<aura::Window, aura::WindowObserver> window_observer_{this};
43
44 DISALLOW_COPY_AND_ASSIGN(WindowMonitorAura);
45 };
46
47 } // namespace
48
49 // static
CreateApplicationMonitor(ui::EventObserver * event_observer,gfx::NativeWindow context,const std::set<ui::EventType> & types)50 std::unique_ptr<EventMonitor> EventMonitor::CreateApplicationMonitor(
51 ui::EventObserver* event_observer,
52 gfx::NativeWindow context,
53 const std::set<ui::EventType>& types) {
54 return std::make_unique<EventMonitorAura>(event_observer,
55 aura::Env::GetInstance(), types);
56 }
57
58 // static
CreateWindowMonitor(ui::EventObserver * event_observer,gfx::NativeWindow target_window,const std::set<ui::EventType> & types)59 std::unique_ptr<EventMonitor> EventMonitor::CreateWindowMonitor(
60 ui::EventObserver* event_observer,
61 gfx::NativeWindow target_window,
62 const std::set<ui::EventType>& types) {
63 return std::make_unique<WindowMonitorAura>(event_observer, target_window,
64 types);
65 }
66
EventMonitorAura(ui::EventObserver * event_observer,ui::EventTarget * event_target,const std::set<ui::EventType> & types)67 EventMonitorAura::EventMonitorAura(ui::EventObserver* event_observer,
68 ui::EventTarget* event_target,
69 const std::set<ui::EventType>& types)
70 : event_observer_(event_observer), event_target_(event_target) {
71 DCHECK(event_observer_);
72 DCHECK(event_target_);
73 aura::Env::GetInstance()->AddEventObserver(event_observer_, event_target,
74 types);
75 }
76
~EventMonitorAura()77 EventMonitorAura::~EventMonitorAura() {
78 TearDown();
79 }
80
GetLastMouseLocation()81 gfx::Point EventMonitorAura::GetLastMouseLocation() {
82 return aura::Env::GetInstance()->last_mouse_location();
83 }
84
TearDown()85 void EventMonitorAura::TearDown() {
86 if (event_observer_)
87 aura::Env::GetInstance()->RemoveEventObserver(event_observer_);
88 event_observer_ = nullptr;
89 }
90
91 } // namespace views
92