diff options
-rw-r--r-- | ash/accelerators/accelerator_controller.cc | 4 | ||||
-rw-r--r-- | ash/accelerators/accelerator_controller_unittest.cc | 4 | ||||
-rw-r--r-- | ash/accelerators/accelerator_table.cc | 16 | ||||
-rw-r--r-- | ash/ime_control_delegate.h | 5 | ||||
-rw-r--r-- | chrome/browser/ui/views/ash/ime_controller_chromeos.cc | 29 | ||||
-rw-r--r-- | chrome/browser/ui/views/ash/ime_controller_chromeos.h | 4 |
6 files changed, 46 insertions, 16 deletions
diff --git a/ash/accelerators/accelerator_controller.cc b/ash/accelerators/accelerator_controller.cc index 3cd9db2..6434a5f 100644 --- a/ash/accelerators/accelerator_controller.cc +++ b/ash/accelerators/accelerator_controller.cc @@ -242,6 +242,10 @@ void AcceleratorController::UnregisterAll(ui::AcceleratorTarget* target) { } bool AcceleratorController::Process(const ui::Accelerator& accelerator) { + if (ime_control_delegate_.get()) { + return accelerator_manager_->Process( + ime_control_delegate_->RemapAccelerator(accelerator)); + } return accelerator_manager_->Process(accelerator); } diff --git a/ash/accelerators/accelerator_controller_unittest.cc b/ash/accelerators/accelerator_controller_unittest.cc index 510e250..71eef58 100644 --- a/ash/accelerators/accelerator_controller_unittest.cc +++ b/ash/accelerators/accelerator_controller_unittest.cc @@ -249,6 +249,10 @@ class DummyImeControlDelegate : public ImeControlDelegate { const ui::Accelerator& last_accelerator() const { return last_accelerator_; } + ui::Accelerator RemapAccelerator( + const ui::Accelerator& accelerator) { + return ui::Accelerator(accelerator); + } private: const bool consume_; diff --git a/ash/accelerators/accelerator_table.cc b/ash/accelerators/accelerator_table.cc index dd64375..bbe3229 100644 --- a/ash/accelerators/accelerator_table.cc +++ b/ash/accelerators/accelerator_table.cc @@ -84,22 +84,6 @@ const AcceleratorData kAcceleratorData[] = { { true, ui::VKEY_8, ui::EF_ALT_DOWN, SELECT_WIN_7 }, { true, ui::VKEY_9, ui::EF_ALT_DOWN, SELECT_LAST_WIN }, - // We need the number keys with and without shift since the French keyboard - // does not have explicit number keys. Instead they have to press - // 'Shift' + .. to access the keys. If we ever have an overlap of - // functionality, we should think about either assembling this table - // dynamically - or by decoding the keys properly (which is of course in - // conflict with other keyboards since the Shift+ is missing then). - { true, ui::VKEY_1, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, SELECT_WIN_0 }, - { true, ui::VKEY_2, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, SELECT_WIN_1 }, - { true, ui::VKEY_3, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, SELECT_WIN_2 }, - { true, ui::VKEY_4, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, SELECT_WIN_3 }, - { true, ui::VKEY_5, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, SELECT_WIN_4 }, - { true, ui::VKEY_6, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, SELECT_WIN_5 }, - { true, ui::VKEY_7, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, SELECT_WIN_6 }, - { true, ui::VKEY_8, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, SELECT_WIN_7 }, - { true, ui::VKEY_9, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, SELECT_LAST_WIN }, - // Window management shortcuts. { true, ui::VKEY_OEM_4, ui::EF_ALT_DOWN, WINDOW_SNAP_LEFT }, { true, ui::VKEY_OEM_6, ui::EF_ALT_DOWN, WINDOW_SNAP_RIGHT }, diff --git a/ash/ime_control_delegate.h b/ash/ime_control_delegate.h index 5d6e538..f52ef50 100644 --- a/ash/ime_control_delegate.h +++ b/ash/ime_control_delegate.h @@ -21,6 +21,11 @@ class ImeControlDelegate { virtual bool HandlePreviousIme() = 0; // Switches to another IME depending on the |accelerator|. virtual bool HandleSwitchIme(const ui::Accelerator& accelerator) = 0; + + // Checks for special language anomalies and re-map the |accelerator| + // accordingly. + virtual ui::Accelerator RemapAccelerator( + const ui::Accelerator& accelerator) = 0; }; } // namespace ash diff --git a/chrome/browser/ui/views/ash/ime_controller_chromeos.cc b/chrome/browser/ui/views/ash/ime_controller_chromeos.cc index 1934357..98ac9a2 100644 --- a/chrome/browser/ui/views/ash/ime_controller_chromeos.cc +++ b/chrome/browser/ui/views/ash/ime_controller_chromeos.cc @@ -5,6 +5,7 @@ #include "chrome/browser/ui/views/ash/ime_controller_chromeos.h" #include "chrome/browser/chromeos/input_method/input_method_manager.h" +#include "ui/base/accelerators/accelerator.h" bool ImeController::HandleNextIme() { chromeos::input_method::InputMethodManager* manager = @@ -23,3 +24,31 @@ bool ImeController::HandleSwitchIme(const ui::Accelerator& accelerator) { chromeos::input_method::InputMethodManager::GetInstance(); return manager->SwitchInputMethod(accelerator); } + +ui::Accelerator ImeController::RemapAccelerator( + const ui::Accelerator& accelerator) { + ui::KeyboardCode key = accelerator.key_code(); + int modifiers = accelerator.modifiers(); + // On French keyboards the user needs to press a number key in conjunction + // with the shift key. To get the right accelerator from our static table + // we modify the received accelerator to match this. + if (key >= ui::VKEY_0 && key <= ui::VKEY_9) { + // A keyboard layout can get changed by the user, so we perform quickly + // this cheap layout test. + // See http://crbug.com/129017 for more details. + if (UsingFrenchInputMethod()) { + // We toggle the shift key to get the correct accelerator from our table. + modifiers ^= ui::EF_SHIFT_DOWN; + } + } + return ui::Accelerator(key, modifiers); +} + +bool ImeController::UsingFrenchInputMethod() const { + chromeos::input_method::InputMethodManager* manager = + chromeos::input_method::InputMethodManager::GetInstance(); + const chromeos::input_method::InputMethodDescriptor& descriptor = + manager->GetCurrentInputMethod(); + const std::string& layout = descriptor.id(); + return (layout == "xkb:fr::fra" || layout == "xkb:be::fra"); +} diff --git a/chrome/browser/ui/views/ash/ime_controller_chromeos.h b/chrome/browser/ui/views/ash/ime_controller_chromeos.h index 9cc5c82..f66c86f 100644 --- a/chrome/browser/ui/views/ash/ime_controller_chromeos.h +++ b/chrome/browser/ui/views/ash/ime_controller_chromeos.h @@ -21,8 +21,12 @@ class ImeController : public ash::ImeControlDelegate { virtual bool HandleNextIme() OVERRIDE; virtual bool HandlePreviousIme() OVERRIDE; virtual bool HandleSwitchIme(const ui::Accelerator& accelerator) OVERRIDE; + virtual ui::Accelerator RemapAccelerator( + const ui::Accelerator& accelerator) OVERRIDE; private: + bool UsingFrenchInputMethod() const; + DISALLOW_COPY_AND_ASSIGN(ImeController); }; |