| Index: chrome/browser/ui/ash/event_rewriter.cc
|
| diff --git a/chrome/browser/ui/ash/event_rewriter.cc b/chrome/browser/ui/ash/event_rewriter.cc
|
| index 2919599f7464f631bba2c3a672a16d40927269ad..b836f1a543ab037778e3c406e1047e9827ad107a 100644
|
| --- a/chrome/browser/ui/ash/event_rewriter.cc
|
| +++ b/chrome/browser/ui/ash/event_rewriter.cc
|
| @@ -18,6 +18,7 @@
|
| #if defined(OS_CHROMEOS)
|
| #include <X11/extensions/XInput2.h>
|
| #include <X11/keysym.h>
|
| +#include <X11/XF86keysym.h>
|
| #include <X11/Xlib.h>
|
|
|
| // Get rid of a macro from Xlib.h that conflicts with OwnershipService class.
|
| @@ -73,6 +74,9 @@ const struct ModifierFlagToPrefName {
|
| int flag;
|
| const char* pref_name;
|
| } kModifierFlagToPrefName[] = {
|
| + // TODO(yusukes): When the device has a Chrome keyboard (i.e. the one without
|
| + // Caps Lock), we should not check kLanguageRemapCapsLockKeyTo.
|
| + { Mod3Mask, 0, prefs::kLanguageRemapCapsLockKeyTo },
|
| { Mod4Mask, 0, prefs::kLanguageRemapSearchKeyTo },
|
| { ControlMask, ui::EF_CONTROL_DOWN, prefs::kLanguageRemapControlKeyTo },
|
| { Mod1Mask, ui::EF_ALT_DOWN, prefs::kLanguageRemapAltKeyTo },
|
| @@ -107,6 +111,15 @@ bool IsRight(KeySym native_keysym) {
|
| }
|
| return false;
|
| }
|
| +
|
| +bool ShouldRemapCapsLock() {
|
| + // Since both German Neo2 XKB layout and Caps Lock depend on Mod3Mask, it's
|
| + // not possible to make both features work. For now, we don't remap Mod3Mask
|
| + // when Neo2 is in use.
|
| + // TODO(yusukes): Remove the restriction.
|
| + return InputMethodManager::GetInstance()->GetCurrentInputMethod().id() !=
|
| + kNeo2LayoutId;
|
| +}
|
| #endif
|
|
|
| const PrefService* GetPrefService() {
|
| @@ -342,9 +355,6 @@ void EventRewriter::Rewrite(ui::KeyEvent* event) {
|
| return;
|
| #endif
|
| RewriteModifiers(event);
|
| - // This should be called after RewriteModifiers(). Otherwise, remapped
|
| - // Mod3Mask might be re-remapped.
|
| - RewriteFnKey(event);
|
| RewriteNumPadKeys(event);
|
| RewriteBackspaceAndArrowKeys(event);
|
| // TODO(yusukes): Implement crosbug.com/27167 (allow sending function keys).
|
| @@ -384,7 +394,12 @@ void EventRewriter::GetRemappedModifierMasks(
|
| if (!pref_service)
|
| return;
|
|
|
| + const bool skip_mod3 = !ShouldRemapCapsLock();
|
| for (size_t i = 0; i < arraysize(kModifierFlagToPrefName); ++i) {
|
| + if (skip_mod3 &&
|
| + (kModifierFlagToPrefName[i].native_modifier == Mod3Mask)) {
|
| + continue;
|
| + }
|
| if (original_native_modifiers &
|
| kModifierFlagToPrefName[i].native_modifier) {
|
| const ModifierRemapping* remapped_key =
|
| @@ -408,8 +423,12 @@ void EventRewriter::GetRemappedModifierMasks(
|
| *remapped_flags =
|
| (original_flags & ~(ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN)) |
|
| *remapped_flags;
|
| +
|
| + unsigned int native_mask = Mod4Mask | ControlMask | Mod1Mask;
|
| + if (!skip_mod3)
|
| + native_mask |= Mod3Mask;
|
| *remapped_native_modifiers =
|
| - (original_native_modifiers & ~(Mod4Mask | ControlMask | Mod1Mask)) |
|
| + (original_native_modifiers & ~native_mask) |
|
| *remapped_native_modifiers;
|
| #endif
|
| }
|
| @@ -443,9 +462,15 @@ bool EventRewriter::RewriteModifiers(ui::KeyEvent* event) {
|
| ui::KeyboardCode remapped_keycode = event->key_code();
|
| KeyCode remapped_native_keycode = xkey->keycode;
|
|
|
| + const bool skip_mod3 = !ShouldRemapCapsLock();
|
| +
|
| // First, remap |keysym|.
|
| const char* pref_name = NULL;
|
| switch (keysym) {
|
| + // XF86XK_Launch7 (F16) with Mod3Mask is sent when Caps Lock is pressed.
|
| + case XF86XK_Launch7:
|
| + pref_name = skip_mod3 ? NULL : prefs::kLanguageRemapCapsLockKeyTo;
|
| + break;
|
| case XK_Super_L:
|
| case XK_Super_R:
|
| pref_name = prefs::kLanguageRemapSearchKeyTo;
|
| @@ -505,41 +530,6 @@ bool EventRewriter::RewriteModifiers(ui::KeyEvent* event) {
|
| #endif
|
| }
|
|
|
| -bool EventRewriter::RewriteFnKey(ui::KeyEvent* event) {
|
| -#if defined(OS_CHROMEOS)
|
| - // Since both German Neo2 XKB layout and F15 depend on Mod3Mask, it's not
|
| - // possible to make both features work. For now, we don't remap Mod3Mask to
|
| - // ControlMask when Neo2 is in use.
|
| - // TODO(yusukes): Remove the restriction.
|
| - if (InputMethodManager::GetInstance()->GetCurrentInputMethod().id() ==
|
| - kNeo2LayoutId) {
|
| - return false;
|
| - }
|
| -
|
| - XEvent* xev = event->native_event();
|
| - XKeyEvent* xkey = &(xev->xkey);
|
| -
|
| - int remapped_flags = event->flags();
|
| - unsigned int remapped_native_modifiers = xkey->state;
|
| -
|
| - // TODO(yusukes): Add a pref entry for specifying how to remap Fn key, and
|
| - // check it here if not in guest mode.
|
| - if (xkey->state & Mod3Mask) {
|
| - remapped_flags |= ui::EF_CONTROL_DOWN;
|
| - remapped_native_modifiers =
|
| - (remapped_native_modifiers & ~Mod3Mask) | ControlMask;
|
| - }
|
| -
|
| - OverwriteEvent(event,
|
| - xkey->keycode, remapped_native_modifiers,
|
| - event->key_code(), remapped_flags);
|
| - return true;
|
| -#else
|
| - // TODO(yusukes): Support Ash on other platforms if needed.
|
| - return false;
|
| -#endif
|
| -}
|
| -
|
| bool EventRewriter::RewriteNumPadKeys(ui::KeyEvent* event) {
|
| bool rewritten = false;
|
| #if defined(OS_CHROMEOS)
|
|
|