summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ash/accelerators/accelerator_controller.cc4
-rw-r--r--ash/accelerators/accelerator_controller_unittest.cc4
-rw-r--r--ash/accelerators/accelerator_table.cc16
-rw-r--r--ash/ime_control_delegate.h5
-rw-r--r--chrome/browser/ui/views/ash/ime_controller_chromeos.cc29
-rw-r--r--chrome/browser/ui/views/ash/ime_controller_chromeos.h4
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);
};