Index: chrome/browser/chromeos/event_rewriter.cc |
diff --git a/chrome/browser/ui/ash/event_rewriter.cc b/chrome/browser/chromeos/event_rewriter.cc |
similarity index 59% |
rename from chrome/browser/ui/ash/event_rewriter.cc |
rename to chrome/browser/chromeos/event_rewriter.cc |
index 5912b1ee76bb4ab13ed4e5db0d88af7d467ff803..029d9af8b548604078c262c992af87253464ab66 100644 |
--- a/chrome/browser/ui/ash/event_rewriter.cc |
+++ b/chrome/browser/chromeos/event_rewriter.cc |
@@ -1,51 +1,47 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "chrome/browser/ui/ash/event_rewriter.h" |
+#include "chrome/browser/chromeos/event_rewriter.h" |
-#include <vector> |
- |
-#include "ash/shell.h" |
-#include "base/logging.h" |
-#include "base/prefs/pref_service.h" |
-#include "base/strings/string_util.h" |
-#include "chrome/browser/profiles/profile_manager.h" |
-#include "ui/aura/root_window.h" |
-#include "ui/events/event.h" |
-#include "ui/events/event_utils.h" |
-#include "ui/events/keycodes/keyboard_code_conversion.h" |
- |
-#if defined(OS_CHROMEOS) |
#include <X11/extensions/XInput2.h> |
#include <X11/keysym.h> |
#include <X11/XF86keysym.h> |
#include <X11/Xlib.h> |
- |
-// Get rid of a macro from Xlib.h that conflicts with OwnershipService class. |
+// Get rid of macros from Xlib.h that conflicts with other parts of the code. |
+#undef RootWindow |
#undef Status |
+#include <vector> |
+ |
+#include "ash/shell.h" |
#include "ash/wm/window_state.h" |
+#include "ash/wm/window_util.h" |
#include "base/command_line.h" |
+#include "base/logging.h" |
+#include "base/prefs/pref_service.h" |
+#include "base/strings/string_util.h" |
#include "base/sys_info.h" |
#include "chrome/browser/chromeos/keyboard_driven_event_rewriter.h" |
#include "chrome/browser/chromeos/login/login_display_host_impl.h" |
#include "chrome/browser/chromeos/login/user_manager.h" |
#include "chrome/browser/chromeos/xinput_hierarchy_changed_event_listener.h" |
+#include "chrome/browser/profiles/profile_manager.h" |
#include "chrome/common/pref_names.h" |
#include "chromeos/chromeos_switches.h" |
#include "chromeos/ime/input_method_manager.h" |
#include "chromeos/ime/xkeyboard.h" |
+#include "ui/aura/root_window.h" |
#include "ui/base/x/x11_util.h" |
+#include "ui/events/event.h" |
+#include "ui/events/event_utils.h" |
#include "ui/events/keycodes/keyboard_code_conversion_x.h" |
#include "ui/views/corewm/window_util.h" |
-#endif |
namespace { |
const int kBadDeviceId = -1; |
-#if defined(OS_CHROMEOS) |
const char kNeo2LayoutId[] = "xkb:de:neo:ger"; |
const char kCaMultixLayoutId[] = "xkb:ca:multix:fra"; |
@@ -136,43 +132,36 @@ bool IsMod3UsedByCurrentInputMethod() { |
manager->GetCurrentInputMethod().id() == kCaMultixLayoutId; |
} |
-#endif // defined(OS_CHROMEOS) |
- |
} // namespace |
+namespace chromeos { |
+ |
EventRewriter::EventRewriter() |
: last_device_id_(kBadDeviceId), |
-#if defined(OS_CHROMEOS) |
xkeyboard_for_testing_(NULL), |
- keyboard_driven_event_rewriter_( |
- new chromeos::KeyboardDrivenEventRewriter), |
-#endif |
+ keyboard_driven_event_rewriter_(new KeyboardDrivenEventRewriter), |
pref_service_for_testing_(NULL) { |
// The ash shell isn't instantiated for our unit tests. |
if (ash::Shell::HasInstance()) { |
ash::Shell::GetPrimaryRootWindow()->GetDispatcher()-> |
AddRootWindowObserver(this); |
} |
-#if defined(OS_CHROMEOS) |
+ base::MessageLoopForUI::current()->AddObserver(this); |
if (base::SysInfo::IsRunningOnChromeOS()) { |
- chromeos::XInputHierarchyChangedEventListener::GetInstance() |
- ->AddObserver(this); |
+ XInputHierarchyChangedEventListener::GetInstance()->AddObserver(this); |
} |
RefreshKeycodes(); |
-#endif |
} |
EventRewriter::~EventRewriter() { |
+ base::MessageLoopForUI::current()->RemoveObserver(this); |
if (ash::Shell::HasInstance()) { |
ash::Shell::GetPrimaryRootWindow()->GetDispatcher()-> |
RemoveRootWindowObserver(this); |
} |
-#if defined(OS_CHROMEOS) |
if (base::SysInfo::IsRunningOnChromeOS()) { |
- chromeos::XInputHierarchyChangedEventListener::GetInstance() |
- ->RemoveObserver(this); |
+ XInputHierarchyChangedEventListener::GetInstance()->RemoveObserver(this); |
} |
-#endif |
} |
EventRewriter::DeviceType EventRewriter::DeviceAddedForTesting( |
@@ -203,31 +192,27 @@ EventRewriter::DeviceType EventRewriter::GetDeviceType( |
return kDeviceUnknown; |
} |
-void EventRewriter::RewriteForTesting(ui::KeyEvent* event) { |
+void EventRewriter::RewriteForTesting(XEvent* event) { |
Rewrite(event); |
} |
-ash::EventRewriterDelegate::Action EventRewriter::RewriteOrFilterKeyEvent( |
- ui::KeyEvent* event) { |
- if (event->HasNativeEvent()) |
- Rewrite(event); |
- return ash::EventRewriterDelegate::ACTION_REWRITE_EVENT; |
+void EventRewriter::OnKeyboardMappingChanged(const aura::RootWindow* root) { |
+ RefreshKeycodes(); |
} |
-ash::EventRewriterDelegate::Action EventRewriter::RewriteOrFilterLocatedEvent( |
- ui::LocatedEvent* event) { |
- if (event->HasNativeEvent()) |
- RewriteLocatedEvent(event); |
- return ash::EventRewriterDelegate::ACTION_REWRITE_EVENT; |
+base::EventStatus EventRewriter::WillProcessEvent( |
+ const base::NativeEvent& event) { |
+ XEvent* xevent = event; |
+ if (xevent->type == KeyPress || xevent->type == KeyRelease) |
+ Rewrite(xevent); |
+ else if (xevent->type == GenericEvent) |
+ RewriteLocatedEvent(xevent); |
+ return base::EVENT_CONTINUE; |
} |
-void EventRewriter::OnKeyboardMappingChanged(const aura::RootWindow* root) { |
-#if defined(OS_CHROMEOS) |
- RefreshKeycodes(); |
-#endif |
+void EventRewriter::DidProcessEvent(const base::NativeEvent& event) { |
} |
-#if defined(OS_CHROMEOS) |
void EventRewriter::DeviceAdded(int device_id) { |
DCHECK_NE(XIAllDevices, device_id); |
DCHECK_NE(XIAllMasterDevices, device_id); |
@@ -288,19 +273,15 @@ KeyCode EventRewriter::NativeKeySymToNativeKeycode(KeySym keysym) { |
return keycode; |
} |
-bool EventRewriter::TopRowKeysAreFunctionKeys(ui::KeyEvent* event) const { |
+bool EventRewriter::TopRowKeysAreFunctionKeys(XEvent* event) const { |
const PrefService* prefs = GetPrefService(); |
if (prefs && |
prefs->FindPreference(prefs::kLanguageSendFunctionKeys) && |
prefs->GetBoolean(prefs::kLanguageSendFunctionKeys)) |
return true; |
- aura::Window* target = static_cast<aura::Window*>(event->target()); |
- if (!target) |
- return false; |
- aura::Window* top_level = views::corewm::GetToplevelWindow(target); |
- return top_level && |
- ash::wm::GetWindowState(top_level)->top_row_keys_are_function_keys(); |
+ ash::wm::WindowState* state = ash::wm::GetActiveWindowState(); |
+ return state ? state->top_row_keys_are_function_keys() : false; |
} |
bool EventRewriter::RewriteWithKeyboardRemappingsByKeySym( |
@@ -308,11 +289,8 @@ bool EventRewriter::RewriteWithKeyboardRemappingsByKeySym( |
size_t num_remappings, |
KeySym keysym, |
unsigned int native_mods, |
- unsigned int mods, |
KeySym* remapped_native_keysym, |
- unsigned int* remapped_native_mods, |
- ui::KeyboardCode* remapped_keycode, |
- unsigned int* remapped_mods) { |
+ unsigned int* remapped_native_mods) { |
for (size_t i = 0; i < num_remappings; ++i) { |
const KeyboardRemapping& map = remappings[i]; |
@@ -323,10 +301,8 @@ bool EventRewriter::RewriteWithKeyboardRemappingsByKeySym( |
continue; |
*remapped_native_keysym = map.output_keysym; |
- *remapped_keycode = map.output_keycode; |
*remapped_native_mods = (native_mods & ~map.input_native_mods) | |
map.output_native_mods; |
- *remapped_mods = (mods & ~map.input_mods) | map.output_mods; |
return true; |
} |
@@ -338,11 +314,8 @@ bool EventRewriter::RewriteWithKeyboardRemappingsByKeyCode( |
size_t num_remappings, |
KeyCode keycode, |
unsigned int native_mods, |
- unsigned int mods, |
KeySym* remapped_native_keysym, |
- unsigned int* remapped_native_mods, |
- ui::KeyboardCode* remapped_keycode, |
- unsigned int* remapped_mods) { |
+ unsigned int* remapped_native_mods) { |
for (size_t i = 0; i < num_remappings; ++i) { |
const KeyboardRemapping& map = remappings[i]; |
@@ -354,16 +327,13 @@ bool EventRewriter::RewriteWithKeyboardRemappingsByKeyCode( |
continue; |
*remapped_native_keysym = map.output_keysym; |
- *remapped_keycode = map.output_keycode; |
*remapped_native_mods = (native_mods & ~map.input_native_mods) | |
map.output_native_mods; |
- *remapped_mods = (mods & ~map.input_mods) | map.output_mods; |
return true; |
} |
return false; |
} |
-#endif // defined(OS_CHROMEOS) |
const PrefService* EventRewriter::GetPrefService() const { |
if (pref_service_for_testing_) |
@@ -372,11 +342,10 @@ const PrefService* EventRewriter::GetPrefService() const { |
return profile ? profile->GetPrefs() : NULL; |
} |
-void EventRewriter::Rewrite(ui::KeyEvent* event) { |
-#if defined(OS_CHROMEOS) |
+void EventRewriter::Rewrite(XEvent* event) { |
// Do not rewrite an event sent by ui_controls::SendKeyPress(). See |
// crbug.com/136465. |
- if (event->native_event()->xkey.send_event) |
+ if (event->xkey.send_event) |
return; |
// Keyboard driven rewriting happen first. Skip further processing if event is |
@@ -385,7 +354,7 @@ void EventRewriter::Rewrite(ui::KeyEvent* event) { |
event)) { |
return; |
} |
-#endif |
+ |
RewriteModifiers(event); |
RewriteNumPadKeys(event); |
RewriteExtendedKeys(event); |
@@ -409,15 +378,12 @@ bool EventRewriter::IsAppleKeyboard() const { |
} |
void EventRewriter::GetRemappedModifierMasks( |
- int original_flags, |
unsigned int original_native_modifiers, |
- int* remapped_flags, |
unsigned int* remapped_native_modifiers) const { |
-#if defined(OS_CHROMEOS) |
// TODO(glotov): remove the following condition when we do not restart chrome |
// when user logs in as guest. See Rewrite() for details. |
- if (chromeos::UserManager::Get()->IsLoggedInAsGuest() && |
- chromeos::LoginDisplayHostImpl::default_host()) { |
+ if (UserManager::Get()->IsLoggedInAsGuest() && |
+ LoginDisplayHostImpl::default_host()) { |
return; |
} |
@@ -448,20 +414,14 @@ void EventRewriter::GetRemappedModifierMasks( |
remapped_key = kModifierRemappingCtrl; |
} |
if (remapped_key) { |
- *remapped_flags |= remapped_key->flag; |
*remapped_native_modifiers |= remapped_key->native_modifier; |
} else { |
- *remapped_flags |= kModifierFlagToPrefName[i].flag; |
*remapped_native_modifiers |= |
kModifierFlagToPrefName[i].native_modifier; |
} |
} |
} |
- *remapped_flags = |
- (original_flags & ~(ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN)) | |
- *remapped_flags; |
- |
unsigned int native_mask = Mod4Mask | ControlMask | Mod1Mask; |
if (!skip_mod2) |
native_mask |= Mod2Mask; |
@@ -470,11 +430,10 @@ void EventRewriter::GetRemappedModifierMasks( |
*remapped_native_modifiers = |
(original_native_modifiers & ~native_mask) | |
*remapped_native_modifiers; |
-#endif |
} |
-bool EventRewriter::RewriteModifiers(ui::KeyEvent* event) { |
-#if defined(OS_CHROMEOS) |
+bool EventRewriter::RewriteModifiers(XEvent* event) { |
+ DCHECK(event->type == KeyPress || event->type == KeyRelease); |
// Do nothing if we have just logged in as guest but have not restarted chrome |
// process yet (so we are still on the login screen). In this situations we |
// have no user profile so can not do anything useful. |
@@ -482,22 +441,20 @@ bool EventRewriter::RewriteModifiers(ui::KeyEvent* event) { |
// restart chrome process. In future this is to be changed. |
// TODO(glotov): remove the following condition when we do not restart chrome |
// when user logs in as guest. |
- if (chromeos::UserManager::Get()->IsLoggedInAsGuest() && |
- chromeos::LoginDisplayHostImpl::default_host()) |
+ if (UserManager::Get()->IsLoggedInAsGuest() && |
+ LoginDisplayHostImpl::default_host()) |
return false; |
const PrefService* pref_service = GetPrefService(); |
if (!pref_service) |
return false; |
- DCHECK_EQ(chromeos::input_method::kControlKey, |
- kModifierRemappingCtrl->remap_to); |
+ DCHECK_EQ(input_method::kControlKey, kModifierRemappingCtrl->remap_to); |
- XEvent* xev = event->native_event(); |
- XKeyEvent* xkey = &(xev->xkey); |
+ XKeyEvent* xkey = &event->xkey; |
KeySym keysym = XLookupKeysym(xkey, 0); |
- |
- ui::KeyboardCode remapped_keycode = event->key_code(); |
+ ui::KeyboardCode original_keycode = ui::KeyboardCodeFromNative(event); |
+ ui::KeyboardCode remapped_keycode = original_keycode; |
KeyCode remapped_native_keycode = xkey->keycode; |
// First, remap |keysym|. |
@@ -552,113 +509,93 @@ bool EventRewriter::RewriteModifiers(ui::KeyEvent* event) { |
} |
if (remapped_key) { |
+ int flags = ui::EventFlagsFromNative(event); |
remapped_keycode = remapped_key->keycode; |
- const size_t level = (event->IsShiftDown() ? (1 << 1) : 0) + |
+ const size_t level = ((flags & ui::EF_SHIFT_DOWN) ? (1 << 1) : 0) + |
(IsRight(keysym) ? (1 << 0) : 0); |
const KeySym native_keysym = remapped_key->native_keysyms[level]; |
remapped_native_keycode = NativeKeySymToNativeKeycode(native_keysym); |
} |
// Next, remap modifier bits. |
- int remapped_flags = 0; |
unsigned int remapped_native_modifiers = 0U; |
- GetRemappedModifierMasks(event->flags(), xkey->state, |
- &remapped_flags, &remapped_native_modifiers); |
+ GetRemappedModifierMasks(xkey->state, &remapped_native_modifiers); |
// Toggle Caps Lock if the remapped key is ui::VKEY_CAPITAL, but do nothing if |
// the original key is ui::VKEY_CAPITAL (i.e. a Caps Lock key on an external |
// keyboard is pressed) since X can handle that case. |
- if ((event->type() == ui::ET_KEY_PRESSED) && |
- (event->key_code() != ui::VKEY_CAPITAL) && |
- (remapped_keycode == ui::VKEY_CAPITAL)) { |
- chromeos::input_method::XKeyboard* xkeyboard = xkeyboard_for_testing_ ? |
+ if (event->type == KeyPress && |
+ original_keycode != ui::VKEY_CAPITAL && |
+ remapped_keycode == ui::VKEY_CAPITAL) { |
+ input_method::XKeyboard* xkeyboard = xkeyboard_for_testing_ ? |
xkeyboard_for_testing_ : |
- chromeos::input_method::InputMethodManager::Get()->GetXKeyboard(); |
+ input_method::InputMethodManager::Get()->GetXKeyboard(); |
xkeyboard->SetCapsLockEnabled(!xkeyboard->CapsLockIsEnabled()); |
} |
- OverwriteEvent(event, |
- remapped_native_keycode, remapped_native_modifiers, |
- remapped_keycode, remapped_flags); |
+ OverwriteEvent(event, remapped_native_keycode, remapped_native_modifiers); |
return true; |
-#else |
- // TODO(yusukes): Support Ash on other platforms if needed. |
- return false; |
-#endif |
} |
-bool EventRewriter::RewriteNumPadKeys(ui::KeyEvent* event) { |
+bool EventRewriter::RewriteNumPadKeys(XEvent* event) { |
+ DCHECK(event->type == KeyPress || event->type == KeyRelease); |
bool rewritten = false; |
-#if defined(OS_CHROMEOS) |
- XEvent* xev = event->native_event(); |
- XKeyEvent* xkey = &(xev->xkey); |
- |
+ XKeyEvent* xkey = &event->xkey; |
const KeySym keysym = XLookupKeysym(xkey, 0); |
switch (keysym) { |
case XK_KP_Insert: |
OverwriteEvent(event, NativeKeySymToNativeKeycode(XK_KP_0), |
- xkey->state | Mod2Mask, |
- ui::VKEY_NUMPAD0, event->flags()); |
+ xkey->state | Mod2Mask); |
rewritten = true; |
break; |
case XK_KP_Delete: |
OverwriteEvent(event, NativeKeySymToNativeKeycode(XK_KP_Decimal), |
- xkey->state | Mod2Mask, |
- ui::VKEY_DECIMAL, event->flags()); |
+ xkey->state | Mod2Mask); |
rewritten = true; |
break; |
case XK_KP_End: |
OverwriteEvent(event, NativeKeySymToNativeKeycode(XK_KP_1), |
- xkey->state | Mod2Mask, |
- ui::VKEY_NUMPAD1, event->flags()); |
+ xkey->state | Mod2Mask); |
rewritten = true; |
break; |
case XK_KP_Down: |
OverwriteEvent(event, NativeKeySymToNativeKeycode(XK_KP_2), |
- xkey->state | Mod2Mask, |
- ui::VKEY_NUMPAD2, event->flags()); |
+ xkey->state | Mod2Mask); |
rewritten = true; |
break; |
case XK_KP_Next: |
OverwriteEvent(event, NativeKeySymToNativeKeycode(XK_KP_3), |
- xkey->state | Mod2Mask, |
- ui::VKEY_NUMPAD3, event->flags()); |
+ xkey->state | Mod2Mask); |
rewritten = true; |
break; |
case XK_KP_Left: |
OverwriteEvent(event, NativeKeySymToNativeKeycode(XK_KP_4), |
- xkey->state | Mod2Mask, |
- ui::VKEY_NUMPAD4, event->flags()); |
+ xkey->state | Mod2Mask); |
rewritten = true; |
break; |
case XK_KP_Begin: |
OverwriteEvent(event, NativeKeySymToNativeKeycode(XK_KP_5), |
- xkey->state | Mod2Mask, |
- ui::VKEY_NUMPAD5, event->flags()); |
+ xkey->state | Mod2Mask); |
rewritten = true; |
break; |
case XK_KP_Right: |
OverwriteEvent(event, NativeKeySymToNativeKeycode(XK_KP_6), |
- xkey->state | Mod2Mask, |
- ui::VKEY_NUMPAD6, event->flags()); |
+ xkey->state | Mod2Mask); |
rewritten = true; |
break; |
case XK_KP_Home: |
OverwriteEvent(event, NativeKeySymToNativeKeycode(XK_KP_7), |
- xkey->state | Mod2Mask, |
- ui::VKEY_NUMPAD7, event->flags()); |
+ xkey->state | Mod2Mask); |
rewritten = true; |
break; |
case XK_KP_Up: |
OverwriteEvent(event, NativeKeySymToNativeKeycode(XK_KP_8), |
- xkey->state | Mod2Mask, |
- ui::VKEY_NUMPAD8, event->flags()); |
+ xkey->state | Mod2Mask); |
rewritten = true; |
break; |
case XK_KP_Prior: |
OverwriteEvent(event, NativeKeySymToNativeKeycode(XK_KP_9), |
- xkey->state | Mod2Mask, |
- ui::VKEY_NUMPAD9, event->flags()); |
+ xkey->state | Mod2Mask); |
rewritten = true; |
break; |
case XK_KP_Divide: |
@@ -667,199 +604,145 @@ bool EventRewriter::RewriteNumPadKeys(ui::KeyEvent* event) { |
case XK_KP_Add: |
case XK_KP_Enter: |
// Add Mod2Mask for consistency. |
- OverwriteEvent(event, xkey->keycode, xkey->state | Mod2Mask, |
- event->key_code(), event->flags()); |
+ OverwriteEvent(event, xkey->keycode, xkey->state | Mod2Mask); |
rewritten = true; |
break; |
default: |
break; |
} |
-#else |
- // TODO(yusukes): Support Ash on other platforms if needed. |
-#endif |
return rewritten; |
} |
-bool EventRewriter::RewriteExtendedKeys(ui::KeyEvent* event) { |
-#if defined(OS_CHROMEOS) |
- XEvent* xev = event->native_event(); |
- XKeyEvent* xkey = &(xev->xkey); |
+bool EventRewriter::RewriteExtendedKeys(XEvent* event) { |
+ DCHECK(event->type == KeyPress || event->type == KeyRelease); |
+ XKeyEvent* xkey = &event->xkey; |
const KeySym keysym = XLookupKeysym(xkey, 0); |
KeySym remapped_native_keysym = 0; |
unsigned int remapped_native_mods = 0; |
- ui::KeyboardCode remapped_keycode = ui::VKEY_UNKNOWN; |
- unsigned int remapped_mods = 0; |
+ bool rewritten = false; |
if (xkey->state & Mod4Mask) { |
// Allow Search to avoid rewriting extended keys. |
static const KeyboardRemapping kAvoidRemappings[] = { |
{ // Alt+Backspace |
- XK_BackSpace, |
- ui::EF_ALT_DOWN, Mod1Mask | Mod4Mask, |
- XK_BackSpace, ui::VKEY_BACK, |
- ui::EF_ALT_DOWN, Mod1Mask, |
+ XK_BackSpace, Mod1Mask | Mod4Mask, |
+ XK_BackSpace, Mod1Mask, |
}, |
{ // Control+Alt+Up |
- XK_Up, |
- ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, |
- Mod1Mask | ControlMask | Mod4Mask, |
- XK_Up, ui::VKEY_UP, |
- ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask, |
+ XK_Up, Mod1Mask | ControlMask | Mod4Mask, |
+ XK_Up, Mod1Mask | ControlMask, |
}, |
{ // Alt+Up |
- XK_Up, |
- ui::EF_ALT_DOWN, Mod1Mask | Mod4Mask, |
- XK_Up, ui::VKEY_UP, |
- ui::EF_ALT_DOWN, Mod1Mask, |
+ XK_Up, Mod1Mask | Mod4Mask, |
+ XK_Up, Mod1Mask, |
}, |
{ // Control+Alt+Down |
- XK_Down, |
- ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, |
- Mod1Mask | ControlMask | Mod4Mask, |
- XK_Down, ui::VKEY_DOWN, |
- ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask, |
+ XK_Down, Mod1Mask | ControlMask | Mod4Mask, |
+ XK_Down, Mod1Mask | ControlMask, |
}, |
{ // Alt+Down |
- XK_Down, |
- ui::EF_ALT_DOWN, Mod1Mask | Mod4Mask, |
- XK_Down, ui::VKEY_DOWN, |
- ui::EF_ALT_DOWN, Mod1Mask, |
+ XK_Down, Mod1Mask | Mod4Mask, |
+ XK_Down, Mod1Mask, |
} |
}; |
- RewriteWithKeyboardRemappingsByKeySym(kAvoidRemappings, |
- arraysize(kAvoidRemappings), |
- keysym, |
- xkey->state, |
- event->flags(), |
- &remapped_native_keysym, |
- &remapped_native_mods, |
- &remapped_keycode, |
- &remapped_mods); |
+ rewritten = RewriteWithKeyboardRemappingsByKeySym( |
+ kAvoidRemappings, |
+ arraysize(kAvoidRemappings), |
+ keysym, |
+ xkey->state, |
+ &remapped_native_keysym, |
+ &remapped_native_mods); |
} |
- if (remapped_keycode == ui::VKEY_UNKNOWN) { |
+ if (!rewritten) { |
static const KeyboardRemapping kSearchRemappings[] = { |
{ // Search+BackSpace -> Delete |
- XK_BackSpace, |
- 0, Mod4Mask, |
- XK_Delete, ui::VKEY_DELETE, |
- 0, 0 |
+ XK_BackSpace, Mod4Mask, |
+ XK_Delete, 0 |
}, |
{ // Search+Left -> Home |
- XK_Left, |
- 0, Mod4Mask, |
- XK_Home, ui::VKEY_HOME, |
- 0, 0 |
+ XK_Left, Mod4Mask, |
+ XK_Home, 0 |
}, |
{ // Search+Up -> Prior (aka PageUp) |
- XK_Up, |
- 0, Mod4Mask, |
- XK_Prior, ui::VKEY_PRIOR, |
- 0, 0 |
+ XK_Up, Mod4Mask, |
+ XK_Prior, 0 |
}, |
{ // Search+Right -> End |
- XK_Right, |
- 0, Mod4Mask, |
- XK_End, ui::VKEY_END, |
- 0, 0 |
+ XK_Right, Mod4Mask, |
+ XK_End, 0 |
}, |
{ // Search+Down -> Next (aka PageDown) |
- XK_Down, |
- 0, Mod4Mask, |
- XK_Next, ui::VKEY_NEXT, |
- 0, 0 |
+ XK_Down, Mod4Mask, |
+ XK_Next, 0 |
}, |
{ // Search+Period -> Insert |
- XK_period, |
- 0, Mod4Mask, |
- XK_Insert, ui::VKEY_INSERT, |
- 0, 0 |
+ XK_period, Mod4Mask, |
+ XK_Insert, 0 |
} |
}; |
- RewriteWithKeyboardRemappingsByKeySym(kSearchRemappings, |
- arraysize(kSearchRemappings), |
- keysym, |
- xkey->state, |
- event->flags(), |
- &remapped_native_keysym, |
- &remapped_native_mods, |
- &remapped_keycode, |
- &remapped_mods); |
+ rewritten = RewriteWithKeyboardRemappingsByKeySym( |
+ kSearchRemappings, |
+ arraysize(kSearchRemappings), |
+ keysym, |
+ xkey->state, |
+ &remapped_native_keysym, |
+ &remapped_native_mods); |
} |
- if (remapped_keycode == ui::VKEY_UNKNOWN) { |
+ if (!rewritten) { |
static const KeyboardRemapping kNonSearchRemappings[] = { |
{ // Alt+BackSpace -> Delete |
- XK_BackSpace, |
- ui::EF_ALT_DOWN, Mod1Mask, |
- XK_Delete, ui::VKEY_DELETE, |
- 0, 0 |
+ XK_BackSpace, Mod1Mask, |
+ XK_Delete, 0 |
}, |
{ // Control+Alt+Up -> Home |
- XK_Up, |
- ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask, |
- XK_Home, ui::VKEY_HOME, |
- 0, 0 |
+ XK_Up, Mod1Mask | ControlMask, |
+ XK_Home, 0 |
}, |
{ // Alt+Up -> Prior (aka PageUp) |
- XK_Up, |
- ui::EF_ALT_DOWN, Mod1Mask, |
- XK_Prior, ui::VKEY_PRIOR, |
- 0, 0 |
+ XK_Up, Mod1Mask, |
+ XK_Prior, 0 |
}, |
{ // Control+Alt+Down -> End |
- XK_Down, |
- ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask, |
- XK_End, ui::VKEY_END, |
- 0, 0 |
+ XK_Down, Mod1Mask | ControlMask, |
+ XK_End, 0 |
}, |
{ // Alt+Down -> Next (aka PageDown) |
- XK_Down, |
- ui::EF_ALT_DOWN, Mod1Mask, |
- XK_Next, ui::VKEY_NEXT, |
- 0, 0 |
+ XK_Down, Mod1Mask, |
+ XK_Next, 0 |
} |
}; |
- RewriteWithKeyboardRemappingsByKeySym(kNonSearchRemappings, |
- arraysize(kNonSearchRemappings), |
- keysym, |
- xkey->state, |
- event->flags(), |
- &remapped_native_keysym, |
- &remapped_native_mods, |
- &remapped_keycode, |
- &remapped_mods); |
+ rewritten = RewriteWithKeyboardRemappingsByKeySym( |
+ kNonSearchRemappings, |
+ arraysize(kNonSearchRemappings), |
+ keysym, |
+ xkey->state, |
+ &remapped_native_keysym, |
+ &remapped_native_mods); |
} |
- if (remapped_keycode == ui::VKEY_UNKNOWN) |
+ if (!rewritten) |
return false; |
OverwriteEvent(event, |
NativeKeySymToNativeKeycode(remapped_native_keysym), |
- remapped_native_mods, |
- remapped_keycode, |
- remapped_mods); |
+ remapped_native_mods); |
return true; |
-#else |
- // TODO(yusukes): Support Ash on other platforms if needed. |
- return false; |
-#endif |
} |
-bool EventRewriter::RewriteFunctionKeys(ui::KeyEvent* event) { |
-#if defined(OS_CHROMEOS) |
- XEvent* xev = event->native_event(); |
- XKeyEvent* xkey = &(xev->xkey); |
+bool EventRewriter::RewriteFunctionKeys(XEvent* event) { |
+ DCHECK(event->type == KeyPress || event->type == KeyRelease); |
+ XKeyEvent* xkey = &event->xkey; |
const KeySym keysym = XLookupKeysym(xkey, 0); |
KeySym remapped_native_keysym = 0; |
unsigned int remapped_native_mods = 0; |
- ui::KeyboardCode remapped_keycode = ui::VKEY_UNKNOWN; |
- unsigned int remapped_mods = 0; |
+ bool rewritten = false; |
// By default the top row (F1-F12) keys are special keys for back, forward, |
// brightness, volume, etc. However, windows for v2 apps can optionally |
@@ -869,71 +752,65 @@ bool EventRewriter::RewriteFunctionKeys(ui::KeyEvent* event) { |
if ((xkey->state & Mod4Mask) && top_row_keys_are_special_keys) { |
// Allow Search to avoid rewriting F1-F12. |
static const KeyboardRemapping kFkeysToFkeys[] = { |
- { XK_F1, 0, Mod4Mask, XK_F1, ui::VKEY_F1, }, |
- { XK_F2, 0, Mod4Mask, XK_F2, ui::VKEY_F2, }, |
- { XK_F3, 0, Mod4Mask, XK_F3, ui::VKEY_F3, }, |
- { XK_F4, 0, Mod4Mask, XK_F4, ui::VKEY_F4, }, |
- { XK_F5, 0, Mod4Mask, XK_F5, ui::VKEY_F5, }, |
- { XK_F6, 0, Mod4Mask, XK_F6, ui::VKEY_F6, }, |
- { XK_F7, 0, Mod4Mask, XK_F7, ui::VKEY_F7, }, |
- { XK_F8, 0, Mod4Mask, XK_F8, ui::VKEY_F8, }, |
- { XK_F9, 0, Mod4Mask, XK_F9, ui::VKEY_F9, }, |
- { XK_F10, 0, Mod4Mask, XK_F10, ui::VKEY_F10, }, |
- { XK_F11, 0, Mod4Mask, XK_F11, ui::VKEY_F11, }, |
- { XK_F12, 0, Mod4Mask, XK_F12, ui::VKEY_F12, }, |
+ { XK_F1, Mod4Mask, XK_F1, }, |
+ { XK_F2, Mod4Mask, XK_F2, }, |
+ { XK_F3, Mod4Mask, XK_F3, }, |
+ { XK_F4, Mod4Mask, XK_F4, }, |
+ { XK_F5, Mod4Mask, XK_F5, }, |
+ { XK_F6, Mod4Mask, XK_F6, }, |
+ { XK_F7, Mod4Mask, XK_F7, }, |
+ { XK_F8, Mod4Mask, XK_F8, }, |
+ { XK_F9, Mod4Mask, XK_F9, }, |
+ { XK_F10, Mod4Mask, XK_F10, }, |
+ { XK_F11, Mod4Mask, XK_F11, }, |
+ { XK_F12, Mod4Mask, XK_F12, }, |
}; |
- RewriteWithKeyboardRemappingsByKeySym(kFkeysToFkeys, |
- arraysize(kFkeysToFkeys), |
- keysym, |
- xkey->state, |
- event->flags(), |
- &remapped_native_keysym, |
- &remapped_native_mods, |
- &remapped_keycode, |
- &remapped_mods); |
+ rewritten = RewriteWithKeyboardRemappingsByKeySym( |
+ kFkeysToFkeys, |
+ arraysize(kFkeysToFkeys), |
+ keysym, |
+ xkey->state, |
+ &remapped_native_keysym, |
+ &remapped_native_mods); |
} |
- if (remapped_keycode == ui::VKEY_UNKNOWN) { |
+ if (!rewritten) { |
static const KeyboardRemapping kFkeysToSpecialKeys[] = { |
- { XK_F1, 0, 0, XF86XK_Back, ui::VKEY_BROWSER_BACK, 0, 0 }, |
- { XK_F2, 0, 0, XF86XK_Forward, ui::VKEY_BROWSER_FORWARD, 0, 0 }, |
- { XK_F3, 0, 0, XF86XK_Reload, ui::VKEY_BROWSER_REFRESH, 0, 0 }, |
- { XK_F4, 0, 0, XF86XK_LaunchB, ui::VKEY_MEDIA_LAUNCH_APP2, 0, 0 }, |
- { XK_F5, 0, 0, XF86XK_LaunchA, ui::VKEY_MEDIA_LAUNCH_APP1, 0, 0 }, |
- { XK_F6, 0, 0, XF86XK_MonBrightnessDown, ui::VKEY_BRIGHTNESS_DOWN, 0, 0 }, |
- { XK_F7, 0, 0, XF86XK_MonBrightnessUp, ui::VKEY_BRIGHTNESS_UP, 0, 0 }, |
- { XK_F8, 0, 0, XF86XK_AudioMute, ui::VKEY_VOLUME_MUTE, 0, 0 }, |
- { XK_F9, 0, 0, XF86XK_AudioLowerVolume, ui::VKEY_VOLUME_DOWN, 0, 0 }, |
- { XK_F10, 0, 0, XF86XK_AudioRaiseVolume, ui::VKEY_VOLUME_UP, 0, 0 }, |
+ { XK_F1, 0, XF86XK_Back, 0 }, |
+ { XK_F2, 0, XF86XK_Forward, 0 }, |
+ { XK_F3, 0, XF86XK_Reload, 0 }, |
+ { XK_F4, 0, XF86XK_LaunchB, 0 }, |
+ { XK_F5, 0, XF86XK_LaunchA, 0 }, |
+ { XK_F6, 0, XF86XK_MonBrightnessDown, 0 }, |
+ { XK_F7, 0, XF86XK_MonBrightnessUp, 0 }, |
+ { XK_F8, 0, XF86XK_AudioMute, 0 }, |
+ { XK_F9, 0, XF86XK_AudioLowerVolume, 0 }, |
+ { XK_F10, 0, XF86XK_AudioRaiseVolume, 0 }, |
}; |
if (top_row_keys_are_special_keys) { |
// Rewrite the F1-F12 keys on a Chromebook keyboard to special keys. |
- RewriteWithKeyboardRemappingsByKeySym(kFkeysToSpecialKeys, |
- arraysize(kFkeysToSpecialKeys), |
- keysym, |
- xkey->state, |
- event->flags(), |
- &remapped_native_keysym, |
- &remapped_native_mods, |
- &remapped_keycode, |
- &remapped_mods); |
+ rewritten = RewriteWithKeyboardRemappingsByKeySym( |
+ kFkeysToSpecialKeys, |
+ arraysize(kFkeysToSpecialKeys), |
+ keysym, |
+ xkey->state, |
+ &remapped_native_keysym, |
+ &remapped_native_mods); |
} else if (xkey->state & Mod4Mask) { |
// Use Search + F1-F12 for the special keys. |
- RewriteWithKeyboardRemappingsByKeySym(kFkeysToSpecialKeys, |
- arraysize(kFkeysToSpecialKeys), |
- keysym, |
- xkey->state & !Mod4Mask, |
- event->flags(), |
- &remapped_native_keysym, |
- &remapped_native_mods, |
- &remapped_keycode, |
- &remapped_mods); |
+ rewritten = RewriteWithKeyboardRemappingsByKeySym( |
+ kFkeysToSpecialKeys, |
+ arraysize(kFkeysToSpecialKeys), |
+ keysym, |
+ xkey->state & !Mod4Mask, |
+ &remapped_native_keysym, |
+ &remapped_native_mods); |
} |
} |
- if (remapped_keycode == ui::VKEY_UNKNOWN && xkey->state & Mod4Mask) { |
+ if (!rewritten && (xkey->state & Mod4Mask)) { |
// Remap Search+<number> to F<number>. |
// We check the keycode here instead of the keysym, as these keys have |
// different keysyms when modifiers are pressed, such as shift. |
@@ -942,64 +819,47 @@ bool EventRewriter::RewriteFunctionKeys(ui::KeyEvent* event) { |
// should make layout-specific choices here. For eg. on a french keyboard |
// "-" and "6" are the same key, so F11 will not be accessible. |
static const KeyboardRemapping kNumberKeysToFkeys[] = { |
- { XK_1, 0, Mod4Mask, XK_F1, ui::VKEY_F1, 0, 0 }, |
- { XK_2, 0, Mod4Mask, XK_F2, ui::VKEY_F2, 0, 0 }, |
- { XK_3, 0, Mod4Mask, XK_F3, ui::VKEY_F3, 0, 0 }, |
- { XK_4, 0, Mod4Mask, XK_F4, ui::VKEY_F4, 0, 0 }, |
- { XK_5, 0, Mod4Mask, XK_F5, ui::VKEY_F5, 0, 0 }, |
- { XK_6, 0, Mod4Mask, XK_F6, ui::VKEY_F6, 0, 0 }, |
- { XK_7, 0, Mod4Mask, XK_F7, ui::VKEY_F7, 0, 0 }, |
- { XK_8, 0, Mod4Mask, XK_F8, ui::VKEY_F8, 0, 0 }, |
- { XK_9, 0, Mod4Mask, XK_F9, ui::VKEY_F9, 0, 0 }, |
- { XK_0, 0, Mod4Mask, XK_F10, ui::VKEY_F10, 0, 0 }, |
- { XK_minus, 0, Mod4Mask, XK_F11, ui::VKEY_F11, 0, 0 }, |
- { XK_equal, 0, Mod4Mask, XK_F12, ui::VKEY_F12, 0, 0 } |
+ { XK_1, Mod4Mask, XK_F1, 0 }, |
+ { XK_2, Mod4Mask, XK_F2, 0 }, |
+ { XK_3, Mod4Mask, XK_F3, 0 }, |
+ { XK_4, Mod4Mask, XK_F4, 0 }, |
+ { XK_5, Mod4Mask, XK_F5, 0 }, |
+ { XK_6, Mod4Mask, XK_F6, 0 }, |
+ { XK_7, Mod4Mask, XK_F7, 0 }, |
+ { XK_8, Mod4Mask, XK_F8, 0 }, |
+ { XK_9, Mod4Mask, XK_F9, 0 }, |
+ { XK_0, Mod4Mask, XK_F10, 0 }, |
+ { XK_minus, Mod4Mask, XK_F11, 0 }, |
+ { XK_equal, Mod4Mask, XK_F12, 0 } |
}; |
- RewriteWithKeyboardRemappingsByKeyCode(kNumberKeysToFkeys, |
- arraysize(kNumberKeysToFkeys), |
- xkey->keycode, |
- xkey->state, |
- event->flags(), |
- &remapped_native_keysym, |
- &remapped_native_mods, |
- &remapped_keycode, |
- &remapped_mods); |
+ rewritten = RewriteWithKeyboardRemappingsByKeyCode( |
+ kNumberKeysToFkeys, |
+ arraysize(kNumberKeysToFkeys), |
+ xkey->keycode, |
+ xkey->state, |
+ &remapped_native_keysym, |
+ &remapped_native_mods); |
} |
- if (remapped_keycode == ui::VKEY_UNKNOWN) |
+ if (!rewritten) |
return false; |
OverwriteEvent(event, |
NativeKeySymToNativeKeycode(remapped_native_keysym), |
- remapped_native_mods, |
- remapped_keycode, |
- remapped_mods); |
+ remapped_native_mods); |
return true; |
-#else |
- // TODO(danakj): Support Ash on other platforms if needed. |
- return false; |
-#endif |
} |
-void EventRewriter::RewriteLocatedEvent(ui::LocatedEvent* event) { |
-#if defined(OS_CHROMEOS) |
- if (event->flags() & ui::EF_IS_SYNTHESIZED) |
- return; |
- |
- XEvent* xevent = event->native_event(); |
- if (!xevent || xevent->type != GenericEvent) |
- return; |
- |
- XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xevent->xcookie.data); |
+void EventRewriter::RewriteLocatedEvent(XEvent* event) { |
+ DCHECK_EQ(GenericEvent, event->type); |
+ XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(event->xcookie.data); |
if (xievent->evtype != XI_ButtonPress && xievent->evtype != XI_ButtonRelease) |
return; |
// First, remap modifier masks. |
- int remapped_flags = 0; |
unsigned int remapped_native_modifiers = 0U; |
- GetRemappedModifierMasks(event->flags(), xievent->mods.effective, |
- &remapped_flags, &remapped_native_modifiers); |
+ GetRemappedModifierMasks(xievent->mods.effective, &remapped_native_modifiers); |
xievent->mods.effective = remapped_native_modifiers; |
// Then, remap Alt+Button1 to Button3. |
@@ -1019,34 +879,15 @@ void EventRewriter::RewriteLocatedEvent(ui::LocatedEvent* event) { |
pressed_device_ids_.insert(xievent->sourceid); |
} |
} |
- |
- const int mouse_event_flags = event->flags() & |
- (ui::EF_IS_DOUBLE_CLICK | ui::EF_IS_TRIPLE_CLICK | ui::EF_IS_NON_CLIENT | |
- ui::EF_IS_SYNTHESIZED | ui::EF_FROM_TOUCH); |
- event->set_flags(mouse_event_flags | ui::EventFlagsFromNative(xevent)); |
-#else |
- // TODO(yusukes): Support Ash on other platforms if needed. |
-#endif |
} |
-void EventRewriter::OverwriteEvent(ui::KeyEvent* event, |
+void EventRewriter::OverwriteEvent(XEvent* event, |
unsigned int new_native_keycode, |
- unsigned int new_native_state, |
- ui::KeyboardCode new_keycode, |
- int new_flags) { |
-#if defined(OS_CHROMEOS) |
- XEvent* xev = event->native_event(); |
- XKeyEvent* xkey = &(xev->xkey); |
+ unsigned int new_native_state) { |
+ DCHECK(event->type == KeyPress || event->type == KeyRelease); |
+ XKeyEvent* xkey = &event->xkey; |
xkey->keycode = new_native_keycode; |
xkey->state = new_native_state; |
- event->set_key_code(new_keycode); |
- event->set_character(ui::GetCharacterFromKeyCode(event->key_code(), |
- new_flags)); |
- event->set_flags(new_flags); |
- event->NormalizeFlags(); |
-#else |
- // TODO(yusukes): Support Ash on other platforms if needed. |
-#endif |
} |
EventRewriter::DeviceType EventRewriter::DeviceAddedInternal( |
@@ -1062,3 +903,5 @@ EventRewriter::DeviceType EventRewriter::DeviceAddedInternal( |
device_id_to_type_[device_id] = type; |
return type; |
} |
+ |
+} // namespace chromeos |