2
* Copyright (C) 2014 Red Hat
4
* This program is free software: you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License as published by
6
* the Free Software Foundation, either version 3 of the License, or
7
* (at your option) any later version.
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
14
* You should have received a copy of the GNU General Public License
15
* along with this program. If not, see <http://www.gnu.org/licenses/>.
18
* Jasper St. Pierre <jstpierre@mecheye.net>
24
#include "meta-backend.h"
25
#include "meta-idle-monitor-xsync.h"
27
static MetaBackend *backend = NULL;
29
G_DEFINE_TYPE (MetaBackend, meta_backend, G_TYPE_OBJECT);
32
meta_backend_finalize (GObject *object)
34
MetaBackend *backend = META_BACKEND (object);
37
for (i = 0; i <= backend->device_id_max; i++)
39
if (backend->device_monitors[i])
40
g_object_unref (backend->device_monitors[i]);
43
G_OBJECT_CLASS (meta_backend_parent_class)->finalize (object);
47
create_device_monitor (MetaBackend *backend,
50
g_assert (backend->device_monitors[device_id] == NULL);
52
backend->device_monitors[device_id] = g_object_new (META_TYPE_IDLE_MONITOR_XSYNC,
53
"device-id", device_id,
55
backend->device_id_max = MAX (backend->device_id_max, device_id);
59
destroy_device_monitor (MetaBackend *backend,
62
g_clear_object (&backend->device_monitors[device_id]);
64
if (device_id == backend->device_id_max)
66
/* Reset the max device ID */
68
for (i = 0; i < backend->device_id_max; i++)
69
if (backend->device_monitors[i] != NULL)
71
backend->device_id_max = new_max;
76
on_device_added (GdkDeviceManager *device_manager,
80
MetaBackend *backend = META_BACKEND (user_data);
81
int device_id = gdk_x11_device_get_id (device);
83
create_device_monitor (backend, device_id);
87
on_device_removed (GdkDeviceManager *device_manager,
91
MetaBackend *backend = META_BACKEND (user_data);
92
int device_id = gdk_x11_device_get_id (device);
94
destroy_device_monitor (backend, device_id);
98
on_device_changed (GdkDeviceManager *device_manager,
102
MetaBackend *backend = META_BACKEND (user_data);
104
if (gdk_device_get_device_type (device) == GDK_DEVICE_TYPE_FLOATING)
105
on_device_removed (device_manager, device, backend);
107
on_device_added (device_manager, device, backend);
111
meta_backend_class_init (MetaBackendClass *klass)
113
GObjectClass *object_class = G_OBJECT_CLASS (klass);
115
object_class->finalize = meta_backend_finalize;
119
meta_backend_init (MetaBackend *backend)
121
GdkDeviceManager *manager;
124
/* Create the core device monitor. */
125
create_device_monitor (backend, 0);
127
manager = gdk_display_get_device_manager (gdk_display_get_default ());
128
g_signal_connect_object (manager, "device-added", G_CALLBACK (on_device_added), backend, 0);
129
g_signal_connect_object (manager, "device-removed", G_CALLBACK (on_device_removed), backend, 0);
130
g_signal_connect_object (manager, "device-changed", G_CALLBACK (on_device_changed), backend, 0);
132
devices = gdk_device_manager_list_devices (manager, GDK_DEVICE_TYPE_MASTER);
133
devices = g_list_concat (devices, gdk_device_manager_list_devices (manager, GDK_DEVICE_TYPE_SLAVE));
135
for (l = devices; l != NULL; l = l->next) {
136
GdkDevice *device = l->data;
137
on_device_added (manager, device, backend);
140
g_list_free (devices);
144
meta_get_backend (void)
147
backend = g_object_new (META_TYPE_BACKEND, NULL);
153
meta_backend_get_idle_monitor (MetaBackend *backend,
156
g_return_val_if_fail (device_id >= 0 && device_id < 256, NULL);
158
return backend->device_monitors[device_id];