1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "ui/events/x/device_list_cache_x.h" 6 7#include <algorithm> 8 9#include "base/memory/singleton.h" 10#include "base/message_loop/message_loop.h" 11#include "ui/events/x/device_data_manager_x11.h" 12 13namespace { 14 15bool IsXI2Available() { 16#if defined(USE_AURA) 17 return ui::DeviceDataManagerX11::GetInstance()->IsXInput2Available(); 18#else 19 return false; 20#endif 21} 22 23} 24 25namespace ui { 26 27DeviceListCacheX::DeviceListCacheX() { 28} 29 30DeviceListCacheX::~DeviceListCacheX() { 31 std::map<Display*, XDeviceList>::iterator xp; 32 for (xp = x_dev_list_map_.begin(); xp != x_dev_list_map_.end(); xp++) { 33 if (xp->second.devices) 34 XFreeDeviceList(xp->second.devices); 35 } 36 std::map<Display*, XIDeviceList>::iterator xip; 37 for (xip = xi_dev_list_map_.begin(); xip != xi_dev_list_map_.end(); xip++) { 38 if (xip->second.devices) 39 XIFreeDeviceInfo(xip->second.devices); 40 } 41} 42 43DeviceListCacheX* DeviceListCacheX::GetInstance() { 44 return Singleton<DeviceListCacheX>::get(); 45} 46 47void DeviceListCacheX::UpdateDeviceList(Display* display) { 48 XDeviceList& new_x_dev_list = x_dev_list_map_[display]; 49 if (new_x_dev_list.devices) 50 XFreeDeviceList(new_x_dev_list.devices); 51 new_x_dev_list.devices = XListInputDevices(display, &new_x_dev_list.count); 52 53 XIDeviceList& new_xi_dev_list = xi_dev_list_map_[display]; 54 if (new_xi_dev_list.devices) 55 XIFreeDeviceInfo(new_xi_dev_list.devices); 56 new_xi_dev_list.devices = IsXI2Available() ? 57 XIQueryDevice(display, XIAllDevices, &new_xi_dev_list.count) : NULL; 58} 59 60const XDeviceList& DeviceListCacheX::GetXDeviceList(Display* display) { 61 XDeviceList& x_dev_list = x_dev_list_map_[display]; 62 // Note that the function can be called before any update has taken place. 63 if (!x_dev_list.devices && !x_dev_list.count) 64 x_dev_list.devices = XListInputDevices(display, &x_dev_list.count); 65 return x_dev_list; 66} 67 68const XIDeviceList& DeviceListCacheX::GetXI2DeviceList(Display* display) { 69 XIDeviceList& xi_dev_list = xi_dev_list_map_[display]; 70 if (!xi_dev_list.devices && !xi_dev_list.count) { 71 xi_dev_list.devices = XIQueryDevice(display, XIAllDevices, 72 &xi_dev_list.count); 73 } 74 return xi_dev_list; 75} 76 77} // namespace ui 78 79