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

Side by Side 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, 6 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/wm/window_state.h" 9 #include "ash/wm/window_state.h"
10 #include "ash/wm/window_util.h" 10 #include "ash/wm/window_util.h"
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 } 176 }
177 177
178 EventRewriter::DeviceType EventRewriter::DeviceAddedForTesting( 178 EventRewriter::DeviceType EventRewriter::DeviceAddedForTesting(
179 int device_id, 179 int device_id,
180 const std::string& device_name) { 180 const std::string& device_name) {
181 return DeviceAddedInternal(device_id, device_name); 181 return DeviceAddedInternal(device_id, device_name);
182 } 182 }
183 183
184 void EventRewriter::RewriteLocatedEventForTesting(const ui::Event& event, 184 void EventRewriter::RewriteLocatedEventForTesting(const ui::Event& event,
185 int* flags) { 185 int* flags) {
186 MutableKeyState state = {*flags, ui::VKEY_UNKNOWN}; 186 RewriteLocatedEvent(event, flags);
187 RewriteLocatedEvent(event, &state);
188 *flags = state.flags;
189 } 187 }
190 188
191 ui::EventRewriteStatus EventRewriter::RewriteEvent( 189 ui::EventRewriteStatus EventRewriter::RewriteEvent(
192 const ui::Event& event, 190 const ui::Event& event,
193 scoped_ptr<ui::Event>* rewritten_event) { 191 scoped_ptr<ui::Event>* rewritten_event) {
194 #if defined(USE_X11) 192 #if defined(USE_X11)
195 // Do not rewrite an event sent by ui_controls::SendKeyPress(). See 193 // Do not rewrite an event sent by ui_controls::SendKeyPress(). See
196 // crbug.com/136465. 194 // crbug.com/136465.
197 XEvent* xev = event.native_event(); 195 XEvent* xev = event.native_event();
198 if (xev && xev->xany.send_event) 196 if (xev && xev->xany.send_event)
199 return ui::EVENT_REWRITE_CONTINUE; 197 return ui::EVENT_REWRITE_CONTINUE;
200 #endif 198 #endif
201 switch (event.type()) { 199 switch (event.type()) {
202 case ui::ET_KEY_PRESSED: 200 case ui::ET_KEY_PRESSED:
203 case ui::ET_KEY_RELEASED: { 201 case ui::ET_KEY_RELEASED:
204 const ui::KeyEvent& key_event = static_cast<const ui::KeyEvent&>(event); 202 return RewriteKeyEvent(static_cast<const ui::KeyEvent&>(event),
205 MutableKeyState state = {key_event.flags(), key_event.key_code()}; 203 rewritten_event);
206 RewriteModifierKeys(key_event, &state);
207 RewriteNumPadKeys(key_event, &state);
208 RewriteExtendedKeys(key_event, &state);
209 RewriteFunctionKeys(key_event, &state);
210 if ((key_event.flags() != state.flags) ||
211 (key_event.key_code() != state.key_code)) {
212 ui::KeyEvent* rewritten_key_event = new ui::KeyEvent(key_event);
213 rewritten_event->reset(rewritten_key_event);
214 rewritten_key_event->set_flags(state.flags);
215 rewritten_key_event->set_key_code(state.key_code);
216 rewritten_key_event->set_character(
217 ui::GetCharacterFromKeyCode(state.key_code, state.flags));
218 rewritten_key_event->NormalizeFlags();
219 #if defined(USE_X11)
220 xev = rewritten_key_event->native_event();
221 if (xev) {
222 XKeyEvent* xkey = &(xev->xkey);
223 UpdateX11EventMask(state.flags, &xkey->state);
224 xkey->keycode = XKeysymToKeycode(
225 gfx::GetXDisplay(),
226 ui::XKeysymForWindowsKeyCode(state.key_code,
227 state.flags & ui::EF_SHIFT_DOWN));
228 }
229 #endif
230 return ui::EVENT_REWRITE_REWRITTEN;
231 }
232 return ui::EVENT_REWRITE_CONTINUE;
233 }
234 case ui::ET_MOUSE_PRESSED: 204 case ui::ET_MOUSE_PRESSED:
235 case ui::ET_MOUSE_RELEASED: 205 case ui::ET_MOUSE_RELEASED:
206 return RewriteMouseEvent(static_cast<const ui::MouseEvent&>(event),
207 rewritten_event);
236 case ui::ET_TOUCH_PRESSED: 208 case ui::ET_TOUCH_PRESSED:
237 case ui::ET_TOUCH_RELEASED: { 209 case ui::ET_TOUCH_RELEASED:
238 MutableKeyState state = {event.flags(), ui::VKEY_UNKNOWN}; 210 return RewriteTouchEvent(static_cast<const ui::TouchEvent&>(event),
239 RewriteLocatedEvent(event, &state); 211 rewritten_event);
240 if (event.flags() != state.flags) {
241 if (event.IsMouseEvent()) {
242 rewritten_event->reset(
243 new ui::MouseEvent(static_cast<const ui::MouseEvent&>(event)));
244 } else {
245 rewritten_event->reset(
246 new ui::TouchEvent(static_cast<const ui::TouchEvent&>(event)));
247 }
248 rewritten_event->get()->set_flags(state.flags);
249 return ui::EVENT_REWRITE_REWRITTEN;
250 }
251 return ui::EVENT_REWRITE_CONTINUE;
252 }
253 default: 212 default:
254 return ui::EVENT_REWRITE_CONTINUE; 213 return ui::EVENT_REWRITE_CONTINUE;
255 } 214 }
256 NOTREACHED(); 215 NOTREACHED();
257 } 216 }
258 217
259 ui::EventRewriteStatus EventRewriter::NextDispatchEvent( 218 ui::EventRewriteStatus EventRewriter::NextDispatchEvent(
260 const ui::Event& last_event, 219 const ui::Event& last_event,
261 scoped_ptr<ui::Event>* new_event) { 220 scoped_ptr<ui::Event>* new_event) {
262 NOTREACHED(); 221 NOTREACHED();
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
362 continue; 321 continue;
363 if ((input.flags & map.input_flags) != map.input_flags) 322 if ((input.flags & map.input_flags) != map.input_flags)
364 continue; 323 continue;
365 remapped_state->key_code = map.output_key_code; 324 remapped_state->key_code = map.output_key_code;
366 remapped_state->flags = (input.flags & ~map.input_flags) | map.output_flags; 325 remapped_state->flags = (input.flags & ~map.input_flags) | map.output_flags;
367 return true; 326 return true;
368 } 327 }
369 return false; 328 return false;
370 } 329 }
371 330
331 ui::EventRewriteStatus EventRewriter::RewriteKeyEvent(
332 const ui::KeyEvent& key_event,
333 scoped_ptr<ui::Event>* rewritten_event) {
334 MutableKeyState state = {key_event.flags(), key_event.key_code()};
335 RewriteModifierKeys(key_event, &state);
336 RewriteNumPadKeys(key_event, &state);
337 RewriteExtendedKeys(key_event, &state);
338 RewriteFunctionKeys(key_event, &state);
339 if ((key_event.flags() == state.flags) &&
340 (key_event.key_code() == state.key_code)) {
341 return ui::EVENT_REWRITE_CONTINUE;
342 }
343 ui::KeyEvent* rewritten_key_event = new ui::KeyEvent(key_event);
344 rewritten_event->reset(rewritten_key_event);
345 rewritten_key_event->set_flags(state.flags);
346 rewritten_key_event->set_key_code(state.key_code);
347 rewritten_key_event->set_character(
348 ui::GetCharacterFromKeyCode(state.key_code, state.flags));
349 rewritten_key_event->NormalizeFlags();
350 #if defined(USE_X11)
351 XEvent* xev = rewritten_key_event->native_event();
352 if (xev) {
353 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.
354 UpdateX11EventMask(rewritten_key_event->flags(), &xkey->state);
355 xkey->keycode =
356 XKeysymToKeycode(gfx::GetXDisplay(),
357 ui::XKeysymForWindowsKeyCode(
358 state.key_code, state.flags & ui::EF_SHIFT_DOWN));
359 }
360 #endif
361 return ui::EVENT_REWRITE_REWRITTEN;
362 }
363
364 ui::EventRewriteStatus EventRewriter::RewriteMouseEvent(
365 const ui::MouseEvent& mouse_event,
366 scoped_ptr<ui::Event>* rewritten_event) {
367 int flags = mouse_event.flags();
368 RewriteLocatedEvent(mouse_event, &flags);
369 if (mouse_event.flags() == flags)
370 return ui::EVENT_REWRITE_CONTINUE;
371 ui::MouseEvent* rewritten_mouse_event = new ui::MouseEvent(mouse_event);
372 rewritten_event->reset(rewritten_mouse_event);
373 rewritten_mouse_event->set_flags(flags);
374 #if defined(USE_X11)
375 XEvent* xev = rewritten_mouse_event->native_event();
376 if (xev) {
377 switch (xev->type) {
378 case ButtonPress:
379 case ButtonRelease: {
380 XButtonEvent* xbutton = &(xev->xbutton);
381 UpdateX11EventMask(rewritten_mouse_event->flags(), &xbutton->state);
382 break;
383 }
384 case GenericEvent: {
385 XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xev->xcookie.data);
386 CHECK(xievent->evtype == XI_ButtonPress ||
387 xievent->evtype == XI_ButtonRelease);
388 UpdateX11EventMask(
389 rewritten_mouse_event->flags(),
390 reinterpret_cast<unsigned int*>(&xievent->mods.effective));
391 break;
392 }
393 default:
394 NOTREACHED();
395 }
396 }
397 #endif
398 return ui::EVENT_REWRITE_REWRITTEN;
399 }
400
401 ui::EventRewriteStatus EventRewriter::RewriteTouchEvent(
402 const ui::TouchEvent& touch_event,
403 scoped_ptr<ui::Event>* rewritten_event) {
404 int flags = touch_event.flags();
405 RewriteLocatedEvent(touch_event, &flags);
406 if (touch_event.flags() == flags)
407 return ui::EVENT_REWRITE_CONTINUE;
408 ui::TouchEvent* rewritten_touch_event = new ui::TouchEvent(touch_event);
409 rewritten_event->reset(rewritten_touch_event);
410 rewritten_touch_event->set_flags(flags);
411 #if defined(USE_X11)
412 XEvent* xev = rewritten_touch_event->native_event();
413 if (xev) {
414 XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xev->xcookie.data);
415 if (xievent) {
416 UpdateX11EventMask(
417 rewritten_touch_event->flags(),
418 reinterpret_cast<unsigned int*>(&xievent->mods.effective));
419 }
420 }
421 #endif
422 return ui::EVENT_REWRITE_REWRITTEN;
423 }
424
372 void EventRewriter::RewriteModifierKeys(const ui::KeyEvent& key_event, 425 void EventRewriter::RewriteModifierKeys(const ui::KeyEvent& key_event,
373 MutableKeyState* state) { 426 MutableKeyState* state) {
374 DCHECK(key_event.type() == ui::ET_KEY_PRESSED || 427 DCHECK(key_event.type() == ui::ET_KEY_PRESSED ||
375 key_event.type() == ui::ET_KEY_RELEASED); 428 key_event.type() == ui::ET_KEY_RELEASED);
376 429
377 // Do nothing if we have just logged in as guest but have not restarted chrome 430 // Do nothing if we have just logged in as guest but have not restarted chrome
378 // process yet (so we are still on the login screen). In this situations we 431 // process yet (so we are still on the login screen). In this situations we
379 // have no user profile so can not do anything useful. 432 // have no user profile so can not do anything useful.
380 // Note that currently, unlike other accounts, when user logs in as guest, we 433 // Note that currently, unlike other accounts, when user logs in as guest, we
381 // restart chrome process. In future this is to be changed. 434 // restart chrome process. In future this is to be changed.
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
651 {ui::VKEY_9, ui::EF_COMMAND_DOWN, ui::VKEY_F9, 0}, 704 {ui::VKEY_9, ui::EF_COMMAND_DOWN, ui::VKEY_F9, 0},
652 {ui::VKEY_0, ui::EF_COMMAND_DOWN, ui::VKEY_F10, 0}, 705 {ui::VKEY_0, ui::EF_COMMAND_DOWN, ui::VKEY_F10, 0},
653 {ui::VKEY_OEM_MINUS, ui::EF_COMMAND_DOWN, ui::VKEY_F11, 0}, 706 {ui::VKEY_OEM_MINUS, ui::EF_COMMAND_DOWN, ui::VKEY_F11, 0},
654 {ui::VKEY_OEM_PLUS, ui::EF_COMMAND_DOWN, ui::VKEY_F12, 0}}; 707 {ui::VKEY_OEM_PLUS, ui::EF_COMMAND_DOWN, ui::VKEY_F12, 0}};
655 rewritten = RewriteWithKeyboardRemappingsByKeyCode( 708 rewritten = RewriteWithKeyboardRemappingsByKeyCode(
656 kNumberKeysToFkeys, arraysize(kNumberKeysToFkeys), incoming, state); 709 kNumberKeysToFkeys, arraysize(kNumberKeysToFkeys), incoming, state);
657 } 710 }
658 } 711 }
659 712
660 void EventRewriter::RewriteLocatedEvent(const ui::Event& event, 713 void EventRewriter::RewriteLocatedEvent(const ui::Event& event,
661 MutableKeyState* state) { 714 int* flags) {
662 const PrefService* pref_service = GetPrefService(); 715 const PrefService* pref_service = GetPrefService();
663 if (!pref_service) 716 if (!pref_service)
664 return; 717 return;
665 718
666 // First, remap modifier masks. 719 // First, remap modifier masks.
667 state->flags = GetRemappedModifierMasks(*pref_service, event, state->flags); 720 *flags = GetRemappedModifierMasks(*pref_service, event, *flags);
668 721
669 #if defined(USE_X11) 722 #if defined(USE_X11)
670 // TODO(kpschoedel): de-X11 with unified device ids from crbug.com/360377 723 // TODO(kpschoedel): de-X11 with unified device ids from crbug.com/360377
671 XEvent* xevent = event.native_event(); 724 XEvent* xevent = event.native_event();
672 if (!xevent || xevent->type != GenericEvent) 725 if (!xevent || xevent->type != GenericEvent)
673 return; 726 return;
674 XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xevent->xcookie.data); 727 XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xevent->xcookie.data);
675 if (xievent->evtype != XI_ButtonPress && xievent->evtype != XI_ButtonRelease) 728 if (xievent->evtype != XI_ButtonPress && xievent->evtype != XI_ButtonRelease)
676 return; 729 return;
730 UpdateX11EventMask(*flags,
731 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
677 732
678 // Then, remap Alt+Button1 to Button3. 733 // Then, remap Alt+Button1 to Button3.
679 if ((xievent->evtype == XI_ButtonPress || 734 if ((xievent->evtype == XI_ButtonPress ||
680 pressed_device_ids_.count(xievent->sourceid)) && 735 pressed_device_ids_.count(xievent->sourceid)) &&
681 (xievent->mods.effective & Mod1Mask) && xievent->detail == Button1) { 736 (xievent->mods.effective & Mod1Mask) && xievent->detail == Button1) {
682 state->flags &= ~(ui::EF_ALT_DOWN | ui::EF_LEFT_MOUSE_BUTTON); 737 *flags &= ~(ui::EF_ALT_DOWN | ui::EF_LEFT_MOUSE_BUTTON);
683 state->flags |= ui::EF_RIGHT_MOUSE_BUTTON; 738 *flags |= ui::EF_RIGHT_MOUSE_BUTTON;
684 xievent->mods.effective &= ~Mod1Mask; 739 xievent->mods.effective &= ~Mod1Mask;
685 xievent->detail = Button3; 740 xievent->detail = Button3;
686 if (xievent->evtype == XI_ButtonRelease) { 741 if (xievent->evtype == XI_ButtonRelease) {
687 // On the release clear the left button from the existing state and the 742 // On the release clear the left button from the existing state and the
688 // mods, and set the right button. 743 // mods, and set the right button.
689 XISetMask(xievent->buttons.mask, Button3); 744 XISetMask(xievent->buttons.mask, Button3);
690 XIClearMask(xievent->buttons.mask, Button1); 745 XIClearMask(xievent->buttons.mask, Button1);
691 xievent->mods.effective &= ~Button1Mask; 746 xievent->mods.effective &= ~Button1Mask;
692 pressed_device_ids_.erase(xievent->sourceid); 747 pressed_device_ids_.erase(xievent->sourceid);
693 } else { 748 } else {
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
757 812
758 XIFreeDeviceInfo(device_info); 813 XIFreeDeviceInfo(device_info);
759 } 814 }
760 815
761 void EventRewriter::DeviceRemoved(int device_id) { 816 void EventRewriter::DeviceRemoved(int device_id) {
762 device_id_to_type_.erase(device_id); 817 device_id_to_type_.erase(device_id);
763 } 818 }
764 #endif 819 #endif
765 820
766 } // namespace chromeos 821 } // namespace chromeos
OLDNEW
« 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