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

Unified Diff: chrome/browser/chromeos/events/event_rewriter.cc

Issue 280413002: Fix handling of rewritten-Alt + Button1 -> Button3. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: review comments Created 6 years, 7 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/events/event_rewriter.cc
diff --git a/chrome/browser/chromeos/events/event_rewriter.cc b/chrome/browser/chromeos/events/event_rewriter.cc
index 2603e0519400b43345afd263b049287000255c77..4f7a99bed1b8a7befcdcdcc506ea405ab756b6d9 100644
--- a/chrome/browser/chromeos/events/event_rewriter.cc
+++ b/chrome/browser/chromeos/events/event_rewriter.cc
@@ -183,9 +183,7 @@ EventRewriter::DeviceType EventRewriter::DeviceAddedForTesting(
void EventRewriter::RewriteLocatedEventForTesting(const ui::Event& event,
int* flags) {
- MutableKeyState state = {*flags, ui::VKEY_UNKNOWN};
- RewriteLocatedEvent(event, &state);
- *flags = state.flags;
+ RewriteLocatedEvent(event, flags);
}
ui::EventRewriteStatus EventRewriter::RewriteEvent(
@@ -200,56 +198,17 @@ ui::EventRewriteStatus EventRewriter::RewriteEvent(
#endif
switch (event.type()) {
case ui::ET_KEY_PRESSED:
- case ui::ET_KEY_RELEASED: {
- const ui::KeyEvent& key_event = static_cast<const ui::KeyEvent&>(event);
- MutableKeyState state = {key_event.flags(), key_event.key_code()};
- RewriteModifierKeys(key_event, &state);
- RewriteNumPadKeys(key_event, &state);
- RewriteExtendedKeys(key_event, &state);
- RewriteFunctionKeys(key_event, &state);
- if ((key_event.flags() != state.flags) ||
- (key_event.key_code() != state.key_code)) {
- ui::KeyEvent* rewritten_key_event = new ui::KeyEvent(key_event);
- rewritten_event->reset(rewritten_key_event);
- rewritten_key_event->set_flags(state.flags);
- rewritten_key_event->set_key_code(state.key_code);
- rewritten_key_event->set_character(
- ui::GetCharacterFromKeyCode(state.key_code, state.flags));
- rewritten_key_event->NormalizeFlags();
-#if defined(USE_X11)
- xev = rewritten_key_event->native_event();
- if (xev) {
- XKeyEvent* xkey = &(xev->xkey);
- UpdateX11EventMask(state.flags, &xkey->state);
- xkey->keycode = XKeysymToKeycode(
- gfx::GetXDisplay(),
- ui::XKeysymForWindowsKeyCode(state.key_code,
- state.flags & ui::EF_SHIFT_DOWN));
- }
-#endif
- return ui::EVENT_REWRITE_REWRITTEN;
- }
- return ui::EVENT_REWRITE_CONTINUE;
- }
+ case ui::ET_KEY_RELEASED:
+ return RewriteKeyEvent(static_cast<const ui::KeyEvent&>(event),
+ rewritten_event);
case ui::ET_MOUSE_PRESSED:
case ui::ET_MOUSE_RELEASED:
+ return RewriteMouseEvent(static_cast<const ui::MouseEvent&>(event),
+ rewritten_event);
case ui::ET_TOUCH_PRESSED:
- case ui::ET_TOUCH_RELEASED: {
- MutableKeyState state = {event.flags(), ui::VKEY_UNKNOWN};
- RewriteLocatedEvent(event, &state);
- if (event.flags() != state.flags) {
- if (event.IsMouseEvent()) {
- rewritten_event->reset(
- new ui::MouseEvent(static_cast<const ui::MouseEvent&>(event)));
- } else {
- rewritten_event->reset(
- new ui::TouchEvent(static_cast<const ui::TouchEvent&>(event)));
- }
- rewritten_event->get()->set_flags(state.flags);
- return ui::EVENT_REWRITE_REWRITTEN;
- }
- return ui::EVENT_REWRITE_CONTINUE;
- }
+ case ui::ET_TOUCH_RELEASED:
+ return RewriteTouchEvent(static_cast<const ui::TouchEvent&>(event),
+ rewritten_event);
default:
return ui::EVENT_REWRITE_CONTINUE;
}
@@ -369,6 +328,100 @@ bool EventRewriter::RewriteWithKeyboardRemappingsByKeyCode(
return false;
}
+ui::EventRewriteStatus EventRewriter::RewriteKeyEvent(
+ const ui::KeyEvent& key_event,
+ scoped_ptr<ui::Event>* rewritten_event) {
+ MutableKeyState state = {key_event.flags(), key_event.key_code()};
+ RewriteModifierKeys(key_event, &state);
+ RewriteNumPadKeys(key_event, &state);
+ RewriteExtendedKeys(key_event, &state);
+ RewriteFunctionKeys(key_event, &state);
+ if ((key_event.flags() == state.flags) &&
+ (key_event.key_code() == state.key_code)) {
+ return ui::EVENT_REWRITE_CONTINUE;
+ }
+ ui::KeyEvent* rewritten_key_event = new ui::KeyEvent(key_event);
+ rewritten_event->reset(rewritten_key_event);
+ rewritten_key_event->set_flags(state.flags);
+ rewritten_key_event->set_key_code(state.key_code);
+ rewritten_key_event->set_character(
+ ui::GetCharacterFromKeyCode(state.key_code, state.flags));
+ rewritten_key_event->NormalizeFlags();
+#if defined(USE_X11)
+ XEvent* xev = rewritten_key_event->native_event();
+ if (xev) {
+ XKeyEvent* xkey = &(xev->xkey);
sadrul 2014/06/02 00:19:52 Add a CHECK here that xev->type == KeyPress or Key
kpschoedel 2014/06/02 00:52:36 Done.
+ UpdateX11EventMask(rewritten_key_event->flags(), &xkey->state);
+ xkey->keycode =
+ XKeysymToKeycode(gfx::GetXDisplay(),
+ ui::XKeysymForWindowsKeyCode(
+ state.key_code, state.flags & ui::EF_SHIFT_DOWN));
+ }
+#endif
+ return ui::EVENT_REWRITE_REWRITTEN;
+}
+
+ui::EventRewriteStatus EventRewriter::RewriteMouseEvent(
+ const ui::MouseEvent& mouse_event,
+ scoped_ptr<ui::Event>* rewritten_event) {
+ int flags = mouse_event.flags();
+ RewriteLocatedEvent(mouse_event, &flags);
+ if (mouse_event.flags() == flags)
+ return ui::EVENT_REWRITE_CONTINUE;
+ ui::MouseEvent* rewritten_mouse_event = new ui::MouseEvent(mouse_event);
+ rewritten_event->reset(rewritten_mouse_event);
+ rewritten_mouse_event->set_flags(flags);
+#if defined(USE_X11)
+ XEvent* xev = rewritten_mouse_event->native_event();
+ if (xev) {
+ switch (xev->type) {
+ case ButtonPress:
+ case ButtonRelease: {
+ XButtonEvent* xbutton = &(xev->xbutton);
+ UpdateX11EventMask(rewritten_mouse_event->flags(), &xbutton->state);
+ break;
+ }
+ case GenericEvent: {
+ XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xev->xcookie.data);
+ CHECK(xievent->evtype == XI_ButtonPress ||
+ xievent->evtype == XI_ButtonRelease);
+ UpdateX11EventMask(
+ rewritten_mouse_event->flags(),
+ reinterpret_cast<unsigned int*>(&xievent->mods.effective));
+ break;
+ }
+ default:
+ NOTREACHED();
+ }
+ }
+#endif
+ return ui::EVENT_REWRITE_REWRITTEN;
+}
+
+ui::EventRewriteStatus EventRewriter::RewriteTouchEvent(
+ const ui::TouchEvent& touch_event,
+ scoped_ptr<ui::Event>* rewritten_event) {
+ int flags = touch_event.flags();
+ RewriteLocatedEvent(touch_event, &flags);
+ if (touch_event.flags() == flags)
+ return ui::EVENT_REWRITE_CONTINUE;
+ ui::TouchEvent* rewritten_touch_event = new ui::TouchEvent(touch_event);
+ rewritten_event->reset(rewritten_touch_event);
+ rewritten_touch_event->set_flags(flags);
+#if defined(USE_X11)
+ XEvent* xev = rewritten_touch_event->native_event();
+ if (xev) {
+ XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xev->xcookie.data);
+ if (xievent) {
+ UpdateX11EventMask(
+ rewritten_touch_event->flags(),
+ reinterpret_cast<unsigned int*>(&xievent->mods.effective));
+ }
+ }
+#endif
+ return ui::EVENT_REWRITE_REWRITTEN;
+}
+
void EventRewriter::RewriteModifierKeys(const ui::KeyEvent& key_event,
MutableKeyState* state) {
DCHECK(key_event.type() == ui::ET_KEY_PRESSED ||
@@ -658,13 +711,13 @@ void EventRewriter::RewriteFunctionKeys(const ui::KeyEvent& key_event,
}
void EventRewriter::RewriteLocatedEvent(const ui::Event& event,
- MutableKeyState* state) {
+ int* flags) {
const PrefService* pref_service = GetPrefService();
if (!pref_service)
return;
// First, remap modifier masks.
- state->flags = GetRemappedModifierMasks(*pref_service, event, state->flags);
+ *flags = GetRemappedModifierMasks(*pref_service, event, *flags);
#if defined(USE_X11)
// TODO(kpschoedel): de-X11 with unified device ids from crbug.com/360377
@@ -674,13 +727,15 @@ void EventRewriter::RewriteLocatedEvent(const ui::Event& event,
XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xevent->xcookie.data);
if (xievent->evtype != XI_ButtonPress && xievent->evtype != XI_ButtonRelease)
return;
+ UpdateX11EventMask(*flags,
+ reinterpret_cast<unsigned int*>(&xievent->mods.effective));
sadrul 2014/06/02 00:19:52 Should this happen after |flags| is changed in lin
kpschoedel 2014/06/02 00:52:36 No, this is updating the native (X11) flags so tha
sadrul 2014/06/02 00:58:47 In that case, do we need to UpdateX11EventMask() a
// Then, remap Alt+Button1 to Button3.
if ((xievent->evtype == XI_ButtonPress ||
pressed_device_ids_.count(xievent->sourceid)) &&
(xievent->mods.effective & Mod1Mask) && xievent->detail == Button1) {
- state->flags &= ~(ui::EF_ALT_DOWN | ui::EF_LEFT_MOUSE_BUTTON);
- state->flags |= ui::EF_RIGHT_MOUSE_BUTTON;
+ *flags &= ~(ui::EF_ALT_DOWN | ui::EF_LEFT_MOUSE_BUTTON);
+ *flags |= ui::EF_RIGHT_MOUSE_BUTTON;
xievent->mods.effective &= ~Mod1Mask;
xievent->detail = Button3;
if (xievent->evtype == XI_ButtonRelease) {
« no previous file with comments | « chrome/browser/chromeos/events/event_rewriter.h ('k') | chrome/browser/chromeos/events/event_rewriter_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698