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

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

Issue 11417144: Use rewriting to make ChromeOS keyboard F<number> keys produce extended keycodes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 1 month 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 759bc0c51b44ae4d45a4e8bf00334affa42fc1e3..03c1441f2b8e73dbd4d1578fe451f960a870c332 100644
--- a/chrome/browser/ui/ash/event_rewriter.cc
+++ b/chrome/browser/ui/ash/event_rewriter.cc
@@ -308,6 +308,18 @@ void EventRewriter::RefreshKeycodes() {
f10_xkeycode_ = XKeysymToKeycode(display, XK_F10);
f11_xkeycode_ = XKeysymToKeycode(display, XK_F11);
f12_xkeycode_ = XKeysymToKeycode(display, XK_F12);
+ browser_back_xkeycode_ = XKeysymToKeycode(display, XF86XK_Back);
+ browser_forward_xkeycode_ = XKeysymToKeycode(display, XF86XK_Forward);
+ browser_refresh_xkeycode_ = XKeysymToKeycode(display, XF86XK_Reload);
+ media_launch_app1_xkeycode_ = XKeysymToKeycode(display, XF86XK_LaunchA);
+ media_launch_app2_xkeycode_ = XKeysymToKeycode(display, XF86XK_LaunchB);
+ brightness_down_xkeycode_ =
+ XKeysymToKeycode(display, XF86XK_MonBrightnessDown);
+ brightness_up_xkeycode_ = XKeysymToKeycode(display, XF86XK_MonBrightnessUp);
+ volume_mute_xkeycode_ = XKeysymToKeycode(display, XF86XK_AudioMute);
+ volume_down_xkeycode_ = XKeysymToKeycode(display, XF86XK_AudioLowerVolume);
+ volume_up_xkeycode_ = XKeysymToKeycode(display, XF86XK_AudioRaiseVolume);
+ power_xkeycode_ = XKeysymToKeycode(display, XF86XK_PowerOff);
}
KeyCode EventRewriter::NativeKeySymToNativeKeycode(KeySym keysym) {
@@ -382,6 +394,7 @@ ash::EventRewriterDelegate::Action EventRewriter::Rewrite(ui::KeyEvent* event) {
RewriteModifiers(event);
RewriteNumPadKeys(event);
RewriteBackspaceAndArrowKeys(event);
+ RewriteFunctionKeys(event);
return ash::EventRewriterDelegate::ACTION_REWRITE_EVENT;
}
@@ -737,6 +750,183 @@ bool EventRewriter::RewriteBackspaceAndArrowKeys(ui::KeyEvent* event) {
return rewritten;
}
+bool EventRewriter::RewriteFunctionKeys(ui::KeyEvent* event) {
+#if defined(OS_CHROMEOS)
+ XEvent* xev = event->native_event();
+ XKeyEvent* xkey = &(xev->xkey);
+ const KeySym keysym = XLookupKeysym(xkey, 0);
+
+ KeyCode remapped_native_keycode = 0;
+ ui::KeyboardCode remapped_keycode = ui::VKEY_UNKNOWN;
+ unsigned int remapped_native_state = xkey->state;
+ int remapped_flags = event->flags();
+
+ // On a ChromeOS keyboard, F<number> keys have special purposes. On other
Yusuke Sato 2012/11/26 07:28:19 What's the expected behavior when Stumpy is used w
danakj 2012/11/26 17:50:38 Stumpy should not --has-chromeos-keyboard, so it s
Yusuke Sato 2012/11/26 19:00:00 Sorry: I thought that HasChromeOSKeyboard() was a
danakj 2012/11/26 19:07:17 Ok. I will had an EventSourceIsChromebookKeyboard(
+ // keyboards they should act as usual.
+ // TODO(danakj): Early out here when the event came from an external keyboard.
+ if (!HasChromeOSKeyboard())
+ return false;
+
+ // Rewrite the actual F1-F12 keys on a ChromeOS keyboard to special keys.
+ switch (keysym) {
+ case XK_F1:
+ // Remap F1 to BROWSER_BACK
+ remapped_native_keycode = browser_back_xkeycode_;
+ remapped_keycode = ui::VKEY_BROWSER_BACK;
+ break;
+ case XK_F2:
+ // Remap F2 to BROWSER_FORWARD
+ remapped_native_keycode = browser_forward_xkeycode_;
+ remapped_keycode = ui::VKEY_BROWSER_FORWARD;
+ break;
+ case XK_F3:
+ // Remap F3 to BROWSER_REFRESH
+ remapped_native_keycode = browser_refresh_xkeycode_;
+ remapped_keycode = ui::VKEY_BROWSER_REFRESH;
+ break;
+ case XK_F4:
+ // Remap F4 to MEDIA_LAUNCH_APP2
+ remapped_native_keycode = media_launch_app2_xkeycode_;
+ remapped_keycode = ui::VKEY_MEDIA_LAUNCH_APP2;
+ break;
+ case XK_F5:
+ // Remap F5 to MEDIA_LAUNCH_APP1
+ remapped_native_keycode = media_launch_app1_xkeycode_;
+ remapped_keycode = ui::VKEY_MEDIA_LAUNCH_APP1;
+ break;
+ case XK_F6:
+ // Remap F6 to BRIGHTNESS_DOWN
+ remapped_native_keycode = brightness_down_xkeycode_;
+ remapped_keycode = ui::VKEY_BRIGHTNESS_DOWN;
+ break;
+ case XK_F7:
+ // Remap F7 to BRIGHTNESS_UP
+ remapped_native_keycode = brightness_up_xkeycode_;
+ remapped_keycode = ui::VKEY_BRIGHTNESS_UP;
+ break;
+ case XK_F8:
+ // Remap F8 to VOLUME_MUTE
+ remapped_native_keycode = volume_mute_xkeycode_;
+ remapped_keycode = ui::VKEY_VOLUME_MUTE;
+ break;
+ case XK_F9:
+ // Remap F9 to VOLUME_DOWN
+ remapped_native_keycode = volume_down_xkeycode_;
+ remapped_keycode = ui::VKEY_VOLUME_DOWN;
+ break;
+ case XK_F10:
+ // Remap F10 to VOLUME_UP
+ remapped_native_keycode = volume_up_xkeycode_;
+ remapped_keycode = ui::VKEY_VOLUME_UP;
+ break;
+ case XK_F11:
+ // Remap F11 to POWER
+ remapped_native_keycode = power_xkeycode_;
+ remapped_keycode = ui::VKEY_POWER;
+ break;
+ default:
+ break;
+ }
+
+ const PrefService* pref_service =
+ pref_service_ ? pref_service_ : GetPrefService();
+
+ const bool search_as_function_key = pref_service &&
+ pref_service->GetBoolean(prefs::kLanguageSearchKeyActsAsFunctionKey);
+
+ // When using Search as a Function key, remap Search+<number> to F<number>.
+ if (search_as_function_key && xkey->state & Mod4Mask) {
+ switch (keysym) {
+ case XK_1:
Yusuke Sato 2012/11/26 07:28:19 This is very dirty, but probably we should check |
danakj 2012/11/26 21:08:38 Ok this sounds reasonable. If we check that keycod
+ // Remap Search+1 to F1.
+ remapped_native_keycode = f1_xkeycode_;
+ remapped_keycode = ui::VKEY_F1;
+ remapped_native_state &= ~Mod4Mask;
+ break;
+ case XK_2:
+ // Remap Search+2 to F2.
+ remapped_native_keycode = f2_xkeycode_;
+ remapped_keycode = ui::VKEY_F2;
+ remapped_native_state &= ~Mod4Mask;
+ break;
+ case XK_3:
+ // Remap Search+3 to F3.
+ remapped_native_keycode = f3_xkeycode_;
+ remapped_keycode = ui::VKEY_F3;
+ remapped_native_state &= ~Mod4Mask;
+ break;
+ case XK_4:
+ // Remap Search+4 to F4.
+ remapped_native_keycode = f4_xkeycode_;
+ remapped_keycode = ui::VKEY_F4;
+ remapped_native_state &= ~Mod4Mask;
+ break;
+ case XK_5:
+ // Remap Search+5 to F5.
+ remapped_native_keycode = f5_xkeycode_;
+ remapped_keycode = ui::VKEY_F5;
+ remapped_native_state &= ~Mod4Mask;
+ break;
+ case XK_6:
+ // Remap Search+6 to F6.
+ remapped_native_keycode = f6_xkeycode_;
+ remapped_keycode = ui::VKEY_F6;
+ remapped_native_state &= ~Mod4Mask;
+ break;
+ case XK_7:
+ // Remap Search+7 to F7.
+ remapped_native_keycode = f7_xkeycode_;
+ remapped_keycode = ui::VKEY_F7;
+ remapped_native_state &= ~Mod4Mask;
+ break;
+ case XK_8:
+ // Remap Search+8 to F8.
+ remapped_native_keycode = f8_xkeycode_;
+ remapped_keycode = ui::VKEY_F8;
+ remapped_native_state &= ~Mod4Mask;
+ break;
+ case XK_9:
+ // Remap Search+9 to F9.
+ remapped_native_keycode = f9_xkeycode_;
+ remapped_keycode = ui::VKEY_F9;
+ remapped_native_state &= ~Mod4Mask;
+ break;
+ case XK_0:
+ // Remap Search+0 to F10.
+ remapped_native_keycode = f10_xkeycode_;
+ remapped_keycode = ui::VKEY_F10;
+ remapped_native_state &= ~Mod4Mask;
+ break;
+ case XK_minus:
+ // Remap Search+- to F11.
+ remapped_native_keycode = f11_xkeycode_;
+ remapped_keycode = ui::VKEY_F11;
+ remapped_native_state &= ~Mod4Mask;
+ break;
+ case XK_equal:
+ // Remap Search+= to F12.
+ remapped_native_keycode = f12_xkeycode_;
+ remapped_keycode = ui::VKEY_F12;
+ remapped_native_state &= ~Mod4Mask;
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (!remapped_native_keycode || remapped_keycode == ui::VKEY_UNKNOWN)
+ return false;
+
+ OverwriteEvent(event, remapped_native_keycode, remapped_native_state,
+ remapped_keycode, remapped_flags);
+ return true;
+#else
+ // TODO(danakj): Support Ash on other platforms if needed.
+#endif
+
+ return false;
+}
+
#if defined(OS_CHROMEOS)
bool EventRewriter::DropSearchKey(ui::KeyEvent* event) {
const PrefService* pref_service =

Powered by Google App Engine
This is Rietveld 408576698