OLD | NEW |
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 <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
11 #include "ash/common/wm/window_state.h" | |
12 #include "ash/sticky_keys/sticky_keys_controller.h" | |
13 #include "ash/wm/window_util.h" | |
14 #include "base/command_line.h" | 11 #include "base/command_line.h" |
15 #include "base/logging.h" | 12 #include "base/logging.h" |
16 #include "base/macros.h" | 13 #include "base/macros.h" |
17 #include "base/strings/string_split.h" | 14 #include "base/strings/string_split.h" |
18 #include "base/strings/string_util.h" | 15 #include "base/strings/string_util.h" |
19 #include "base/sys_info.h" | 16 #include "base/sys_info.h" |
20 #include "chrome/browser/chromeos/login/ui/login_display_host.h" | 17 #include "chrome/browser/chromeos/login/ui/login_display_host.h" |
21 #include "chrome/browser/extensions/extension_commands_global_registry.h" | 18 #include "chrome/browser/extensions/extension_commands_global_registry.h" |
22 #include "chrome/browser/profiles/profile_manager.h" | 19 #include "chrome/browser/profiles/profile_manager.h" |
23 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" | 20 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" |
24 #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h" | 21 #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h" |
25 #include "chrome/common/pref_names.h" | 22 #include "chrome/common/pref_names.h" |
26 #include "chromeos/chromeos_switches.h" | 23 #include "chromeos/chromeos_switches.h" |
27 #include "components/prefs/pref_service.h" | 24 #include "components/prefs/pref_service.h" |
28 #include "components/user_manager/user_manager.h" | 25 #include "components/user_manager/user_manager.h" |
29 #include "ui/base/ime/chromeos/ime_keyboard.h" | 26 #include "ui/base/ime/chromeos/ime_keyboard.h" |
30 #include "ui/base/ime/chromeos/input_method_manager.h" | 27 #include "ui/base/ime/chromeos/input_method_manager.h" |
31 #include "ui/events/devices/input_device_manager.h" | 28 #include "ui/events/devices/input_device_manager.h" |
32 #include "ui/events/event.h" | 29 #include "ui/events/event.h" |
33 #include "ui/events/event_utils.h" | 30 #include "ui/events/event_utils.h" |
34 #include "ui/events/keycodes/dom/dom_code.h" | 31 #include "ui/events/keycodes/dom/dom_code.h" |
35 #include "ui/events/keycodes/dom/dom_key.h" | 32 #include "ui/events/keycodes/dom/dom_key.h" |
36 #include "ui/events/keycodes/dom/keycode_converter.h" | 33 #include "ui/events/keycodes/dom/keycode_converter.h" |
37 #include "ui/events/keycodes/keyboard_code_conversion.h" | 34 #include "ui/events/keycodes/keyboard_code_conversion.h" |
38 #include "ui/wm/core/window_util.h" | |
39 | 35 |
40 #if defined(USE_X11) | 36 #if defined(USE_X11) |
41 #include <X11/extensions/XInput2.h> | 37 #include <X11/extensions/XInput2.h> |
42 #include <X11/Xlib.h> | 38 #include <X11/Xlib.h> |
43 | 39 |
44 // Get rid of macros from Xlib.h that conflicts with other parts of the code. | 40 // Get rid of macros from Xlib.h that conflicts with other parts of the code. |
45 #undef RootWindow | 41 #undef RootWindow |
46 #undef Status | 42 #undef Status |
47 | 43 |
48 #include "ui/base/x/x11_util.h" | 44 #include "ui/base/x/x11_util.h" |
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
299 case ui::DomCode::META_RIGHT: | 295 case ui::DomCode::META_RIGHT: |
300 return right ? ui::DomCode::META_RIGHT : ui::DomCode::META_LEFT; | 296 return right ? ui::DomCode::META_RIGHT : ui::DomCode::META_LEFT; |
301 default: | 297 default: |
302 break; | 298 break; |
303 } | 299 } |
304 return code; | 300 return code; |
305 } | 301 } |
306 | 302 |
307 } // namespace | 303 } // namespace |
308 | 304 |
309 EventRewriter::EventRewriter(ash::StickyKeysController* sticky_keys_controller) | 305 EventRewriter::EventRewriter(ui::EventRewriter* sticky_keys_controller) |
310 : last_keyboard_device_id_(ui::ED_UNKNOWN_DEVICE), | 306 : last_keyboard_device_id_(ui::ED_UNKNOWN_DEVICE), |
311 ime_keyboard_for_testing_(NULL), | 307 ime_keyboard_for_testing_(NULL), |
312 pref_service_for_testing_(NULL), | 308 pref_service_for_testing_(NULL), |
313 sticky_keys_controller_(sticky_keys_controller), | 309 sticky_keys_controller_(sticky_keys_controller), |
314 pressed_modifier_latches_(ui::EF_NONE), | 310 pressed_modifier_latches_(ui::EF_NONE), |
315 latched_modifier_latches_(ui::EF_NONE), | 311 latched_modifier_latches_(ui::EF_NONE), |
316 used_modifier_latches_(ui::EF_NONE) {} | 312 used_modifier_latches_(ui::EF_NONE) {} |
317 | 313 |
318 EventRewriter::~EventRewriter() {} | 314 EventRewriter::~EventRewriter() {} |
319 | 315 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
363 | 359 |
364 ui::EventRewriteStatus EventRewriter::NextDispatchEvent( | 360 ui::EventRewriteStatus EventRewriter::NextDispatchEvent( |
365 const ui::Event& last_event, | 361 const ui::Event& last_event, |
366 std::unique_ptr<ui::Event>* new_event) { | 362 std::unique_ptr<ui::Event>* new_event) { |
367 if (sticky_keys_controller_) { | 363 if (sticky_keys_controller_) { |
368 // In the case of sticky keys, we know what the events obtained here are: | 364 // In the case of sticky keys, we know what the events obtained here are: |
369 // modifier key releases that match the ones previously discarded. So, we | 365 // modifier key releases that match the ones previously discarded. So, we |
370 // know that they don't have to be passed through the post-sticky key | 366 // know that they don't have to be passed through the post-sticky key |
371 // rewriting phases, |RewriteExtendedKeys()| and |RewriteFunctionKeys()|, | 367 // rewriting phases, |RewriteExtendedKeys()| and |RewriteFunctionKeys()|, |
372 // because those phases do nothing with modifier key releases. | 368 // because those phases do nothing with modifier key releases. |
373 return sticky_keys_controller_->NextDispatchEvent(new_event); | 369 return sticky_keys_controller_->NextDispatchEvent(last_event, new_event); |
374 } | 370 } |
375 NOTREACHED(); | 371 NOTREACHED(); |
376 return ui::EVENT_REWRITE_CONTINUE; | 372 return ui::EVENT_REWRITE_CONTINUE; |
377 } | 373 } |
378 | 374 |
379 void EventRewriter::BuildRewrittenKeyEvent( | 375 void EventRewriter::BuildRewrittenKeyEvent( |
380 const ui::KeyEvent& key_event, | 376 const ui::KeyEvent& key_event, |
381 const MutableKeyState& state, | 377 const MutableKeyState& state, |
382 std::unique_ptr<ui::Event>* rewritten_event) { | 378 std::unique_ptr<ui::Event>* rewritten_event) { |
383 ui::KeyEvent* rewritten_key_event = | 379 ui::KeyEvent* rewritten_key_event = |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
516 // Early exit with completed event. | 512 // Early exit with completed event. |
517 BuildRewrittenKeyEvent(key_event, state, rewritten_event); | 513 BuildRewrittenKeyEvent(key_event, state, rewritten_event); |
518 return ui::EVENT_REWRITE_REWRITTEN; | 514 return ui::EVENT_REWRITE_REWRITTEN; |
519 } | 515 } |
520 RewriteNumPadKeys(key_event, &state); | 516 RewriteNumPadKeys(key_event, &state); |
521 } | 517 } |
522 | 518 |
523 ui::EventRewriteStatus status = ui::EVENT_REWRITE_CONTINUE; | 519 ui::EventRewriteStatus status = ui::EVENT_REWRITE_CONTINUE; |
524 bool is_sticky_key_extension_command = false; | 520 bool is_sticky_key_extension_command = false; |
525 if (sticky_keys_controller_) { | 521 if (sticky_keys_controller_) { |
526 status = sticky_keys_controller_->RewriteKeyEvent(key_event, state.key_code, | 522 auto tmp_event = key_event; |
527 &state.flags); | 523 tmp_event.set_key_code(state.key_code); |
| 524 tmp_event.set_flags(state.flags); |
| 525 std::unique_ptr<ui::Event> output_event; |
| 526 status = sticky_keys_controller_->RewriteEvent(tmp_event, &output_event); |
| 527 if (status == ui::EVENT_REWRITE_REWRITTEN || |
| 528 status == ui::EVENT_REWRITE_DISPATCH_ANOTHER) |
| 529 state.flags = output_event->flags(); |
528 if (status == ui::EVENT_REWRITE_DISCARD) | 530 if (status == ui::EVENT_REWRITE_DISCARD) |
529 return ui::EVENT_REWRITE_DISCARD; | 531 return ui::EVENT_REWRITE_DISCARD; |
530 is_sticky_key_extension_command = | 532 is_sticky_key_extension_command = |
531 IsExtensionCommandRegistered(state.key_code, state.flags); | 533 IsExtensionCommandRegistered(state.key_code, state.flags); |
532 } | 534 } |
533 | 535 |
534 // If flags have changed, this may change the interpretation of the key, | 536 // If flags have changed, this may change the interpretation of the key, |
535 // so reapply layout. | 537 // so reapply layout. |
536 if (state.flags != key_event.flags()) | 538 if (state.flags != key_event.flags()) |
537 SetMeaningForLayout(key_event.type(), &state); | 539 SetMeaningForLayout(key_event.type(), &state); |
(...skipping 28 matching lines...) Expand all Loading... |
566 BuildRewrittenKeyEvent(key_event, state, rewritten_event); | 568 BuildRewrittenKeyEvent(key_event, state, rewritten_event); |
567 return status; | 569 return status; |
568 } | 570 } |
569 | 571 |
570 ui::EventRewriteStatus EventRewriter::RewriteMouseButtonEvent( | 572 ui::EventRewriteStatus EventRewriter::RewriteMouseButtonEvent( |
571 const ui::MouseEvent& mouse_event, | 573 const ui::MouseEvent& mouse_event, |
572 std::unique_ptr<ui::Event>* rewritten_event) { | 574 std::unique_ptr<ui::Event>* rewritten_event) { |
573 int flags = mouse_event.flags(); | 575 int flags = mouse_event.flags(); |
574 RewriteLocatedEvent(mouse_event, &flags); | 576 RewriteLocatedEvent(mouse_event, &flags); |
575 ui::EventRewriteStatus status = ui::EVENT_REWRITE_CONTINUE; | 577 ui::EventRewriteStatus status = ui::EVENT_REWRITE_CONTINUE; |
576 if (sticky_keys_controller_) | 578 if (sticky_keys_controller_) { |
577 status = sticky_keys_controller_->RewriteMouseEvent(mouse_event, &flags); | 579 auto tmp_event = mouse_event; |
| 580 tmp_event.set_flags(flags); |
| 581 std::unique_ptr<ui::Event> output_event; |
| 582 status = sticky_keys_controller_->RewriteEvent(tmp_event, &output_event); |
| 583 if (status == ui::EVENT_REWRITE_REWRITTEN || |
| 584 status == ui::EVENT_REWRITE_DISPATCH_ANOTHER) |
| 585 flags = output_event->flags(); |
| 586 } |
578 int changed_button = ui::EF_NONE; | 587 int changed_button = ui::EF_NONE; |
579 if ((mouse_event.type() == ui::ET_MOUSE_PRESSED) || | 588 if ((mouse_event.type() == ui::ET_MOUSE_PRESSED) || |
580 (mouse_event.type() == ui::ET_MOUSE_RELEASED)) { | 589 (mouse_event.type() == ui::ET_MOUSE_RELEASED)) { |
581 changed_button = RewriteModifierClick(mouse_event, &flags); | 590 changed_button = RewriteModifierClick(mouse_event, &flags); |
582 } | 591 } |
583 if ((mouse_event.flags() == flags) && | 592 if ((mouse_event.flags() == flags) && |
584 (status == ui::EVENT_REWRITE_CONTINUE)) { | 593 (status == ui::EVENT_REWRITE_CONTINUE)) { |
585 return ui::EVENT_REWRITE_CONTINUE; | 594 return ui::EVENT_REWRITE_CONTINUE; |
586 } | 595 } |
587 if (status == ui::EVENT_REWRITE_CONTINUE) | 596 if (status == ui::EVENT_REWRITE_CONTINUE) |
(...skipping 13 matching lines...) Expand all Loading... |
601 return status; | 610 return status; |
602 } | 611 } |
603 | 612 |
604 ui::EventRewriteStatus EventRewriter::RewriteMouseWheelEvent( | 613 ui::EventRewriteStatus EventRewriter::RewriteMouseWheelEvent( |
605 const ui::MouseWheelEvent& wheel_event, | 614 const ui::MouseWheelEvent& wheel_event, |
606 std::unique_ptr<ui::Event>* rewritten_event) { | 615 std::unique_ptr<ui::Event>* rewritten_event) { |
607 if (!sticky_keys_controller_) | 616 if (!sticky_keys_controller_) |
608 return ui::EVENT_REWRITE_CONTINUE; | 617 return ui::EVENT_REWRITE_CONTINUE; |
609 int flags = wheel_event.flags(); | 618 int flags = wheel_event.flags(); |
610 RewriteLocatedEvent(wheel_event, &flags); | 619 RewriteLocatedEvent(wheel_event, &flags); |
| 620 auto tmp_event = wheel_event; |
| 621 tmp_event.set_flags(flags); |
611 ui::EventRewriteStatus status = | 622 ui::EventRewriteStatus status = |
612 sticky_keys_controller_->RewriteMouseEvent(wheel_event, &flags); | 623 sticky_keys_controller_->RewriteEvent(tmp_event, rewritten_event); |
613 if ((wheel_event.flags() == flags) && | 624 |
614 (status == ui::EVENT_REWRITE_CONTINUE)) { | 625 switch (status) { |
615 return ui::EVENT_REWRITE_CONTINUE; | 626 case ui::EVENT_REWRITE_REWRITTEN: |
| 627 case ui::EVENT_REWRITE_DISPATCH_ANOTHER: |
| 628 // whell event has been rewritten and stored in |rewritten_event|. |
| 629 #if defined(USE_X11) |
| 630 ui::UpdateX11EventForFlags(rewritten_event->get()); |
| 631 #endif |
| 632 break; |
| 633 case ui::EVENT_REWRITE_CONTINUE: |
| 634 if (flags != wheel_event.flags()) { |
| 635 *rewritten_event = base::MakeUnique<ui::MouseWheelEvent>(wheel_event); |
| 636 (*rewritten_event)->set_flags(flags); |
| 637 status = ui::EVENT_REWRITE_REWRITTEN; |
| 638 #if defined(USE_X11) |
| 639 ui::UpdateX11EventForFlags(rewritten_event->get()); |
| 640 #endif |
| 641 } |
| 642 break; |
| 643 case ui::EVENT_REWRITE_DISCARD: |
| 644 NOTREACHED(); |
| 645 break; |
616 } | 646 } |
617 if (status == ui::EVENT_REWRITE_CONTINUE) | 647 |
618 status = ui::EVENT_REWRITE_REWRITTEN; | |
619 ui::MouseWheelEvent* rewritten_wheel_event = | |
620 new ui::MouseWheelEvent(wheel_event); | |
621 rewritten_event->reset(rewritten_wheel_event); | |
622 rewritten_wheel_event->set_flags(flags); | |
623 #if defined(USE_X11) | |
624 ui::UpdateX11EventForFlags(rewritten_wheel_event); | |
625 #endif | |
626 return status; | 648 return status; |
627 } | 649 } |
628 | 650 |
629 ui::EventRewriteStatus EventRewriter::RewriteTouchEvent( | 651 ui::EventRewriteStatus EventRewriter::RewriteTouchEvent( |
630 const ui::TouchEvent& touch_event, | 652 const ui::TouchEvent& touch_event, |
631 std::unique_ptr<ui::Event>* rewritten_event) { | 653 std::unique_ptr<ui::Event>* rewritten_event) { |
632 int flags = touch_event.flags(); | 654 int flags = touch_event.flags(); |
633 RewriteLocatedEvent(touch_event, &flags); | 655 RewriteLocatedEvent(touch_event, &flags); |
634 if (touch_event.flags() == flags) | 656 if (touch_event.flags() == flags) |
635 return ui::EVENT_REWRITE_CONTINUE; | 657 return ui::EVENT_REWRITE_CONTINUE; |
636 ui::TouchEvent* rewritten_touch_event = new ui::TouchEvent(touch_event); | 658 ui::TouchEvent* rewritten_touch_event = new ui::TouchEvent(touch_event); |
637 rewritten_event->reset(rewritten_touch_event); | 659 rewritten_event->reset(rewritten_touch_event); |
638 rewritten_touch_event->set_flags(flags); | 660 rewritten_touch_event->set_flags(flags); |
639 #if defined(USE_X11) | 661 #if defined(USE_X11) |
640 ui::UpdateX11EventForFlags(rewritten_touch_event); | 662 ui::UpdateX11EventForFlags(rewritten_touch_event); |
641 #endif | 663 #endif |
642 return ui::EVENT_REWRITE_REWRITTEN; | 664 return ui::EVENT_REWRITE_REWRITTEN; |
643 } | 665 } |
644 | 666 |
645 ui::EventRewriteStatus EventRewriter::RewriteScrollEvent( | 667 ui::EventRewriteStatus EventRewriter::RewriteScrollEvent( |
646 const ui::ScrollEvent& scroll_event, | 668 const ui::ScrollEvent& scroll_event, |
647 std::unique_ptr<ui::Event>* rewritten_event) { | 669 std::unique_ptr<ui::Event>* rewritten_event) { |
648 int flags = scroll_event.flags(); | 670 if (!sticky_keys_controller_) |
649 ui::EventRewriteStatus status = ui::EVENT_REWRITE_CONTINUE; | 671 return ui::EVENT_REWRITE_CONTINUE; |
650 if (sticky_keys_controller_) | 672 ui::EventRewriteStatus status = |
651 status = sticky_keys_controller_->RewriteScrollEvent(scroll_event, &flags); | 673 sticky_keys_controller_->RewriteEvent(scroll_event, rewritten_event); |
652 if (status == ui::EVENT_REWRITE_CONTINUE) | 674 // Scroll event shouldn't be discarded. |
653 return status; | 675 DCHECK_NE(status, ui::EVENT_REWRITE_DISCARD); |
654 ui::ScrollEvent* rewritten_scroll_event = new ui::ScrollEvent(scroll_event); | |
655 rewritten_event->reset(rewritten_scroll_event); | |
656 rewritten_scroll_event->set_flags(flags); | |
657 #if defined(USE_X11) | 676 #if defined(USE_X11) |
658 ui::UpdateX11EventForFlags(rewritten_scroll_event); | 677 if (status != ui::EVENT_REWRITE_CONTINUE) |
| 678 ui::UpdateX11EventForFlags(rewritten_event->get()); |
659 #endif | 679 #endif |
660 return status; | 680 return status; |
661 } | 681 } |
662 | 682 |
663 bool EventRewriter::RewriteModifierKeys(const ui::KeyEvent& key_event, | 683 bool EventRewriter::RewriteModifierKeys(const ui::KeyEvent& key_event, |
664 MutableKeyState* state) { | 684 MutableKeyState* state) { |
665 DCHECK(key_event.type() == ui::ET_KEY_PRESSED || | 685 DCHECK(key_event.type() == ui::ET_KEY_PRESSED || |
666 key_event.type() == ui::ET_KEY_RELEASED); | 686 key_event.type() == ui::ET_KEY_RELEASED); |
667 | 687 |
668 // Do nothing if we have just logged in as guest but have not restarted chrome | 688 // Do nothing if we have just logged in as guest but have not restarted chrome |
(...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1167 for (const auto& keyboard : keyboard_devices) { | 1187 for (const auto& keyboard : keyboard_devices) { |
1168 if (keyboard.id == device_id) { | 1188 if (keyboard.id == device_id) { |
1169 return KeyboardDeviceAddedInternal( | 1189 return KeyboardDeviceAddedInternal( |
1170 keyboard.id, keyboard.name, keyboard.vendor_id, keyboard.product_id); | 1190 keyboard.id, keyboard.name, keyboard.vendor_id, keyboard.product_id); |
1171 } | 1191 } |
1172 } | 1192 } |
1173 return kDeviceUnknown; | 1193 return kDeviceUnknown; |
1174 } | 1194 } |
1175 | 1195 |
1176 } // namespace chromeos | 1196 } // namespace chromeos |
OLD | NEW |