15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cstring> 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <set> 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include <X11/extensions/XInput2.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <X11/Xlib.h> 100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include <X11/Xutil.h> 110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include <X11/XKBlib.h> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generically-named #defines from Xlib that conflict with symbols in GTest. 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef Bool 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef None 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/scoped_ptr.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h" 20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_constants.h" 21d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_utils.h" 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/events/test/events_test_utils.h" 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/events/test/events_test_utils_x11.h" 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/events/x/device_data_manager_x11.h" 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/events/x/touch_factory_x11.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/point.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Initializes the passed-in Xlib event. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InitButtonEvent(XEvent* event, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_press, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& location, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int button, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int state) { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(event, 0, sizeof(*event)); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't bother setting fields that the event code doesn't use, such as 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // x_root/y_root and window/root/subwindow. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XButtonEvent* button_event = &(event->xbutton); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) button_event->type = is_press ? ButtonPress : ButtonRelease; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) button_event->x = location.x(); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) button_event->y = location.y(); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) button_event->button = button; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) button_event->state = state; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Initializes the passed-in Xlib event. 510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid InitKeyEvent(Display* display, 520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch XEvent* event, 530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool is_press, 540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int keycode, 550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int state) { 560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch memset(event, 0, sizeof(*event)); 570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // We don't bother setting fields that the event code doesn't use, such as 590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // x_root/y_root and window/root/subwindow. 600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch XKeyEvent* key_event = &(event->xkey); 610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch key_event->display = display; 620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch key_event->type = is_press ? KeyPress : KeyRelease; 630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch key_event->keycode = keycode; 640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch key_event->state = state; 650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Returns true if the keysym maps to a KeyEvent with the EF_FUNCTION_KEY 6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// flag set, or the keysym maps to a zero key code. 6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool HasFunctionKeyFlagSetIfSupported(Display* display, int x_keysym) { 7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) XEvent event; 7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int x_keycode = XKeysymToKeycode(display, x_keysym); 7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Exclude keysyms for which the server has no corresponding keycode. 7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (x_keycode) { 7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) InitKeyEvent(display, &event, true, x_keycode, 0); 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::KeyEvent ui_key_event(&event); 7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return (ui_key_event.flags() & ui::EF_FUNCTION_KEY); 7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return true; 7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass EventsXTest : public testing::Test { 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EventsXTest() {} 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual ~EventsXTest() {} 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void SetUp() OVERRIDE { 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DeviceDataManagerX11::CreateInstance(); 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::TouchFactory::GetInstance()->ResetForTest(); 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private: 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DISALLOW_COPY_AND_ASSIGN(EventsXTest); 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 96116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(EventsXTest, ButtonEvents) { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XEvent event; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point location(5, 10); 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Vector2d offset; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitButtonEvent(&event, true, location, 1, 0); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_MOUSE_PRESSED, ui::EventTypeFromNative(&event)); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, ui::EventFlagsFromNative(&event)); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(location, ui::EventLocationFromNative(&event)); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitButtonEvent(&event, true, location, 2, Button1Mask | ShiftMask); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_MOUSE_PRESSED, ui::EventTypeFromNative(&event)); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON | ui::EF_MIDDLE_MOUSE_BUTTON | 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_SHIFT_DOWN, 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EventFlagsFromNative(&event)); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(location, ui::EventLocationFromNative(&event)); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitButtonEvent(&event, false, location, 3, 0); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_MOUSE_RELEASED, ui::EventTypeFromNative(&event)); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, ui::EventFlagsFromNative(&event)); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(location, ui::EventLocationFromNative(&event)); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Scroll up. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitButtonEvent(&event, true, location, 4, 0); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_MOUSEWHEEL, ui::EventTypeFromNative(&event)); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, ui::EventFlagsFromNative(&event)); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(location, ui::EventLocationFromNative(&event)); 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) offset = ui::GetMouseWheelOffset(&event); 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_GT(offset.y(), 0); 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, offset.x()); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Scroll down. 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitButtonEvent(&event, true, location, 5, 0); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_MOUSEWHEEL, ui::EventTypeFromNative(&event)); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, ui::EventFlagsFromNative(&event)); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(location, ui::EventLocationFromNative(&event)); 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) offset = ui::GetMouseWheelOffset(&event); 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LT(offset.y(), 0); 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, offset.x()); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Scroll left. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitButtonEvent(&event, true, location, 6, 0); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_MOUSEWHEEL, ui::EventTypeFromNative(&event)); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, ui::EventFlagsFromNative(&event)); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(location, ui::EventLocationFromNative(&event)); 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) offset = ui::GetMouseWheelOffset(&event); 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, offset.y()); 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_GT(offset.x(), 0); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Scroll right. 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitButtonEvent(&event, true, location, 7, 0); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_MOUSEWHEEL, ui::EventTypeFromNative(&event)); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, ui::EventFlagsFromNative(&event)); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(location, ui::EventLocationFromNative(&event)); 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) offset = ui::GetMouseWheelOffset(&event); 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, offset.y()); 152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_LT(offset.x(), 0); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(derat): Test XInput code. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 157116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(EventsXTest, AvoidExtraEventsOnWheelRelease) { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XEvent event; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point location(5, 10); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitButtonEvent(&event, true, location, 4, 0); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_MOUSEWHEEL, ui::EventTypeFromNative(&event)); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should return ET_UNKNOWN for the release event instead of returning 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ET_MOUSEWHEEL; otherwise we'll scroll twice for each scrollwheel step. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitButtonEvent(&event, false, location, 4, 0); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_UNKNOWN, ui::EventTypeFromNative(&event)); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(derat): Test XInput code. 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 172116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(EventsXTest, EnterLeaveEvent) { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XEvent event; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.xcrossing.type = EnterNotify; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.xcrossing.x = 10; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.xcrossing.y = 20; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.xcrossing.x_root = 110; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.xcrossing.y_root = 120; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 180a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Mouse enter events are converted to mouse move events to be consistent with 181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // the way views handle mouse enter. See comments for EnterNotify case in 182a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // ui::EventTypeFromNative for more details. 183a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(ui::ET_MOUSE_MOVED, ui::EventTypeFromNative(&event)); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("10,20", ui::EventLocationFromNative(&event).ToString()); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("110,120", ui::EventSystemLocationFromNative(&event).ToString()); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.xcrossing.type = LeaveNotify; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.xcrossing.x = 30; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.xcrossing.y = 40; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.xcrossing.x_root = 230; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.xcrossing.y_root = 240; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::ET_MOUSE_EXITED, ui::EventTypeFromNative(&event)); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("30,40", ui::EventLocationFromNative(&event).ToString()); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("230,240", ui::EventSystemLocationFromNative(&event).ToString()); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 197116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(EventsXTest, ClickCount) { 198d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) XEvent event; 199d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gfx::Point location(5, 10); 200d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 201d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) for (int i = 1; i <= 3; ++i) { 202d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) InitButtonEvent(&event, true, location, 1, 0); 203d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) { 204d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) MouseEvent mouseev(&event); 205d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(ui::ET_MOUSE_PRESSED, mouseev.type()); 206d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(i, mouseev.GetClickCount()); 207d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 208d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 209d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) InitButtonEvent(&event, false, location, 1, 0); 210d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) { 211d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) MouseEvent mouseev(&event); 212d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(ui::ET_MOUSE_RELEASED, mouseev.type()); 213d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(i, mouseev.GetClickCount()); 214d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 215d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 216d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 217d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 218a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#if defined(USE_XI2_MT) 219116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(EventsXTest, TouchEventBasic) { 220a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::vector<unsigned int> devices; 221a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) devices.push_back(0); 222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui::SetUpTouchDevicesForTest(devices); 223a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::vector<Valuator> valuators; 224a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 225a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Init touch begin with tracking id 5, touch id 0. 226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch valuators.push_back(Valuator(DeviceDataManagerX11::DT_TOUCH_MAJOR, 20)); 227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch valuators.push_back( 228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Valuator(DeviceDataManagerX11::DT_TOUCH_ORIENTATION, 0.3f)); 229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch valuators.push_back(Valuator(DeviceDataManagerX11::DT_TOUCH_PRESSURE, 100)); 230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ui::ScopedXI2Event scoped_xevent; 231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_xevent.InitTouchEvent( 232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 0, XI_TouchBegin, 5, gfx::Point(10, 10), valuators); 233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(ui::ET_TOUCH_PRESSED, ui::EventTypeFromNative(scoped_xevent)); 234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("10,10", ui::EventLocationFromNative(scoped_xevent).ToString()); 235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(GetTouchId(scoped_xevent), 0); 236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(GetTouchRadiusX(scoped_xevent), 10); 237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FLOAT_EQ(GetTouchAngle(scoped_xevent), 0.15f); 238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FLOAT_EQ(GetTouchForce(scoped_xevent), 0.1f); 239a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 240a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Touch update, with new orientation info. 241a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) valuators.clear(); 242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch valuators.push_back( 243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Valuator(DeviceDataManagerX11::DT_TOUCH_ORIENTATION, 0.5f)); 244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_xevent.InitTouchEvent( 245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 0, XI_TouchUpdate, 5, gfx::Point(20, 20), valuators); 246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(ui::ET_TOUCH_MOVED, ui::EventTypeFromNative(scoped_xevent)); 247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("20,20", ui::EventLocationFromNative(scoped_xevent).ToString()); 248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(GetTouchId(scoped_xevent), 0); 249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(GetTouchRadiusX(scoped_xevent), 10); 250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FLOAT_EQ(GetTouchAngle(scoped_xevent), 0.25f); 251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FLOAT_EQ(GetTouchForce(scoped_xevent), 0.1f); 252a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 253a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Another touch with tracking id 6, touch id 1. 254a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) valuators.clear(); 255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch valuators.push_back(Valuator(DeviceDataManagerX11::DT_TOUCH_MAJOR, 100)); 256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch valuators.push_back(Valuator( 257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DeviceDataManagerX11::DT_TOUCH_ORIENTATION, 0.9f)); 258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch valuators.push_back(Valuator(DeviceDataManagerX11::DT_TOUCH_PRESSURE, 500)); 259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_xevent.InitTouchEvent( 260a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, XI_TouchBegin, 6, gfx::Point(200, 200), valuators); 261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(ui::ET_TOUCH_PRESSED, ui::EventTypeFromNative(scoped_xevent)); 262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("200,200", ui::EventLocationFromNative(scoped_xevent).ToString()); 263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(GetTouchId(scoped_xevent), 1); 264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(GetTouchRadiusX(scoped_xevent), 50); 265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FLOAT_EQ(GetTouchAngle(scoped_xevent), 0.45f); 266f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FLOAT_EQ(GetTouchForce(scoped_xevent), 0.5f); 267a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 268a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Touch with tracking id 5 should have old radius/angle value and new pressue 269a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // value. 270a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) valuators.clear(); 271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch valuators.push_back(Valuator(DeviceDataManagerX11::DT_TOUCH_PRESSURE, 50)); 272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_xevent.InitTouchEvent( 273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 0, XI_TouchEnd, 5, gfx::Point(30, 30), valuators); 274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(ui::ET_TOUCH_RELEASED, ui::EventTypeFromNative(scoped_xevent)); 275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("30,30", ui::EventLocationFromNative(scoped_xevent).ToString()); 276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(GetTouchId(scoped_xevent), 0); 277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(GetTouchRadiusX(scoped_xevent), 10); 278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FLOAT_EQ(GetTouchAngle(scoped_xevent), 0.25f); 279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FLOAT_EQ(GetTouchForce(scoped_xevent), 0.05f); 280a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 281a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Touch with tracking id 6 should have old angle/pressure value and new 282a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // radius value. 283a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) valuators.clear(); 284116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch valuators.push_back(Valuator(DeviceDataManagerX11::DT_TOUCH_MAJOR, 50)); 285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_xevent.InitTouchEvent( 286f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 0, XI_TouchEnd, 6, gfx::Point(200, 200), valuators); 287f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(ui::ET_TOUCH_RELEASED, ui::EventTypeFromNative(scoped_xevent)); 288f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("200,200", ui::EventLocationFromNative(scoped_xevent).ToString()); 289f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(GetTouchId(scoped_xevent), 1); 290f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(GetTouchRadiusX(scoped_xevent), 25); 291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FLOAT_EQ(GetTouchAngle(scoped_xevent), 0.45f); 292f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FLOAT_EQ(GetTouchForce(scoped_xevent), 0.5f); 293a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 2945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)int GetTouchIdForTrackingId(uint32 tracking_id) { 2965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int slot = 0; 2975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool success = 2985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TouchFactory::GetInstance()->QuerySlotForTrackingID(tracking_id, &slot); 2995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (success) 3005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return slot; 3015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return -1; 3025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 3035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(EventsXTest, TouchEventIdRefcounting) { 3055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::vector<unsigned int> devices; 3065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) devices.push_back(0); 3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::SetUpTouchDevicesForTest(devices); 3085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::vector<Valuator> valuators; 3095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const int kTrackingId0 = 5; 3115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const int kTrackingId1 = 7; 3125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Increment ref count once for first touch. 3145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::ScopedXI2Event xpress0; 3155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) xpress0.InitTouchEvent( 3165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 0, XI_TouchBegin, kTrackingId0, gfx::Point(10, 10), valuators); 3175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<ui::TouchEvent> upress0(new ui::TouchEvent(xpress0)); 3185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(0, GetTouchIdForTrackingId(kTrackingId0)); 3195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Increment ref count 4 times for second touch. 3215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::ScopedXI2Event xpress1; 3225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) xpress1.InitTouchEvent( 3235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 0, XI_TouchBegin, kTrackingId1, gfx::Point(20, 20), valuators); 3245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for (int i = 0; i < 4; ++i) { 3265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::TouchEvent upress1(xpress1); 3275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1, GetTouchIdForTrackingId(kTrackingId1)); 3285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 3295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::ScopedXI2Event xrelease1; 3315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) xrelease1.InitTouchEvent( 3325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 0, XI_TouchEnd, kTrackingId1, gfx::Point(10, 10), valuators); 3335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Decrement ref count 3 times for second touch. 3355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for (int i = 0; i < 3; ++i) { 3365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::TouchEvent urelease1(xrelease1); 3375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1, GetTouchIdForTrackingId(kTrackingId1)); 3385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 3395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // This should clear the touch id of the second touch. 3415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<ui::TouchEvent> urelease1(new ui::TouchEvent(xrelease1)); 3425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) urelease1.reset(); 3435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(-1, GetTouchIdForTrackingId(kTrackingId1)); 3445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // This should clear the touch id of the first touch. 3465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::ScopedXI2Event xrelease0; 3475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) xrelease0.InitTouchEvent( 3485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 0, XI_TouchEnd, kTrackingId0, gfx::Point(10, 10), valuators); 3495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<ui::TouchEvent> urelease0(new ui::TouchEvent(xrelease0)); 3505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) urelease0.reset(); 3515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(-1, GetTouchIdForTrackingId(kTrackingId0)); 3525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 353a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif 3540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 355116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(EventsXTest, NumpadKeyEvents) { 3560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch XEvent event; 3570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Display* display = gfx::GetXDisplay(); 3580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch struct { 3600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool is_numpad_key; 3610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int x_keysym; 3620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } keys[] = { 3630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // XK_KP_Space and XK_KP_Equal are the extrema in the conventional 3640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // keysymdef.h numbering. 3650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_Space }, 3660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_Equal }, 3670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Other numpad keysyms. (This is actually exhaustive in the current list.) 3680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_Tab }, 3690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_Enter }, 3700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_F1 }, 3710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_F2 }, 3720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_F3 }, 3730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_F4 }, 3740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_Home }, 3750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_Left }, 3760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_Up }, 3770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_Right }, 3780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_Down }, 3790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_Prior }, 3800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_Page_Up }, 3810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_Next }, 3820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_Page_Down }, 3830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_End }, 3840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_Begin }, 3850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_Insert }, 3860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_Delete }, 3870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_Multiply }, 3880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_Add }, 3890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_Separator }, 3900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_Subtract }, 3910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_Decimal }, 3920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_Divide }, 3930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_0 }, 3940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_1 }, 3950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_2 }, 3960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_3 }, 3970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_4 }, 3980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_5 }, 3990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_6 }, 4000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_7 }, 4010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_8 }, 4020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { true, XK_KP_9 }, 4030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Largest keysym preceding XK_KP_Space. 4040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_Num_Lock }, 4050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Smallest keysym following XK_KP_Equal. 4060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_F1 }, 4070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Non-numpad analogues of numpad keysyms. 4080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_Tab }, 4090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_Return }, 4100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_F1 }, 4110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_F2 }, 4120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_F3 }, 4130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_F4 }, 4140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_Home }, 4150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_Left }, 4160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_Up }, 4170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_Right }, 4180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_Down }, 4190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_Prior }, 4200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_Page_Up }, 4210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_Next }, 4220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_Page_Down }, 4230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_End }, 4240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_Insert }, 4250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_Delete }, 4260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_multiply }, 4270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_plus }, 4280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_minus }, 4290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_period }, 4300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_slash }, 4310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_0 }, 4320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_1 }, 4330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_2 }, 4340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_3 }, 4350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_4 }, 4360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_5 }, 4370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_6 }, 4380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_7 }, 4390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_8 }, 4400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_9 }, 4410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Miscellaneous other keysyms. 4420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_BackSpace }, 4430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_Scroll_Lock }, 4440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_Multi_key }, 4450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_Select }, 4460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_Num_Lock }, 4470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_Shift_L }, 4480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_space }, 4490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { false, XK_A }, 4500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch }; 4510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch for (size_t k = 0; k < ARRAYSIZE_UNSAFE(keys); ++k) { 4530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int x_keycode = XKeysymToKeycode(display, keys[k].x_keysym); 4540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Exclude keysyms for which the server has no corresponding keycode. 4550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (x_keycode) { 4560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch InitKeyEvent(display, &event, true, x_keycode, 0); 4570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // int keysym = XLookupKeysym(&event.xkey, 0); 4580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // if (keysym) { 4595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::KeyEvent ui_key_event(&event); 4600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(keys[k].is_numpad_key ? ui::EF_NUMPAD_KEY : 0, 4610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ui_key_event.flags() & ui::EF_NUMPAD_KEY); 4620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 4630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 4640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 4650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 466116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(EventsXTest, FunctionKeyEvents) { 46746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) Display* display = gfx::GetXDisplay(); 46846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 46946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Min function key code minus 1. 47046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(HasFunctionKeyFlagSetIfSupported(display, XK_F1 - 1)); 47146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // All function keys. 47246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F1)); 47346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F2)); 47446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F3)); 47546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F4)); 47646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F5)); 47746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F6)); 47846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F7)); 47946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F8)); 48046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F9)); 48146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F10)); 48246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F11)); 48346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F12)); 48446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F13)); 48546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F14)); 48646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F15)); 48746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F16)); 48846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F17)); 48946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F18)); 49046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F19)); 49146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F20)); 49246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F21)); 49346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F22)); 49446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F23)); 49546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F24)); 49646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F25)); 49746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F26)); 49846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F27)); 49946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F28)); 50046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F29)); 50146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F30)); 50246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F31)); 50346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F32)); 50446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F33)); 50546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F34)); 50646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(HasFunctionKeyFlagSetIfSupported(display, XK_F35)); 50746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Max function key code plus 1. 50846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(HasFunctionKeyFlagSetIfSupported(display, XK_F35 + 1)); 50946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 51046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 5116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if defined(USE_XI2_MT) 512116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Verifies that the type of events from a disabled keyboard is ET_UNKNOWN, but 513116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// that an exception list of keys can still be processed. 514116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(EventsXTest, DisableKeyboard) { 515116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DeviceDataManagerX11* device_data_manager = 516116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static_cast<DeviceDataManagerX11*>( 517116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DeviceDataManager::GetInstance()); 5186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) unsigned int blocked_device_id = 1; 5196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) unsigned int other_device_id = 2; 5201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned int master_device_id = 3; 5216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) device_data_manager->DisableDevice(blocked_device_id); 5226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 523116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<std::set<KeyboardCode> > excepted_keys(new std::set<KeyboardCode>); 524116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch excepted_keys->insert(VKEY_B); 5256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) device_data_manager->SetDisabledKeyboardAllowedKeys(excepted_keys.Pass()); 526116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ScopedXI2Event xev; 528116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // A is not allowed on the blocked keyboard, and should return ET_UNKNOWN. 5291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci xev.InitGenericKeyEvent(master_device_id, 5301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci blocked_device_id, 5311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::ET_KEY_PRESSED, 5321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::VKEY_A, 5331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0); 5346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(ui::ET_UNKNOWN, ui::EventTypeFromNative(xev)); 535116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 536116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // The B key is allowed as an exception, and should return KEY_PRESSED. 5371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci xev.InitGenericKeyEvent(master_device_id, 5381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci blocked_device_id, 5391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::ET_KEY_PRESSED, 5401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::VKEY_B, 5411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0); 5426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(ui::ET_KEY_PRESSED, ui::EventTypeFromNative(xev)); 543116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Both A and B are allowed on an unblocked keyboard device. 5451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci xev.InitGenericKeyEvent(master_device_id, 5461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci other_device_id, 5471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::ET_KEY_PRESSED, 5481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::VKEY_A, 5491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0); 5506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(ui::ET_KEY_PRESSED, ui::EventTypeFromNative(xev)); 5511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci xev.InitGenericKeyEvent(master_device_id, 5521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci other_device_id, 5531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::ET_KEY_PRESSED, 5541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::VKEY_B, 5551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0); 5566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(ui::ET_KEY_PRESSED, ui::EventTypeFromNative(xev)); 5576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 5586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) device_data_manager->EnableDevice(blocked_device_id); 5596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) device_data_manager->SetDisabledKeyboardAllowedKeys( 5606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<std::set<KeyboardCode> >()); 561116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 562116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // A key returns KEY_PRESSED as per usual now that keyboard was re-enabled. 5631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci xev.InitGenericKeyEvent(master_device_id, 5641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci blocked_device_id, 5651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::ET_KEY_PRESSED, 5661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::VKEY_A, 5671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0); 5686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(ui::ET_KEY_PRESSED, ui::EventTypeFromNative(xev)); 569116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 570116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 571116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Verifies that the type of events from a disabled mouse is ET_UNKNOWN. 572116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(EventsXTest, DisableMouse) { 573116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DeviceDataManagerX11* device_data_manager = 574116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static_cast<DeviceDataManagerX11*>( 575116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DeviceDataManager::GetInstance()); 576116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch unsigned int blocked_device_id = 1; 577116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch unsigned int other_device_id = 2; 578116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::vector<unsigned int> device_list; 579116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch device_list.push_back(blocked_device_id); 580116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch device_list.push_back(other_device_id); 581116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list); 582116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 583116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch device_data_manager->DisableDevice(blocked_device_id); 584116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 585116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ScopedXI2Event xev; 586116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch xev.InitGenericButtonEvent(blocked_device_id, ET_MOUSE_PRESSED, gfx::Point(), 587116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EF_LEFT_MOUSE_BUTTON); 588116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ui::ET_UNKNOWN, ui::EventTypeFromNative(xev)); 589116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 590116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch xev.InitGenericButtonEvent(other_device_id, ET_MOUSE_PRESSED, gfx::Point(), 591116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EF_LEFT_MOUSE_BUTTON); 592116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ui::ET_MOUSE_PRESSED, ui::EventTypeFromNative(xev)); 593116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 594116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch device_data_manager->EnableDevice(blocked_device_id); 595116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 596116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch xev.InitGenericButtonEvent(blocked_device_id, ET_MOUSE_PRESSED, gfx::Point(), 597116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EF_LEFT_MOUSE_BUTTON); 598116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ui::ET_MOUSE_PRESSED, ui::EventTypeFromNative(xev)); 599116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 600116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif // defined(USE_XI2_MT) 601116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 602f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if !defined(OS_CHROMEOS) 603116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(EventsXTest, ImeFabricatedKeyEvents) { 604f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Display* display = gfx::GetXDisplay(); 605f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 606f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) unsigned int state_to_be_fabricated[] = { 607f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 0, ShiftMask, LockMask, ShiftMask | LockMask, 608f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) }; 609f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(state_to_be_fabricated); ++i) { 610f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) unsigned int state = state_to_be_fabricated[i]; 611f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (int is_char = 0; is_char < 2; ++is_char) { 612f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) XEvent x_event; 613f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InitKeyEvent(display, &x_event, true, 0, state); 6145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::KeyEvent key_event(&x_event); 6155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (is_char) { 6165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) KeyEventTestApi test_event(&key_event); 6175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) test_event.set_is_char(true); 6185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 619f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(key_event.flags() & ui::EF_IME_FABRICATED_KEY); 620f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 621f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 622f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 623f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) unsigned int state_to_be_not_fabricated[] = { 624f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ControlMask, Mod1Mask, Mod2Mask, ShiftMask | ControlMask, 625f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) }; 626f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(state_to_be_not_fabricated); ++i) { 627f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) unsigned int state = state_to_be_not_fabricated[i]; 628f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (int is_char = 0; is_char < 2; ++is_char) { 629f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) XEvent x_event; 630f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InitKeyEvent(display, &x_event, true, 0, state); 6315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::KeyEvent key_event(&x_event); 6325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (is_char) { 6335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) KeyEventTestApi test_event(&key_event); 6345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) test_event.set_is_char(true); 6355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 636f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(key_event.flags() & ui::EF_IME_FABRICATED_KEY); 637f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 638f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 639f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 640f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif 641f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui 643