event_monitor_aura.cc 3.0 KB

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