Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(867)

Unified Diff: ui/aura/root_window.cc

Issue 8894018: Move the concept of Activation to the Shell. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/aura/root_window.h ('k') | ui/aura/root_window_observer.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/aura/root_window.cc
===================================================================
--- ui/aura/root_window.cc (revision 114022)
+++ ui/aura/root_window.cc (working copy)
@@ -14,6 +14,7 @@
#include "base/string_number_conversions.h"
#include "base/string_split.h"
#include "ui/aura/aura_switches.h"
+#include "ui/aura/client/activation_client.h"
#include "ui/aura/client/drag_drop_client.h"
#include "ui/aura/client/stacking_client.h"
#include "ui/aura/client/tooltip_client.h"
@@ -69,20 +70,6 @@
virtual void AddChildToDefaultParent(Window* window) OVERRIDE {
root_window_->AddChild(window);
}
- virtual bool CanActivateWindow(Window* window) const OVERRIDE {
- return window->parent() == root_window_;
- }
- virtual Window* GetTopmostWindowToActivate(Window* ignore) const OVERRIDE {
- Window::Windows::const_reverse_iterator i;
- for (i = root_window_->children().rbegin();
- i != root_window_->children().rend();
- ++i) {
- if (*i == ignore)
- continue;
- return *i;
- }
- return NULL;
- }
RootWindow* root_window_;
@@ -247,55 +234,6 @@
SetHostSize(size);
}
-void RootWindow::SetActiveWindow(Window* window, Window* to_focus) {
- if (!window)
- return;
- // The stacking client may impose rules on what window configurations can be
- // activated or deactivated.
- if (!stacking_client_->CanActivateWindow(window))
- return;
- // The window may not be activate-able.
- if (!window->CanActivate())
- return;
- // Nothing may actually have changed.
- if (active_window_ == window)
- return;
-
- Window* old_active = active_window_;
- active_window_ = window;
- // Invoke OnLostActive after we've changed the active window. That way if the
- // delegate queries for active state it doesn't think the window is still
- // active.
- if (old_active && old_active->delegate())
- old_active->delegate()->OnLostActive();
- if (active_window_) {
- active_window_->parent()->StackChildAtTop(active_window_);
- if (active_window_->delegate())
- active_window_->delegate()->OnActivated();
- active_window_->GetFocusManager()->SetFocusedWindow(
- to_focus ? to_focus : active_window_);
- }
- FOR_EACH_OBSERVER(RootWindowObserver, observers_,
- OnActiveWindowChanged(active_window_));
-}
-
-void RootWindow::ActivateTopmostWindow() {
- SetActiveWindow(stacking_client_->GetTopmostWindowToActivate(NULL), NULL);
-}
-
-void RootWindow::Deactivate(Window* window) {
- // The stacking client may impose rules on what window configurations can be
- // activated or deactivated.
- if (!window || !stacking_client_->CanActivateWindow(window))
- return;
- if (active_window_ != window)
- return;
-
- Window* to_activate = stacking_client_->GetTopmostWindowToActivate(window);
- if (to_activate)
- SetActiveWindow(to_activate, NULL);
-}
-
void RootWindow::WindowInitialized(Window* window) {
FOR_EACH_OBSERVER(RootWindowObserver, observers_,
OnWindowInitialized(window));
@@ -317,25 +255,17 @@
capture_window_ = NULL;
if (touch_event_handler_ == window)
touch_event_handler_ = NULL;
-
- if (in_destructor_ || window != active_window_)
- return;
-
- // Reset active_window_ before invoking SetActiveWindow so that we don't
- // attempt to notify it while running its destructor.
- active_window_ = NULL;
- SetActiveWindow(stacking_client_->GetTopmostWindowToActivate(window), NULL);
}
MessageLoop::Dispatcher* RootWindow::GetDispatcher() {
return host_.get();
}
-void RootWindow::AddObserver(RootWindowObserver* observer) {
+void RootWindow::AddRootWindowObserver(RootWindowObserver* observer) {
observers_.AddObserver(observer);
}
-void RootWindow::RemoveObserver(RootWindowObserver* observer) {
+void RootWindow::RemoveRootWindowObserver(RootWindowObserver* observer) {
observers_.RemoveObserver(observer);
}
@@ -406,10 +336,8 @@
ALLOW_THIS_IN_INITIALIZER_LIST(
stacking_client_(new DefaultStackingClient(this))),
ALLOW_THIS_IN_INITIALIZER_LIST(schedule_paint_factory_(this)),
- active_window_(NULL),
mouse_button_flags_(0),
last_cursor_(kCursorNull),
- in_destructor_(false),
screen_(new ScreenAura),
capture_window_(NULL),
mouse_pressed_handler_(NULL),
@@ -434,7 +362,6 @@
}
RootWindow::~RootWindow() {
- in_destructor_ = true;
// Make sure to destroy the compositor before terminating so that state is
// cleared and we don't hit asserts.
compositor_ = NULL;
@@ -571,15 +498,28 @@
}
void RootWindow::SetFocusedWindow(Window* focused_window) {
- if (focused_window == focused_window_ ||
- (focused_window && !focused_window->CanFocus())) {
+ if (focused_window == focused_window_)
return;
+ if (focused_window && !focused_window->CanFocus())
+ return;
+ // The NULL-check of |focused)window| is essential here before asking the
+ // activation client, since it is valid to clear the focus by calling
+ // SetFocusedWindow() to NULL.
+ if (focused_window && ActivationClient::GetActivationClient() &&
+ !ActivationClient::GetActivationClient()->CanFocusWindow(
+ focused_window)) {
+ return;
}
+
if (focused_window_ && focused_window_->delegate())
focused_window_->delegate()->OnBlur();
focused_window_ = focused_window;
if (focused_window_ && focused_window_->delegate())
focused_window_->delegate()->OnFocus();
+ if (focused_window_) {
+ FOR_EACH_OBSERVER(RootWindowObserver, observers_,
+ OnWindowFocused(focused_window_));
+ }
}
Window* RootWindow::GetFocusedWindow() {
« no previous file with comments | « ui/aura/root_window.h ('k') | ui/aura/root_window_observer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698