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.
5 #include "ui/events/devices/x11/device_list_cache_x11.h"
9 #include "base/memory/singleton.h"
10 #include "base/message_loop/message_loop.h"
11 #include "ui/events/devices/x11/device_data_manager_x11.h"
15 bool IsXI2Available() {
17 return ui::DeviceDataManagerX11::GetInstance()->IsXInput2Available();
27 DeviceListCacheX11::DeviceListCacheX11() {
30 DeviceListCacheX11::~DeviceListCacheX11() {
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
);
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
);
43 DeviceListCacheX11
* DeviceListCacheX11::GetInstance() {
44 return Singleton
<DeviceListCacheX11
>::get();
47 void DeviceListCacheX11::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
);
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
;
60 const XDeviceList
& DeviceListCacheX11::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
);
68 const XIDeviceList
& DeviceListCacheX11::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
,