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 |