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.
5 #include "ui/aura/window.h"
6 #include "ui/aura/window_observer.h"
7 #include "ui/views/controls/menu/menu_runner.h"
8 #include "ui/views/widget/widget.h"
13 // DisplayChangeListener implementation for aura. Cancels the menu any time the
14 // root window bounds change.
15 class AuraDisplayChangeListener
16 : public DisplayChangeListener,
17 public aura::WindowObserver {
19 AuraDisplayChangeListener(Widget* widget, MenuRunner* menu_runner);
20 ~AuraDisplayChangeListener() override;
22 // aura::WindowObserver overrides:
23 void OnWindowBoundsChanged(aura::Window* window,
24 const gfx::Rect& old_bounds,
25 const gfx::Rect& new_bounds) override;
26 void OnWindowDestroying(aura::Window* window) override;
29 MenuRunner* menu_runner_;
30 aura::Window* root_window_;
32 DISALLOW_COPY_AND_ASSIGN(AuraDisplayChangeListener);
35 AuraDisplayChangeListener::AuraDisplayChangeListener(Widget* widget,
36 MenuRunner* menu_runner)
37 : menu_runner_(menu_runner),
38 root_window_(widget->GetNativeView()->GetRootWindow()) {
40 root_window_->AddObserver(this);
43 AuraDisplayChangeListener::~AuraDisplayChangeListener() {
45 root_window_->RemoveObserver(this);
48 void AuraDisplayChangeListener::OnWindowBoundsChanged(
50 const gfx::Rect& old_bounds,
51 const gfx::Rect& new_bounds) {
52 menu_runner_->Cancel();
55 void AuraDisplayChangeListener::OnWindowDestroying(aura::Window* window) {
56 DCHECK_EQ(window, root_window_);
57 root_window_->RemoveObserver(this);
62 DisplayChangeListener* DisplayChangeListener::Create(Widget* widget,
64 return new AuraDisplayChangeListener(widget, runner);
67 } // namespace internal