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 13 namespace { 14 IsXI2Available()15bool IsXI2Available() { 16 #if defined(USE_AURA) 17 return ui::DeviceDataManagerX11::GetInstance()->IsXInput2Available(); 18 #else 19 return false; 20 #endif 21 } 22 23 } 24 25 namespace ui { 26 DeviceListCacheX()27DeviceListCacheX::DeviceListCacheX() { 28 } 29 ~DeviceListCacheX()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 GetInstance()43DeviceListCacheX* DeviceListCacheX::GetInstance() { 44 return Singleton<DeviceListCacheX>::get(); 45 } 46 UpdateDeviceList(Display * display)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 GetXDeviceList(Display * display)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 GetXI2DeviceList(Display * display)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