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) 568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#ifndef UI_EVENTS_X_TOUCH_FACTORY_X11_H_ 668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#define UI_EVENTS_X_TOUCH_FACTORY_X11_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <bitset> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <set> 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <utility> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h" 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/events/events_base_export.h" 1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/gfx/sequential_id_generator.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename T> struct DefaultSingletonTraits; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef unsigned long Cursor; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef unsigned long Window; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _XDisplay Display; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef union _XEvent XEvent; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Functions related to determining touch devices. 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class EVENTS_BASE_EXPORT TouchFactory { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TouchFactory(); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~TouchFactory(); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the TouchFactory singleton. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static TouchFactory* GetInstance(); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the touch devices from the command line. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void SetTouchDeviceListFromCommandLine(); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Updates the list of devices. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateDeviceList(Display* display); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Checks whether an XI2 event should be processed or not (i.e. if the event 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // originated from a device we are interested in). 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ShouldProcessXI2Event(XEvent* xevent); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setup an X Window for XInput2 events. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetupXI2ForXWindow(::Window xid); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keeps a list of touch devices so that it is possible to determine if a 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pointer event is a touch-event or a mouse-event. The list is reset each 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // time this is called. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetTouchDeviceList(const std::vector<unsigned int>& devices); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Is the device a touch-device? 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsTouchDevice(unsigned int deviceid) const; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Is the device a real multi-touch-device? (see doc. for |touch_device_list_| 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // below for more explanation.) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsMultiTouchDevice(unsigned int deviceid) const; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Tries to find an existing slot ID mapping to tracking ID. Returns true 63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // if the slot is found and it is saved in |slot|, false if no such slot 64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // can be found. 65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool QuerySlotForTrackingID(uint32 tracking_id, int* slot); 66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tries to find an existing slot ID mapping to tracking ID. If there 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // isn't one already, allocates a new slot ID and sets up the mapping. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetSlotForTrackingID(uint32 tracking_id); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Increases the number of times |ReleaseSlotForTrackingID| needs to be called 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // on a given tracking id before it will actually be released. 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void AcquireSlotForTrackingID(uint32 tracking_id); 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Releases the slot ID mapping to tracking ID. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReleaseSlotForTrackingID(uint32 tracking_id); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether any touch device is currently present and enabled. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsTouchDevicePresent(); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Pairs of <vendor id, product id> of external touch screens. 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::set<std::pair<int, int> >& GetTouchscreenIds() const { 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return touchscreen_ids_; 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Return maximum simultaneous touch points supported by device. 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int GetMaxTouchPoints() const; 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Resets the TouchFactory singleton. 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void ResetForTest(); 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Sets up the device id in the list |devices| as multi-touch capable 93a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // devices and enables touch events processing. This function is only 94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // for test purpose, and it does not query from X server. 95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void SetTouchDeviceForTest(const std::vector<unsigned int>& devices); 96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Sets up the device id in the list |devices| as pointer devices. 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This function is only for test purpose, and it does not query from 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // X server. 100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void SetPointerDeviceForTest(const std::vector<unsigned int>& devices); 101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Requirement for Singleton 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend struct DefaultSingletonTraits<TouchFactory>; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void CacheTouchscreenIds(Display* display, int id); 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: To keep track of touch devices, we currently maintain a lookup table 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to quickly decide if a device is a touch device or not. We also maintain a 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // list of the touch devices. Ideally, there will be only one touch device, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and instead of having the lookup table and the list, there will be a single 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // identifier for the touch device. This can be completed after enough testing 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on real touch devices. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kMaxDeviceNum = 128; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A quick lookup table for determining if events from the pointer device 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should be processed. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::bitset<kMaxDeviceNum> pointer_device_lookup_; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A quick lookup table for determining if a device is a touch device. 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::bitset<kMaxDeviceNum> touch_device_lookup_; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Indicates whether a touch device is currently available or not. 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool touch_device_available_; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Indicates whether touch events are explicitly disabled. 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool touch_events_disabled_; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The list of touch devices. For testing/debugging purposes, a single-pointer 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // device (mouse or touch screen without sufficient X/driver support for MT) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can sometimes be treated as a touch device. The key in the map represents 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the device id, and the value represents if the device is multi-touch 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // capable. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<int, bool> touch_device_list_; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Touch screen <vid, pid>s. 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::set<std::pair<int, int> > touchscreen_ids_; 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Maps from a tracking id to the number of times |ReleaseSlotForTrackingID| 1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // must be called before the tracking id is released. 1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::map<uint32, int> tracking_id_refcounts_; 1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Maximum simultaneous touch points supported by device. In the case of 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // devices with multiple digitizers (e.g. multiple touchscreens), the value 146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // is the maximum of the set of maximum supported contacts by each individual 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // digitizer. 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int max_touch_points_; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Device ID of the virtual core keyboard. 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int virtual_core_keyboard_device_; 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 153d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) SequentialIDGenerator id_generator_; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TouchFactory); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif // UI_EVENTS_X_TOUCH_FACTORY_X11_H_ 161