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