Chromium Code Reviews| Index: ash/accelerators/accelerator_controller.cc |
| diff --git a/ash/accelerators/accelerator_controller.cc b/ash/accelerators/accelerator_controller.cc |
| index b18d0a01a1af496ea7a3b0be59fe3279badddfaa..467c5606d015f27f2594635393609ac0a645a429 100644 |
| --- a/ash/accelerators/accelerator_controller.cc |
| +++ b/ash/accelerators/accelerator_controller.cc |
| @@ -56,6 +56,7 @@ |
| #include "base/command_line.h" |
| #include "base/metrics/histogram_macros.h" |
| #include "base/metrics/user_metrics.h" |
| +#include "base/strings/utf_string_conversions.h" |
| #include "ui/aura/env.h" |
| #include "ui/base/accelerators/accelerator.h" |
| #include "ui/base/accelerators/accelerator_manager.h" |
| @@ -115,9 +116,48 @@ ui::Accelerator CreateAccelerator(ui::KeyboardCode keycode, |
| return accelerator; |
| } |
| +// Ensures that there are no word breaks at the "+"s in the shortcut texts such |
|
oshima
2015/11/09 19:49:28
what if the shortcut contains "+" key itself?
afakhry
2015/11/10 00:56:47
The "+" will just be appended and prepended with t
|
| +// as "Ctrl+Shift+Space". |
| +void EnsureNoWordBreaks(base::string16* shortcut_text) { |
| + std::vector<base::string16> keys = |
| + base::SplitString(*shortcut_text, base::ASCIIToUTF16("+"), |
| + base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); |
| + |
| + if (keys.size() < 2U) |
| + return; |
| + |
| + // The plus sign surrounded by the word joiner to guarantee an non-breaking |
| + // shortcut. |
| + const base::string16 non_breaking_plus = |
| + base::UTF8ToUTF16("\xe2\x81\xa0+\xe2\x81\xa0"); |
| + shortcut_text->clear(); |
| + for (size_t i = 0; i < keys.size() - 1; ++i) { |
| + *shortcut_text += keys[i]; |
| + *shortcut_text += non_breaking_plus; |
| + } |
| + |
| + *shortcut_text += keys[keys.size() - 1]; |
| +} |
| + |
| +// Gets the notification message after it formats it in such a way that there |
| +// are no line breaks in the middle of the shortcut texts. |
| +base::string16 GetNotificationText(int message_id, |
| + int old_shortcut_id, |
| + int new_shortcut_id) { |
| + base::string16 old_shortcut = l10n_util::GetStringUTF16(old_shortcut_id); |
| + base::string16 new_shortcut = l10n_util::GetStringUTF16(new_shortcut_id); |
| + EnsureNoWordBreaks(&old_shortcut); |
| + EnsureNoWordBreaks(&new_shortcut); |
| + |
| + return l10n_util::GetStringFUTF16(message_id, new_shortcut, old_shortcut); |
| +} |
| + |
| void ShowDeprecatedAcceleratorNotification(const char* const notification_id, |
| - int message_id) { |
| - const base::string16 message = l10n_util::GetStringUTF16(message_id); |
| + int message_id, |
| + int old_shortcut_id, |
| + int new_shortcut_id) { |
| + const base::string16 message = |
| + GetNotificationText(message_id, old_shortcut_id, new_shortcut_id); |
| scoped_ptr<message_center::Notification> notification( |
| new message_center::Notification( |
| message_center::NOTIFICATION_TYPE_SIMPLE, notification_id, |
| @@ -253,33 +293,38 @@ void HandleNewWindow() { |
| } |
| bool CanHandleNextIme(ImeControlDelegate* ime_control_delegate, |
| - const ui::Accelerator& previous_accelerator) { |
| - // We only allow next IME to be triggered if the previous is accelerator key |
| - // is ONLY either Shift, Alt, Enter or Space. |
| - // The first two cases to avoid conflicting accelerators that contain |
| - // Alt+Shift (like Alt+Shift+Tab or Alt+Shift+S) to trigger next IME when the |
| - // wrong order of key sequences is pressed. crbug.com/527154. |
| - // The latter two cases are needed for CJK IME users who tend to press Enter |
| - // (or Space) and Shift+Alt almost at the same time to commit an IME string |
| - // and then switch from the IME to the English layout. This allows these users |
| - // to trigger NEXT_IME even if they press Shift+Alt before releasing Enter. |
| - // crbug.com/139556. |
| - // TODO(nona|mazda): Fix crbug.com/139556 in a cleaner way. |
| - const ui::KeyboardCode previous_key_code = previous_accelerator.key_code(); |
| - switch (previous_key_code) { |
| - case ui::VKEY_SHIFT: |
| - case ui::VKEY_LSHIFT: |
| - case ui::VKEY_RSHIFT: |
| - case ui::VKEY_MENU: |
| - case ui::VKEY_LMENU: |
| - case ui::VKEY_RMENU: |
| - case ui::VKEY_RETURN: |
| - case ui::VKEY_SPACE: |
| - return ime_control_delegate && ime_control_delegate->CanCycleIme(); |
| - |
| - default: |
| - return false; |
| + const ui::Accelerator& previous_accelerator, |
| + bool current_accelerator_is_deprecated) { |
| + if (current_accelerator_is_deprecated) { |
| + // We only allow next IME to be triggered if the previous is accelerator key |
| + // is ONLY either Shift, Alt, Enter or Space. |
| + // The first six cases below are to avoid conflicting accelerators that |
| + // contain Alt+Shift (like Alt+Shift+Tab or Alt+Shift+S) to trigger next IME |
| + // when the wrong order of key sequences is pressed. crbug.com/527154. |
| + // The latter two cases are needed for CJK IME users who tend to press Enter |
| + // (or Space) and Shift+Alt almost at the same time to commit an IME string |
| + // and then switch from the IME to the English layout. This allows these |
| + // users to trigger NEXT_IME even if they press Shift+Alt before releasing |
| + // Enter. crbug.com/139556. |
| + // TODO(nona|mazda): Fix crbug.com/139556 in a cleaner way. |
| + const ui::KeyboardCode previous_key_code = previous_accelerator.key_code(); |
| + switch (previous_key_code) { |
| + case ui::VKEY_SHIFT: |
| + case ui::VKEY_LSHIFT: |
| + case ui::VKEY_RSHIFT: |
| + case ui::VKEY_MENU: |
| + case ui::VKEY_LMENU: |
| + case ui::VKEY_RMENU: |
| + case ui::VKEY_RETURN: |
| + case ui::VKEY_SPACE: |
| + break; |
| + |
| + default: |
| + return false; |
| + } |
| } |
| + |
| + return ime_control_delegate && ime_control_delegate->CanCycleIme(); |
| } |
| void HandleNextIme(ImeControlDelegate* ime_control_delegate) { |
| @@ -832,8 +877,9 @@ bool AcceleratorController::AcceleratorPressed( |
| RecordUmaHistogram(data->uma_histogram_name, DEPRECATED_USED); |
| // We always display the notification as long as this entry exists. |
| - ShowDeprecatedAcceleratorNotification(data->uma_histogram_name, |
| - data->notification_message_id); |
| + ShowDeprecatedAcceleratorNotification( |
| + data->uma_histogram_name, data->notification_message_id, |
| + data->old_shortcut_id, data->new_shortcut_id); |
| if (!data->deprecated_enabled) |
| return false; |
| @@ -913,17 +959,19 @@ void AcceleratorController::RegisterAccelerators( |
| void AcceleratorController::RegisterDeprecatedAccelerators() { |
| #if defined(OS_CHROMEOS) |
| + for (size_t i = 0; i < kDeprecatedAcceleratorsDataLength; ++i) { |
| + const DeprecatedAcceleratorData* data = &kDeprecatedAcceleratorsData[i]; |
| + actions_with_deprecations_[data->action] = data; |
| + } |
| + |
| for (size_t i = 0; i < kDeprecatedAcceleratorsLength; ++i) { |
| - const DeprecatedAcceleratorData* data = &kDeprecatedAccelerators[i]; |
| - const AcceleratorAction action = data->deprecated_accelerator.action; |
| + const AcceleratorData& accelerator_data = kDeprecatedAccelerators[i]; |
| const ui::Accelerator deprecated_accelerator = |
| - CreateAccelerator(data->deprecated_accelerator.keycode, |
| - data->deprecated_accelerator.modifiers, |
| - data->deprecated_accelerator.trigger_on_press); |
| + CreateAccelerator(accelerator_data.keycode, accelerator_data.modifiers, |
| + accelerator_data.trigger_on_press); |
| Register(deprecated_accelerator, this); |
| - actions_with_deprecations_[action] = data; |
| - accelerators_[deprecated_accelerator] = action; |
| + accelerators_[deprecated_accelerator] = accelerator_data.action; |
| deprecated_accelerators_.insert(deprecated_accelerator); |
| } |
| #endif // defined(OS_CHROMEOS) |
| @@ -964,9 +1012,18 @@ bool AcceleratorController::CanPerformAction( |
| return CanHandleMagnifyScreen(); |
| case NEW_INCOGNITO_WINDOW: |
| return CanHandleNewIncognitoWindow(); |
| - case NEXT_IME: |
| - return CanHandleNextIme(ime_control_delegate_.get(), |
| - previous_accelerator); |
| + case NEXT_IME: { |
| +#if defined(OS_CHROMEOS) |
| + bool accelerator_is_deprecated = |
| + (deprecated_accelerators_.count(accelerator) != 0); |
| +#else |
| + // On non-chromeos, the NEXT_IME deprecated accelerators are always used. |
| + bool accelerator_is_deprecated = true; |
| +#endif // defined(OS_CHROMEOS) |
| + |
| + return CanHandleNextIme(ime_control_delegate_.get(), previous_accelerator, |
| + accelerator_is_deprecated); |
| + } |
| case PREVIOUS_IME: |
| return CanHandlePreviousIme(ime_control_delegate_.get()); |
| case SCALE_UI_RESET: |