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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/ash/event_rewriter.h" 5 #include "chrome/browser/ui/ash/event_rewriter.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "ash/shell.h" 9 #include "ash/shell.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after
301 f3_xkeycode_ = XKeysymToKeycode(display, XK_F3); 301 f3_xkeycode_ = XKeysymToKeycode(display, XK_F3);
302 f4_xkeycode_ = XKeysymToKeycode(display, XK_F4); 302 f4_xkeycode_ = XKeysymToKeycode(display, XK_F4);
303 f5_xkeycode_ = XKeysymToKeycode(display, XK_F5); 303 f5_xkeycode_ = XKeysymToKeycode(display, XK_F5);
304 f6_xkeycode_ = XKeysymToKeycode(display, XK_F6); 304 f6_xkeycode_ = XKeysymToKeycode(display, XK_F6);
305 f7_xkeycode_ = XKeysymToKeycode(display, XK_F7); 305 f7_xkeycode_ = XKeysymToKeycode(display, XK_F7);
306 f8_xkeycode_ = XKeysymToKeycode(display, XK_F8); 306 f8_xkeycode_ = XKeysymToKeycode(display, XK_F8);
307 f9_xkeycode_ = XKeysymToKeycode(display, XK_F9); 307 f9_xkeycode_ = XKeysymToKeycode(display, XK_F9);
308 f10_xkeycode_ = XKeysymToKeycode(display, XK_F10); 308 f10_xkeycode_ = XKeysymToKeycode(display, XK_F10);
309 f11_xkeycode_ = XKeysymToKeycode(display, XK_F11); 309 f11_xkeycode_ = XKeysymToKeycode(display, XK_F11);
310 f12_xkeycode_ = XKeysymToKeycode(display, XK_F12); 310 f12_xkeycode_ = XKeysymToKeycode(display, XK_F12);
311 browser_back_xkeycode_ = XKeysymToKeycode(display, XF86XK_Back);
312 browser_forward_xkeycode_ = XKeysymToKeycode(display, XF86XK_Forward);
313 browser_refresh_xkeycode_ = XKeysymToKeycode(display, XF86XK_Reload);
314 media_launch_app1_xkeycode_ = XKeysymToKeycode(display, XF86XK_LaunchA);
315 media_launch_app2_xkeycode_ = XKeysymToKeycode(display, XF86XK_LaunchB);
316 brightness_down_xkeycode_ =
317 XKeysymToKeycode(display, XF86XK_MonBrightnessDown);
318 brightness_up_xkeycode_ = XKeysymToKeycode(display, XF86XK_MonBrightnessUp);
319 volume_mute_xkeycode_ = XKeysymToKeycode(display, XF86XK_AudioMute);
320 volume_down_xkeycode_ = XKeysymToKeycode(display, XF86XK_AudioLowerVolume);
321 volume_up_xkeycode_ = XKeysymToKeycode(display, XF86XK_AudioRaiseVolume);
322 power_xkeycode_ = XKeysymToKeycode(display, XF86XK_PowerOff);
311 } 323 }
312 324
313 KeyCode EventRewriter::NativeKeySymToNativeKeycode(KeySym keysym) { 325 KeyCode EventRewriter::NativeKeySymToNativeKeycode(KeySym keysym) {
314 switch (keysym) { 326 switch (keysym) {
315 case XK_Control_L: 327 case XK_Control_L:
316 return control_l_xkeycode_; 328 return control_l_xkeycode_;
317 case XK_Control_R: 329 case XK_Control_R:
318 return control_r_xkeycode_; 330 return control_r_xkeycode_;
319 case XK_Alt_L: 331 case XK_Alt_L:
320 return alt_l_xkeycode_; 332 return alt_l_xkeycode_;
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
375 // crbug.com/136465. 387 // crbug.com/136465.
376 if (event->native_event()->xkey.send_event) 388 if (event->native_event()->xkey.send_event)
377 return ash::EventRewriterDelegate::ACTION_REWRITE_EVENT; 389 return ash::EventRewriterDelegate::ACTION_REWRITE_EVENT;
378 390
379 if (DropSearchKey(event)) 391 if (DropSearchKey(event))
380 return ash::EventRewriterDelegate::ACTION_DROP_EVENT; 392 return ash::EventRewriterDelegate::ACTION_DROP_EVENT;
381 #endif 393 #endif
382 RewriteModifiers(event); 394 RewriteModifiers(event);
383 RewriteNumPadKeys(event); 395 RewriteNumPadKeys(event);
384 RewriteBackspaceAndArrowKeys(event); 396 RewriteBackspaceAndArrowKeys(event);
397 RewriteFunctionKeys(event);
385 return ash::EventRewriterDelegate::ACTION_REWRITE_EVENT; 398 return ash::EventRewriterDelegate::ACTION_REWRITE_EVENT;
386 } 399 }
387 400
388 bool EventRewriter::IsAppleKeyboard() const { 401 bool EventRewriter::IsAppleKeyboard() const {
389 if (last_device_id_ == kBadDeviceId) 402 if (last_device_id_ == kBadDeviceId)
390 return false; 403 return false;
391 404
392 // Check which device generated |event|. 405 // Check which device generated |event|.
393 std::map<int, DeviceType>::const_iterator iter = 406 std::map<int, DeviceType>::const_iterator iter =
394 device_id_to_type_.find(last_device_id_); 407 device_id_to_type_.find(last_device_id_);
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after
730 OverwriteEvent(event, next_xkeycode_, xkey->state & ~Mod4Mask, 743 OverwriteEvent(event, next_xkeycode_, xkey->state & ~Mod4Mask,
731 ui::VKEY_NEXT, event->flags()); 744 ui::VKEY_NEXT, event->flags());
732 rewritten = true; 745 rewritten = true;
733 } 746 }
734 #else 747 #else
735 // TODO(yusukes): Support Ash on other platforms if needed. 748 // TODO(yusukes): Support Ash on other platforms if needed.
736 #endif 749 #endif
737 return rewritten; 750 return rewritten;
738 } 751 }
739 752
753 bool EventRewriter::RewriteFunctionKeys(ui::KeyEvent* event) {
754 #if defined(OS_CHROMEOS)
755 XEvent* xev = event->native_event();
756 XKeyEvent* xkey = &(xev->xkey);
757 const KeySym keysym = XLookupKeysym(xkey, 0);
758
759 KeyCode remapped_native_keycode = 0;
760 ui::KeyboardCode remapped_keycode = ui::VKEY_UNKNOWN;
761 unsigned int remapped_native_state = xkey->state;
762 int remapped_flags = event->flags();
763
764 // 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(
765 // keyboards they should act as usual.
766 // TODO(danakj): Early out here when the event came from an external keyboard.
767 if (!HasChromeOSKeyboard())
768 return false;
769
770 // Rewrite the actual F1-F12 keys on a ChromeOS keyboard to special keys.
771 switch (keysym) {
772 case XK_F1:
773 // Remap F1 to BROWSER_BACK
774 remapped_native_keycode = browser_back_xkeycode_;
775 remapped_keycode = ui::VKEY_BROWSER_BACK;
776 break;
777 case XK_F2:
778 // Remap F2 to BROWSER_FORWARD
779 remapped_native_keycode = browser_forward_xkeycode_;
780 remapped_keycode = ui::VKEY_BROWSER_FORWARD;
781 break;
782 case XK_F3:
783 // Remap F3 to BROWSER_REFRESH
784 remapped_native_keycode = browser_refresh_xkeycode_;
785 remapped_keycode = ui::VKEY_BROWSER_REFRESH;
786 break;
787 case XK_F4:
788 // Remap F4 to MEDIA_LAUNCH_APP2
789 remapped_native_keycode = media_launch_app2_xkeycode_;
790 remapped_keycode = ui::VKEY_MEDIA_LAUNCH_APP2;
791 break;
792 case XK_F5:
793 // Remap F5 to MEDIA_LAUNCH_APP1
794 remapped_native_keycode = media_launch_app1_xkeycode_;
795 remapped_keycode = ui::VKEY_MEDIA_LAUNCH_APP1;
796 break;
797 case XK_F6:
798 // Remap F6 to BRIGHTNESS_DOWN
799 remapped_native_keycode = brightness_down_xkeycode_;
800 remapped_keycode = ui::VKEY_BRIGHTNESS_DOWN;
801 break;
802 case XK_F7:
803 // Remap F7 to BRIGHTNESS_UP
804 remapped_native_keycode = brightness_up_xkeycode_;
805 remapped_keycode = ui::VKEY_BRIGHTNESS_UP;
806 break;
807 case XK_F8:
808 // Remap F8 to VOLUME_MUTE
809 remapped_native_keycode = volume_mute_xkeycode_;
810 remapped_keycode = ui::VKEY_VOLUME_MUTE;
811 break;
812 case XK_F9:
813 // Remap F9 to VOLUME_DOWN
814 remapped_native_keycode = volume_down_xkeycode_;
815 remapped_keycode = ui::VKEY_VOLUME_DOWN;
816 break;
817 case XK_F10:
818 // Remap F10 to VOLUME_UP
819 remapped_native_keycode = volume_up_xkeycode_;
820 remapped_keycode = ui::VKEY_VOLUME_UP;
821 break;
822 case XK_F11:
823 // Remap F11 to POWER
824 remapped_native_keycode = power_xkeycode_;
825 remapped_keycode = ui::VKEY_POWER;
826 break;
827 default:
828 break;
829 }
830
831 const PrefService* pref_service =
832 pref_service_ ? pref_service_ : GetPrefService();
833
834 const bool search_as_function_key = pref_service &&
835 pref_service->GetBoolean(prefs::kLanguageSearchKeyActsAsFunctionKey);
836
837 // When using Search as a Function key, remap Search+<number> to F<number>.
838 if (search_as_function_key && xkey->state & Mod4Mask) {
839 switch (keysym) {
840 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
841 // Remap Search+1 to F1.
842 remapped_native_keycode = f1_xkeycode_;
843 remapped_keycode = ui::VKEY_F1;
844 remapped_native_state &= ~Mod4Mask;
845 break;
846 case XK_2:
847 // Remap Search+2 to F2.
848 remapped_native_keycode = f2_xkeycode_;
849 remapped_keycode = ui::VKEY_F2;
850 remapped_native_state &= ~Mod4Mask;
851 break;
852 case XK_3:
853 // Remap Search+3 to F3.
854 remapped_native_keycode = f3_xkeycode_;
855 remapped_keycode = ui::VKEY_F3;
856 remapped_native_state &= ~Mod4Mask;
857 break;
858 case XK_4:
859 // Remap Search+4 to F4.
860 remapped_native_keycode = f4_xkeycode_;
861 remapped_keycode = ui::VKEY_F4;
862 remapped_native_state &= ~Mod4Mask;
863 break;
864 case XK_5:
865 // Remap Search+5 to F5.
866 remapped_native_keycode = f5_xkeycode_;
867 remapped_keycode = ui::VKEY_F5;
868 remapped_native_state &= ~Mod4Mask;
869 break;
870 case XK_6:
871 // Remap Search+6 to F6.
872 remapped_native_keycode = f6_xkeycode_;
873 remapped_keycode = ui::VKEY_F6;
874 remapped_native_state &= ~Mod4Mask;
875 break;
876 case XK_7:
877 // Remap Search+7 to F7.
878 remapped_native_keycode = f7_xkeycode_;
879 remapped_keycode = ui::VKEY_F7;
880 remapped_native_state &= ~Mod4Mask;
881 break;
882 case XK_8:
883 // Remap Search+8 to F8.
884 remapped_native_keycode = f8_xkeycode_;
885 remapped_keycode = ui::VKEY_F8;
886 remapped_native_state &= ~Mod4Mask;
887 break;
888 case XK_9:
889 // Remap Search+9 to F9.
890 remapped_native_keycode = f9_xkeycode_;
891 remapped_keycode = ui::VKEY_F9;
892 remapped_native_state &= ~Mod4Mask;
893 break;
894 case XK_0:
895 // Remap Search+0 to F10.
896 remapped_native_keycode = f10_xkeycode_;
897 remapped_keycode = ui::VKEY_F10;
898 remapped_native_state &= ~Mod4Mask;
899 break;
900 case XK_minus:
901 // Remap Search+- to F11.
902 remapped_native_keycode = f11_xkeycode_;
903 remapped_keycode = ui::VKEY_F11;
904 remapped_native_state &= ~Mod4Mask;
905 break;
906 case XK_equal:
907 // Remap Search+= to F12.
908 remapped_native_keycode = f12_xkeycode_;
909 remapped_keycode = ui::VKEY_F12;
910 remapped_native_state &= ~Mod4Mask;
911 break;
912 default:
913 break;
914 }
915 }
916
917 if (!remapped_native_keycode || remapped_keycode == ui::VKEY_UNKNOWN)
918 return false;
919
920 OverwriteEvent(event, remapped_native_keycode, remapped_native_state,
921 remapped_keycode, remapped_flags);
922 return true;
923 #else
924 // TODO(danakj): Support Ash on other platforms if needed.
925 #endif
926
927 return false;
928 }
929
740 #if defined(OS_CHROMEOS) 930 #if defined(OS_CHROMEOS)
741 bool EventRewriter::DropSearchKey(ui::KeyEvent* event) { 931 bool EventRewriter::DropSearchKey(ui::KeyEvent* event) {
742 const PrefService* pref_service = 932 const PrefService* pref_service =
743 pref_service_ ? pref_service_ : GetPrefService(); 933 pref_service_ ? pref_service_ : GetPrefService();
744 if (!pref_service) 934 if (!pref_service)
745 return false; 935 return false;
746 const bool search_as_function_key = 936 const bool search_as_function_key =
747 pref_service->GetBoolean(prefs::kLanguageSearchKeyActsAsFunctionKey); 937 pref_service->GetBoolean(prefs::kLanguageSearchKeyActsAsFunctionKey);
748 938
749 if (!search_as_function_key) 939 if (!search_as_function_key)
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
846 const DeviceType type = EventRewriter::GetDeviceType(device_name); 1036 const DeviceType type = EventRewriter::GetDeviceType(device_name);
847 if (type == kDeviceAppleKeyboard) { 1037 if (type == kDeviceAppleKeyboard) {
848 VLOG(1) << "Apple keyboard '" << device_name << "' connected: " 1038 VLOG(1) << "Apple keyboard '" << device_name << "' connected: "
849 << "id=" << device_id; 1039 << "id=" << device_id;
850 } 1040 }
851 // Always overwrite the existing device_id since the X server may reuse a 1041 // Always overwrite the existing device_id since the X server may reuse a
852 // device id for an unattached device. 1042 // device id for an unattached device.
853 device_id_to_type_[device_id] = type; 1043 device_id_to_type_[device_id] = type;
854 return type; 1044 return type;
855 } 1045 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698