OLD | NEW |
---|---|
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 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
114 break; | 114 break; |
115 } | 115 } |
116 return false; | 116 return false; |
117 } | 117 } |
118 | 118 |
119 bool HasChromeOSKeyboard() { | 119 bool HasChromeOSKeyboard() { |
120 return CommandLine::ForCurrentProcess()->HasSwitch( | 120 return CommandLine::ForCurrentProcess()->HasSwitch( |
121 switches::kHasChromeOSKeyboard); | 121 switches::kHasChromeOSKeyboard); |
122 } | 122 } |
123 | 123 |
124 bool EventSourceIsChromebookKeyboard(ui::KeyEvent* /* event */) { | |
125 // TODO(danakj): Determine if the event came from a Chromebook internal | |
126 // keyboard. | |
127 return true; | |
128 } | |
129 | |
130 bool IsMod3UsedByCurrentInputMethod() { | 124 bool IsMod3UsedByCurrentInputMethod() { |
131 // Since both German Neo2 XKB layout and Caps Lock depend on Mod3Mask, | 125 // Since both German Neo2 XKB layout and Caps Lock depend on Mod3Mask, |
132 // it's not possible to make both features work. For now, we don't remap | 126 // it's not possible to make both features work. For now, we don't remap |
133 // Mod3Mask when Neo2 is in use. | 127 // Mod3Mask when Neo2 is in use. |
134 // TODO(yusukes): Remove the restriction. | 128 // TODO(yusukes): Remove the restriction. |
135 return InputMethodManager::GetInstance()->GetCurrentInputMethod().id() == | 129 return InputMethodManager::GetInstance()->GetCurrentInputMethod().id() == |
136 kNeo2LayoutId; | 130 kNeo2LayoutId; |
137 } | 131 } |
138 #endif | 132 #endif |
139 | 133 |
140 const PrefService* GetPrefService() { | 134 const PrefService* GetPrefService() { |
141 Profile* profile = ProfileManager::GetDefaultProfile(); | 135 Profile* profile = ProfileManager::GetDefaultProfile(); |
142 if (profile) | 136 if (profile) |
143 return profile->GetPrefs(); | 137 return profile->GetPrefs(); |
144 return NULL; | 138 return NULL; |
145 } | 139 } |
146 | 140 |
147 } // namespace | 141 } // namespace |
148 | 142 |
149 EventRewriter::EventRewriter() | 143 EventRewriter::EventRewriter() |
150 : last_device_id_(kBadDeviceId), | 144 : last_device_id_(kBadDeviceId), |
151 #if defined(OS_CHROMEOS) | 145 #if defined(OS_CHROMEOS) |
146 force_external_keyboard_for_testing_(false), | |
152 xkeyboard_(NULL), | 147 xkeyboard_(NULL), |
153 #endif | 148 #endif |
154 pref_service_(NULL) { | 149 pref_service_(NULL) { |
155 // The ash shell isn't instantiated for our unit tests. | 150 // The ash shell isn't instantiated for our unit tests. |
156 if (ash::Shell::HasInstance()) | 151 if (ash::Shell::HasInstance()) |
157 ash::Shell::GetPrimaryRootWindow()->AddRootWindowObserver(this); | 152 ash::Shell::GetPrimaryRootWindow()->AddRootWindowObserver(this); |
158 #if defined(OS_CHROMEOS) | 153 #if defined(OS_CHROMEOS) |
159 if (base::chromeos::IsRunningOnChromeOS()) { | 154 if (base::chromeos::IsRunningOnChromeOS()) { |
160 chromeos::XInputHierarchyChangedEventListener::GetInstance() | 155 chromeos::XInputHierarchyChangedEventListener::GetInstance() |
161 ->AddObserver(this); | 156 ->AddObserver(this); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
193 bool found_keyboard = false; | 188 bool found_keyboard = false; |
194 for (size_t i = 0; i < tokens.size(); ++i) { | 189 for (size_t i = 0; i < tokens.size(); ++i) { |
195 if (!found_apple && LowerCaseEqualsASCII(tokens[i], "apple")) | 190 if (!found_apple && LowerCaseEqualsASCII(tokens[i], "apple")) |
196 found_apple = true; | 191 found_apple = true; |
197 if (!found_keyboard && LowerCaseEqualsASCII(tokens[i], "keyboard")) | 192 if (!found_keyboard && LowerCaseEqualsASCII(tokens[i], "keyboard")) |
198 found_keyboard = true; | 193 found_keyboard = true; |
199 if (found_apple && found_keyboard) | 194 if (found_apple && found_keyboard) |
200 return kDeviceAppleKeyboard; | 195 return kDeviceAppleKeyboard; |
201 } | 196 } |
202 | 197 |
198 // TODO(danakj): This could also impact laptops other than Chromebooks, and | |
199 // might belong behind a command-line flag to be used only on Chromebooks. | |
200 if (LowerCaseEqualsASCII(device_name, "at translated set 2 keyboard")) | |
Yusuke Sato
2012/11/28 20:39:17
can you also support Chrome USB keyboard for Stump
| |
201 return kDeviceChromebookKeyboard; | |
202 | |
203 return kDeviceUnknown; | 203 return kDeviceUnknown; |
204 } | 204 } |
205 | 205 |
206 void EventRewriter::RewriteForTesting(ui::KeyEvent* event) { | 206 void EventRewriter::RewriteForTesting(ui::KeyEvent* event) { |
207 Rewrite(event); | 207 Rewrite(event); |
208 } | 208 } |
209 | 209 |
210 ash::EventRewriterDelegate::Action EventRewriter::RewriteOrFilterKeyEvent( | 210 ash::EventRewriterDelegate::Action EventRewriter::RewriteOrFilterKeyEvent( |
211 ui::KeyEvent* event) { | 211 ui::KeyEvent* event) { |
212 if (event->HasNativeEvent()) | 212 if (event->HasNativeEvent()) |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
294 kp_1_xkeycode_ = XKeysymToKeycode(display, XK_KP_1); | 294 kp_1_xkeycode_ = XKeysymToKeycode(display, XK_KP_1); |
295 kp_2_xkeycode_ = XKeysymToKeycode(display, XK_KP_2); | 295 kp_2_xkeycode_ = XKeysymToKeycode(display, XK_KP_2); |
296 kp_3_xkeycode_ = XKeysymToKeycode(display, XK_KP_3); | 296 kp_3_xkeycode_ = XKeysymToKeycode(display, XK_KP_3); |
297 kp_4_xkeycode_ = XKeysymToKeycode(display, XK_KP_4); | 297 kp_4_xkeycode_ = XKeysymToKeycode(display, XK_KP_4); |
298 kp_5_xkeycode_ = XKeysymToKeycode(display, XK_KP_5); | 298 kp_5_xkeycode_ = XKeysymToKeycode(display, XK_KP_5); |
299 kp_6_xkeycode_ = XKeysymToKeycode(display, XK_KP_6); | 299 kp_6_xkeycode_ = XKeysymToKeycode(display, XK_KP_6); |
300 kp_7_xkeycode_ = XKeysymToKeycode(display, XK_KP_7); | 300 kp_7_xkeycode_ = XKeysymToKeycode(display, XK_KP_7); |
301 kp_8_xkeycode_ = XKeysymToKeycode(display, XK_KP_8); | 301 kp_8_xkeycode_ = XKeysymToKeycode(display, XK_KP_8); |
302 kp_9_xkeycode_ = XKeysymToKeycode(display, XK_KP_9); | 302 kp_9_xkeycode_ = XKeysymToKeycode(display, XK_KP_9); |
303 kp_decimal_xkeycode_ = XKeysymToKeycode(display, XK_KP_Decimal); | 303 kp_decimal_xkeycode_ = XKeysymToKeycode(display, XK_KP_Decimal); |
304 f1_xkeycode_ = XKeysymToKeycode(display, XK_F1); | |
305 f2_xkeycode_ = XKeysymToKeycode(display, XK_F2); | |
306 f3_xkeycode_ = XKeysymToKeycode(display, XK_F3); | |
307 f4_xkeycode_ = XKeysymToKeycode(display, XK_F4); | |
308 f5_xkeycode_ = XKeysymToKeycode(display, XK_F5); | |
309 f6_xkeycode_ = XKeysymToKeycode(display, XK_F6); | |
310 f7_xkeycode_ = XKeysymToKeycode(display, XK_F7); | |
311 f8_xkeycode_ = XKeysymToKeycode(display, XK_F8); | |
312 f9_xkeycode_ = XKeysymToKeycode(display, XK_F9); | |
313 f10_xkeycode_ = XKeysymToKeycode(display, XK_F10); | |
314 f11_xkeycode_ = XKeysymToKeycode(display, XK_F11); | |
315 f12_xkeycode_ = XKeysymToKeycode(display, XK_F12); | |
316 number1_xkeycode_ = XKeysymToKeycode(display, XK_1); | |
317 number2_xkeycode_ = XKeysymToKeycode(display, XK_2); | |
318 number3_xkeycode_ = XKeysymToKeycode(display, XK_3); | |
319 number4_xkeycode_ = XKeysymToKeycode(display, XK_4); | |
320 number5_xkeycode_ = XKeysymToKeycode(display, XK_5); | |
321 number6_xkeycode_ = XKeysymToKeycode(display, XK_6); | |
322 number7_xkeycode_ = XKeysymToKeycode(display, XK_7); | |
323 number8_xkeycode_ = XKeysymToKeycode(display, XK_8); | |
324 number9_xkeycode_ = XKeysymToKeycode(display, XK_9); | |
325 number0_xkeycode_ = XKeysymToKeycode(display, XK_0); | |
326 minus_xkeycode_ = XKeysymToKeycode(display, XK_minus); | |
327 equal_xkeycode_ = XKeysymToKeycode(display, XK_equal); | |
328 browser_back_xkeycode_ = XKeysymToKeycode(display, XF86XK_Back); | |
329 browser_forward_xkeycode_ = XKeysymToKeycode(display, XF86XK_Forward); | |
330 browser_refresh_xkeycode_ = XKeysymToKeycode(display, XF86XK_Reload); | |
331 media_launch_app1_xkeycode_ = XKeysymToKeycode(display, XF86XK_LaunchA); | |
332 media_launch_app2_xkeycode_ = XKeysymToKeycode(display, XF86XK_LaunchB); | |
333 brightness_down_xkeycode_ = | |
334 XKeysymToKeycode(display, XF86XK_MonBrightnessDown); | |
335 brightness_up_xkeycode_ = XKeysymToKeycode(display, XF86XK_MonBrightnessUp); | |
336 volume_mute_xkeycode_ = XKeysymToKeycode(display, XF86XK_AudioMute); | |
337 volume_down_xkeycode_ = XKeysymToKeycode(display, XF86XK_AudioLowerVolume); | |
338 volume_up_xkeycode_ = XKeysymToKeycode(display, XF86XK_AudioRaiseVolume); | |
339 power_xkeycode_ = XKeysymToKeycode(display, XF86XK_PowerOff); | |
304 } | 340 } |
305 | 341 |
306 KeyCode EventRewriter::NativeKeySymToNativeKeycode(KeySym keysym) { | 342 KeyCode EventRewriter::NativeKeySymToNativeKeycode(KeySym keysym) { |
307 switch (keysym) { | 343 switch (keysym) { |
308 case XK_Control_L: | 344 case XK_Control_L: |
309 return control_l_xkeycode_; | 345 return control_l_xkeycode_; |
310 case XK_Control_R: | 346 case XK_Control_R: |
311 return control_r_xkeycode_; | 347 return control_r_xkeycode_; |
312 case XK_Alt_L: | 348 case XK_Alt_L: |
313 return alt_l_xkeycode_; | 349 return alt_l_xkeycode_; |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
353 return kp_8_xkeycode_; | 389 return kp_8_xkeycode_; |
354 case XK_KP_9: | 390 case XK_KP_9: |
355 return kp_9_xkeycode_; | 391 return kp_9_xkeycode_; |
356 case XK_KP_Decimal: | 392 case XK_KP_Decimal: |
357 return kp_decimal_xkeycode_; | 393 return kp_decimal_xkeycode_; |
358 default: | 394 default: |
359 break; | 395 break; |
360 } | 396 } |
361 return 0U; | 397 return 0U; |
362 } | 398 } |
399 | |
400 bool EventRewriter::EventSourceIsChromebookKeyboard(ui::KeyEvent* /* event */) { | |
401 if (force_external_keyboard_for_testing_) | |
402 return false; | |
403 | |
404 if (last_device_id_ == kBadDeviceId) | |
405 return false; | |
406 | |
407 // Check which device generated |event|. | |
408 std::map<int, DeviceType>::const_iterator iter = | |
409 device_id_to_type_.find(last_device_id_); | |
410 if (iter == device_id_to_type_.end()) { | |
411 LOG(ERROR) << "Device ID " << last_device_id_ << " is unknown."; | |
412 return false; | |
413 } | |
414 | |
415 const DeviceType type = iter->second; | |
416 return type == kDeviceChromebookKeyboard; | |
417 } | |
363 #endif | 418 #endif |
364 | 419 |
365 void EventRewriter::Rewrite(ui::KeyEvent* event) { | 420 void EventRewriter::Rewrite(ui::KeyEvent* event) { |
366 #if defined(OS_CHROMEOS) | 421 #if defined(OS_CHROMEOS) |
367 // Do not rewrite an event sent by ui_controls::SendKeyPress(). See | 422 // Do not rewrite an event sent by ui_controls::SendKeyPress(). See |
368 // crbug.com/136465. | 423 // crbug.com/136465. |
369 if (event->native_event()->xkey.send_event) | 424 if (event->native_event()->xkey.send_event) |
370 return; | 425 return; |
371 #endif | 426 #endif |
372 RewriteModifiers(event); | 427 RewriteModifiers(event); |
373 RewriteNumPadKeys(event); | 428 RewriteNumPadKeys(event); |
374 RewriteBackspaceAndArrowKeys(event); | 429 RewriteBackspaceAndArrowKeys(event); |
375 // TODO(yusukes): Implement crosbug.com/27167 (allow sending function keys). | 430 RewriteFunctionKeys(event); |
376 } | 431 } |
377 | 432 |
378 bool EventRewriter::IsAppleKeyboard() const { | 433 bool EventRewriter::IsAppleKeyboard() const { |
379 if (last_device_id_ == kBadDeviceId) | 434 if (last_device_id_ == kBadDeviceId) |
380 return false; | 435 return false; |
381 | 436 |
382 // Check which device generated |event|. | 437 // Check which device generated |event|. |
383 std::map<int, DeviceType>::const_iterator iter = | 438 std::map<int, DeviceType>::const_iterator iter = |
384 device_id_to_type_.find(last_device_id_); | 439 device_id_to_type_.find(last_device_id_); |
385 if (iter == device_id_to_type_.end()) { | 440 if (iter == device_id_to_type_.end()) { |
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
724 ui::VKEY_NEXT, event->flags()); | 779 ui::VKEY_NEXT, event->flags()); |
725 rewritten = true; | 780 rewritten = true; |
726 } | 781 } |
727 } | 782 } |
728 #else | 783 #else |
729 // TODO(yusukes): Support Ash on other platforms if needed. | 784 // TODO(yusukes): Support Ash on other platforms if needed. |
730 #endif | 785 #endif |
731 return rewritten; | 786 return rewritten; |
732 } | 787 } |
733 | 788 |
789 bool EventRewriter::RewriteFunctionKeys(ui::KeyEvent* event) { | |
790 #if defined(OS_CHROMEOS) | |
791 XEvent* xev = event->native_event(); | |
792 XKeyEvent* xkey = &(xev->xkey); | |
793 const KeySym keysym = XLookupKeysym(xkey, 0); | |
794 | |
795 KeyCode remapped_native_keycode = 0; | |
796 ui::KeyboardCode remapped_keycode = ui::VKEY_UNKNOWN; | |
797 unsigned int remapped_native_state = xkey->state; | |
798 int remapped_flags = event->flags(); | |
799 | |
800 // On a Chromebook keyboard, F<number> keys have special purposes. On other | |
801 // keyboards, they should act as usual. | |
802 if (!EventSourceIsChromebookKeyboard(event)) | |
803 return false; | |
804 | |
805 // Rewrite the actual F1-F12 keys on a Chromebook keyboard to special keys. | |
806 switch (keysym) { | |
807 case XK_F1: | |
808 // Remap F1 to BROWSER_BACK | |
809 remapped_native_keycode = browser_back_xkeycode_; | |
810 remapped_keycode = ui::VKEY_BROWSER_BACK; | |
811 break; | |
812 case XK_F2: | |
813 // Remap F2 to BROWSER_FORWARD | |
814 remapped_native_keycode = browser_forward_xkeycode_; | |
815 remapped_keycode = ui::VKEY_BROWSER_FORWARD; | |
816 break; | |
817 case XK_F3: | |
818 // Remap F3 to BROWSER_REFRESH | |
819 remapped_native_keycode = browser_refresh_xkeycode_; | |
820 remapped_keycode = ui::VKEY_BROWSER_REFRESH; | |
821 break; | |
822 case XK_F4: | |
823 // Remap F4 to MEDIA_LAUNCH_APP2 | |
824 remapped_native_keycode = media_launch_app2_xkeycode_; | |
825 remapped_keycode = ui::VKEY_MEDIA_LAUNCH_APP2; | |
826 break; | |
827 case XK_F5: | |
828 // Remap F5 to MEDIA_LAUNCH_APP1 | |
829 remapped_native_keycode = media_launch_app1_xkeycode_; | |
830 remapped_keycode = ui::VKEY_MEDIA_LAUNCH_APP1; | |
831 break; | |
832 case XK_F6: | |
833 // Remap F6 to BRIGHTNESS_DOWN | |
834 remapped_native_keycode = brightness_down_xkeycode_; | |
835 remapped_keycode = ui::VKEY_BRIGHTNESS_DOWN; | |
836 break; | |
837 case XK_F7: | |
838 // Remap F7 to BRIGHTNESS_UP | |
839 remapped_native_keycode = brightness_up_xkeycode_; | |
840 remapped_keycode = ui::VKEY_BRIGHTNESS_UP; | |
841 break; | |
842 case XK_F8: | |
843 // Remap F8 to VOLUME_MUTE | |
844 remapped_native_keycode = volume_mute_xkeycode_; | |
845 remapped_keycode = ui::VKEY_VOLUME_MUTE; | |
846 break; | |
847 case XK_F9: | |
848 // Remap F9 to VOLUME_DOWN | |
849 remapped_native_keycode = volume_down_xkeycode_; | |
850 remapped_keycode = ui::VKEY_VOLUME_DOWN; | |
851 break; | |
852 case XK_F10: | |
853 // Remap F10 to VOLUME_UP | |
854 remapped_native_keycode = volume_up_xkeycode_; | |
855 remapped_keycode = ui::VKEY_VOLUME_UP; | |
856 break; | |
857 case XK_F11: | |
858 // Remap F11 to POWER | |
859 remapped_native_keycode = power_xkeycode_; | |
860 remapped_keycode = ui::VKEY_POWER; | |
861 break; | |
862 default: | |
863 break; | |
864 } | |
865 | |
866 const PrefService* pref_service = | |
867 pref_service_ ? pref_service_ : GetPrefService(); | |
868 bool chromebook_function_key = CommandLine::ForCurrentProcess()->HasSwitch( | |
869 switches::kEnableChromebookFunctionKey); | |
870 | |
871 bool search_as_function_key = chromebook_function_key && pref_service && | |
872 pref_service->GetBoolean(prefs::kLanguageSearchKeyActsAsFunctionKey); | |
873 | |
874 // When using Search as a Function key, remap Search+<number> to F<number>. | |
875 if (search_as_function_key && xkey->state & Mod4Mask) { | |
876 // We check the keycode here instead of the keysym, as these keys have | |
877 // different keysyms when modifiers are pressed, such as shift. | |
878 | |
879 // TODO(danakj): On some i18n keyboards, these choices will be bad and we | |
880 // should make layout-specific choices here. For eg. on a french keyboard | |
881 // "-" and "6" are the same key, so F11 will not be accessible. | |
882 KeyCode xkeycode = xkey->keycode; | |
883 if (xkeycode == number1_xkeycode_) { | |
884 // Remap Search+1 to F1. | |
885 remapped_native_keycode = f1_xkeycode_; | |
886 remapped_keycode = ui::VKEY_F1; | |
887 remapped_native_state &= ~Mod4Mask; | |
888 } else if (xkeycode == number2_xkeycode_) { | |
889 // Remap Search+2 to F2. | |
890 remapped_native_keycode = f2_xkeycode_; | |
891 remapped_keycode = ui::VKEY_F2; | |
892 remapped_native_state &= ~Mod4Mask; | |
893 } else if (xkeycode == number3_xkeycode_) { | |
894 // Remap Search+3 to F3. | |
895 remapped_native_keycode = f3_xkeycode_; | |
896 remapped_keycode = ui::VKEY_F3; | |
897 remapped_native_state &= ~Mod4Mask; | |
898 } else if (xkeycode == number4_xkeycode_) { | |
899 // Remap Search+4 to F4. | |
900 remapped_native_keycode = f4_xkeycode_; | |
901 remapped_keycode = ui::VKEY_F4; | |
902 remapped_native_state &= ~Mod4Mask; | |
903 } else if (xkeycode == number5_xkeycode_) { | |
904 // Remap Search+5 to F5. | |
905 remapped_native_keycode = f5_xkeycode_; | |
906 remapped_keycode = ui::VKEY_F5; | |
907 remapped_native_state &= ~Mod4Mask; | |
908 } else if (xkeycode == number6_xkeycode_) { | |
909 // Remap Search+6 to F6. | |
910 remapped_native_keycode = f6_xkeycode_; | |
911 remapped_keycode = ui::VKEY_F6; | |
912 remapped_native_state &= ~Mod4Mask; | |
913 } else if (xkeycode == number7_xkeycode_) { | |
914 // Remap Search+7 to F7. | |
915 remapped_native_keycode = f7_xkeycode_; | |
916 remapped_keycode = ui::VKEY_F7; | |
917 remapped_native_state &= ~Mod4Mask; | |
918 } else if (xkeycode == number8_xkeycode_) { | |
919 // Remap Search+8 to F8. | |
920 remapped_native_keycode = f8_xkeycode_; | |
921 remapped_keycode = ui::VKEY_F8; | |
922 remapped_native_state &= ~Mod4Mask; | |
923 } else if (xkeycode == number9_xkeycode_) { | |
924 // Remap Search+9 to F9. | |
925 remapped_native_keycode = f9_xkeycode_; | |
926 remapped_keycode = ui::VKEY_F9; | |
927 remapped_native_state &= ~Mod4Mask; | |
928 } else if (xkeycode == number0_xkeycode_) { | |
929 // Remap Search+0 to F10. | |
930 remapped_native_keycode = f10_xkeycode_; | |
931 remapped_keycode = ui::VKEY_F10; | |
932 remapped_native_state &= ~Mod4Mask; | |
933 } else if (xkeycode == minus_xkeycode_) { | |
934 // Remap Search+- to F11. | |
935 remapped_native_keycode = f11_xkeycode_; | |
936 remapped_keycode = ui::VKEY_F11; | |
937 remapped_native_state &= ~Mod4Mask; | |
938 } else if (xkeycode == equal_xkeycode_) { | |
939 // Remap Search+= to F12. | |
940 remapped_native_keycode = f12_xkeycode_; | |
941 remapped_keycode = ui::VKEY_F12; | |
942 remapped_native_state &= ~Mod4Mask; | |
943 } | |
944 } | |
945 | |
946 if (!remapped_native_keycode || remapped_keycode == ui::VKEY_UNKNOWN) | |
947 return false; | |
948 | |
949 OverwriteEvent(event, remapped_native_keycode, remapped_native_state, | |
950 remapped_keycode, remapped_flags); | |
951 return true; | |
952 #else | |
953 // TODO(danakj): Support Ash on other platforms if needed. | |
954 return false; | |
955 #endif | |
956 } | |
957 | |
734 void EventRewriter::RewriteLocatedEvent(ui::LocatedEvent* event) { | 958 void EventRewriter::RewriteLocatedEvent(ui::LocatedEvent* event) { |
735 #if defined(OS_CHROMEOS) | 959 #if defined(OS_CHROMEOS) |
736 if (event->flags() & ui::EF_IS_SYNTHESIZED) | 960 if (event->flags() & ui::EF_IS_SYNTHESIZED) |
737 return; | 961 return; |
738 | 962 |
739 XEvent* xevent = event->native_event(); | 963 XEvent* xevent = event->native_event(); |
740 if (!xevent || xevent->type != GenericEvent) | 964 if (!xevent || xevent->type != GenericEvent) |
741 return; | 965 return; |
742 | 966 |
743 XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xevent->xcookie.data); | 967 XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xevent->xcookie.data); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
793 #endif | 1017 #endif |
794 } | 1018 } |
795 | 1019 |
796 EventRewriter::DeviceType EventRewriter::DeviceAddedInternal( | 1020 EventRewriter::DeviceType EventRewriter::DeviceAddedInternal( |
797 int device_id, | 1021 int device_id, |
798 const std::string& device_name) { | 1022 const std::string& device_name) { |
799 const DeviceType type = EventRewriter::GetDeviceType(device_name); | 1023 const DeviceType type = EventRewriter::GetDeviceType(device_name); |
800 if (type == kDeviceAppleKeyboard) { | 1024 if (type == kDeviceAppleKeyboard) { |
801 VLOG(1) << "Apple keyboard '" << device_name << "' connected: " | 1025 VLOG(1) << "Apple keyboard '" << device_name << "' connected: " |
802 << "id=" << device_id; | 1026 << "id=" << device_id; |
1027 } else if (type == kDeviceChromebookKeyboard) { | |
1028 VLOG(1) << "Chromebook keyboard '" << device_name << "' connected: " | |
1029 << "id=" << device_id; | |
803 } | 1030 } |
804 // Always overwrite the existing device_id since the X server may reuse a | 1031 // Always overwrite the existing device_id since the X server may reuse a |
805 // device id for an unattached device. | 1032 // device id for an unattached device. |
806 device_id_to_type_[device_id] = type; | 1033 device_id_to_type_[device_id] = type; |
807 return type; | 1034 return type; |
808 } | 1035 } |
OLD | NEW |