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) 5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_constants.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <cmath> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <X11/extensions/XInput.h> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <X11/extensions/XInput2.h> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <X11/Xlib.h> 120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include <X11/Xutil.h> 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <X11/XKBlib.h> 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/singleton.h" 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/events/event.h" 18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_utils.h" 19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_code_conversion_x.h" 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/events/x/device_data_manager_x11.h" 2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/events/x/device_list_cache_x.h" 2268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/events/x/touch_factory_x11.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/display.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/point.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 2768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/gfx/x/x11_atom_cache.h" 2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/gfx/x/x11_types.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Scroll amount for each wheelscroll event. 53 is also the value used for GTK+. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kWheelScrollAmount = 53; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kMinWheelButton = 4; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kMaxWheelButton = 7; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A class to track current modifier state on master device. Only track ctrl, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// alt, shift and caps lock keys currently. The tracked state can then be used 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by floating device. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class XModifierStateWatcher{ 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static XModifierStateWatcher* GetInstance() { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Singleton<XModifierStateWatcher>::get(); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int StateFromKeyboardCode(ui::KeyboardCode keyboard_code) { 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch switch (keyboard_code) { 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ui::VKEY_CONTROL: 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ControlMask; 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ui::VKEY_SHIFT: 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ShiftMask; 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ui::VKEY_MENU: 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return Mod1Mask; 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ui::VKEY_CAPITAL: 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return LockMask; 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch default: 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return 0; 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void UpdateStateFromXEvent(const base::NativeEvent& native_event) { 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::KeyboardCode keyboard_code = ui::KeyboardCodeFromNative(native_event); 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch unsigned int mask = StateFromKeyboardCode(keyboard_code); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Floating device can't access the modifer state from master device. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need to track the states of modifier keys in a singleton for 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // floating devices such as touch screen. Issue 106426 is one example 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of why we need the modifier states for floating device. 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch switch (native_event->type) { 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case KeyPress: 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch state_ = native_event->xkey.state | mask; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case KeyRelease: 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch state_ = native_event->xkey.state & ~mask; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case GenericEvent: { 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch XIDeviceEvent* xievent = 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static_cast<XIDeviceEvent*>(native_event->xcookie.data); 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch switch (xievent->evtype) { 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case XI_KeyPress: 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch state_ = xievent->mods.effective |= mask; 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case XI_KeyRelease: 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch state_ = xievent->mods.effective &= ~mask; 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch default: 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NOTREACHED(); 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NOTREACHED(); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the current modifer state in master device. It only contains the 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // state of ctrl, shift, alt and caps lock keys. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int state() { return state_; } 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend struct DefaultSingletonTraits<XModifierStateWatcher>; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XModifierStateWatcher() : state_(0) { } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int state_; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(XModifierStateWatcher); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_XI2_MT) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Detects if a touch event is a driver-generated 'special event'. 114ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// A 'special event' is a touch event with maximum radius and pressure at 115ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// location (0, 0). 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This needs to be done in a cleaner way: http://crbug.com/169256 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool TouchEventIsGeneratedHack(const base::NativeEvent& native_event) { 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) XIDeviceEvent* event = 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<XIDeviceEvent*>(native_event->xcookie.data); 120ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch CHECK(event->evtype == XI_TouchBegin || 121ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch event->evtype == XI_TouchUpdate || 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->evtype == XI_TouchEnd); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Force is normalized to [0, 1]. 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ui::GetTouchForce(native_event) < 1.0f) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ui::EventLocationFromNative(native_event) != gfx::Point()) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Radius is in pixels, and the valuator is the diameter in pixels. 13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) double radius = ui::GetTouchRadiusX(native_event), min, max; 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned int deviceid = 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<XIDeviceEvent*>(native_event->xcookie.data)->sourceid; 135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!ui::DeviceDataManagerX11::GetInstance()->GetDataRange( 136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch deviceid, ui::DeviceDataManagerX11::DT_TOUCH_MAJOR, &min, &max)) { 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return radius * 2 == max; 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GetEventFlagsFromXState(unsigned int state) { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags = 0; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state & ControlMask) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= ui::EF_CONTROL_DOWN; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state & ShiftMask) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= ui::EF_SHIFT_DOWN; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state & Mod1Mask) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= ui::EF_ALT_DOWN; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state & LockMask) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= ui::EF_CAPS_LOCK_DOWN; 154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (state & Mod3Mask) 155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) flags |= ui::EF_MOD3_DOWN; 156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (state & Mod4Mask) 157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) flags |= ui::EF_COMMAND_DOWN; 158a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (state & Mod5Mask) 159a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) flags |= ui::EF_ALTGR_DOWN; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state & Button1Mask) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= ui::EF_LEFT_MOUSE_BUTTON; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state & Button2Mask) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= ui::EF_MIDDLE_MOUSE_BUTTON; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state & Button3Mask) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= ui::EF_RIGHT_MOUSE_BUTTON; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return flags; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint GetEventFlagsFromXKeyEvent(XEvent* xevent) { 1705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK(xevent->type == KeyPress || xevent->type == KeyRelease); 1715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#if defined(OS_CHROMEOS) 1735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const int ime_fabricated_flag = 0; 1745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#else 1755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // XIM fabricates key events for the character compositions by XK_Multi_key. 1765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // For example, when a user hits XK_Multi_key, XK_apostrophe, and XK_e in 1775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // order to input "é", then XIM generates a key event with keycode=0 and 1785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // state=0 for the composition, and the sequence of X11 key events will be 179f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // XK_Multi_key, XK_apostrophe, **NoSymbol**, and XK_e. If the user used 180f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // shift key and/or caps lock key, state can be ShiftMask, LockMask or both. 1815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // 1825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // We have to send these fabricated key events to XIM so it can correctly 1835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // handle the character compositions. 184f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const unsigned int shift_lock_mask = ShiftMask | LockMask; 1855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const bool fabricated_by_xim = 186f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) xevent->xkey.keycode == 0 && 187f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) (xevent->xkey.state & ~shift_lock_mask) == 0; 1885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const int ime_fabricated_flag = 1895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu fabricated_by_xim ? ui::EF_IME_FABRICATED_KEY : 0; 1905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#endif 1915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return GetEventFlagsFromXState(xevent->xkey.state) | 1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) (xevent->xkey.send_event ? ui::EF_FINAL : 0) | 1945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu (IsKeypadKey(XLookupKeysym(&xevent->xkey, 0)) ? ui::EF_NUMPAD_KEY : 0) | 19546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) (IsFunctionKey(XLookupKeysym(&xevent->xkey, 0)) ? 19646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ui::EF_FUNCTION_KEY : 0) | 1975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ime_fabricated_flag; 1980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 200116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint GetEventFlagsFromXGenericEvent(XEvent* xevent) { 201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(xevent->type == GenericEvent); 202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xevent->xcookie.data); 203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK((xievent->evtype == XI_KeyPress) || 204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch (xievent->evtype == XI_KeyRelease)); 205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return GetEventFlagsFromXState(xievent->mods.effective) | 2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) (xevent->xkey.send_event ? ui::EF_FINAL : 0) | 207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch (IsKeypadKey( 208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch XkbKeycodeToKeysym(xievent->display, xievent->detail, 0, 0)) 209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ? ui::EF_NUMPAD_KEY 210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : 0); 211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Get the event flag for the button in XButtonEvent. During a ButtonPress 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// event, |state| in XButtonEvent does not include the button that has just been 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pressed. Instead |state| contains flags for the buttons (if any) that had 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// already been pressed before the current button, and |button| stores the most 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// current pressed button. So, if you press down left mouse button, and while 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pressing it down, press down the right mouse button, then for the latter 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// event, |state| would have Button1Mask set but not Button3Mask, and |button| 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// would be 3. 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GetEventFlagsForButton(int button) { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (button) { 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 1: 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::EF_LEFT_MOUSE_BUTTON; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 2: 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::EF_MIDDLE_MOUSE_BUTTON; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 3: 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::EF_RIGHT_MOUSE_BUTTON; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GetButtonMaskForX2Event(XIDeviceEvent* xievent) { 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int buttonflags = 0; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 8 * xievent->buttons.mask_len; i++) { 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (XIMaskIsSet(xievent->buttons.mask, i)) { 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int button = (xievent->sourceid == xievent->deviceid) ? 239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::DeviceDataManagerX11::GetInstance()->GetMappedButton(i) : i; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buttonflags |= GetEventFlagsForButton(button); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return buttonflags; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::EventType GetTouchEventType(const base::NativeEvent& native_event) { 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XIDeviceEvent* event = 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<XIDeviceEvent*>(native_event->xcookie.data); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_XI2_MT) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch(event->evtype) { 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XI_TouchBegin: 252ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return TouchEventIsGeneratedHack(native_event) ? ui::ET_UNKNOWN : 253ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ui::ET_TOUCH_PRESSED; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XI_TouchUpdate: 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return TouchEventIsGeneratedHack(native_event) ? ui::ET_UNKNOWN : 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ET_TOUCH_MOVED; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XI_TouchEnd: 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return TouchEventIsGeneratedHack(native_event) ? ui::ET_TOUCH_CANCELLED : 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ET_TOUCH_RELEASED; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif // defined(USE_XI2_MT) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(ui::TouchFactory::GetInstance()->IsTouchDevice(event->sourceid)); 2644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) switch (event->evtype) { 2654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case XI_ButtonPress: 2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return ui::ET_TOUCH_PRESSED; 2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case XI_ButtonRelease: 2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return ui::ET_TOUCH_RELEASED; 2694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case XI_Motion: 270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Should not convert any emulated Motion event from touch device to 271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // touch event. 272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!(event->flags & XIPointerEmulated) && 273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetButtonMaskForX2Event(event)) 2744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return ui::ET_TOUCH_MOVED; 2754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return ui::ET_UNKNOWN; 2764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) default: 2774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NOTREACHED(); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return ui::ET_UNKNOWN; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)double GetTouchParamFromXEvent(XEvent* xev, 283116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::DeviceDataManagerX11::DataType val, 28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) double default_value) { 285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::DeviceDataManagerX11::GetInstance()->GetEventData( 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *xev, val, &default_value); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return default_value; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void ScaleTouchRadius(XEvent* xev, double* radius) { 2915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK_EQ(GenericEvent, xev->type); 2925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(xev->xcookie.data); 2935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::DeviceDataManagerX11::GetInstance()->ApplyTouchRadiusScale( 2945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) xiev->sourceid, radius); 2955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 2965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)unsigned int UpdateX11EventFlags(int ui_flags, unsigned int old_x_flags) { 2985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) static struct { 2995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int ui; 3005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int x; 3015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } flags[] = { 3025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) {ui::EF_CONTROL_DOWN, ControlMask}, 3035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) {ui::EF_SHIFT_DOWN, ShiftMask}, 3045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) {ui::EF_ALT_DOWN, Mod1Mask}, 3055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) {ui::EF_CAPS_LOCK_DOWN, LockMask}, 3065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) {ui::EF_ALTGR_DOWN, Mod5Mask}, 3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) {ui::EF_COMMAND_DOWN, Mod4Mask}, 3085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) {ui::EF_MOD3_DOWN, Mod3Mask}, 3095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) {ui::EF_NUMPAD_KEY, Mod2Mask}, 3105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) {ui::EF_LEFT_MOUSE_BUTTON, Button1Mask}, 3115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) {ui::EF_MIDDLE_MOUSE_BUTTON, Button2Mask}, 3125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) {ui::EF_RIGHT_MOUSE_BUTTON, Button3Mask}, 3135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) }; 3145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) unsigned int new_x_flags = old_x_flags; 3155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(flags); ++i) { 3165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (ui_flags & flags[i].ui) 3175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new_x_flags |= flags[i].x; 3185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) else 3195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new_x_flags &= ~flags[i].x; 3205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 3215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return new_x_flags; 3225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 3235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)unsigned int UpdateX11EventButton(int ui_flag, unsigned int old_x_button) { 3255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) switch (ui_flag) { 3265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case ui::EF_LEFT_MOUSE_BUTTON: 3275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return Button1; 3285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case ui::EF_MIDDLE_MOUSE_BUTTON: 3295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return Button2; 3305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case ui::EF_RIGHT_MOUSE_BUTTON: 3315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return Button3; 3325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) default: 3335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return old_x_button; 3345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 3355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NOTREACHED(); 3365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 3375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool GetGestureTimes(const base::NativeEvent& native_event, 3396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) double* start_time, 3406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) double* end_time) { 3416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!ui::DeviceDataManagerX11::GetInstance()->HasGestureTimes(native_event)) 3426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return false; 3436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 3446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) double start_time_, end_time_; 3456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!start_time) 3466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) start_time = &start_time_; 3476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!end_time) 3486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) end_time = &end_time_; 3496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 3506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ui::DeviceDataManagerX11::GetInstance()->GetGestureTimes( 3516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) native_event, start_time, end_time); 3526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return true; 3536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 3546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui { 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UpdateDeviceList() { 36068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) XDisplay* display = gfx::GetXDisplay(); 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DeviceListCacheX::GetInstance()->UpdateDeviceList(display); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TouchFactory::GetInstance()->UpdateDeviceList(display); 363116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DeviceDataManagerX11::GetInstance()->UpdateDeviceList(display); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EventType EventTypeFromNative(const base::NativeEvent& native_event) { 367116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Allow the DeviceDataManager to block the event. If blocked return 368116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // ET_UNKNOWN as the type so this event will not be further processed. 369116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // NOTE: During some events unittests there is no device data manager. 370116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (DeviceDataManager::HasInstance() && 371116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static_cast<DeviceDataManagerX11*>(DeviceDataManager::GetInstance())-> 372116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IsEventBlocked(native_event)) { 373116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ET_UNKNOWN; 374116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 375116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (native_event->type) { 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case KeyPress: 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ET_KEY_PRESSED; 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case KeyRelease: 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ET_KEY_RELEASED; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ButtonPress: 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (static_cast<int>(native_event->xbutton.button) >= kMinWheelButton && 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(native_event->xbutton.button) <= kMaxWheelButton) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ET_MOUSEWHEEL; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ET_MOUSE_PRESSED; 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ButtonRelease: 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drop wheel events; we should've already scrolled on the press. 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (static_cast<int>(native_event->xbutton.button) >= kMinWheelButton && 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(native_event->xbutton.button) <= kMaxWheelButton) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ET_UNKNOWN; 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ET_MOUSE_RELEASED; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MotionNotify: 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (native_event->xmotion.state & 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (Button1Mask | Button2Mask | Button3Mask)) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ET_MOUSE_DRAGGED; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ET_MOUSE_MOVED; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case EnterNotify: 398a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The standard on Windows is to send a MouseMove event when the mouse 399a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // first enters a window instead of sending a special mouse enter event. 400a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // To be consistent we follow the same style. 401a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return ET_MOUSE_MOVED; 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case LeaveNotify: 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ET_MOUSE_EXITED; 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case GenericEvent: { 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TouchFactory* factory = TouchFactory::GetInstance(); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!factory->ShouldProcessXI2Event(native_event)) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ET_UNKNOWN; 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XIDeviceEvent* xievent = 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<XIDeviceEvent*>(native_event->xcookie.data); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This check works only for master and floating slave devices. That is 4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // why it is necessary to check for the XI_Touch* events in the following 4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // switch statement to account for attached-slave touchscreens. 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (factory->IsTouchDevice(xievent->sourceid)) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetTouchEventType(native_event); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (xievent->evtype) { 4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case XI_TouchBegin: 4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ui::ET_TOUCH_PRESSED; 4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case XI_TouchUpdate: 4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ui::ET_TOUCH_MOVED; 4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case XI_TouchEnd: 4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ui::ET_TOUCH_RELEASED; 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XI_ButtonPress: { 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int button = EventButtonFromNative(native_event); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (button >= kMinWheelButton && button <= kMaxWheelButton) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ET_MOUSEWHEEL; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ET_MOUSE_PRESSED; 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XI_ButtonRelease: { 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int button = EventButtonFromNative(native_event); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drop wheel events; we should've already scrolled on the press. 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (button >= kMinWheelButton && button <= kMaxWheelButton) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ET_UNKNOWN; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ET_MOUSE_RELEASED; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XI_Motion: { 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_cancel; 4405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DeviceDataManagerX11* devices = DeviceDataManagerX11::GetInstance(); 4415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (GetFlingData(native_event, NULL, NULL, NULL, NULL, &is_cancel)) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return is_cancel ? ET_SCROLL_FLING_CANCEL : ET_SCROLL_FLING_START; 4435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (devices->IsScrollEvent(native_event)) { 4445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return devices->IsTouchpadXInputEvent(native_event) ? ET_SCROLL 4455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : ET_MOUSEWHEEL; 4465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 4475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (devices->IsCMTMetricsEvent(native_event)) 448eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return ET_UMA_DATA; 4495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (GetButtonMaskForX2Event(xievent)) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ET_MOUSE_DRAGGED; 451116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ET_MOUSE_MOVED; 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 453116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case XI_KeyPress: 454116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ET_KEY_PRESSED; 455116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case XI_KeyRelease: 456116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ET_KEY_RELEASED; 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ET_UNKNOWN; 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int EventFlagsFromNative(const base::NativeEvent& native_event) { 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (native_event->type) { 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case KeyPress: 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case KeyRelease: { 469116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch XModifierStateWatcher::GetInstance()->UpdateStateFromXEvent(native_event); 4700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return GetEventFlagsFromXKeyEvent(native_event); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ButtonPress: 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ButtonRelease: { 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags = GetEventFlagsFromXState(native_event->xbutton.state); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const EventType type = EventTypeFromNative(native_event); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type == ET_MOUSE_PRESSED || type == ET_MOUSE_RELEASED) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= GetEventFlagsForButton(native_event->xbutton.button); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return flags; 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case EnterNotify: 4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case LeaveNotify: 4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetEventFlagsFromXState(native_event->xcrossing.state); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MotionNotify: 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetEventFlagsFromXState(native_event->xmotion.state); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case GenericEvent: { 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XIDeviceEvent* xievent = 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<XIDeviceEvent*>(native_event->xcookie.data); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (xievent->evtype) { 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_XI2_MT) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XI_TouchBegin: 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XI_TouchUpdate: 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XI_TouchEnd: 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetButtonMaskForX2Event(xievent) | 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetEventFlagsFromXState(xievent->mods.effective) | 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetEventFlagsFromXState( 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XModifierStateWatcher::GetInstance()->state()); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XI_ButtonPress: 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XI_ButtonRelease: { 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool touch = 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TouchFactory::GetInstance()->IsTouchDevice(xievent->sourceid); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags = GetButtonMaskForX2Event(xievent) | 505116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetEventFlagsFromXState(xievent->mods.effective); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (touch) { 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= GetEventFlagsFromXState( 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XModifierStateWatcher::GetInstance()->state()); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const EventType type = EventTypeFromNative(native_event); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int button = EventButtonFromNative(native_event); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((type == ET_MOUSE_PRESSED || type == ET_MOUSE_RELEASED) && !touch) 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= GetEventFlagsForButton(button); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return flags; 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XI_Motion: 518116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return GetButtonMaskForX2Event(xievent) | 519116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetEventFlagsFromXState(xievent->mods.effective); 520116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case XI_KeyPress: 521116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case XI_KeyRelease: { 522116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch XModifierStateWatcher::GetInstance()->UpdateStateFromXEvent( 523116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_event); 524116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return GetEventFlagsFromXGenericEvent(native_event); 525116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TimeDelta EventTimeFromNative(const base::NativeEvent& native_event) { 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch(native_event->type) { 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case KeyPress: 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case KeyRelease: 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::TimeDelta::FromMilliseconds(native_event->xkey.time); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ButtonPress: 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ButtonRelease: 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::TimeDelta::FromMilliseconds(native_event->xbutton.time); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MotionNotify: 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::TimeDelta::FromMilliseconds(native_event->xmotion.time); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case EnterNotify: 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case LeaveNotify: 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::TimeDelta::FromMilliseconds(native_event->xcrossing.time); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case GenericEvent: { 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double start, end; 55090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) double touch_timestamp; 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetGestureTimes(native_event, &start, &end)) { 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the driver supports gesture times, use them. 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::TimeDelta::FromMicroseconds(end * 1000000); 554116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } else if (DeviceDataManagerX11::GetInstance()->GetEventData( 555116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *native_event, 556116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DeviceDataManagerX11::DT_TOUCH_RAW_TIMESTAMP, 557116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &touch_timestamp)) { 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::TimeDelta::FromMicroseconds(touch_timestamp * 1000000); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XIDeviceEvent* xide = 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<XIDeviceEvent*>(native_event->xcookie.data); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::TimeDelta::FromMilliseconds(xide->time); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::TimeDelta(); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Point EventLocationFromNative(const base::NativeEvent& native_event) { 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (native_event->type) { 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case EnterNotify: 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case LeaveNotify: 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Point(native_event->xcrossing.x, native_event->xcrossing.y); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ButtonPress: 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ButtonRelease: 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Point(native_event->xbutton.x, native_event->xbutton.y); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MotionNotify: 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Point(native_event->xmotion.x, native_event->xmotion.y); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case GenericEvent: { 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XIDeviceEvent* xievent = 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<XIDeviceEvent*>(native_event->xcookie.data); 584cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) float x = xievent->event_x; 585cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) float y = xievent->event_y; 586cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_CHROMEOS) 587cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switch (xievent->evtype) { 588cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case XI_TouchBegin: 589cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case XI_TouchUpdate: 590cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case XI_TouchEnd: 591116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::DeviceDataManagerX11::GetInstance()->ApplyTouchTransformer( 592cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) xievent->deviceid, &x, &y); 593cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 594cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) default: 595cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 596cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 597cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif // defined(OS_CHROMEOS) 598cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return gfx::Point(static_cast<int>(x), static_cast<int>(y)); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Point(); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Point EventSystemLocationFromNative( 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::NativeEvent& native_event) { 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (native_event->type) { 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case EnterNotify: 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case LeaveNotify: { 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Point(native_event->xcrossing.x_root, 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_event->xcrossing.y_root); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ButtonPress: 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ButtonRelease: { 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Point(native_event->xbutton.x_root, 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_event->xbutton.y_root); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MotionNotify: { 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Point(native_event->xmotion.x_root, 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_event->xmotion.y_root); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case GenericEvent: { 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XIDeviceEvent* xievent = 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<XIDeviceEvent*>(native_event->xcookie.data); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Point(xievent->root_x, xievent->root_y); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Point(); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int EventButtonFromNative(const base::NativeEvent& native_event) { 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_EQ(GenericEvent, native_event->type); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XIDeviceEvent* xievent = 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<XIDeviceEvent*>(native_event->xcookie.data); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int button = xievent->detail; 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (xievent->sourceid == xievent->deviceid) ? 638116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DeviceDataManagerX11::GetInstance()->GetMappedButton(button) : button; 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)KeyboardCode KeyboardCodeFromNative(const base::NativeEvent& native_event) { 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return KeyboardCodeFromXKeyEvent(native_event); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const char* CodeFromNative(const base::NativeEvent& native_event) { 646a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return CodeFromXEvent(native_event); 647a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 648a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 649f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)uint32 PlatformKeycodeFromNative(const base::NativeEvent& native_event) { 650116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch XKeyEvent* xkey = NULL; 651116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch XEvent xkey_from_xi2; 652116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch switch (native_event->type) { 653116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case KeyPress: 654116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case KeyRelease: 655116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch xkey = &native_event->xkey; 656116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 657116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case GenericEvent: { 658116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch XIDeviceEvent* xievent = 659116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static_cast<XIDeviceEvent*>(native_event->xcookie.data); 660116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch switch (xievent->evtype) { 661116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case XI_KeyPress: 662116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case XI_KeyRelease: 663116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Build an XKeyEvent corresponding to the XI2 event, 664116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // so that we can call XLookupString on it. 665116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch InitXKeyEventFromXIDeviceEvent(*native_event, &xkey_from_xi2); 666116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch xkey = &xkey_from_xi2.xkey; 667116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 668116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch default: 669116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NOTREACHED(); 670116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 671116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 672116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 673116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 674116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch default: 675116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NOTREACHED(); 676116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 677116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 678116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch KeySym keysym = XK_VoidSymbol; 679116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (xkey) 680116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch XLookupString(xkey, NULL, 0, &keysym, NULL); 681f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return keysym; 682f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 683f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 6845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool IsCharFromNative(const base::NativeEvent& native_event) { 6855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return false; 6865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 6875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GetChangedMouseButtonFlagsFromNative( 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::NativeEvent& native_event) { 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (native_event->type) { 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ButtonPress: 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ButtonRelease: 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetEventFlagsFromXState(native_event->xbutton.state); 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case GenericEvent: { 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XIDeviceEvent* xievent = 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<XIDeviceEvent*>(native_event->xcookie.data); 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (xievent->evtype) { 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XI_ButtonPress: 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XI_ButtonRelease: 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetEventFlagsForButton(EventButtonFromNative(native_event)); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Vector2d GetMouseWheelOffset(const base::NativeEvent& native_event) { 7127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) float x_offset, y_offset; 7137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (GetScrollOffsets( 7147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) native_event, &x_offset, &y_offset, NULL, NULL, NULL)) { 715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return gfx::Vector2d(static_cast<int>(x_offset), 716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static_cast<int>(y_offset)); 717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int button = native_event->type == GenericEvent ? 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EventButtonFromNative(native_event) : native_event->xbutton.button; 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (button) { 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 4: 724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return gfx::Vector2d(0, kWheelScrollAmount); 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 5: 726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return gfx::Vector2d(0, -kWheelScrollAmount); 727a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case 6: 728a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return gfx::Vector2d(kWheelScrollAmount, 0); 729a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case 7: 730a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return gfx::Vector2d(-kWheelScrollAmount, 0); 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return gfx::Vector2d(); 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubase::NativeEvent CopyNativeEvent(const base::NativeEvent& event) { 7375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!event || event->type == GenericEvent) 7385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return NULL; 7395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu XEvent* copy = new XEvent; 7405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu *copy = *event; 7415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return copy; 7425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 7435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 7445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid ReleaseCopiedNativeEvent(const base::NativeEvent& event) { 7455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu delete event; 7465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 7475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 7485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void IncrementTouchIdRefCount(const base::NativeEvent& xev) { 7495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::DeviceDataManagerX11* manager = ui::DeviceDataManagerX11::GetInstance(); 7505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) double tracking_id; 7515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!manager->GetEventData( 7525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) *xev, ui::DeviceDataManagerX11::DT_TOUCH_TRACKING_ID, &tracking_id)) { 7535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return; 7545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 7555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 7565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::TouchFactory* factory = ui::TouchFactory::GetInstance(); 7575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) factory->AcquireSlotForTrackingID(tracking_id); 7585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 7595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 760a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void ClearTouchIdIfReleased(const base::NativeEvent& xev) { 761a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui::EventType type = ui::EventTypeFromNative(xev); 762a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (type == ui::ET_TOUCH_CANCELLED || 763a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) type == ui::ET_TOUCH_RELEASED) { 764a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui::TouchFactory* factory = ui::TouchFactory::GetInstance(); 765116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::DeviceDataManagerX11* manager = ui::DeviceDataManagerX11::GetInstance(); 766a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) double tracking_id; 767a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (manager->GetEventData( 768116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *xev, ui::DeviceDataManagerX11::DT_TOUCH_TRACKING_ID, &tracking_id)) { 769a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) factory->ReleaseSlotForTrackingID(tracking_id); 770a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 771a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 772a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 773a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GetTouchId(const base::NativeEvent& xev) { 77590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) double slot = 0; 776116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::DeviceDataManagerX11* manager = ui::DeviceDataManagerX11::GetInstance(); 77790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) double tracking_id; 7787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!manager->GetEventData( 779116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *xev, ui::DeviceDataManagerX11::DT_TOUCH_TRACKING_ID, &tracking_id)) { 780558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch LOG(ERROR) << "Could not get the tracking ID for the event. Using 0."; 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 7824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ui::TouchFactory* factory = ui::TouchFactory::GetInstance(); 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) slot = factory->GetSlotForTrackingID(tracking_id); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return slot; 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)float GetTouchRadiusX(const base::NativeEvent& native_event) { 7895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) double radius = GetTouchParamFromXEvent(native_event, 790116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::DeviceDataManagerX11::DT_TOUCH_MAJOR, 0.0) / 2.0; 7915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ScaleTouchRadius(native_event, &radius); 7925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return radius; 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)float GetTouchRadiusY(const base::NativeEvent& native_event) { 7965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) double radius = GetTouchParamFromXEvent(native_event, 797116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::DeviceDataManagerX11::DT_TOUCH_MINOR, 0.0) / 2.0; 7985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ScaleTouchRadius(native_event, &radius); 7995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return radius; 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)float GetTouchAngle(const base::NativeEvent& native_event) { 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetTouchParamFromXEvent(native_event, 804116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::DeviceDataManagerX11::DT_TOUCH_ORIENTATION, 0.0) / 2.0; 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)float GetTouchForce(const base::NativeEvent& native_event) { 80890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) double force = 0.0; 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) force = GetTouchParamFromXEvent(native_event, 810116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::DeviceDataManagerX11::DT_TOUCH_PRESSURE, 0.0); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int deviceid = 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<XIDeviceEvent*>(native_event->xcookie.data)->sourceid; 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force is normalized to fall into [0, 1] 814116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!ui::DeviceDataManagerX11::GetInstance()->NormalizeData( 815116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch deviceid, ui::DeviceDataManagerX11::DT_TOUCH_PRESSURE, &force)) 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) force = 0.0; 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return force; 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetScrollOffsets(const base::NativeEvent& native_event, 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float* x_offset, 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float* y_offset, 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float* x_offset_ordinal, 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float* y_offset_ordinal, 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int* finger_count) { 826116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!DeviceDataManagerX11::GetInstance()->IsScrollEvent(native_event)) 8277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 8287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Temp values to prevent passing NULLs to DeviceDataManager. 8307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) float x_offset_, y_offset_; 8317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) float x_offset_ordinal_, y_offset_ordinal_; 8327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int finger_count_; 8337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!x_offset) 8347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) x_offset = &x_offset_; 8357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!y_offset) 8367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) y_offset = &y_offset_; 8377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!x_offset_ordinal) 8387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) x_offset_ordinal = &x_offset_ordinal_; 8397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!y_offset_ordinal) 8407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) y_offset_ordinal = &y_offset_ordinal_; 8417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!finger_count) 8427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) finger_count = &finger_count_; 8437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 844116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DeviceDataManagerX11::GetInstance()->GetScrollOffsets( 8457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) native_event, 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) x_offset, y_offset, 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) x_offset_ordinal, y_offset_ordinal, 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) finger_count); 8497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return true; 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetFlingData(const base::NativeEvent& native_event, 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float* vx, 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float* vy, 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float* vx_ordinal, 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float* vy_ordinal, 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* is_cancel) { 858116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!DeviceDataManagerX11::GetInstance()->IsFlingEvent(native_event)) 8597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 8607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) float vx_, vy_; 8627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) float vx_ordinal_, vy_ordinal_; 8637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool is_cancel_; 8647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!vx) 8657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) vx = &vx_; 8667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!vy) 8677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) vy = &vy_; 8687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!vx_ordinal) 8697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) vx_ordinal = &vx_ordinal_; 8707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!vy_ordinal) 8717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) vy_ordinal = &vy_ordinal_; 8727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!is_cancel) 8737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) is_cancel = &is_cancel_; 8747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 875116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DeviceDataManagerX11::GetInstance()->GetFlingData( 8767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) native_event, vx, vy, vx_ordinal, vy_ordinal, is_cancel); 8777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return true; 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void UpdateX11EventForFlags(Event* event) { 8815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) XEvent* xev = event->native_event(); 8825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!xev) 8835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return; 8845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) switch (xev->type) { 8855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case KeyPress: 8865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case KeyRelease: 8875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) xev->xkey.state = UpdateX11EventFlags(event->flags(), xev->xkey.state); 8885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) break; 8895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case ButtonPress: 8905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case ButtonRelease: 8915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) xev->xbutton.state = 8925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) UpdateX11EventFlags(event->flags(), xev->xbutton.state); 8935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) break; 8945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case GenericEvent: { 8955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xev->xcookie.data); 8965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(xievent); 8975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) xievent->mods.effective = 8985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) UpdateX11EventFlags(event->flags(), xievent->mods.effective); 8995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) break; 9005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 9015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) default: 9025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) break; 9035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 9045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 9055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 9065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void UpdateX11EventForChangedButtonFlags(MouseEvent* event) { 9075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) XEvent* xev = event->native_event(); 9085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!xev) 9095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return; 9105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) switch (xev->type) { 9115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case ButtonPress: 9125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case ButtonRelease: 9135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) xev->xbutton.button = UpdateX11EventButton(event->changed_button_flags(), 9145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) xev->xbutton.button); 9155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) break; 9165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case GenericEvent: { 9175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xev->xcookie.data); 9185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CHECK(xievent && (xievent->evtype == XI_ButtonPress || 9195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) xievent->evtype == XI_ButtonRelease)); 9205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) xievent->detail = 9215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) UpdateX11EventButton(event->changed_button_flags(), xievent->detail); 9225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) break; 9235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 9245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) default: 9255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) break; 9265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui 930