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

Side by Side Diff: chrome/browser/chromeos/events/event_rewriter.cc

Issue 553243002: Track the active ExtensionKeybindingRegistry and make it available to EventRewriter. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@lkcr
Patch Set: Fix bool vs BOOL. Created 6 years, 3 months 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/chromeos/events/event_rewriter.h" 5 #include "chrome/browser/chromeos/events/event_rewriter.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "ash/sticky_keys/sticky_keys_controller.h" 9 #include "ash/sticky_keys/sticky_keys_controller.h"
10 #include "ash/wm/window_state.h" 10 #include "ash/wm/window_state.h"
11 #include "ash/wm/window_util.h" 11 #include "ash/wm/window_util.h"
12 #include "base/command_line.h" 12 #include "base/command_line.h"
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #include "base/macros.h" 14 #include "base/macros.h"
15 #include "base/prefs/pref_service.h" 15 #include "base/prefs/pref_service.h"
16 #include "base/strings/string_util.h" 16 #include "base/strings/string_util.h"
17 #include "base/sys_info.h" 17 #include "base/sys_info.h"
18 #include "chrome/browser/chromeos/login/ui/login_display_host_impl.h" 18 #include "chrome/browser/chromeos/login/ui/login_display_host_impl.h"
19 #include "chrome/browser/profiles/profile_manager.h" 19 #include "chrome/browser/profiles/profile_manager.h"
20 #include "chrome/browser/ui/browser.h"
21 #include "chrome/browser/ui/browser_list.h"
22 #include "chrome/browser/ui/browser_window.h"
20 #include "chrome/common/pref_names.h" 23 #include "chrome/common/pref_names.h"
21 #include "chromeos/chromeos_switches.h" 24 #include "chromeos/chromeos_switches.h"
22 #include "chromeos/ime/ime_keyboard.h" 25 #include "chromeos/ime/ime_keyboard.h"
23 #include "chromeos/ime/input_method_manager.h" 26 #include "chromeos/ime/input_method_manager.h"
24 #include "components/user_manager/user_manager.h" 27 #include "components/user_manager/user_manager.h"
25 #include "ui/events/event.h" 28 #include "ui/events/event.h"
26 #include "ui/events/event_utils.h" 29 #include "ui/events/event_utils.h"
27 #include "ui/events/keycodes/keyboard_code_conversion.h" 30 #include "ui/events/keycodes/keyboard_code_conversion.h"
28 #include "ui/wm/core/window_util.h" 31 #include "ui/wm/core/window_util.h"
29 32
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
97 bool IsISOLevel5ShiftUsedByCurrentInputMethod() { 100 bool IsISOLevel5ShiftUsedByCurrentInputMethod() {
98 // Since both German Neo2 XKB layout and Caps Lock depend on Mod3Mask, 101 // Since both German Neo2 XKB layout and Caps Lock depend on Mod3Mask,
99 // it's not possible to make both features work. For now, we don't remap 102 // it's not possible to make both features work. For now, we don't remap
100 // Mod3Mask when Neo2 is in use. 103 // Mod3Mask when Neo2 is in use.
101 // TODO(yusukes): Remove the restriction. 104 // TODO(yusukes): Remove the restriction.
102 input_method::InputMethodManager* manager = 105 input_method::InputMethodManager* manager =
103 input_method::InputMethodManager::Get(); 106 input_method::InputMethodManager::Get();
104 return manager->IsISOLevel5ShiftUsedByCurrentInputMethod(); 107 return manager->IsISOLevel5ShiftUsedByCurrentInputMethod();
105 } 108 }
106 109
110 bool IsExtensionCommandRegistered(const ui::KeyEvent& key_event) {
111 // Some keyboard events for ChromeOS get rewritten, such as:
112 // Search+Shift+Left gets converted to Shift+Home (BeginDocument).
113 // This doesn't make sense if the user has assigned that shortcut
114 // to an extension. Because:
115 // 1) The extension would, upon seeing a request for Ctrl+Shift+Home have
116 // to register for Shift+Home, instead.
117 // 2) The conversion is unnecessary, because Shift+Home (BeginDocument) isn't
118 // going to be executed.
119 // Therefore, we skip converting the accelerator if an extension has
120 // registered for this shortcut.
121 const BrowserList* ash_browser_list =
122 BrowserList::GetInstance(chrome::HOST_DESKTOP_TYPE_ASH);
123 for (BrowserList::const_reverse_iterator browser_iterator =
124 ash_browser_list->begin_last_active();
125 browser_iterator != ash_browser_list->end_last_active();
126 ++browser_iterator) {
127 BrowserWindow* window = (*browser_iterator)->window();
128
129 if (window->IsActive()) {
130 int modifiers = ui::EF_NONE;
131 if (key_event.IsShiftDown())
132 modifiers |= ui::EF_SHIFT_DOWN;
133 if (key_event.IsControlDown())
134 modifiers |= ui::EF_CONTROL_DOWN;
135 if (key_event.IsAltDown())
136 modifiers |= ui::EF_ALT_DOWN;
137 if (key_event.IsCommandDown())
138 modifiers |= ui::EF_COMMAND_DOWN;
139 ui::Accelerator accelerator(key_event.key_code(), modifiers);
140 if (window->IsExtensionCommandRegistered(accelerator))
141 return true;
142 }
143 }
144 return false;
145 }
146
107 EventRewriter::DeviceType GetDeviceType(const std::string& device_name) { 147 EventRewriter::DeviceType GetDeviceType(const std::string& device_name) {
108 std::vector<std::string> tokens; 148 std::vector<std::string> tokens;
109 Tokenize(device_name, " .", &tokens); 149 Tokenize(device_name, " .", &tokens);
110 150
111 // If the |device_name| contains the two words, "apple" and "keyboard", treat 151 // If the |device_name| contains the two words, "apple" and "keyboard", treat
112 // it as an Apple keyboard. 152 // it as an Apple keyboard.
113 bool found_apple = false; 153 bool found_apple = false;
114 bool found_keyboard = false; 154 bool found_keyboard = false;
115 for (size_t i = 0; i < tokens.size(); ++i) { 155 for (size_t i = 0; i < tokens.size(); ++i) {
116 if (!found_apple && LowerCaseEqualsASCII(tokens[i], "apple")) 156 if (!found_apple && LowerCaseEqualsASCII(tokens[i], "apple"))
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
353 remapped_state->key_code = map.output_key_code; 393 remapped_state->key_code = map.output_key_code;
354 remapped_state->flags = (input.flags & ~map.input_flags) | map.output_flags; 394 remapped_state->flags = (input.flags & ~map.input_flags) | map.output_flags;
355 return true; 395 return true;
356 } 396 }
357 return false; 397 return false;
358 } 398 }
359 399
360 ui::EventRewriteStatus EventRewriter::RewriteKeyEvent( 400 ui::EventRewriteStatus EventRewriter::RewriteKeyEvent(
361 const ui::KeyEvent& key_event, 401 const ui::KeyEvent& key_event,
362 scoped_ptr<ui::Event>* rewritten_event) { 402 scoped_ptr<ui::Event>* rewritten_event) {
403 if (IsExtensionCommandRegistered(key_event))
404 return ui::EVENT_REWRITE_CONTINUE;
363 if (key_event.source_device_id() != ui::ED_UNKNOWN_DEVICE) 405 if (key_event.source_device_id() != ui::ED_UNKNOWN_DEVICE)
364 DeviceKeyPressedOrReleased(key_event.source_device_id()); 406 DeviceKeyPressedOrReleased(key_event.source_device_id());
365 MutableKeyState state = {key_event.flags(), key_event.key_code()}; 407 MutableKeyState state = {key_event.flags(), key_event.key_code()};
366 // Do not rewrite an event sent by ui_controls::SendKeyPress(). See 408 // Do not rewrite an event sent by ui_controls::SendKeyPress(). See
367 // crbug.com/136465. 409 // crbug.com/136465.
368 if (!(key_event.flags() & ui::EF_FINAL)) { 410 if (!(key_event.flags() & ui::EF_FINAL)) {
369 RewriteModifierKeys(key_event, &state); 411 RewriteModifierKeys(key_event, &state);
370 RewriteNumPadKeys(key_event, &state); 412 RewriteNumPadKeys(key_event, &state);
371 } 413 }
372 ui::EventRewriteStatus status = ui::EVENT_REWRITE_CONTINUE; 414 ui::EventRewriteStatus status = ui::EVENT_REWRITE_CONTINUE;
(...skipping 488 matching lines...) Expand 10 before | Expand all | Expand 10 after
861 KeyboardDeviceAddedInternal(device_info[i].deviceid, device_info[i].name); 903 KeyboardDeviceAddedInternal(device_info[i].deviceid, device_info[i].name);
862 } 904 }
863 905
864 XIFreeDeviceInfo(device_info); 906 XIFreeDeviceInfo(device_info);
865 #else 907 #else
866 KeyboardDeviceAddedInternal(device_id, "keyboard"); 908 KeyboardDeviceAddedInternal(device_id, "keyboard");
867 #endif 909 #endif
868 } 910 }
869 911
870 } // namespace chromeos 912 } // namespace chromeos
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/extensions/extension_keybinding_apitest.cc » ('j') | chrome/browser/ui/browser_window.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698