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

Side by Side Diff: chrome/browser/ui/ash/event_rewriter.cc

Issue 11421055: Add power-user keyboard mode for ChromeOS with Search key acting as a typical Fn key. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: SkyNits Created 8 years 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 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
124 bool IsMod3UsedByCurrentInputMethod() { 130 bool IsMod3UsedByCurrentInputMethod() {
125 // Since both German Neo2 XKB layout and Caps Lock depend on Mod3Mask, 131 // Since both German Neo2 XKB layout and Caps Lock depend on Mod3Mask,
126 // it's not possible to make both features work. For now, we don't remap 132 // it's not possible to make both features work. For now, we don't remap
127 // Mod3Mask when Neo2 is in use. 133 // Mod3Mask when Neo2 is in use.
128 // TODO(yusukes): Remove the restriction. 134 // TODO(yusukes): Remove the restriction.
129 return InputMethodManager::GetInstance()->GetCurrentInputMethod().id() == 135 return InputMethodManager::GetInstance()->GetCurrentInputMethod().id() ==
130 kNeo2LayoutId; 136 kNeo2LayoutId;
131 } 137 }
132 #endif 138 #endif
133 139
(...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after
631 } 637 }
632 #else 638 #else
633 // TODO(yusukes): Support Ash on other platforms if needed. 639 // TODO(yusukes): Support Ash on other platforms if needed.
634 #endif 640 #endif
635 return rewritten; 641 return rewritten;
636 } 642 }
637 643
638 bool EventRewriter::RewriteBackspaceAndArrowKeys(ui::KeyEvent* event) { 644 bool EventRewriter::RewriteBackspaceAndArrowKeys(ui::KeyEvent* event) {
639 bool rewritten = false; 645 bool rewritten = false;
640 #if defined(OS_CHROMEOS) 646 #if defined(OS_CHROMEOS)
647 // On a Chromebook keyboard, modifier keys can be used to access extended
648 // keyboard shortcuts. On other keyboards, keys such as delete and page up are
649 // already available, so we do not need to rewrite anything here.
650 if (!EventSourceIsChromebookKeyboard(event))
651 return rewritten;
652
653 const PrefService* pref_service =
654 pref_service_ ? pref_service_ : GetPrefService();
655 bool chromebook_function_key = CommandLine::ForCurrentProcess()->HasSwitch(
656 switches::kEnableChromebookFunctionKey);
657
658 bool search_as_function_key = chromebook_function_key && pref_service &&
659 pref_service->GetBoolean(prefs::kLanguageSearchKeyActsAsFunctionKey);
660
641 XEvent* xev = event->native_event(); 661 XEvent* xev = event->native_event();
642 XKeyEvent* xkey = &(xev->xkey); 662 XKeyEvent* xkey = &(xev->xkey);
663 const KeySym keysym = XLookupKeysym(xkey, 0);
643 664
644 const KeySym keysym = XLookupKeysym(xkey, 0); 665 if (!search_as_function_key) {
645 if (keysym == XK_BackSpace && (xkey->state & Mod1Mask)) { 666 if (keysym == XK_BackSpace && (xkey->state & Mod1Mask)) {
646 // Remap Alt+Backspace to Delete. 667 // Without Search as Function key: Remap Alt+Backspace to Delete.
647 OverwriteEvent(event, delete_xkeycode_, xkey->state & ~Mod1Mask, 668 OverwriteEvent(event, delete_xkeycode_, xkey->state & ~Mod1Mask,
648 ui::VKEY_DELETE, event->flags() & ~ui::EF_ALT_DOWN); 669 ui::VKEY_DELETE, event->flags() & ~ui::EF_ALT_DOWN);
649 rewritten = true; 670 rewritten = true;
650 } else if (keysym == XK_Up && 671 } else if (keysym == XK_Up &&
651 (xkey->state & ControlMask) && (xkey->state & Mod1Mask)) { 672 (xkey->state & ControlMask) && (xkey->state & Mod1Mask)) {
652 // Remap Ctrl+Alt+Up to Home. 673 // Without Search as Function key: Remap Ctrl+Alt+Up to Home.
653 OverwriteEvent(event, 674 OverwriteEvent(event,
654 home_xkeycode_, 675 home_xkeycode_,
655 xkey->state & ~(Mod1Mask | ControlMask), 676 xkey->state & ~(Mod1Mask | ControlMask),
656 ui::VKEY_HOME, 677 ui::VKEY_HOME,
657 event->flags() & ~(ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN)); 678 event->flags() & ~(ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN));
658 rewritten = true; 679 rewritten = true;
659 } else if (keysym == XK_Up && (xkey->state & Mod1Mask)) { 680 } else if (keysym == XK_Up && (xkey->state & Mod1Mask)) {
660 // Remap Alt+Up to Prior (aka PageUp). 681 // Without Search as Function key: Remap Alt+Up to Prior (aka PageUp).
661 OverwriteEvent(event, prior_xkeycode_, xkey->state & ~Mod1Mask, 682 OverwriteEvent(event, prior_xkeycode_, xkey->state & ~Mod1Mask,
662 ui::VKEY_PRIOR, event->flags() & ~ui::EF_ALT_DOWN); 683 ui::VKEY_PRIOR, event->flags() & ~ui::EF_ALT_DOWN);
663 rewritten = true; 684 rewritten = true;
664 } else if (keysym == XK_Down && 685 } else if (keysym == XK_Down &&
665 (xkey->state & ControlMask) && (xkey->state & Mod1Mask)) { 686 (xkey->state & ControlMask) && (xkey->state & Mod1Mask)) {
666 // Remap Ctrl+Alt+Down to End. 687 // Without Search as Function key: Remap Ctrl+Alt+Down to End.
667 OverwriteEvent(event, 688 OverwriteEvent(event,
668 end_xkeycode_, 689 end_xkeycode_,
669 xkey->state & ~(Mod1Mask | ControlMask), 690 xkey->state & ~(Mod1Mask | ControlMask),
670 ui::VKEY_END, 691 ui::VKEY_END,
671 event->flags() & ~(ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN)); 692 event->flags() & ~(ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN));
672 rewritten = true; 693 rewritten = true;
673 } else if (keysym == XK_Down && (xkey->state & Mod1Mask)) { 694 } else if (keysym == XK_Down && (xkey->state & Mod1Mask)) {
674 // Remap Alt+Down to Next (aka PageDown). 695 // Without Search as Function key: Remap Alt+Down to Next (aka PageDown).
675 OverwriteEvent(event, next_xkeycode_, xkey->state & ~Mod1Mask, 696 OverwriteEvent(event, next_xkeycode_, xkey->state & ~Mod1Mask,
676 ui::VKEY_NEXT, event->flags() & ~ui::EF_ALT_DOWN); 697 ui::VKEY_NEXT, event->flags() & ~ui::EF_ALT_DOWN);
677 rewritten = true; 698 rewritten = true;
699 }
700 } else {
701 if (keysym == XK_BackSpace && (xkey->state & Mod4Mask)) {
702 // With Search as Function key: Remap Search+Backspace to Delete.
703 OverwriteEvent(event, delete_xkeycode_, xkey->state & ~Mod4Mask,
704 ui::VKEY_DELETE, event->flags());
705 rewritten = true;
706 } else if (keysym == XK_Left && (xkey->state & Mod4Mask)) {
707 // With Search as Function key: Remap Search+Left to Home.
708 OverwriteEvent(event, home_xkeycode_, xkey->state & ~Mod4Mask,
709 ui::VKEY_HOME, event->flags());
710 rewritten = true;
711 } else if (keysym == XK_Up && (xkey->state & Mod4Mask)) {
712 // With Search as Function key: Remap Search+Up to Prior (aka PageUp).
713 OverwriteEvent(event, prior_xkeycode_, xkey->state & ~Mod4Mask,
714 ui::VKEY_PRIOR, event->flags());
715 rewritten = true;
716 } else if (keysym == XK_Right && (xkey->state & Mod4Mask)) {
717 // With Search as Function key: Remap Search+Right to End.
718 OverwriteEvent(event, end_xkeycode_, xkey->state & ~Mod4Mask,
719 ui::VKEY_END, event->flags());
720 rewritten = true;
721 } else if (keysym == XK_Down && (xkey->state & Mod4Mask)) {
722 // With Search as Function key: Remap Search+Down to Next (aka PageDown).
723 OverwriteEvent(event, next_xkeycode_, xkey->state & ~Mod4Mask,
724 ui::VKEY_NEXT, event->flags());
725 rewritten = true;
726 }
678 } 727 }
679 #else 728 #else
680 // TODO(yusukes): Support Ash on other platforms if needed. 729 // TODO(yusukes): Support Ash on other platforms if needed.
681 #endif 730 #endif
682 return rewritten; 731 return rewritten;
683 } 732 }
684 733
685 void EventRewriter::RewriteLocatedEvent(ui::LocatedEvent* event) { 734 void EventRewriter::RewriteLocatedEvent(ui::LocatedEvent* event) {
686 #if defined(OS_CHROMEOS) 735 #if defined(OS_CHROMEOS)
687 if (event->flags() & ui::EF_IS_SYNTHESIZED) 736 if (event->flags() & ui::EF_IS_SYNTHESIZED)
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
750 const DeviceType type = EventRewriter::GetDeviceType(device_name); 799 const DeviceType type = EventRewriter::GetDeviceType(device_name);
751 if (type == kDeviceAppleKeyboard) { 800 if (type == kDeviceAppleKeyboard) {
752 VLOG(1) << "Apple keyboard '" << device_name << "' connected: " 801 VLOG(1) << "Apple keyboard '" << device_name << "' connected: "
753 << "id=" << device_id; 802 << "id=" << device_id;
754 } 803 }
755 // Always overwrite the existing device_id since the X server may reuse a 804 // Always overwrite the existing device_id since the X server may reuse a
756 // device id for an unattached device. 805 // device id for an unattached device.
757 device_id_to_type_[device_id] = type; 806 device_id_to_type_[device_id] = type;
758 return type; 807 return type;
759 } 808 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/ash/event_rewriter.h ('k') | chrome/browser/ui/ash/event_rewriter_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698