Chromium Code Reviews| 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 |