Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2097)

Unified Diff: chrome/browser/ui/ash/event_rewriter.cc

Issue 11314020: Allow Caps Lock to be remapped [part 1 of 2] (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: review Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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)

Powered by Google App Engine
This is Rietveld 408576698