12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#ifndef UI_EVENTS_X_DEVICE_LIST_CACHE_X_H_
668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#define UI_EVENTS_X_DEVICE_LIST_CACHE_X_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <X11/extensions/XInput.h>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <X11/extensions/XInput2.h>
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <map>
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/events/events_base_export.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <typename T> struct DefaultSingletonTraits;
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef struct _XDisplay Display;
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <typename T>
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct DeviceList {
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DeviceList() : devices(NULL), count(0) {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  T& operator[] (int x) {
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return devices[x];
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const T& operator[](int x) const { return devices[x]; }
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  T* devices;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int count;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef struct DeviceList<XDeviceInfo> XDeviceList;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef struct DeviceList<XIDeviceInfo> XIDeviceList;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ui {
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A class to cache the current XInput device list. This minimized the
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// round-trip time to the X server whenever such a device list is needed. The
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// update function will be called on each incoming XI_HierarchyChanged event.
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class EVENTS_BASE_EXPORT DeviceListCacheX {
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static DeviceListCacheX* GetInstance();
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateDeviceList(Display* display);
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Returns the list of devices associated with |display|. Uses the old X11
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // protocol to get the list of the devices.
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const XDeviceList& GetXDeviceList(Display* display);
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Returns the list of devices associated with |display|. Uses the newer
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // XINPUT2 protocol to get the list of devices. Before making this call, make
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // sure that XInput2 support is available (e.g. by calling
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // IsXInput2Available()).
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const XIDeviceList& GetXI2DeviceList(Display* display);
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend struct DefaultSingletonTraits<DeviceListCacheX>;
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DeviceListCacheX();
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~DeviceListCacheX();
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::map<Display*, XDeviceList> x_dev_list_map_;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::map<Display*, XIDeviceList> xi_dev_list_map_;
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DeviceListCacheX);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace ui
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif  // UI_EVENTS_X_DEVICE_LIST_CACHE_X_H_
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72