Chromium Code Reviews| Index: ui/aura_shell/shell_accelerator_controller.cc |
| diff --git a/ui/aura_shell/shell_accelerator_controller.cc b/ui/aura_shell/shell_accelerator_controller.cc |
| index 74e36d5e7e77ce275601da95d5b062297ccd6dcc..5b850d735b97a3da253fc4bda8b81cb57e456146 100644 |
| --- a/ui/aura_shell/shell_accelerator_controller.cc |
| +++ b/ui/aura_shell/shell_accelerator_controller.cc |
| @@ -4,10 +4,15 @@ |
| #include "ui/aura_shell/shell_accelerator_controller.h" |
| +#include <algorithm> |
| + |
| #include "base/logging.h" |
| #include "ui/aura/event.h" |
| #include "ui/aura/root_window.h" |
| +#include "ui/aura_shell/launcher/launcher.h" |
| +#include "ui/aura_shell/launcher/launcher_model.h" |
| #include "ui/aura_shell/shell.h" |
| +#include "ui/aura_shell/shell_window_ids.h" |
| #include "ui/base/accelerators/accelerator.h" |
| #include "ui/base/accelerators/accelerator_manager.h" |
| #include "ui/gfx/compositor/debug_utils.h" |
| @@ -47,16 +52,55 @@ struct AcceleratorData { |
| #endif |
| }; |
| -bool HandleCycleBackward() { |
| - // TODO(mazda): http://crbug.com/105204 |
| - NOTIMPLEMENTED(); |
| +// Returns true if the screen is locked. |
| +bool IsLocked() { |
|
Ben Goodger (Google)
2011/12/09 22:53:19
I wonder if we might want to make this a function
|
| + const aura::Window* lock_screen_container = |
| + aura_shell::Shell::GetInstance()->GetContainer( |
| + aura_shell::internal::kShellWindowId_LockScreenContainer); |
| + const aura::Window::Windows& lock_screen_windows = |
| + lock_screen_container->children(); |
| + aura::Window::Windows::const_iterator lock_screen_it = |
| + std::find_if(lock_screen_windows.begin(), lock_screen_windows.end(), |
| + std::mem_fun(&aura::Window::IsVisible)); |
| + if (lock_screen_it != lock_screen_windows.end()) |
| + return true; |
| + |
| + aura::Window* lock_modal_container = |
| + aura_shell::Shell::GetInstance()->GetContainer( |
| + aura_shell::internal::kShellWindowId_LockModalContainer); |
| + const aura::Window::Windows& lock_modal_windows = |
| + lock_modal_container->children(); |
| + aura::Window::Windows::const_iterator lock_modal_it = |
| + std::find_if(lock_modal_windows.begin(), lock_modal_windows.end(), |
| + std::mem_fun(&aura::Window::IsVisible)); |
| + if (lock_modal_it != lock_modal_windows.end()) |
| + return true; |
| + |
| return false; |
| } |
| -bool HandleCycleForward() { |
| - // TODO(mazda): http://crbug.com/105204 |
| - NOTIMPLEMENTED(); |
| - return false; |
| +bool HandleCycleWindow(bool forward) { |
| + if (IsLocked()) |
| + return false; |
| + |
| + // Use the same order of the windows in LauncherModel to cycle windows. |
| + aura_shell::LauncherModel* model = |
| + aura_shell::Shell::GetInstance()->launcher()->model(); |
| + aura::RootWindow* root_window = aura::RootWindow::GetInstance(); |
| + aura::Window* active_window = root_window->active_window(); |
| + if (!active_window) { |
| + LOG(ERROR) << "No active window"; |
| + return false; |
| + } |
| + int active_index = model->ItemIndexByWindow(active_window); |
| + if (active_index < 0) { |
| + VLOG(2) << "Active window not found in the launcher model"; |
| + return false; |
| + } |
| + int next_index = (active_index + (forward ? 1 : -1) + model->item_count()) % |
| + model->item_count(); |
| + model->items()[next_index].window->Activate(); |
| + return true; |
| } |
| bool HandleTakeScreenshot() { |
| @@ -166,9 +210,9 @@ bool ShellAcceleratorController::AcceleratorPressed( |
| DCHECK(it != accelerators_.end()); |
| switch (static_cast<AcceleratorAction>(it->second)) { |
| case CYCLE_BACKWARD: |
| - return HandleCycleBackward(); |
| + return HandleCycleWindow(false); |
| case CYCLE_FORWARD: |
| - return HandleCycleForward(); |
| + return HandleCycleWindow(true); |
| case TAKE_SCREENSHOT: |
| return HandleTakeScreenshot(); |
| #if !defined(NDEBUG) |