summaryrefslogtreecommitdiffstats
path: root/ash/wm/activation_controller.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ash/wm/activation_controller.cc')
-rw-r--r--ash/wm/activation_controller.cc51
1 files changed, 46 insertions, 5 deletions
diff --git a/ash/wm/activation_controller.cc b/ash/wm/activation_controller.cc
index 3685d79..6859dd3 100644
--- a/ash/wm/activation_controller.cc
+++ b/ash/wm/activation_controller.cc
@@ -4,10 +4,13 @@
#include "ash/wm/activation_controller.h"
+#include "ash/root_window_controller.h"
#include "ash/shell.h"
#include "ash/shell_window_ids.h"
+#include "ash/wm/property_util.h"
#include "ash/wm/window_modality_controller.h"
#include "ash/wm/window_util.h"
+#include "ash/wm/workspace_controller.h"
#include "base/auto_reset.h"
#include "ui/aura/client/activation_change_observer.h"
#include "ui/aura/client/activation_delegate.h"
@@ -33,6 +36,7 @@ const int kWindowContainerIds[] = {
kShellWindowId_SystemModalContainer,
kShellWindowId_AlwaysOnTopContainer,
kShellWindowId_AppListContainer,
+ // TODO(sky): defaultcontainer shouldn't be in the list with workspace2.
kShellWindowId_DefaultContainer,
// Panel, launcher and status are intentionally checked after other
@@ -46,9 +50,18 @@ const int kWindowContainerIds[] = {
// Returns true if children of |window| can be activated.
// These are the only containers in which windows can receive focus.
bool SupportsChildActivation(aura::Window* window) {
+ // TODO(sky): straighten this out when workspace2 is the default.
+ // kShellWindowId_WorkspaceContainer isn't in |kWindowContainerIds| since it
+ // needs to be special cased in GetTopmostWindowToActivate().
+ if (window->id() == kShellWindowId_WorkspaceContainer)
+ return true;
+
for (size_t i = 0; i < arraysize(kWindowContainerIds); i++) {
- if (window->id() == kWindowContainerIds[i])
+ if (window->id() == kWindowContainerIds[i] &&
+ (window->id() != kShellWindowId_DefaultContainer ||
+ !WorkspaceController::IsWorkspace2Enabled())) {
return true;
+ }
}
return false;
}
@@ -78,7 +91,9 @@ enum ActivateVisibilityType {
bool VisibilityMatches(aura::Window* window, ActivateVisibilityType type) {
bool visible = (type == CURRENT_VISIBILITY) ? window->IsVisible() :
window->TargetVisibility();
- return visible || wm::IsWindowMinimized(window);
+ return visible || wm::IsWindowMinimized(window) ||
+ (window->TargetVisibility() &&
+ window->parent()->id() == kShellWindowId_WorkspaceContainer);
}
// Returns true if |window| can be activated or deactivated.
@@ -250,6 +265,19 @@ void ActivationController::ActivateWindowWithEvent(aura::Window* window,
if (window && !CanActivateWindowWithEvent(window, event, CURRENT_VISIBILITY))
return;
+ // Make sure the workspace manager switches to the workspace for window.
+ // Without this CanReceiveEvents() below returns false and activation never
+ // changes. CanReceiveEvents() returns false if |window| isn't in the active
+ // workspace, in which case its parent is not visible.
+ // TODO(sky): if I instead change the opacity of the parent this isn't an
+ // issue, but will make animations trickier... Consider which one is better.
+ if (window) {
+ internal::RootWindowController* root_window_controller =
+ GetRootWindowController(window->GetRootWindow());
+ root_window_controller->workspace_controller()->
+ SetActiveWorkspaceByWindow(window);
+ }
+
// Restore minimized window. This needs to be done before CanReceiveEvents()
// is called as that function checks window visibility.
if (window && wm::IsWindowMinimized(window))
@@ -321,12 +349,10 @@ aura::Window* ActivationController::GetTopmostWindowToActivate(
aura::Window* window = NULL;
for (; !window && current_container_index < arraysize(kWindowContainerIds);
current_container_index++) {
-
aura::Window::Windows containers =
Shell::GetAllContainers(kWindowContainerIds[current_container_index]);
for (aura::Window::Windows::const_iterator iter = containers.begin();
- iter != containers.end();
- ++iter) {
+ iter != containers.end() && !window; ++iter) {
window = GetTopmostWindowToActivateInContainer((*iter), ignore);
}
}
@@ -336,6 +362,21 @@ aura::Window* ActivationController::GetTopmostWindowToActivate(
aura::Window* ActivationController::GetTopmostWindowToActivateInContainer(
aura::Window* container,
aura::Window* ignore) const {
+ // Workspace2 has an extra level of windows that needs to be special cased.
+ if (container->id() == kShellWindowId_DefaultContainer &&
+ WorkspaceController::IsWorkspace2Enabled()) {
+ for (aura::Window::Windows::const_reverse_iterator i =
+ container->children().rbegin();
+ i != container->children().rend(); ++i) {
+ if ((*i)->IsVisible()) {
+ aura::Window* window = GetTopmostWindowToActivateInContainer(
+ *i, ignore);
+ if (window)
+ return window;
+ }
+ }
+ return NULL;
+ }
for (aura::Window::Windows::const_reverse_iterator i =
container->children().rbegin();
i != container->children().rend();