Commit 719548cc authored by Ahmed Fakhry's avatar Ahmed Fakhry Committed by Commit Bot

Limit alt+click -> right-click remapping to touchpads only

Many media and creative suite applications make use of
Alt+Click actions, but we always rewrite it to Right-Click
without giving the users a way to turn this behavior off.
Users of such applications often use external mice, which
already have an independent right click button.

This CL limits this behavior to events coming from touchpad
devices.

BUG=890648
TEST=Expanded tests.

Change-Id: I1b72eb4d9986e9139d7c6193cc2f808a6d9cad06
Reviewed-on: https://chromium-review.googlesource.com/c/1255605Reviewed-by: default avatarSadrul Chowdhury <sadrul@chromium.org>
Reviewed-by: default avatarSteven Bennetts <stevenjb@chromium.org>
Commit-Queue: Ahmed Fakhry <afakhry@chromium.org>
Cr-Commit-Position: refs/heads/master@{#599783}
parent 92f4ad59
...@@ -33,4 +33,7 @@ specific_include_rules = { ...@@ -33,4 +33,7 @@ specific_include_rules = {
"+ash/shell.h", "+ash/shell.h",
"+ash/sticky_keys/sticky_keys_controller.h", "+ash/sticky_keys/sticky_keys_controller.h",
], ],
"event_rewriter_unittest.cc": [
"+ui/events/devices/device_data_manager.h",
],
} }
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include "ui/chromeos/events/event_rewriter_chromeos.h" #include "ui/chromeos/events/event_rewriter_chromeos.h"
#include "ui/chromeos/events/modifier_key.h" #include "ui/chromeos/events/modifier_key.h"
#include "ui/chromeos/events/pref_names.h" #include "ui/chromeos/events/pref_names.h"
#include "ui/events/devices/device_data_manager.h"
#include "ui/events/event.h" #include "ui/events/event.h"
#include "ui/events/event_rewriter.h" #include "ui/events/event_rewriter.h"
#include "ui/events/event_utils.h" #include "ui/events/event_utils.h"
...@@ -2475,6 +2476,21 @@ TEST_F(EventRewriterAshTest, TopRowKeysAreFunctionKeys) { ...@@ -2475,6 +2476,21 @@ TEST_F(EventRewriterAshTest, TopRowKeysAreFunctionKeys) {
} }
TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) { TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) {
ui::DeviceDataManager* device_data_manager =
ui::DeviceDataManager::GetInstance();
std::vector<ui::InputDevice> touchpad_devices(2);
constexpr int kTouchpadId1 = 10;
constexpr int kTouchpadId2 = 11;
touchpad_devices[0].id = kTouchpadId1;
touchpad_devices[1].id = kTouchpadId2;
static_cast<ui::DeviceHotplugEventObserver*>(device_data_manager)
->OnTouchpadDevicesUpdated(touchpad_devices);
std::vector<ui::InputDevice> mouse_devices(1);
constexpr int kMouseId = 12;
touchpad_devices[0].id = kMouseId;
static_cast<ui::DeviceHotplugEventObserver*>(device_data_manager)
->OnMouseDevicesUpdated(mouse_devices);
const int kLeftAndAltFlag = ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN; const int kLeftAndAltFlag = ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN;
// Test Alt + Left click. // Test Alt + Left click.
...@@ -2483,7 +2499,7 @@ TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) { ...@@ -2483,7 +2499,7 @@ TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) {
ui::EventTimeForNow(), kLeftAndAltFlag, ui::EventTimeForNow(), kLeftAndAltFlag,
ui::EF_LEFT_MOUSE_BUTTON); ui::EF_LEFT_MOUSE_BUTTON);
ui::EventTestApi test_press(&press); ui::EventTestApi test_press(&press);
test_press.set_source_device_id(10); test_press.set_source_device_id(kTouchpadId1);
// Sanity check. // Sanity check.
EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type()); EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type());
EXPECT_EQ(kLeftAndAltFlag, press.flags()); EXPECT_EQ(kLeftAndAltFlag, press.flags());
...@@ -2498,7 +2514,7 @@ TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) { ...@@ -2498,7 +2514,7 @@ TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) {
ui::EventTimeForNow(), kLeftAndAltFlag, ui::EventTimeForNow(), kLeftAndAltFlag,
ui::EF_LEFT_MOUSE_BUTTON); ui::EF_LEFT_MOUSE_BUTTON);
ui::EventTestApi test_release(&release); ui::EventTestApi test_release(&release);
test_release.set_source_device_id(10); test_release.set_source_device_id(kTouchpadId1);
std::unique_ptr<ui::Event> new_event; std::unique_ptr<ui::Event> new_event;
const ui::MouseEvent* result = RewriteMouseButtonEvent(release, &new_event); const ui::MouseEvent* result = RewriteMouseButtonEvent(release, &new_event);
EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result->flags()); EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result->flags());
...@@ -2512,7 +2528,7 @@ TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) { ...@@ -2512,7 +2528,7 @@ TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) {
ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
ui::EF_LEFT_MOUSE_BUTTON); ui::EF_LEFT_MOUSE_BUTTON);
ui::EventTestApi test_press(&press); ui::EventTestApi test_press(&press);
test_press.set_source_device_id(10); test_press.set_source_device_id(kTouchpadId1);
std::unique_ptr<ui::Event> new_event; std::unique_ptr<ui::Event> new_event;
const ui::MouseEvent* result = RewriteMouseButtonEvent(press, &new_event); const ui::MouseEvent* result = RewriteMouseButtonEvent(press, &new_event);
EXPECT_TRUE(ui::EF_LEFT_MOUSE_BUTTON & result->flags()); EXPECT_TRUE(ui::EF_LEFT_MOUSE_BUTTON & result->flags());
...@@ -2523,7 +2539,7 @@ TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) { ...@@ -2523,7 +2539,7 @@ TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) {
ui::EventTimeForNow(), kLeftAndAltFlag, ui::EventTimeForNow(), kLeftAndAltFlag,
ui::EF_LEFT_MOUSE_BUTTON); ui::EF_LEFT_MOUSE_BUTTON);
ui::EventTestApi test_release(&release); ui::EventTestApi test_release(&release);
test_release.set_source_device_id(10); test_release.set_source_device_id(kTouchpadId1);
std::unique_ptr<ui::Event> new_event; std::unique_ptr<ui::Event> new_event;
const ui::MouseEvent* result = RewriteMouseButtonEvent(release, &new_event); const ui::MouseEvent* result = RewriteMouseButtonEvent(release, &new_event);
EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & result->flags()); EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & result->flags());
...@@ -2536,7 +2552,7 @@ TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) { ...@@ -2536,7 +2552,7 @@ TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) {
ui::EventTimeForNow(), kLeftAndAltFlag, ui::EventTimeForNow(), kLeftAndAltFlag,
ui::EF_LEFT_MOUSE_BUTTON); ui::EF_LEFT_MOUSE_BUTTON);
ui::EventTestApi test_press(&press); ui::EventTestApi test_press(&press);
test_press.set_source_device_id(11); test_press.set_source_device_id(kTouchpadId2);
std::unique_ptr<ui::Event> new_event; std::unique_ptr<ui::Event> new_event;
const ui::MouseEvent* result = RewriteMouseButtonEvent(press, &new_event); const ui::MouseEvent* result = RewriteMouseButtonEvent(press, &new_event);
EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result->flags()); EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result->flags());
...@@ -2548,7 +2564,7 @@ TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) { ...@@ -2548,7 +2564,7 @@ TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) {
ui::EventTimeForNow(), kLeftAndAltFlag, ui::EventTimeForNow(), kLeftAndAltFlag,
ui::EF_LEFT_MOUSE_BUTTON); ui::EF_LEFT_MOUSE_BUTTON);
ui::EventTestApi test_release(&release); ui::EventTestApi test_release(&release);
test_release.set_source_device_id(10); test_release.set_source_device_id(kTouchpadId1);
std::unique_ptr<ui::Event> new_event; std::unique_ptr<ui::Event> new_event;
const ui::MouseEvent* result = RewriteMouseButtonEvent(release, &new_event); const ui::MouseEvent* result = RewriteMouseButtonEvent(release, &new_event);
EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & result->flags()); EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & result->flags());
...@@ -2559,13 +2575,39 @@ TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) { ...@@ -2559,13 +2575,39 @@ TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) {
ui::EventTimeForNow(), kLeftAndAltFlag, ui::EventTimeForNow(), kLeftAndAltFlag,
ui::EF_LEFT_MOUSE_BUTTON); ui::EF_LEFT_MOUSE_BUTTON);
ui::EventTestApi test_release(&release); ui::EventTestApi test_release(&release);
test_release.set_source_device_id(11); test_release.set_source_device_id(kTouchpadId2);
std::unique_ptr<ui::Event> new_event; std::unique_ptr<ui::Event> new_event;
const ui::MouseEvent* result = RewriteMouseButtonEvent(release, &new_event); const ui::MouseEvent* result = RewriteMouseButtonEvent(release, &new_event);
EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result->flags()); EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result->flags());
EXPECT_FALSE(kLeftAndAltFlag & result->flags()); EXPECT_FALSE(kLeftAndAltFlag & result->flags());
EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, result->changed_button_flags()); EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, result->changed_button_flags());
} }
// No rewrite for non-touchpad devices.
{
ui::MouseEvent press(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
ui::EventTimeForNow(), kLeftAndAltFlag,
ui::EF_LEFT_MOUSE_BUTTON);
ui::EventTestApi test_press(&press);
test_press.set_source_device_id(kMouseId);
EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type());
EXPECT_EQ(kLeftAndAltFlag, press.flags());
std::unique_ptr<ui::Event> new_event;
const ui::MouseEvent* result = RewriteMouseButtonEvent(press, &new_event);
EXPECT_TRUE(kLeftAndAltFlag & result->flags());
EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result->changed_button_flags());
}
{
ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(),
ui::EventTimeForNow(), kLeftAndAltFlag,
ui::EF_LEFT_MOUSE_BUTTON);
ui::EventTestApi test_release(&release);
test_release.set_source_device_id(kMouseId);
std::unique_ptr<ui::Event> new_event;
const ui::MouseEvent* result = RewriteMouseButtonEvent(release, &new_event);
EXPECT_TRUE(kLeftAndAltFlag & result->flags());
EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result->changed_button_flags());
}
} }
TEST_F(EventRewriterAshTest, StickyKeyEventDispatchImpl) { TEST_F(EventRewriterAshTest, StickyKeyEventDispatchImpl) {
......
...@@ -257,6 +257,17 @@ ui::DomCode RelocateModifier(ui::DomCode code, ui::DomKeyLocation location) { ...@@ -257,6 +257,17 @@ ui::DomCode RelocateModifier(ui::DomCode code, ui::DomKeyLocation location) {
return code; return code;
} }
// Returns true if |mouse_event| was generated from a touchpad device.
bool IsFromTouchpadDevice(const ui::MouseEvent& mouse_event) {
for (const ui::InputDevice& touchpad :
ui::InputDeviceManager::GetInstance()->GetTouchpadDevices()) {
if (touchpad.id == mouse_event.source_device_id())
return true;
}
return false;
}
} // namespace } // namespace
EventRewriterChromeOS::EventRewriterChromeOS( EventRewriterChromeOS::EventRewriterChromeOS(
...@@ -1171,11 +1182,15 @@ void EventRewriterChromeOS::RewriteLocatedEvent(const ui::Event& event, ...@@ -1171,11 +1182,15 @@ void EventRewriterChromeOS::RewriteLocatedEvent(const ui::Event& event,
int EventRewriterChromeOS::RewriteModifierClick( int EventRewriterChromeOS::RewriteModifierClick(
const ui::MouseEvent& mouse_event, const ui::MouseEvent& mouse_event,
int* flags) { int* flags) {
// Note that this behavior is limited to mouse events coming from touchpad
// devices. https://crbug.com/890648.
// Remap Alt+Button1 to Button3. // Remap Alt+Button1 to Button3.
const int kAltLeftButton = (ui::EF_ALT_DOWN | ui::EF_LEFT_MOUSE_BUTTON); const int kAltLeftButton = (ui::EF_ALT_DOWN | ui::EF_LEFT_MOUSE_BUTTON);
if (((*flags & kAltLeftButton) == kAltLeftButton) && if (((*flags & kAltLeftButton) == kAltLeftButton) &&
((mouse_event.type() == ui::ET_MOUSE_PRESSED) || ((mouse_event.type() == ui::ET_MOUSE_PRESSED) ||
pressed_device_ids_.count(mouse_event.source_device_id()))) { pressed_device_ids_.count(mouse_event.source_device_id())) &&
IsFromTouchpadDevice(mouse_event)) {
*flags &= ~kAltLeftButton; *flags &= ~kAltLeftButton;
*flags |= ui::EF_RIGHT_MOUSE_BUTTON; *flags |= ui::EF_RIGHT_MOUSE_BUTTON;
if (mouse_event.type() == ui::ET_MOUSE_PRESSED) if (mouse_event.type() == ui::ET_MOUSE_PRESSED)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment