diff options
author | mtomasz@chromium.org <mtomasz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-03 13:32:29 +0000 |
---|---|---|
committer | mtomasz@chromium.org <mtomasz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-03 13:32:29 +0000 |
commit | 3950001b9436ed77b1212798950ddac40ed0ac9f (patch) | |
tree | b14639f5989f47653f4dcc16c5993a48d8377793 /ash | |
parent | c254da669a16fe48b592f9d0a180e4204d2982d1 (diff) | |
download | chromium_src-3950001b9436ed77b1212798950ddac40ed0ac9f.zip chromium_src-3950001b9436ed77b1212798950ddac40ed0ac9f.tar.gz chromium_src-3950001b9436ed77b1212798950ddac40ed0ac9f.tar.bz2 |
Toggling windows with (shift)-f5 and (shift)-alt-tab does not repeat on key repeat.
While having more than one windows on the screen, when we press and hold f5 button, then the screen will flicker. In this patch, switching windows is not repeated while holding the accelerator key.
This behavior is the same as for f4 key for toggling window maximizing (recently patched).
BUG=152145
TEST=ash_unittests
Review URL: https://chromiumcodereview.appspot.com/10977074
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@159890 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ash')
-rw-r--r-- | ash/accelerators/accelerator_controller.cc | 38 | ||||
-rw-r--r-- | ash/accelerators/accelerator_controller.h | 6 | ||||
-rw-r--r-- | ash/accelerators/accelerator_table.cc | 37 | ||||
-rw-r--r-- | ash/accelerators/accelerator_table.h | 12 | ||||
-rw-r--r-- | ash/wm/gestures/bezel_gesture_handler.cc | 18 | ||||
-rw-r--r-- | ash/wm/system_gesture_event_filter.cc | 7 |
6 files changed, 90 insertions, 28 deletions
diff --git a/ash/accelerators/accelerator_controller.cc b/ash/accelerators/accelerator_controller.cc index 1141cdd..bc742c7 100644 --- a/ash/accelerators/accelerator_controller.cc +++ b/ash/accelerators/accelerator_controller.cc @@ -333,7 +333,11 @@ bool HandlePrintWindowHierarchy() { AcceleratorController::AcceleratorController() : accelerator_manager_(new ui::AcceleratorManager), - toggle_maximized_suppressed_(false) { + toggle_maximized_suppressed_(false), + cycle_backward_linear_suppressed_(false), + cycle_forward_linear_suppressed_(false), + cycle_backward_mru_suppressed_(false), + cycle_forward_mru_suppressed_(false) { Init(); } @@ -431,26 +435,50 @@ bool AcceleratorController::PerformAction(int action, // function might be called *twice*, via BrowserView::PreHandleKeyboardEvent // and BrowserView::HandleKeyboardEvent, for a single accelerator press. switch (action) { - case CYCLE_BACKWARD_MRU: + case CYCLE_BACKWARD_MRU_PRESSED: + if (cycle_backward_mru_suppressed_) + return true; + cycle_backward_mru_suppressed_ = true; if (key_code == ui::VKEY_TAB && shell->delegate()) shell->delegate()->RecordUserMetricsAction(UMA_ACCEL_PREVWINDOW_TAB); return HandleCycleWindowMRU(WindowCycleController::BACKWARD, accelerator.IsAltDown()); - case CYCLE_FORWARD_MRU: + case CYCLE_BACKWARD_MRU_RELEASED: + cycle_backward_mru_suppressed_ = false; + return true; + case CYCLE_FORWARD_MRU_PRESSED: + if (cycle_forward_mru_suppressed_) + return true; + cycle_forward_mru_suppressed_ = true; if (key_code == ui::VKEY_TAB && shell->delegate()) shell->delegate()->RecordUserMetricsAction(UMA_ACCEL_NEXTWINDOW_TAB); return HandleCycleWindowMRU(WindowCycleController::FORWARD, accelerator.IsAltDown()); - case CYCLE_BACKWARD_LINEAR: + case CYCLE_FORWARD_MRU_RELEASED: + cycle_forward_mru_suppressed_ = false; + return true; + case CYCLE_BACKWARD_LINEAR_PRESSED: + if (cycle_backward_linear_suppressed_) + return true; + cycle_backward_linear_suppressed_ = true; if (key_code == ui::VKEY_F5 && shell->delegate()) shell->delegate()->RecordUserMetricsAction(UMA_ACCEL_PREVWINDOW_F5); HandleCycleWindowLinear(CYCLE_BACKWARD); return true; - case CYCLE_FORWARD_LINEAR: + case CYCLE_BACKWARD_LINEAR_RELEASED: + cycle_backward_linear_suppressed_ = false; + return true; + case CYCLE_FORWARD_LINEAR_PRESSED: + if (cycle_forward_linear_suppressed_) + return true; + cycle_forward_linear_suppressed_ = true; if (key_code == ui::VKEY_F5 && shell->delegate()) shell->delegate()->RecordUserMetricsAction(UMA_ACCEL_NEXTWINDOW_F5); HandleCycleWindowLinear(CYCLE_FORWARD); return true; + case CYCLE_FORWARD_LINEAR_RELEASED: + cycle_forward_linear_suppressed_ = false; + return true; #if defined(OS_CHROMEOS) case CYCLE_DISPLAY_MODE: HandleCycleDisplayMode(); diff --git a/ash/accelerators/accelerator_controller.h b/ash/accelerators/accelerator_controller.h index fb3cb7d..0e2ddf4 100644 --- a/ash/accelerators/accelerator_controller.h +++ b/ash/accelerators/accelerator_controller.h @@ -118,8 +118,12 @@ class ASH_EXPORT AcceleratorController : public ui::AcceleratorTarget { // Reserved actions. See accelerator_table.h for details. std::set<int> reserved_actions_; - // If toggling maximized is suppressed until the key release event. + // Used to suppress accelerator handling on key repeat. bool toggle_maximized_suppressed_; + bool cycle_backward_linear_suppressed_; + bool cycle_forward_linear_suppressed_; + bool cycle_backward_mru_suppressed_; + bool cycle_forward_mru_suppressed_; DISALLOW_COPY_AND_ASSIGN(AcceleratorController); }; diff --git a/ash/accelerators/accelerator_table.cc b/ash/accelerators/accelerator_table.cc index ce399d7..ac40ab0 100644 --- a/ash/accelerators/accelerator_table.cc +++ b/ash/accelerators/accelerator_table.cc @@ -33,11 +33,18 @@ const AcceleratorData kAcceleratorData[] = { // Shortcut for Koren IME. { true, ui::VKEY_HANGUL, ui::EF_NONE, SWITCH_IME }, - { true, ui::VKEY_TAB, ui::EF_ALT_DOWN, CYCLE_FORWARD_MRU }, + { true, ui::VKEY_TAB, ui::EF_ALT_DOWN, CYCLE_FORWARD_MRU_PRESSED }, + { false, ui::VKEY_TAB, ui::EF_ALT_DOWN, CYCLE_FORWARD_MRU_RELEASED }, { true, ui::VKEY_TAB, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, - CYCLE_BACKWARD_MRU }, - { true, ui::VKEY_F5, ui::EF_NONE, CYCLE_FORWARD_LINEAR }, - { true, ui::VKEY_MEDIA_LAUNCH_APP1, ui::EF_NONE, CYCLE_FORWARD_LINEAR }, + CYCLE_BACKWARD_MRU_PRESSED }, + { false, ui::VKEY_TAB, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, + CYCLE_BACKWARD_MRU_RELEASED }, + { true, ui::VKEY_F5, ui::EF_NONE, CYCLE_FORWARD_LINEAR_PRESSED }, + { false, ui::VKEY_F5, ui::EF_NONE, CYCLE_FORWARD_LINEAR_RELEASED }, + { true, ui::VKEY_MEDIA_LAUNCH_APP1, ui::EF_NONE, + CYCLE_FORWARD_LINEAR_PRESSED }, + { false, ui::VKEY_MEDIA_LAUNCH_APP1, ui::EF_NONE, + CYCLE_FORWARD_LINEAR_RELEASED }, #if defined(OS_CHROMEOS) { true, ui::VKEY_WLAN, ui::EF_NONE, TOGGLE_WIFI }, { true, ui::VKEY_BRIGHTNESS_DOWN, ui::EF_NONE, BRIGHTNESS_DOWN }, @@ -81,9 +88,12 @@ const AcceleratorData kAcceleratorData[] = { { true, ui::VKEY_F3, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ROTATE_WINDOWS }, - { true, ui::VKEY_F5, ui::EF_SHIFT_DOWN, CYCLE_BACKWARD_LINEAR }, + { true, ui::VKEY_F5, ui::EF_SHIFT_DOWN, CYCLE_BACKWARD_LINEAR_PRESSED }, + { false, ui::VKEY_F5, ui::EF_SHIFT_DOWN, CYCLE_BACKWARD_LINEAR_RELEASED }, { true, ui::VKEY_MEDIA_LAUNCH_APP1, ui::EF_SHIFT_DOWN, - CYCLE_BACKWARD_LINEAR }, + CYCLE_BACKWARD_LINEAR_PRESSED }, + { false, ui::VKEY_MEDIA_LAUNCH_APP1, ui::EF_SHIFT_DOWN, + CYCLE_BACKWARD_LINEAR_RELEASED }, { true, ui::VKEY_T, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, RESTORE_TAB }, { true, ui::VKEY_F5, ui::EF_CONTROL_DOWN, TAKE_SCREENSHOT }, { true, ui::VKEY_F5, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, @@ -156,8 +166,12 @@ const AcceleratorData kDebugAcceleratorData[] = { { true, ui::VKEY_F11, ui::EF_CONTROL_DOWN, TOGGLE_ROOT_WINDOW_FULL_SCREEN }, { true, ui::VKEY_W, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, TOGGLE_WIFI }, // For testing on systems where Alt-Tab is already mapped. - { true, ui::VKEY_W, ui::EF_ALT_DOWN, CYCLE_FORWARD_MRU }, - { true, ui::VKEY_W, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, CYCLE_BACKWARD_MRU }, + { true, ui::VKEY_W, ui::EF_ALT_DOWN, CYCLE_FORWARD_MRU_PRESSED }, + { false, ui::VKEY_W, ui::EF_ALT_DOWN, CYCLE_FORWARD_MRU_RELEASED }, + { true, ui::VKEY_W, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, + CYCLE_BACKWARD_MRU_PRESSED }, + { false, ui::VKEY_W, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, + CYCLE_BACKWARD_MRU_RELEASED }, { true, ui::VKEY_HOME, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, DISPLAY_TOGGLE_SCALE }, #if !defined(NDEBUG) @@ -174,9 +188,10 @@ const size_t kDebugAcceleratorDataLength = arraysize(kDebugAcceleratorData); const AcceleratorAction kReservedActions[] = { // Window cycling accelerators. - CYCLE_BACKWARD_MRU, // Shift+Alt+Tab - CYCLE_FORWARD_MRU, // Alt+Tab - + CYCLE_BACKWARD_MRU_PRESSED, // Shift+Alt+Tab + CYCLE_BACKWARD_MRU_RELEASED, + CYCLE_FORWARD_MRU_PRESSED, // Alt+Tab + CYCLE_FORWARD_MRU_RELEASED, #if defined(OS_CHROMEOS) POWER_PRESSED, POWER_RELEASED, diff --git a/ash/accelerators/accelerator_table.h b/ash/accelerators/accelerator_table.h index 2b6d211..91442a4 100644 --- a/ash/accelerators/accelerator_table.h +++ b/ash/accelerators/accelerator_table.h @@ -15,10 +15,14 @@ namespace ash { enum AcceleratorAction { BRIGHTNESS_DOWN, BRIGHTNESS_UP, - CYCLE_BACKWARD_LINEAR, - CYCLE_BACKWARD_MRU, - CYCLE_FORWARD_LINEAR, - CYCLE_FORWARD_MRU, + CYCLE_BACKWARD_LINEAR_PRESSED, + CYCLE_BACKWARD_LINEAR_RELEASED, + CYCLE_BACKWARD_MRU_PRESSED, + CYCLE_BACKWARD_MRU_RELEASED, + CYCLE_FORWARD_LINEAR_PRESSED, + CYCLE_FORWARD_LINEAR_RELEASED, + CYCLE_FORWARD_MRU_PRESSED, + CYCLE_FORWARD_MRU_RELEASED, DISABLE_CAPS_LOCK, DISPLAY_TOGGLE_SCALE, EXIT, diff --git a/ash/wm/gestures/bezel_gesture_handler.cc b/ash/wm/gestures/bezel_gesture_handler.cc index cf783df..eb43de8 100644 --- a/ash/wm/gestures/bezel_gesture_handler.cc +++ b/ash/wm/gestures/bezel_gesture_handler.cc @@ -139,13 +139,19 @@ bool BezelGestureHandler::HandleApplicationControl( const ui::GestureEvent& event) { ash::AcceleratorController* accelerator = ash::Shell::GetInstance()->accelerator_controller(); - if (start_location_ == BEZEL_START_LEFT && event.details().scroll_x() > 0) - accelerator->PerformAction(CYCLE_BACKWARD_LINEAR, ui::Accelerator()); - else if (start_location_ == BEZEL_START_RIGHT && - event.details().scroll_x() < 0) - accelerator->PerformAction(CYCLE_FORWARD_LINEAR, ui::Accelerator()); - else + if (start_location_ == BEZEL_START_LEFT && event.details().scroll_x() > 0) { + accelerator->PerformAction(CYCLE_BACKWARD_LINEAR_PRESSED, + ui::Accelerator()); + accelerator->PerformAction(CYCLE_BACKWARD_LINEAR_RELEASED, + ui::Accelerator()); + } else if (start_location_ == BEZEL_START_RIGHT && + event.details().scroll_x() < 0) { + accelerator->PerformAction(CYCLE_FORWARD_LINEAR_PRESSED, ui::Accelerator()); + accelerator->PerformAction(CYCLE_FORWARD_LINEAR_RELEASED, + ui::Accelerator()); + } else { return false; + } // No further notifications for this gesture. return true; diff --git a/ash/wm/system_gesture_event_filter.cc b/ash/wm/system_gesture_event_filter.cc index ccb2879..27e1aa4 100644 --- a/ash/wm/system_gesture_event_filter.cc +++ b/ash/wm/system_gesture_event_filter.cc @@ -114,8 +114,13 @@ ui::EventResult SystemGestureEventFilter::PreHandleGestureEvent( SystemPinchHandler::kSystemGesturePoints) { ash::AcceleratorController* accelerator = ash::Shell::GetInstance()->accelerator_controller(); - if (accelerator->PerformAction(CYCLE_FORWARD_MRU, ui::Accelerator())) + if (accelerator->PerformAction(CYCLE_FORWARD_MRU_PRESSED, + ui::Accelerator())) { + accelerator->PerformAction(CYCLE_FORWARD_MRU_RELEASED, + ui::Accelerator()); return ui::ER_CONSUMED; + } + accelerator->PerformAction(CYCLE_FORWARD_MRU_RELEASED, ui::Accelerator()); } return ui::ER_UNHANDLED; } |