| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ash/accelerators/accelerator_controller.h" | 5 #include "ash/accelerators/accelerator_controller.h" |
| 6 | 6 |
| 7 #include "ash/brightness_control_delegate.h" | 7 #include "ash/brightness_control_delegate.h" |
| 8 #include "ash/caps_lock_delegate.h" | 8 #include "ash/caps_lock_delegate.h" |
| 9 #include "ash/ime_control_delegate.h" |
| 9 #include "ash/launcher/launcher.h" | 10 #include "ash/launcher/launcher.h" |
| 10 #include "ash/launcher/launcher_model.h" | 11 #include "ash/launcher/launcher_model.h" |
| 11 #include "ash/screenshot_delegate.h" | 12 #include "ash/screenshot_delegate.h" |
| 12 #include "ash/shell.h" | 13 #include "ash/shell.h" |
| 13 #include "ash/shell_delegate.h" | 14 #include "ash/shell_delegate.h" |
| 14 #include "ash/shell_window_ids.h" | 15 #include "ash/shell_window_ids.h" |
| 15 #include "ash/volume_control_delegate.h" | 16 #include "ash/volume_control_delegate.h" |
| 16 #include "ash/wm/window_cycle_controller.h" | 17 #include "ash/wm/window_cycle_controller.h" |
| 17 #include "ash/wm/window_util.h" | 18 #include "ash/wm/window_util.h" |
| 18 #include "ui/aura/event.h" | 19 #include "ui/aura/event.h" |
| 19 #include "ui/aura/root_window.h" | 20 #include "ui/aura/root_window.h" |
| 20 #include "ui/base/accelerators/accelerator.h" | 21 #include "ui/base/accelerators/accelerator.h" |
| 21 #include "ui/base/accelerators/accelerator_manager.h" | 22 #include "ui/base/accelerators/accelerator_manager.h" |
| 22 #include "ui/gfx/compositor/debug_utils.h" | 23 #include "ui/gfx/compositor/debug_utils.h" |
| 23 #include "ui/gfx/compositor/layer_animation_sequence.h" | 24 #include "ui/gfx/compositor/layer_animation_sequence.h" |
| 24 #include "ui/gfx/compositor/layer_animator.h" | 25 #include "ui/gfx/compositor/layer_animator.h" |
| 25 #include "ui/gfx/compositor/screen_rotation.h" | 26 #include "ui/gfx/compositor/screen_rotation.h" |
| 26 | 27 |
| 27 namespace { | 28 namespace { |
| 28 | 29 |
| 29 enum AcceleratorAction { | 30 enum AcceleratorAction { |
| 30 BRIGHTNESS_DOWN, | 31 BRIGHTNESS_DOWN, |
| 31 BRIGHTNESS_UP, | 32 BRIGHTNESS_UP, |
| 32 CYCLE_BACKWARD, | 33 CYCLE_BACKWARD, |
| 33 CYCLE_FORWARD, | 34 CYCLE_FORWARD, |
| 34 EXIT, | 35 EXIT, |
| 36 NEXT_IME, |
| 37 PREVIOUS_IME, |
| 38 SWITCH_IME, // Switch to another IME depending on the accelerator. |
| 35 TAKE_SCREENSHOT, | 39 TAKE_SCREENSHOT, |
| 36 TAKE_PARTIAL_SCREENSHOT, | 40 TAKE_PARTIAL_SCREENSHOT, |
| 37 TOGGLE_CAPS_LOCK, | 41 TOGGLE_CAPS_LOCK, |
| 38 VOLUME_DOWN, | 42 VOLUME_DOWN, |
| 39 VOLUME_MUTE, | 43 VOLUME_MUTE, |
| 40 VOLUME_UP, | 44 VOLUME_UP, |
| 41 #if defined(OS_CHROMEOS) | 45 #if defined(OS_CHROMEOS) |
| 42 LOCK_SCREEN, | 46 LOCK_SCREEN, |
| 43 #endif | 47 #endif |
| 44 #if !defined(NDEBUG) | 48 #if !defined(NDEBUG) |
| 45 PRINT_LAYER_HIERARCHY, | 49 PRINT_LAYER_HIERARCHY, |
| 46 PRINT_WINDOW_HIERARCHY, | 50 PRINT_WINDOW_HIERARCHY, |
| 47 ROTATE_SCREEN, | 51 ROTATE_SCREEN, |
| 48 TOGGLE_COMPACT_WINDOW_MODE, | 52 TOGGLE_COMPACT_WINDOW_MODE, |
| 49 TOGGLE_ROOT_WINDOW_FULL_SCREEN, | 53 TOGGLE_ROOT_WINDOW_FULL_SCREEN, |
| 50 #endif | 54 #endif |
| 51 }; | 55 }; |
| 52 | 56 |
| 53 // Accelerators handled by AcceleratorController. | 57 // Accelerators handled by AcceleratorController. |
| 54 struct AcceleratorData { | 58 const struct AcceleratorData { |
| 59 ui::EventType type; |
| 55 ui::KeyboardCode keycode; | 60 ui::KeyboardCode keycode; |
| 56 bool shift; | 61 bool shift; |
| 57 bool ctrl; | 62 bool ctrl; |
| 58 bool alt; | 63 bool alt; |
| 59 AcceleratorAction action; | 64 AcceleratorAction action; |
| 60 } kAcceleratorData[] = { | 65 } kAcceleratorData[] = { |
| 61 { ui::VKEY_TAB, false, false, true, CYCLE_FORWARD }, | 66 // Accelerators that should be processed before a key is sent to an IME. |
| 62 { ui::VKEY_TAB, true, false, true, CYCLE_BACKWARD }, | 67 // TODO(yusukes): Handle the NEXT_IME shortcut (Alt+Shift+Release) here. |
| 63 { ui::VKEY_F5, false, false, false, CYCLE_FORWARD }, | 68 { ui::ET_KEY_PRESSED, ui::VKEY_SPACE, false, true, false, PREVIOUS_IME }, |
| 69 // Shortcuts for Japanese IME. |
| 70 { ui::ET_KEY_PRESSED, ui::VKEY_CONVERT, false, false, false, SWITCH_IME }, |
| 71 { ui::ET_KEY_PRESSED, ui::VKEY_NONCONVERT, false, false, false, SWITCH_IME }, |
| 72 { ui::ET_KEY_PRESSED, ui::VKEY_DBE_SBCSCHAR, false, false, false, |
| 73 SWITCH_IME }, |
| 74 { ui::ET_KEY_PRESSED, ui::VKEY_DBE_DBCSCHAR, false, false, false, |
| 75 SWITCH_IME }, |
| 76 // Shortcuts for Koren IME. |
| 77 { ui::ET_KEY_PRESSED, ui::VKEY_HANGUL, false, false, false, SWITCH_IME }, |
| 78 { ui::ET_KEY_PRESSED, ui::VKEY_SPACE, true, false, false, SWITCH_IME }, |
| 79 |
| 80 // Accelerators that should be processed after a key is sent to an IME. |
| 81 { ui::ET_TRANSLATED_KEY_PRESS, ui::VKEY_TAB, false, false, true, |
| 82 CYCLE_FORWARD }, |
| 83 { ui::ET_TRANSLATED_KEY_PRESS, ui::VKEY_TAB, true, false, true, |
| 84 CYCLE_BACKWARD }, |
| 85 { ui::ET_TRANSLATED_KEY_PRESS, ui::VKEY_F5, false, false, false, |
| 86 CYCLE_FORWARD }, |
| 64 #if defined(OS_CHROMEOS) | 87 #if defined(OS_CHROMEOS) |
| 65 { ui::VKEY_BRIGHTNESS_DOWN, false, false, false, BRIGHTNESS_DOWN }, | 88 { ui::ET_TRANSLATED_KEY_PRESS, ui::VKEY_BRIGHTNESS_DOWN, false, false, false, |
| 66 { ui::VKEY_BRIGHTNESS_UP, false, false, false, BRIGHTNESS_UP }, | 89 BRIGHTNESS_DOWN }, |
| 67 { ui::VKEY_L, true, true, false, LOCK_SCREEN }, | 90 { ui::ET_TRANSLATED_KEY_PRESS, ui::VKEY_BRIGHTNESS_UP, false, false, false, |
| 91 BRIGHTNESS_UP }, |
| 92 { ui::ET_TRANSLATED_KEY_PRESS, ui::VKEY_L, true, true, false, LOCK_SCREEN }, |
| 68 #endif | 93 #endif |
| 69 { ui::VKEY_Q, true, true, false, EXIT }, | 94 { ui::ET_TRANSLATED_KEY_PRESS, ui::VKEY_Q, true, true, false, EXIT }, |
| 70 { ui::VKEY_F5, true, false, false, CYCLE_BACKWARD }, | 95 { ui::ET_TRANSLATED_KEY_PRESS, ui::VKEY_F5, true, false, false, |
| 71 { ui::VKEY_F5, false, true, false, TAKE_SCREENSHOT }, | 96 CYCLE_BACKWARD }, |
| 72 { ui::VKEY_F5, true, true, false, TAKE_PARTIAL_SCREENSHOT }, | 97 { ui::ET_TRANSLATED_KEY_PRESS, ui::VKEY_F5, false, true, false, |
| 73 { ui::VKEY_PRINT, false, false, false, TAKE_SCREENSHOT }, | 98 TAKE_SCREENSHOT }, |
| 99 { ui::ET_TRANSLATED_KEY_PRESS, ui::VKEY_F5, true, true, false, |
| 100 TAKE_PARTIAL_SCREENSHOT }, |
| 101 { ui::ET_TRANSLATED_KEY_PRESS, ui::VKEY_PRINT, false, false, false, |
| 102 TAKE_SCREENSHOT }, |
| 74 // On Chrome OS, Search key is mapped to LWIN. | 103 // On Chrome OS, Search key is mapped to LWIN. |
| 75 { ui::VKEY_LWIN, true, false, false, TOGGLE_CAPS_LOCK }, | 104 { ui::ET_TRANSLATED_KEY_PRESS, ui::VKEY_LWIN, true, false, false, |
| 76 { ui::VKEY_F6, false, false, false, BRIGHTNESS_DOWN }, | 105 TOGGLE_CAPS_LOCK }, |
| 77 { ui::VKEY_F7, false, false, false, BRIGHTNESS_UP }, | 106 { ui::ET_TRANSLATED_KEY_PRESS, ui::VKEY_F6, false, false, false, |
| 78 { ui::VKEY_F8, false, false, false, VOLUME_MUTE }, | 107 BRIGHTNESS_DOWN }, |
| 79 { ui::VKEY_VOLUME_MUTE, false, false, false, VOLUME_MUTE }, | 108 { ui::ET_TRANSLATED_KEY_PRESS, ui::VKEY_F7, false, false, false, |
| 80 { ui::VKEY_F9, false, false, false, VOLUME_DOWN }, | 109 BRIGHTNESS_UP }, |
| 81 { ui::VKEY_VOLUME_DOWN, false, false, false, VOLUME_DOWN }, | 110 { ui::ET_TRANSLATED_KEY_PRESS, ui::VKEY_F8, false, false, false, |
| 82 { ui::VKEY_F10, false, false, false, VOLUME_UP }, | 111 VOLUME_MUTE }, |
| 83 { ui::VKEY_VOLUME_UP, false, false, false, VOLUME_UP }, | 112 { ui::ET_TRANSLATED_KEY_PRESS, ui::VKEY_VOLUME_MUTE, false, false, false, |
| 113 VOLUME_MUTE }, |
| 114 { ui::ET_TRANSLATED_KEY_PRESS, ui::VKEY_F9, false, false, false, |
| 115 VOLUME_DOWN }, |
| 116 { ui::ET_TRANSLATED_KEY_PRESS, ui::VKEY_VOLUME_DOWN, false, false, false, |
| 117 VOLUME_DOWN }, |
| 118 { ui::ET_TRANSLATED_KEY_PRESS, ui::VKEY_F10, false, false, false, VOLUME_UP }, |
| 119 { ui::ET_TRANSLATED_KEY_PRESS, ui::VKEY_VOLUME_UP, false, false, false, |
| 120 VOLUME_UP }, |
| 84 #if !defined(NDEBUG) | 121 #if !defined(NDEBUG) |
| 85 { ui::VKEY_HOME, false, true, false, ROTATE_SCREEN }, | 122 { ui::ET_TRANSLATED_KEY_PRESS, ui::VKEY_HOME, false, true, false, |
| 86 { ui::VKEY_A, false, true, true, TOGGLE_COMPACT_WINDOW_MODE }, | 123 ROTATE_SCREEN }, |
| 87 { ui::VKEY_F11, false, true, false, TOGGLE_ROOT_WINDOW_FULL_SCREEN }, | 124 { ui::ET_TRANSLATED_KEY_PRESS, ui::VKEY_A, false, true, true, |
| 88 { ui::VKEY_L, false, false, true, PRINT_LAYER_HIERARCHY }, | 125 TOGGLE_COMPACT_WINDOW_MODE }, |
| 89 { ui::VKEY_L, true, false, true, PRINT_WINDOW_HIERARCHY }, | 126 { ui::ET_TRANSLATED_KEY_PRESS, ui::VKEY_F11, false, true, false, |
| 127 TOGGLE_ROOT_WINDOW_FULL_SCREEN }, |
| 128 { ui::ET_TRANSLATED_KEY_PRESS, ui::VKEY_L, false, false, true, |
| 129 PRINT_LAYER_HIERARCHY }, |
| 130 { ui::ET_TRANSLATED_KEY_PRESS, ui::VKEY_L, true, false, true, |
| 131 PRINT_WINDOW_HIERARCHY }, |
| 90 // For testing on systems where Alt-Tab is already mapped. | 132 // For testing on systems where Alt-Tab is already mapped. |
| 91 { ui::VKEY_W, false, false, true, CYCLE_FORWARD }, | 133 { ui::ET_TRANSLATED_KEY_PRESS, ui::VKEY_W, false, false, true, |
| 92 { ui::VKEY_W, true, false, true, CYCLE_BACKWARD }, | 134 CYCLE_FORWARD }, |
| 135 { ui::ET_TRANSLATED_KEY_PRESS, ui::VKEY_W, true, false, true, |
| 136 CYCLE_BACKWARD }, |
| 93 #endif | 137 #endif |
| 94 }; | 138 }; |
| 95 | 139 |
| 96 bool HandleCycleWindow(ash::WindowCycleController::Direction direction, | 140 bool HandleCycleWindow(ash::WindowCycleController::Direction direction, |
| 97 bool is_alt_down) { | 141 bool is_alt_down) { |
| 98 ash::Shell::GetInstance()-> | 142 ash::Shell::GetInstance()-> |
| 99 window_cycle_controller()->HandleCycleWindow(direction, is_alt_down); | 143 window_cycle_controller()->HandleCycleWindow(direction, is_alt_down); |
| 100 // Always report we handled the key, even if the window didn't change. | 144 // Always report we handled the key, even if the window didn't change. |
| 101 return true; | 145 return true; |
| 102 } | 146 } |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 203 | 247 |
| 204 AcceleratorController::~AcceleratorController() { | 248 AcceleratorController::~AcceleratorController() { |
| 205 } | 249 } |
| 206 | 250 |
| 207 void AcceleratorController::Init() { | 251 void AcceleratorController::Init() { |
| 208 for (size_t i = 0; i < arraysize(kAcceleratorData); ++i) { | 252 for (size_t i = 0; i < arraysize(kAcceleratorData); ++i) { |
| 209 ui::Accelerator accelerator(kAcceleratorData[i].keycode, | 253 ui::Accelerator accelerator(kAcceleratorData[i].keycode, |
| 210 kAcceleratorData[i].shift, | 254 kAcceleratorData[i].shift, |
| 211 kAcceleratorData[i].ctrl, | 255 kAcceleratorData[i].ctrl, |
| 212 kAcceleratorData[i].alt); | 256 kAcceleratorData[i].alt); |
| 257 accelerator.set_type(kAcceleratorData[i].type); |
| 213 Register(accelerator, this); | 258 Register(accelerator, this); |
| 214 accelerators_.insert(std::make_pair(accelerator, | 259 CHECK(accelerators_.insert( |
| 215 kAcceleratorData[i].action)); | 260 std::make_pair(accelerator, kAcceleratorData[i].action)).second); |
| 216 } | 261 } |
| 217 } | 262 } |
| 218 | 263 |
| 219 void AcceleratorController::Register( | 264 void AcceleratorController::Register(const ui::Accelerator& accelerator, |
| 220 const ui::Accelerator& accelerator, | 265 ui::AcceleratorTarget* target) { |
| 221 ui::AcceleratorTarget* target) { | |
| 222 accelerator_manager_->Register(accelerator, target); | 266 accelerator_manager_->Register(accelerator, target); |
| 223 } | 267 } |
| 224 | 268 |
| 225 void AcceleratorController::Unregister( | 269 void AcceleratorController::Unregister(const ui::Accelerator& accelerator, |
| 226 const ui::Accelerator& accelerator, | 270 ui::AcceleratorTarget* target) { |
| 227 ui::AcceleratorTarget* target) { | |
| 228 accelerator_manager_->Unregister(accelerator, target); | 271 accelerator_manager_->Unregister(accelerator, target); |
| 229 } | 272 } |
| 230 | 273 |
| 231 void AcceleratorController::UnregisterAll( | 274 void AcceleratorController::UnregisterAll(ui::AcceleratorTarget* target) { |
| 232 ui::AcceleratorTarget* target) { | |
| 233 accelerator_manager_->UnregisterAll(target); | 275 accelerator_manager_->UnregisterAll(target); |
| 234 } | 276 } |
| 235 | 277 |
| 236 bool AcceleratorController::Process(const ui::Accelerator& accelerator) { | 278 bool AcceleratorController::Process(const ui::Accelerator& accelerator) { |
| 237 return accelerator_manager_->Process(accelerator); | 279 return accelerator_manager_->Process(accelerator); |
| 238 } | 280 } |
| 239 | 281 |
| 240 void AcceleratorController::SetBrightnessControlDelegate( | 282 void AcceleratorController::SetBrightnessControlDelegate( |
| 241 scoped_ptr<BrightnessControlDelegate> brightness_control_delegate) { | 283 scoped_ptr<BrightnessControlDelegate> brightness_control_delegate) { |
| 242 brightness_control_delegate_.swap(brightness_control_delegate); | 284 brightness_control_delegate_.swap(brightness_control_delegate); |
| 243 } | 285 } |
| 244 | 286 |
| 245 void AcceleratorController::SetCapsLockDelegate( | 287 void AcceleratorController::SetCapsLockDelegate( |
| 246 scoped_ptr<CapsLockDelegate> caps_lock_delegate) { | 288 scoped_ptr<CapsLockDelegate> caps_lock_delegate) { |
| 247 caps_lock_delegate_.swap(caps_lock_delegate); | 289 caps_lock_delegate_.swap(caps_lock_delegate); |
| 248 } | 290 } |
| 249 | 291 |
| 292 void AcceleratorController::SetImeControlDelegate( |
| 293 scoped_ptr<ImeControlDelegate> ime_control_delegate) { |
| 294 ime_control_delegate_.swap(ime_control_delegate); |
| 295 } |
| 296 |
| 250 void AcceleratorController::SetScreenshotDelegate( | 297 void AcceleratorController::SetScreenshotDelegate( |
| 251 scoped_ptr<ScreenshotDelegate> screenshot_delegate) { | 298 scoped_ptr<ScreenshotDelegate> screenshot_delegate) { |
| 252 screenshot_delegate_.swap(screenshot_delegate); | 299 screenshot_delegate_.swap(screenshot_delegate); |
| 253 } | 300 } |
| 254 | 301 |
| 255 void AcceleratorController::SetVolumeControlDelegate( | 302 void AcceleratorController::SetVolumeControlDelegate( |
| 256 scoped_ptr<VolumeControlDelegate> volume_control_delegate) { | 303 scoped_ptr<VolumeControlDelegate> volume_control_delegate) { |
| 257 volume_control_delegate_.swap(volume_control_delegate); | 304 volume_control_delegate_.swap(volume_control_delegate); |
| 258 } | 305 } |
| 259 | 306 |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 309 return volume_control_delegate_->HandleVolumeMute(accelerator); | 356 return volume_control_delegate_->HandleVolumeMute(accelerator); |
| 310 break; | 357 break; |
| 311 case VOLUME_DOWN: | 358 case VOLUME_DOWN: |
| 312 if (volume_control_delegate_.get()) | 359 if (volume_control_delegate_.get()) |
| 313 return volume_control_delegate_->HandleVolumeDown(accelerator); | 360 return volume_control_delegate_->HandleVolumeDown(accelerator); |
| 314 break; | 361 break; |
| 315 case VOLUME_UP: | 362 case VOLUME_UP: |
| 316 if (volume_control_delegate_.get()) | 363 if (volume_control_delegate_.get()) |
| 317 return volume_control_delegate_->HandleVolumeUp(accelerator); | 364 return volume_control_delegate_->HandleVolumeUp(accelerator); |
| 318 break; | 365 break; |
| 366 case NEXT_IME: |
| 367 if (ime_control_delegate_.get()) |
| 368 return ime_control_delegate_->HandleNextIme(); |
| 369 break; |
| 370 case PREVIOUS_IME: |
| 371 if (ime_control_delegate_.get()) |
| 372 return ime_control_delegate_->HandlePreviousIme(); |
| 373 break; |
| 374 case SWITCH_IME: |
| 375 if (ime_control_delegate_.get()) |
| 376 return ime_control_delegate_->HandleSwitchIme(accelerator); |
| 377 break; |
| 319 #if !defined(NDEBUG) | 378 #if !defined(NDEBUG) |
| 320 case ROTATE_SCREEN: | 379 case ROTATE_SCREEN: |
| 321 return HandleRotateScreen(); | 380 return HandleRotateScreen(); |
| 322 case TOGGLE_COMPACT_WINDOW_MODE: | 381 case TOGGLE_COMPACT_WINDOW_MODE: |
| 323 return HandleToggleCompactWindowMode(); | 382 return HandleToggleCompactWindowMode(); |
| 324 case TOGGLE_ROOT_WINDOW_FULL_SCREEN: | 383 case TOGGLE_ROOT_WINDOW_FULL_SCREEN: |
| 325 return HandleToggleRootWindowFullScreen(); | 384 return HandleToggleRootWindowFullScreen(); |
| 326 case PRINT_LAYER_HIERARCHY: | 385 case PRINT_LAYER_HIERARCHY: |
| 327 return HandlePrintLayerHierarchy(); | 386 return HandlePrintLayerHierarchy(); |
| 328 case PRINT_WINDOW_HIERARCHY: | 387 case PRINT_WINDOW_HIERARCHY: |
| 329 return HandlePrintWindowHierarchy(); | 388 return HandlePrintWindowHierarchy(); |
| 330 #endif | 389 #endif |
| 331 default: | 390 default: |
| 332 NOTREACHED() << "Unhandled action " << it->second;; | 391 NOTREACHED() << "Unhandled action " << it->second;; |
| 333 } | 392 } |
| 334 return false; | 393 return false; |
| 335 } | 394 } |
| 336 | 395 |
| 337 bool AcceleratorController::CanHandleAccelerators() const { | 396 bool AcceleratorController::CanHandleAccelerators() const { |
| 338 return true; | 397 return true; |
| 339 } | 398 } |
| 340 | 399 |
| 341 } // namespace ash | 400 } // namespace ash |
| OLD | NEW |