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

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: Add unit test 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 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 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
357 continue; 316 continue;
358 if ((input.flags & map.input_flags) != map.input_flags) 317 if ((input.flags & map.input_flags) != map.input_flags)
359 continue; 318 continue;
360 remapped_state->key_code = map.output_key_code; 319 remapped_state->key_code = map.output_key_code;
361 remapped_state->flags = (input.flags & ~map.input_flags) | map.output_flags; 320 remapped_state->flags = (input.flags & ~map.input_flags) | map.output_flags;
362 return true; 321 return true;
363 } 322 }
364 return false; 323 return false;
365 } 324 }
366 325
326 ui::EventRewriteStatus EventRewriter::RewriteKeyEvent(
327 const ui::KeyEvent& key_event,
328 scoped_ptr<ui::Event>* rewritten_event) {
329 ui::EventRewriteStatus status = ui::EVENT_REWRITE_CONTINUE;
330 MutableKeyState state = {key_event.flags(), key_event.key_code()};
331 RewriteModifierKeys(key_event, &state);
332 RewriteNumPadKeys(key_event, &state);
333 RewriteExtendedKeys(key_event, &state);
334 RewriteFunctionKeys(key_event, &state);
335 if ((key_event.flags() != state.flags) ||
336 (key_event.key_code() != state.key_code)) {
337 ui::KeyEvent* rewritten_key_event = new ui::KeyEvent(key_event);
sadrul 2014/05/20 16:46:54 You need to set status to REWRITTEN here? Do we ha
338 rewritten_event->reset(rewritten_key_event);
339 rewritten_key_event->set_flags(state.flags);
340 rewritten_key_event->set_key_code(state.key_code);
341 rewritten_key_event->set_character(
342 ui::GetCharacterFromKeyCode(state.key_code, state.flags));
343 rewritten_key_event->NormalizeFlags();
344 #if defined(USE_X11)
345 XEvent* xev = rewritten_key_event->native_event();
346 if (xev) {
347 XKeyEvent* xkey = &(xev->xkey);
348 UpdateX11EventMask(rewritten_key_event->flags(), &xkey->state);
349 xkey->keycode = XKeysymToKeycode(
350 gfx::GetXDisplay(),
351 ui::XKeysymForWindowsKeyCode(state.key_code,
352 state.flags & ui::EF_SHIFT_DOWN));
353 }
354 #endif
355 }
356 return status;
357 }
358
359 ui::EventRewriteStatus EventRewriter::RewriteMouseEvent(
360 const ui::MouseEvent& mouse_event,
361 scoped_ptr<ui::Event>* rewritten_event) {
362 ui::EventRewriteStatus status = ui::EVENT_REWRITE_CONTINUE;
363 int flags = mouse_event.flags();
364 RewriteLocatedEvent(mouse_event, &flags);
365 if (mouse_event.flags() != flags) {
366 status = ui::EVENT_REWRITE_REWRITTEN;
367 ui::MouseEvent* rewritten_mouse_event = new ui::MouseEvent(mouse_event);
368 rewritten_event->reset(rewritten_mouse_event);
369 rewritten_mouse_event->set_flags(flags);
370 #if defined(USE_X11)
371 XEvent* xev = rewritten_mouse_event->native_event();
372 if (xev) {
373 switch (xev->type) {
374 case ButtonPress:
375 case ButtonRelease: {
376 XButtonEvent* xbutton = &(xev->xbutton);
377 UpdateX11EventMask(rewritten_mouse_event->flags(), &xbutton->state);
378 break;
379 }
380 case GenericEvent: {
381 XIDeviceEvent* xievent =
382 static_cast<XIDeviceEvent*>(xev->xcookie.data);
383 CHECK(xievent->evtype == XI_ButtonPress ||
384 xievent->evtype == XI_ButtonRelease);
385 UpdateX11EventMask(
386 rewritten_mouse_event->flags(),
387 reinterpret_cast<unsigned int*>(&xievent->mods.effective));
388 break;
389 }
390 default:
391 NOTREACHED();
392 }
393 }
394 #endif
395 }
396 return status;
397 }
398
399 ui::EventRewriteStatus EventRewriter::RewriteTouchEvent(
400 const ui::TouchEvent& touch_event,
401 scoped_ptr<ui::Event>* rewritten_event) {
402 ui::EventRewriteStatus status = ui::EVENT_REWRITE_CONTINUE;
403 int flags = touch_event.flags();
404 RewriteLocatedEvent(touch_event, &flags);
405 if (touch_event.flags() != flags) {
406 status = ui::EVENT_REWRITE_REWRITTEN;
407 ui::TouchEvent* rewritten_touch_event = new ui::TouchEvent(touch_event);
408 rewritten_event->reset(rewritten_touch_event);
409 rewritten_touch_event->set_flags(flags);
410 #if defined(USE_X11)
411 XEvent* xev = rewritten_touch_event->native_event();
412 if (xev) {
413 XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xev->xcookie.data);
414 if (xievent) {
415 UpdateX11EventMask(
416 rewritten_touch_event->flags(),
417 reinterpret_cast<unsigned int*>(&xievent->mods.effective));
418 }
419 }
420 #endif
421 }
422 return status;
423 }
424
367 void EventRewriter::RewriteModifierKeys(const ui::KeyEvent& key_event, 425 void EventRewriter::RewriteModifierKeys(const ui::KeyEvent& key_event,
368 MutableKeyState* state) { 426 MutableKeyState* state) {
369 DCHECK(key_event.type() == ui::ET_KEY_PRESSED || 427 DCHECK(key_event.type() == ui::ET_KEY_PRESSED ||
370 key_event.type() == ui::ET_KEY_RELEASED); 428 key_event.type() == ui::ET_KEY_RELEASED);
371 429
372 // 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
373 // 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
374 // have no user profile so can not do anything useful. 432 // have no user profile so can not do anything useful.
375 // 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
376 // 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
646 {ui::VKEY_9, ui::EF_COMMAND_DOWN, ui::VKEY_F9, 0}, 704 {ui::VKEY_9, ui::EF_COMMAND_DOWN, ui::VKEY_F9, 0},
647 {ui::VKEY_0, ui::EF_COMMAND_DOWN, ui::VKEY_F10, 0}, 705 {ui::VKEY_0, ui::EF_COMMAND_DOWN, ui::VKEY_F10, 0},
648 {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},
649 {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}};
650 rewritten = RewriteWithKeyboardRemappingsByKeyCode( 708 rewritten = RewriteWithKeyboardRemappingsByKeyCode(
651 kNumberKeysToFkeys, arraysize(kNumberKeysToFkeys), incoming, state); 709 kNumberKeysToFkeys, arraysize(kNumberKeysToFkeys), incoming, state);
652 } 710 }
653 } 711 }
654 712
655 void EventRewriter::RewriteLocatedEvent(const ui::Event& event, 713 void EventRewriter::RewriteLocatedEvent(const ui::Event& event,
656 MutableKeyState* state) { 714 int* flags) {
657 const PrefService* pref_service = GetPrefService(); 715 const PrefService* pref_service = GetPrefService();
658 if (!pref_service) 716 if (!pref_service)
659 return; 717 return;
660 718
661 // First, remap modifier masks. 719 // First, remap modifier masks.
662 state->flags = GetRemappedModifierMasks(*pref_service, event, state->flags); 720 *flags = GetRemappedModifierMasks(*pref_service, event, *flags);
663 721
664 #if defined(USE_X11) 722 #if defined(USE_X11)
665 // 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
666 XEvent* xevent = event.native_event(); 724 XEvent* xevent = event.native_event();
667 if (!xevent || xevent->type != GenericEvent) 725 if (!xevent || xevent->type != GenericEvent)
668 return; 726 return;
669 XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xevent->xcookie.data); 727 XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xevent->xcookie.data);
670 if (xievent->evtype != XI_ButtonPress && xievent->evtype != XI_ButtonRelease) 728 if (xievent->evtype != XI_ButtonPress && xievent->evtype != XI_ButtonRelease)
671 return; 729 return;
730 UpdateX11EventMask(*flags,
731 reinterpret_cast<unsigned int*>(&xievent->mods.effective));
672 732
673 // Then, remap Alt+Button1 to Button3. 733 // Then, remap Alt+Button1 to Button3.
674 if ((xievent->evtype == XI_ButtonPress || 734 if ((xievent->evtype == XI_ButtonPress ||
675 pressed_device_ids_.count(xievent->sourceid)) && 735 pressed_device_ids_.count(xievent->sourceid)) &&
676 (xievent->mods.effective & Mod1Mask) && xievent->detail == Button1) { 736 (xievent->mods.effective & Mod1Mask) && xievent->detail == Button1) {
677 state->flags &= ~(ui::EF_ALT_DOWN | ui::EF_LEFT_MOUSE_BUTTON); 737 *flags &= ~(ui::EF_ALT_DOWN | ui::EF_LEFT_MOUSE_BUTTON);
678 state->flags |= ui::EF_RIGHT_MOUSE_BUTTON; 738 *flags |= ui::EF_RIGHT_MOUSE_BUTTON;
679 xievent->mods.effective &= ~Mod1Mask; 739 xievent->mods.effective &= ~Mod1Mask;
680 xievent->detail = Button3; 740 xievent->detail = Button3;
681 if (xievent->evtype == XI_ButtonRelease) { 741 if (xievent->evtype == XI_ButtonRelease) {
682 // 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
683 // mods, and set the right button. 743 // mods, and set the right button.
684 XISetMask(xievent->buttons.mask, Button3); 744 XISetMask(xievent->buttons.mask, Button3);
685 XIClearMask(xievent->buttons.mask, Button1); 745 XIClearMask(xievent->buttons.mask, Button1);
686 xievent->mods.effective &= ~Button1Mask; 746 xievent->mods.effective &= ~Button1Mask;
687 pressed_device_ids_.erase(xievent->sourceid); 747 pressed_device_ids_.erase(xievent->sourceid);
688 } else { 748 } else {
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
752 812
753 XIFreeDeviceInfo(device_info); 813 XIFreeDeviceInfo(device_info);
754 } 814 }
755 815
756 void EventRewriter::DeviceRemoved(int device_id) { 816 void EventRewriter::DeviceRemoved(int device_id) {
757 device_id_to_type_.erase(device_id); 817 device_id_to_type_.erase(device_id);
758 } 818 }
759 #endif 819 #endif
760 820
761 } // 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