1 /* GDK - The GIMP Drawing Kit
2 * Copyright (C) 2009 Carlos Garnacho <carlosg@gnome.org>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library 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 GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
23 #include <gdk/gdktypes.h>
24 #include <gdk/gdkdevicemanager.h>
25 #include "gdkdevicemanager-wayland.h"
26 #include "gdkdevice-wayland.h"
27 #include "gdkkeysyms.h"
28 #include "gdkprivate-wayland.h"
30 #include <X11/extensions/XKBcommon.h>
31 #include <X11/keysym.h>
33 static void gdk_device_manager_core_finalize (GObject *object);
35 static GList * gdk_device_manager_core_list_devices (GdkDeviceManager *device_manager,
37 static GdkDevice * gdk_device_manager_core_get_client_pointer (GdkDeviceManager *device_manager);
39 G_DEFINE_TYPE (GdkDeviceManagerCore, gdk_device_manager_core, GDK_TYPE_DEVICE_MANAGER)
42 gdk_device_manager_core_class_init (GdkDeviceManagerCoreClass *klass)
44 GdkDeviceManagerClass *device_manager_class = GDK_DEVICE_MANAGER_CLASS (klass);
45 GObjectClass *object_class = G_OBJECT_CLASS (klass);
47 object_class->finalize = gdk_device_manager_core_finalize;
48 device_manager_class->list_devices = gdk_device_manager_core_list_devices;
49 device_manager_class->get_client_pointer = gdk_device_manager_core_get_client_pointer;
53 input_handle_motion(void *data, struct wl_input_device *input_device,
55 int32_t x, int32_t y, int32_t sx, int32_t sy)
57 GdkWaylandDevice *device = data;
60 event = gdk_event_new (GDK_NOTHING);
65 device->surface_x = sx;
66 device->surface_y = sy;
68 event->motion.type = GDK_MOTION_NOTIFY;
69 event->motion.window = g_object_ref (device->pointer_focus);
70 gdk_event_set_device (event, device->pointer);
71 event->motion.time = time;
72 event->motion.x = (gdouble) sx;
73 event->motion.y = (gdouble) sy;
74 event->motion.x_root = (gdouble) x;
75 event->motion.y_root = (gdouble) y;
76 event->motion.axes = NULL;
77 event->motion.state = device->modifiers;
78 event->motion.is_hint = 0;
80 _gdk_wayland_display_deliver_event (device->display, event);
84 input_handle_button(void *data, struct wl_input_device *input_device,
85 uint32_t time, uint32_t button, uint32_t state)
87 GdkWaylandDevice *device = data;
91 fprintf (stderr, "button event %d, state %d\n", button, state);
94 event = gdk_event_new (state ? GDK_BUTTON_PRESS : GDK_BUTTON_RELEASE);
95 event->button.window = g_object_ref (device->pointer_focus);
96 gdk_event_set_device (event, device->pointer);
97 event->button.time = time;
98 event->button.x = (gdouble) device->surface_x;
99 event->button.y = (gdouble) device->surface_y;
100 event->button.x_root = (gdouble) device->x;
101 event->button.y_root = (gdouble) device->y;
102 event->button.axes = NULL;
103 event->button.state = device->modifiers;
104 event->button.button = button - 271;
106 modifier = 1 << (8 + button - 272);
108 device->modifiers |= modifier;
110 device->modifiers &= ~modifier;
112 _gdk_wayland_display_deliver_event (device->display, event);
116 input_handle_key(void *data, struct wl_input_device *input_device,
117 uint32_t time, uint32_t key, uint32_t state)
119 GdkWaylandDevice *device = data;
121 uint32_t code, modifier, level;
122 struct xkb_desc *xkb;
126 event = gdk_event_new (state ? GDK_KEY_PRESS : GDK_KEY_RELEASE);
127 event->key.window = g_object_ref (device->keyboard_focus);
128 gdk_event_set_device (event, device->keyboard);
129 event->button.time = time;
130 event->key.state = device->modifiers;
131 event->key.group = 0;
132 event->key.hardware_keycode = key;
134 keymap = gdk_keymap_get_for_display (device->display);
135 xkb = _gdk_wayland_keymap_get_xkb_desc (keymap);
137 code = key + xkb->min_key_code;
140 if (device->modifiers & XKB_COMMON_SHIFT_MASK &&
141 XkbKeyGroupWidth(xkb, code, 0) > 1)
144 event->key.keyval = XkbKeySymEntry(xkb, code, level, 0);
146 modifier = xkb->map->modmap[code];
148 device->modifiers |= modifier;
150 device->modifiers &= ~modifier;
152 event->key.is_modifier = modifier > 0;
154 if (event->key.keyval == GDK_KEY_Escape)
156 event->key.length = 1;
157 event->key.string = g_strdup ("\033");
159 else if (event->key.keyval == GDK_KEY_Return ||
160 event->key.keyval == GDK_KEY_KP_Enter)
162 event->key.length = 1;
163 event->key.string = g_strdup ("\r");
165 else if (event->key.state & GDK_CONTROL_MASK)
170 int c = event->key.keyval;
172 /* Apply the control key - Taken from Xlib */
173 if ((c >= XK_at && c < '\177') || c == ' ')
177 event->key.string = g_memdup ("\0\0", 2);
178 event->key.length = 1;
182 else if (c >= XK_3 && c <= XK_7)
183 c -= (XK_3 - '\033');
186 else if (c == XK_slash)
189 len = g_unichar_to_utf8 (c, buf);
192 event->key.string = g_locale_from_utf8 (buf, len,
193 NULL, &bytes_written,
195 if (event->key.string)
196 event->key.length = bytes_written;
201 xkb_keysym_to_string(event->key.keyval, buffer, sizeof buffer);
202 event->key.string = g_strdup (buffer);
203 event->key.length = strlen(event->key.string);
207 _gdk_wayland_display_deliver_event (device->display, event);
209 fprintf (stderr, "keyboard event, code %d, sym %d, string %s, mods 0x%x\n",
210 code, event->key.keyval, event->key.string, event->key.state);
214 input_handle_pointer_focus(void *data,
215 struct wl_input_device *input_device,
216 uint32_t time, struct wl_surface *surface,
217 int32_t x, int32_t y, int32_t sx, int32_t sy)
219 GdkWaylandDevice *device = data;
223 if (device->pointer_focus)
225 event = gdk_event_new (GDK_LEAVE_NOTIFY);
226 event->crossing.window = g_object_ref (device->pointer_focus);
227 gdk_event_set_device (event, device->pointer);
228 event->crossing.subwindow = NULL;
229 event->crossing.time = time;
230 event->crossing.x = (gdouble) device->surface_x;
231 event->crossing.y = (gdouble) device->surface_y;
232 event->crossing.x_root = (gdouble) device->x;
233 event->crossing.y_root = (gdouble) device->y;
235 event->crossing.mode = GDK_CROSSING_NORMAL;
236 event->crossing.detail = GDK_NOTIFY_ANCESTOR;
237 event->crossing.focus = TRUE;
238 event->crossing.state = 0;
240 _gdk_wayland_display_deliver_event (device->display, event);
242 g_object_unref(device->pointer_focus);
243 device->pointer_focus = NULL;
248 device->pointer_focus = wl_surface_get_user_data(surface);
249 g_object_ref(device->pointer_focus);
251 event = gdk_event_new (GDK_ENTER_NOTIFY);
252 event->crossing.window = g_object_ref (device->pointer_focus);
253 gdk_event_set_device (event, device->pointer);
254 event->crossing.subwindow = NULL;
255 event->crossing.time = time;
256 event->crossing.x = (gdouble) sx;
257 event->crossing.y = (gdouble) sy;
258 event->crossing.x_root = (gdouble) x;
259 event->crossing.y_root = (gdouble) y;
261 event->crossing.mode = GDK_CROSSING_NORMAL;
262 event->crossing.detail = GDK_NOTIFY_ANCESTOR;
263 event->crossing.focus = TRUE;
264 event->crossing.state = 0;
266 device->surface_x = sx;
267 device->surface_y = sy;
271 _gdk_wayland_display_deliver_event (device->display, event);
274 fprintf (stderr, "pointer focus surface %p, window %p\n",
275 surface, device->pointer_focus);
279 update_modifiers(GdkWaylandDevice *device, struct wl_array *keys)
283 struct xkb_desc *xkb;
285 keymap = gdk_keymap_get_for_display (device->display);
286 xkb = _gdk_wayland_keymap_get_xkb_desc (keymap);
288 end = keys->data + keys->size;
289 for (k = keys->data; k < end; k++)
290 device->modifiers |= xkb->map->modmap[*k];
292 fprintf (stderr, "modifiers: 0x%x\n", device->modifiers);
296 input_handle_keyboard_focus(void *data,
297 struct wl_input_device *input_device,
299 struct wl_surface *surface,
300 struct wl_array *keys)
302 GdkWaylandDevice *device = data;
305 fprintf (stderr, "keyboard focus surface %p\n", surface);
308 if (device->keyboard_focus)
310 event = gdk_event_new (GDK_FOCUS_CHANGE);
311 event->focus_change.window = g_object_ref (device->keyboard_focus);
312 event->focus_change.send_event = FALSE;
313 event->focus_change.in = FALSE;
314 gdk_event_set_device (event, device->keyboard);
316 g_object_unref(device->pointer_focus);
317 device->keyboard_focus = NULL;
319 _gdk_wayland_display_deliver_event (device->display, event);
324 device->keyboard_focus = wl_surface_get_user_data(surface);
325 g_object_ref(device->keyboard_focus);
327 event = gdk_event_new (GDK_FOCUS_CHANGE);
328 event->focus_change.window = g_object_ref (device->keyboard_focus);
329 event->focus_change.send_event = FALSE;
330 event->focus_change.in = TRUE;
331 gdk_event_set_device (event, device->keyboard);
333 update_modifiers (device, keys);
335 _gdk_wayland_display_deliver_event (device->display, event);
339 static const struct wl_input_device_listener input_device_listener = {
343 input_handle_pointer_focus,
344 input_handle_keyboard_focus,
348 gdk_device_manager_core_add_device (GdkDeviceManager *device_manager,
349 struct wl_input_device *wl_device)
352 GdkDeviceManagerCore *device_manager_core =
353 GDK_DEVICE_MANAGER_CORE(device_manager);
354 GdkWaylandDevice *device;
356 device = g_new0 (GdkWaylandDevice, 1);
357 display = gdk_device_manager_get_display (device_manager);
359 device->display = display;
360 device->pointer = g_object_new (GDK_TYPE_DEVICE_CORE,
361 "name", "Core Pointer",
362 "type", GDK_DEVICE_TYPE_MASTER,
363 "input-source", GDK_SOURCE_MOUSE,
364 "input-mode", GDK_MODE_SCREEN,
367 "device-manager", device_manager,
370 device->keyboard = g_object_new (GDK_TYPE_DEVICE_CORE,
371 "name", "Core Keyboard",
372 "type", GDK_DEVICE_TYPE_MASTER,
373 "input-source", GDK_SOURCE_KEYBOARD,
374 "input-mode", GDK_MODE_SCREEN,
377 "device-manager", device_manager,
380 GDK_DEVICE_CORE (device->pointer)->device = device;
381 GDK_DEVICE_CORE (device->keyboard)->device = device;
382 device->device = wl_device;
384 wl_input_device_add_listener(device->device,
385 &input_device_listener, device);
387 device_manager_core->devices =
388 g_list_prepend (device_manager_core->devices, device->keyboard);
389 device_manager_core->devices =
390 g_list_prepend (device_manager_core->devices, device->pointer);
392 _gdk_device_set_associated_device (device->pointer, device->keyboard);
393 _gdk_device_set_associated_device (device->keyboard, device->pointer);
397 gdk_device_manager_core_init (GdkDeviceManagerCore *device_manager)
402 free_device (void *data, void *user_data)
404 g_object_unref (data);
408 gdk_device_manager_core_finalize (GObject *object)
410 GdkDeviceManagerCore *device_manager_core;
412 device_manager_core = GDK_DEVICE_MANAGER_CORE (object);
414 g_list_foreach (device_manager_core->devices, free_device, NULL);
415 g_list_free (device_manager_core->devices);
417 G_OBJECT_CLASS (gdk_device_manager_core_parent_class)->finalize (object);
421 gdk_device_manager_core_list_devices (GdkDeviceManager *device_manager,
424 GdkDeviceManagerCore *device_manager_core;
425 GList *devices = NULL;
427 if (type == GDK_DEVICE_TYPE_MASTER)
429 device_manager_core = (GdkDeviceManagerCore *) device_manager;
430 devices = g_list_copy(device_manager_core->devices);
437 gdk_device_manager_core_get_client_pointer (GdkDeviceManager *device_manager)
439 GdkDeviceManagerCore *device_manager_core;
441 device_manager_core = (GdkDeviceManagerCore *) device_manager;
442 return device_manager_core->devices->data;
446 _gdk_device_manager_new (GdkDisplay *display)
448 return g_object_new (GDK_TYPE_DEVICE_MANAGER_CORE,