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 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
273 // |device_id| is unknown. This means the device was connected before | 273 // |device_id| is unknown. This means the device was connected before |
274 // booting the OS. Query the name of the device and add it to the map. | 274 // booting the OS. Query the name of the device and add it to the map. |
275 DeviceAdded(device_id); | 275 DeviceAdded(device_id); |
276 } | 276 } |
277 | 277 |
278 last_device_id_ = device_id; | 278 last_device_id_ = device_id; |
279 } | 279 } |
280 | 280 |
281 void EventRewriter::RefreshKeycodes() { | 281 void EventRewriter::RefreshKeycodes() { |
282 Display* display = ui::GetXDisplay(); | 282 Display* display = ui::GetXDisplay(); |
283 control_l_xkeycode_ = XKeysymToKeycode(display, XK_Control_L); | 283 control_l_xkeycode_ = XKeysymToKeycode(display, XK_Control_L); |
Wez
2012/11/26 21:03:19
There are sufficiently many of these now that it'd
Yusuke Sato
2012/11/30 23:43:55
+1
| |
284 control_r_xkeycode_ = XKeysymToKeycode(display, XK_Control_R); | 284 control_r_xkeycode_ = XKeysymToKeycode(display, XK_Control_R); |
285 alt_l_xkeycode_ = XKeysymToKeycode(display, XK_Alt_L); | 285 alt_l_xkeycode_ = XKeysymToKeycode(display, XK_Alt_L); |
286 alt_r_xkeycode_ = XKeysymToKeycode(display, XK_Alt_R); | 286 alt_r_xkeycode_ = XKeysymToKeycode(display, XK_Alt_R); |
287 meta_l_xkeycode_ = XKeysymToKeycode(display, XK_Meta_L); | 287 meta_l_xkeycode_ = XKeysymToKeycode(display, XK_Meta_L); |
288 meta_r_xkeycode_ = XKeysymToKeycode(display, XK_Meta_R); | 288 meta_r_xkeycode_ = XKeysymToKeycode(display, XK_Meta_R); |
289 windows_l_xkeycode_ = XKeysymToKeycode(display, XK_Super_L); | 289 windows_l_xkeycode_ = XKeysymToKeycode(display, XK_Super_L); |
290 caps_lock_xkeycode_ = XKeysymToKeycode(display, XK_Caps_Lock); | 290 caps_lock_xkeycode_ = XKeysymToKeycode(display, XK_Caps_Lock); |
291 void_symbol_xkeycode_ = XKeysymToKeycode(display, XK_VoidSymbol); | 291 void_symbol_xkeycode_ = XKeysymToKeycode(display, XK_VoidSymbol); |
292 delete_xkeycode_ = XKeysymToKeycode(display, XK_Delete); | 292 delete_xkeycode_ = XKeysymToKeycode(display, XK_Delete); |
293 home_xkeycode_ = XKeysymToKeycode(display, XK_Home); | 293 home_xkeycode_ = XKeysymToKeycode(display, XK_Home); |
294 end_xkeycode_ = XKeysymToKeycode(display, XK_End); | 294 end_xkeycode_ = XKeysymToKeycode(display, XK_End); |
295 prior_xkeycode_ = XKeysymToKeycode(display, XK_Prior); | 295 prior_xkeycode_ = XKeysymToKeycode(display, XK_Prior); |
296 next_xkeycode_ = XKeysymToKeycode(display, XK_Next); | 296 next_xkeycode_ = XKeysymToKeycode(display, XK_Next); |
297 insert_xkeycode_ = XKeysymToKeycode(display, XK_Insert); | |
297 kp_0_xkeycode_ = XKeysymToKeycode(display, XK_KP_0); | 298 kp_0_xkeycode_ = XKeysymToKeycode(display, XK_KP_0); |
298 kp_1_xkeycode_ = XKeysymToKeycode(display, XK_KP_1); | 299 kp_1_xkeycode_ = XKeysymToKeycode(display, XK_KP_1); |
299 kp_2_xkeycode_ = XKeysymToKeycode(display, XK_KP_2); | 300 kp_2_xkeycode_ = XKeysymToKeycode(display, XK_KP_2); |
300 kp_3_xkeycode_ = XKeysymToKeycode(display, XK_KP_3); | 301 kp_3_xkeycode_ = XKeysymToKeycode(display, XK_KP_3); |
301 kp_4_xkeycode_ = XKeysymToKeycode(display, XK_KP_4); | 302 kp_4_xkeycode_ = XKeysymToKeycode(display, XK_KP_4); |
302 kp_5_xkeycode_ = XKeysymToKeycode(display, XK_KP_5); | 303 kp_5_xkeycode_ = XKeysymToKeycode(display, XK_KP_5); |
303 kp_6_xkeycode_ = XKeysymToKeycode(display, XK_KP_6); | 304 kp_6_xkeycode_ = XKeysymToKeycode(display, XK_KP_6); |
304 kp_7_xkeycode_ = XKeysymToKeycode(display, XK_KP_7); | 305 kp_7_xkeycode_ = XKeysymToKeycode(display, XK_KP_7); |
305 kp_8_xkeycode_ = XKeysymToKeycode(display, XK_KP_8); | 306 kp_8_xkeycode_ = XKeysymToKeycode(display, XK_KP_8); |
306 kp_9_xkeycode_ = XKeysymToKeycode(display, XK_KP_9); | 307 kp_9_xkeycode_ = XKeysymToKeycode(display, XK_KP_9); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
354 case XK_Delete: | 355 case XK_Delete: |
355 return delete_xkeycode_; | 356 return delete_xkeycode_; |
356 case XK_Home: | 357 case XK_Home: |
357 return home_xkeycode_; | 358 return home_xkeycode_; |
358 case XK_End: | 359 case XK_End: |
359 return end_xkeycode_; | 360 return end_xkeycode_; |
360 case XK_Prior: | 361 case XK_Prior: |
361 return prior_xkeycode_; | 362 return prior_xkeycode_; |
362 case XK_Next: | 363 case XK_Next: |
363 return next_xkeycode_; | 364 return next_xkeycode_; |
365 case XK_Insert: | |
366 return insert_xkeycode_; | |
364 case XK_KP_0: | 367 case XK_KP_0: |
365 return kp_0_xkeycode_; | 368 return kp_0_xkeycode_; |
366 case XK_KP_1: | 369 case XK_KP_1: |
367 return kp_1_xkeycode_; | 370 return kp_1_xkeycode_; |
368 case XK_KP_2: | 371 case XK_KP_2: |
369 return kp_2_xkeycode_; | 372 return kp_2_xkeycode_; |
370 case XK_KP_3: | 373 case XK_KP_3: |
371 return kp_3_xkeycode_; | 374 return kp_3_xkeycode_; |
372 case XK_KP_4: | 375 case XK_KP_4: |
373 return kp_4_xkeycode_; | 376 return kp_4_xkeycode_; |
(...skipping 21 matching lines...) Expand all Loading... | |
395 // Do not rewrite an event sent by ui_controls::SendKeyPress(). See | 398 // Do not rewrite an event sent by ui_controls::SendKeyPress(). See |
396 // crbug.com/136465. | 399 // crbug.com/136465. |
397 if (event->native_event()->xkey.send_event) | 400 if (event->native_event()->xkey.send_event) |
398 return ash::EventRewriterDelegate::ACTION_REWRITE_EVENT; | 401 return ash::EventRewriterDelegate::ACTION_REWRITE_EVENT; |
399 | 402 |
400 if (DropSearchKey(event)) | 403 if (DropSearchKey(event)) |
401 return ash::EventRewriterDelegate::ACTION_DROP_EVENT; | 404 return ash::EventRewriterDelegate::ACTION_DROP_EVENT; |
402 #endif | 405 #endif |
403 RewriteModifiers(event); | 406 RewriteModifiers(event); |
404 RewriteNumPadKeys(event); | 407 RewriteNumPadKeys(event); |
405 RewriteBackspaceAndArrowKeys(event); | 408 RewriteBackspaceBackslashAndArrowKeys(event); |
406 RewriteFunctionKeys(event); | 409 RewriteFunctionKeys(event); |
407 return ash::EventRewriterDelegate::ACTION_REWRITE_EVENT; | 410 return ash::EventRewriterDelegate::ACTION_REWRITE_EVENT; |
408 } | 411 } |
409 | 412 |
410 bool EventRewriter::IsAppleKeyboard() const { | 413 bool EventRewriter::IsAppleKeyboard() const { |
411 if (last_device_id_ == kBadDeviceId) | 414 if (last_device_id_ == kBadDeviceId) |
412 return false; | 415 return false; |
413 | 416 |
414 // Check which device generated |event|. | 417 // Check which device generated |event|. |
415 std::map<int, DeviceType>::const_iterator iter = | 418 std::map<int, DeviceType>::const_iterator iter = |
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
666 break; | 669 break; |
667 default: | 670 default: |
668 break; | 671 break; |
669 } | 672 } |
670 #else | 673 #else |
671 // TODO(yusukes): Support Ash on other platforms if needed. | 674 // TODO(yusukes): Support Ash on other platforms if needed. |
672 #endif | 675 #endif |
673 return rewritten; | 676 return rewritten; |
674 } | 677 } |
675 | 678 |
676 bool EventRewriter::RewriteBackspaceAndArrowKeys(ui::KeyEvent* event) { | 679 bool EventRewriter::RewriteBackspaceBackslashAndArrowKeys(ui::KeyEvent* event) { |
677 bool rewritten = false; | 680 bool rewritten = false; |
678 #if defined(OS_CHROMEOS) | 681 #if defined(OS_CHROMEOS) |
679 const PrefService* pref_service = | 682 const PrefService* pref_service = |
680 pref_service_ ? pref_service_ : GetPrefService(); | 683 pref_service_ ? pref_service_ : GetPrefService(); |
681 | 684 |
682 const bool search_as_function_key = pref_service && | 685 const bool search_as_function_key = pref_service && |
683 pref_service->GetBoolean(prefs::kLanguageSearchKeyActsAsFunctionKey); | 686 pref_service->GetBoolean(prefs::kLanguageSearchKeyActsAsFunctionKey); |
684 | 687 |
685 XEvent* xev = event->native_event(); | 688 XEvent* xev = event->native_event(); |
686 XKeyEvent* xkey = &(xev->xkey); | 689 XKeyEvent* xkey = &(xev->xkey); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
745 // Without Search as Function key: Remap Alt+Down to Next (aka PageDown). | 748 // Without Search as Function key: Remap Alt+Down to Next (aka PageDown). |
746 OverwriteEvent(event, next_xkeycode_, xkey->state & ~Mod1Mask, | 749 OverwriteEvent(event, next_xkeycode_, xkey->state & ~Mod1Mask, |
747 ui::VKEY_NEXT, event->flags() & ~ui::EF_ALT_DOWN); | 750 ui::VKEY_NEXT, event->flags() & ~ui::EF_ALT_DOWN); |
748 rewritten = true; | 751 rewritten = true; |
749 } else if (search_as_function_key && | 752 } else if (search_as_function_key && |
750 keysym == XK_Down && (xkey->state & Mod4Mask)) { | 753 keysym == XK_Down && (xkey->state & Mod4Mask)) { |
751 // With Search as Function key: Remap Search+Down to Next (aka PageDown). | 754 // With Search as Function key: Remap Search+Down to Next (aka PageDown). |
752 OverwriteEvent(event, next_xkeycode_, xkey->state & ~Mod4Mask, | 755 OverwriteEvent(event, next_xkeycode_, xkey->state & ~Mod4Mask, |
753 ui::VKEY_NEXT, event->flags()); | 756 ui::VKEY_NEXT, event->flags()); |
754 rewritten = true; | 757 rewritten = true; |
758 } else if (search_as_function_key && | |
Wez
2012/11/26 21:03:19
nit: This function would be easier to read if it h
| |
759 keysym == XK_backslash && (xkey->state & Mod4Mask)) { | |
Yusuke Sato
2012/11/26 07:54:44
\ might be a bit inconvenient for non-US versions
danakj
2012/11/26 17:47:28
Sure that sounds fine. :)
Wez
2012/11/26 21:03:19
Agreed; "\" not only changes location between US &
Yusuke Sato
2012/11/26 21:08:28
Unfortunately - and = are already used for F11 and
| |
760 // With Search as Function key: Remap Search+backslash to Insert. | |
761 OverwriteEvent(event, insert_xkeycode_, xkey->state & ~Mod4Mask, | |
762 ui::VKEY_INSERT, event->flags()); | |
763 rewritten = true; | |
755 } | 764 } |
756 #else | 765 #else |
757 // TODO(yusukes): Support Ash on other platforms if needed. | 766 // TODO(yusukes): Support Ash on other platforms if needed. |
758 #endif | 767 #endif |
759 return rewritten; | 768 return rewritten; |
760 } | 769 } |
761 | 770 |
762 bool EventRewriter::RewriteFunctionKeys(ui::KeyEvent* event) { | 771 bool EventRewriter::RewriteFunctionKeys(ui::KeyEvent* event) { |
763 #if defined(OS_CHROMEOS) | 772 #if defined(OS_CHROMEOS) |
764 XEvent* xev = event->native_event(); | 773 XEvent* xev = event->native_event(); |
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1045 const DeviceType type = EventRewriter::GetDeviceType(device_name); | 1054 const DeviceType type = EventRewriter::GetDeviceType(device_name); |
1046 if (type == kDeviceAppleKeyboard) { | 1055 if (type == kDeviceAppleKeyboard) { |
1047 VLOG(1) << "Apple keyboard '" << device_name << "' connected: " | 1056 VLOG(1) << "Apple keyboard '" << device_name << "' connected: " |
1048 << "id=" << device_id; | 1057 << "id=" << device_id; |
1049 } | 1058 } |
1050 // Always overwrite the existing device_id since the X server may reuse a | 1059 // Always overwrite the existing device_id since the X server may reuse a |
1051 // device id for an unattached device. | 1060 // device id for an unattached device. |
1052 device_id_to_type_[device_id] = type; | 1061 device_id_to_type_[device_id] = type; |
1053 return type; | 1062 return type; |
1054 } | 1063 } |
OLD | NEW |