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