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)#include "ui/events/x/device_list_cache_x.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <algorithm>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/singleton.h"
104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/message_loop/message_loop.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/events/x/device_data_manager_x11.h"
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace {
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool IsXI2Available() {
164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(USE_AURA)
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return ui::DeviceDataManagerX11::GetInstance()->IsXInput2Available();
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return false;
204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ui {
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)DeviceListCacheX::DeviceListCacheX() {
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeviceListCacheX::~DeviceListCacheX() {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::map<Display*, XDeviceList>::iterator xp;
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  for (xp = x_dev_list_map_.begin(); xp != x_dev_list_map_.end(); xp++) {
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (xp->second.devices)
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      XFreeDeviceList(xp->second.devices);
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::map<Display*, XIDeviceList>::iterator xip;
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  for (xip = xi_dev_list_map_.begin(); xip != xi_dev_list_map_.end(); xip++) {
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (xip->second.devices)
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      XIFreeDeviceInfo(xip->second.devices);
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeviceListCacheX* DeviceListCacheX::GetInstance() {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return Singleton<DeviceListCacheX>::get();
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DeviceListCacheX::UpdateDeviceList(Display* display) {
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  XDeviceList& new_x_dev_list = x_dev_list_map_[display];
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (new_x_dev_list.devices)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    XFreeDeviceList(new_x_dev_list.devices);
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  new_x_dev_list.devices = XListInputDevices(display, &new_x_dev_list.count);
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  XIDeviceList& new_xi_dev_list = xi_dev_list_map_[display];
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (new_xi_dev_list.devices)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    XIFreeDeviceInfo(new_xi_dev_list.devices);
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  new_xi_dev_list.devices = IsXI2Available() ?
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      XIQueryDevice(display, XIAllDevices, &new_xi_dev_list.count) : NULL;
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const XDeviceList& DeviceListCacheX::GetXDeviceList(Display* display) {
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  XDeviceList& x_dev_list = x_dev_list_map_[display];
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Note that the function can be called before any update has taken place.
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!x_dev_list.devices && !x_dev_list.count)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    x_dev_list.devices = XListInputDevices(display, &x_dev_list.count);
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return x_dev_list;
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const XIDeviceList& DeviceListCacheX::GetXI2DeviceList(Display* display) {
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  XIDeviceList& xi_dev_list = xi_dev_list_map_[display];
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!xi_dev_list.devices && !xi_dev_list.count) {
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    xi_dev_list.devices = XIQueryDevice(display, XIAllDevices,
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       &xi_dev_list.count);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return xi_dev_list;
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace ui
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
79