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, see <http://www.gnu.org/licenses/>.
26 #include <gdk/gdkwindow.h>
27 #include <gdk/gdktypes.h>
28 #include "gdkprivate-wayland.h"
29 #include "gdkwayland.h"
30 #include "gdkkeysyms.h"
31 #include "gdkdeviceprivate.h"
32 #include "gdkdevicemanagerprivate.h"
33 #include "gdkprivate-wayland.h"
35 #include <xkbcommon/xkbcommon.h>
36 #include <X11/keysym.h>
40 #define GDK_TYPE_DEVICE_CORE (gdk_device_core_get_type ())
41 #define GDK_DEVICE_CORE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GDK_TYPE_DEVICE_CORE, GdkDeviceCore))
42 #define GDK_DEVICE_CORE_CLASS(c) (G_TYPE_CHECK_CLASS_CAST ((c), GDK_TYPE_DEVICE_CORE, GdkDeviceCoreClass))
43 #define GDK_IS_DEVICE_CORE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GDK_TYPE_DEVICE_CORE))
44 #define GDK_IS_DEVICE_CORE_CLASS(c) (G_TYPE_CHECK_CLASS_TYPE ((c), GDK_TYPE_DEVICE_CORE))
45 #define GDK_DEVICE_CORE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GDK_TYPE_DEVICE_CORE, GdkDeviceCoreClass))
47 typedef struct _GdkDeviceCore GdkDeviceCore;
48 typedef struct _GdkDeviceCoreClass GdkDeviceCoreClass;
49 typedef struct _GdkWaylandDevice GdkWaylandDevice;
51 typedef struct _DataOffer DataOffer;
53 typedef struct _GdkWaylandSelectionOffer GdkWaylandSelectionOffer;
55 struct _GdkWaylandDevice
60 GdkModifierType modifiers;
61 GdkWindow *pointer_focus;
62 GdkWindow *keyboard_focus;
63 struct wl_input_device *device;
64 struct wl_data_device *data_device;
65 int32_t x, y, surface_x, surface_y;
67 GdkWindow *pointer_grab_window;
68 uint32_t pointer_grab_time;
73 DataOffer *drag_offer;
74 DataOffer *selection_offer;
76 GdkWaylandSelectionOffer *selection_offer_out;
81 GdkDevice parent_instance;
82 GdkWaylandDevice *device;
85 struct _GdkDeviceCoreClass
87 GdkDeviceClass parent_class;
90 G_DEFINE_TYPE (GdkDeviceCore, gdk_device_core, GDK_TYPE_DEVICE)
92 #define GDK_TYPE_DEVICE_MANAGER_CORE (gdk_device_manager_core_get_type ())
93 #define GDK_DEVICE_MANAGER_CORE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GDK_TYPE_DEVICE_MANAGER_CORE, GdkDeviceManagerCore))
94 #define GDK_DEVICE_MANAGER_CORE_CLASS(c) (G_TYPE_CHECK_CLASS_CAST ((c), GDK_TYPE_DEVICE_MANAGER_CORE, GdkDeviceManagerCoreClass))
95 #define GDK_IS_DEVICE_MANAGER_CORE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GDK_TYPE_DEVICE_MANAGER_CORE))
96 #define GDK_IS_DEVICE_MANAGER_CORE_CLASS(c) (G_TYPE_CHECK_CLASS_TYPE ((c), GDK_TYPE_DEVICE_MANAGER_CORE))
97 #define GDK_DEVICE_MANAGER_CORE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GDK_TYPE_DEVICE_MANAGER_CORE, GdkDeviceManagerCoreClass))
99 typedef struct _GdkDeviceManagerCore GdkDeviceManagerCore;
100 typedef struct _GdkDeviceManagerCoreClass GdkDeviceManagerCoreClass;
102 struct _GdkDeviceManagerCore
104 GdkDeviceManager parent_object;
105 GdkDevice *core_pointer;
106 GdkDevice *core_keyboard;
110 struct _GdkDeviceManagerCoreClass
112 GdkDeviceManagerClass parent_class;
115 G_DEFINE_TYPE (GdkDeviceManagerCore,
116 gdk_device_manager_core, GDK_TYPE_DEVICE_MANAGER)
119 gdk_device_core_get_history (GdkDevice *device,
123 GdkTimeCoord ***events,
130 gdk_device_core_get_state (GdkDevice *device,
133 GdkModifierType *mask)
137 gdk_window_get_device_position (window, device, &x_int, &y_int, mask);
147 gdk_device_core_set_window_cursor (GdkDevice *device,
151 GdkWaylandDevice *wd = GDK_DEVICE_CORE(device)->device;
152 struct wl_buffer *buffer;
156 g_object_ref (cursor);
158 /* Setting the cursor to NULL means that we should use the default cursor */
161 /* FIXME: Is this the best sensible default ? */
162 cursor = _gdk_wayland_display_get_cursor_for_type (device->display,
166 buffer = _gdk_wayland_cursor_get_buffer(cursor, &x, &y);
167 wl_input_device_attach(wd->device, wd->time, buffer, x, y);
169 g_object_unref (cursor);
173 gdk_device_core_warp (GdkDevice *device,
181 gdk_device_core_query_state (GdkDevice *device,
183 GdkWindow **root_window,
184 GdkWindow **child_window,
189 GdkModifierType *mask)
191 GdkWaylandDevice *wd;
192 GdkScreen *default_screen;
194 wd = GDK_DEVICE_CORE(device)->device;
195 default_screen = gdk_display_get_default_screen (wd->display);
198 *root_window = gdk_screen_get_root_window (default_screen);
200 *child_window = wd->pointer_focus;
206 *win_x = wd->surface_x;
208 *win_y = wd->surface_y;
210 *mask = wd->modifiers;
214 gdk_device_core_grab (GdkDevice *device,
216 gboolean owner_events,
217 GdkEventMask event_mask,
218 GdkWindow *confine_to,
222 GdkWaylandDevice *wayland_device = GDK_DEVICE_CORE (device)->device;
224 if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
226 /* Device is a keyboard */
227 return GDK_GRAB_SUCCESS;
231 /* Device is a pointer */
233 if (wayland_device->pointer_grab_window != NULL &&
234 time_ != 0 && wayland_device->pointer_grab_time > time_)
236 return GDK_GRAB_ALREADY_GRABBED;
240 time_ = wayland_device->time;
242 wayland_device->pointer_grab_window = window;
243 wayland_device->pointer_grab_time = time_;
245 /* FIXME: This probably breaks if you end up with multiple grabs on the
246 * same window - but we need to know the input device for when we are
247 * asked to map a popup window so that the grab can be managed by the
250 _gdk_wayland_window_set_device_grabbed (window,
251 wayland_device->device,
255 return GDK_GRAB_SUCCESS;
259 gdk_device_core_ungrab (GdkDevice *device,
262 GdkWaylandDevice *wayland_device = GDK_DEVICE_CORE (device)->device;
264 GdkDeviceGrabInfo *grab;
266 display = gdk_device_get_display (device);
268 if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
270 /* Device is a keyboard */
274 /* Device is a pointer */
275 grab = _gdk_display_get_last_device_grab (display, device);
278 grab->serial_end = grab->serial_start;
280 if (wayland_device->pointer_grab_window)
281 _gdk_wayland_window_set_device_grabbed (wayland_device->pointer_grab_window,
288 gdk_device_core_window_at_position (GdkDevice *device,
291 GdkModifierType *mask,
292 gboolean get_toplevel)
294 GdkWaylandDevice *wd;
296 wd = GDK_DEVICE_CORE(device)->device;
298 *win_x = wd->surface_x;
300 *win_y = wd->surface_y;
302 *mask = wd->modifiers;
304 return wd->pointer_focus;
308 gdk_device_core_select_window_events (GdkDevice *device,
310 GdkEventMask event_mask)
315 gdk_device_core_class_init (GdkDeviceCoreClass *klass)
317 GdkDeviceClass *device_class = GDK_DEVICE_CLASS (klass);
319 device_class->get_history = gdk_device_core_get_history;
320 device_class->get_state = gdk_device_core_get_state;
321 device_class->set_window_cursor = gdk_device_core_set_window_cursor;
322 device_class->warp = gdk_device_core_warp;
323 device_class->query_state = gdk_device_core_query_state;
324 device_class->grab = gdk_device_core_grab;
325 device_class->ungrab = gdk_device_core_ungrab;
326 device_class->window_at_position = gdk_device_core_window_at_position;
327 device_class->select_window_events = gdk_device_core_select_window_events;
331 gdk_device_core_init (GdkDeviceCore *device_core)
335 device = GDK_DEVICE (device_core);
337 _gdk_device_add_axis (device, GDK_NONE, GDK_AXIS_X, 0, 0, 1);
338 _gdk_device_add_axis (device, GDK_NONE, GDK_AXIS_Y, 0, 0, 1);
341 struct wl_input_device *
342 _gdk_wayland_device_get_device (GdkDevice *device)
344 return GDK_DEVICE_CORE (device)->device->device;
348 input_handle_motion(void *data, struct wl_input_device *input_device,
350 int32_t x, int32_t y, int32_t sx, int32_t sy)
352 GdkWaylandDevice *device = data;
353 GdkWaylandDisplay *display = GDK_WAYLAND_DISPLAY (device->display);
356 event = gdk_event_new (GDK_NOTHING);
361 device->surface_x = sx;
362 device->surface_y = sy;
364 event->motion.type = GDK_MOTION_NOTIFY;
365 event->motion.window = g_object_ref (device->pointer_focus);
366 gdk_event_set_device (event, device->pointer);
367 event->motion.time = time;
368 event->motion.x = (gdouble) sx;
369 event->motion.y = (gdouble) sy;
370 event->motion.x_root = (gdouble) x;
371 event->motion.y_root = (gdouble) y;
372 event->motion.axes = NULL;
373 event->motion.state = device->modifiers;
374 event->motion.is_hint = 0;
375 gdk_event_set_screen (event, display->screen);
378 g_message ("motion %d %d, state %d",
379 sx, sy, event->button.state));
381 _gdk_wayland_display_deliver_event (device->display, event);
385 input_handle_button(void *data, struct wl_input_device *input_device,
386 uint32_t time, uint32_t button, uint32_t state)
388 GdkWaylandDevice *device = data;
389 GdkWaylandDisplay *display = GDK_WAYLAND_DISPLAY (device->display);
402 gdk_button = button - 271;
407 event = gdk_event_new (state ? GDK_BUTTON_PRESS : GDK_BUTTON_RELEASE);
408 event->button.window = g_object_ref (device->pointer_focus);
409 gdk_event_set_device (event, device->pointer);
410 event->button.time = time;
411 event->button.x = (gdouble) device->surface_x;
412 event->button.y = (gdouble) device->surface_y;
413 event->button.x_root = (gdouble) device->x;
414 event->button.y_root = (gdouble) device->y;
415 event->button.axes = NULL;
416 event->button.state = device->modifiers;
417 event->button.button = gdk_button;
418 gdk_event_set_screen (event, display->screen);
420 modifier = 1 << (8 + gdk_button - 1);
422 device->modifiers |= modifier;
424 device->modifiers &= ~modifier;
427 g_message ("button %d %s, state %d",
428 event->button.button,
429 state ? "press" : "release", event->button.state));
431 _gdk_wayland_display_deliver_event (device->display, event);
435 translate_keyboard_string (GdkEventKey *event)
440 /* Fill in event->string crudely, since various programs
443 event->string = NULL;
445 if (event->keyval != GDK_KEY_VoidSymbol)
446 c = gdk_keyval_to_unicode (event->keyval);
453 /* Apply the control key - Taken from Xlib
455 if (event->state & GDK_CONTROL_MASK)
457 if ((c >= '@' && c < '\177') || c == ' ') c &= 0x1F;
460 event->string = g_memdup ("\0\0", 2);
465 else if (c >= '3' && c <= '7') c -= ('3' - '\033');
466 else if (c == '8') c = '\177';
467 else if (c == '/') c = '_' & 0x1F;
470 len = g_unichar_to_utf8 (c, buf);
473 event->string = g_locale_from_utf8 (buf, len,
474 NULL, &bytes_written,
477 event->length = bytes_written;
479 else if (event->keyval == GDK_KEY_Escape)
482 event->string = g_strdup ("\033");
484 else if (event->keyval == GDK_KEY_Return ||
485 event->keyval == GDK_KEY_KP_Enter)
488 event->string = g_strdup ("\r");
494 event->string = g_strdup ("");
499 keyboard_repeat (gpointer data);
502 deliver_key_event(GdkWaylandDevice *device,
503 uint32_t time, uint32_t key, uint32_t state)
506 uint32_t code, modifier, level;
507 struct xkb_desc *xkb;
510 keymap = gdk_keymap_get_for_display (device->display);
511 xkb = _gdk_wayland_keymap_get_xkb_desc (keymap);
514 event = gdk_event_new (state ? GDK_KEY_PRESS : GDK_KEY_RELEASE);
515 event->key.window = g_object_ref (device->keyboard_focus);
516 gdk_event_set_device (event, device->keyboard);
517 event->button.time = time;
518 event->key.state = device->modifiers;
519 event->key.group = 0;
520 code = key + xkb->min_key_code;
521 event->key.hardware_keycode = code;
524 if (device->modifiers & XKB_COMMON_SHIFT_MASK &&
525 XkbKeyGroupWidth(xkb, code, 0) > 1)
528 event->key.keyval = XkbKeySymEntry(xkb, code, level, 0);
530 modifier = xkb->map->modmap[code];
532 device->modifiers |= modifier;
534 device->modifiers &= ~modifier;
536 event->key.is_modifier = modifier > 0;
538 translate_keyboard_string (&event->key);
540 _gdk_wayland_display_deliver_event (device->display, event);
543 g_message ("keyboard event, code %d, sym %d, "
544 "string %s, mods 0x%x",
545 code, event->key.keyval,
546 event->key.string, event->key.state));
548 device->repeat_count++;
549 device->repeat_key = key;
553 if (device->repeat_timer)
555 g_source_remove (device->repeat_timer);
556 device->repeat_timer = 0;
564 else switch (device->repeat_count)
567 if (device->repeat_timer)
569 g_source_remove (device->repeat_timer);
570 device->repeat_timer = 0;
573 device->repeat_timer =
574 gdk_threads_add_timeout (400, keyboard_repeat, device);
577 device->repeat_timer =
578 gdk_threads_add_timeout (80, keyboard_repeat, device);
586 keyboard_repeat (gpointer data)
588 GdkWaylandDevice *device = data;
590 return deliver_key_event (device, device->time, device->repeat_key, 1);
594 input_handle_key(void *data, struct wl_input_device *input_device,
595 uint32_t time, uint32_t key, uint32_t state)
597 GdkWaylandDevice *device = data;
599 device->repeat_count = 0;
600 deliver_key_event (data, time, key, state);
604 input_handle_pointer_focus(void *data,
605 struct wl_input_device *input_device,
606 uint32_t time, struct wl_surface *surface,
607 int32_t x, int32_t y, int32_t sx, int32_t sy)
609 GdkWaylandDevice *device = data;
613 if (device->pointer_focus)
615 event = gdk_event_new (GDK_LEAVE_NOTIFY);
616 event->crossing.window = g_object_ref (device->pointer_focus);
617 gdk_event_set_device (event, device->pointer);
618 event->crossing.subwindow = NULL;
619 event->crossing.time = time;
620 event->crossing.x = (gdouble) device->surface_x;
621 event->crossing.y = (gdouble) device->surface_y;
622 event->crossing.x_root = (gdouble) device->x;
623 event->crossing.y_root = (gdouble) device->y;
625 event->crossing.mode = GDK_CROSSING_NORMAL;
626 event->crossing.detail = GDK_NOTIFY_ANCESTOR;
627 event->crossing.focus = TRUE;
628 event->crossing.state = 0;
630 _gdk_wayland_display_deliver_event (device->display, event);
633 g_message ("leave, device %p surface %p",
634 device, device->pointer_focus));
636 g_object_unref(device->pointer_focus);
637 device->pointer_focus = NULL;
642 device->pointer_focus = wl_surface_get_user_data(surface);
643 g_object_ref(device->pointer_focus);
645 event = gdk_event_new (GDK_ENTER_NOTIFY);
646 event->crossing.window = g_object_ref (device->pointer_focus);
647 gdk_event_set_device (event, device->pointer);
648 event->crossing.subwindow = NULL;
649 event->crossing.time = time;
650 event->crossing.x = (gdouble) sx;
651 event->crossing.y = (gdouble) sy;
652 event->crossing.x_root = (gdouble) x;
653 event->crossing.y_root = (gdouble) y;
655 event->crossing.mode = GDK_CROSSING_NORMAL;
656 event->crossing.detail = GDK_NOTIFY_ANCESTOR;
657 event->crossing.focus = TRUE;
658 event->crossing.state = 0;
660 device->surface_x = sx;
661 device->surface_y = sy;
665 _gdk_wayland_display_deliver_event (device->display, event);
668 g_message ("enter, device %p surface %p",
669 device, device->pointer_focus));
674 update_modifiers(GdkWaylandDevice *device, struct wl_array *keys)
678 struct xkb_desc *xkb;
680 keymap = gdk_keymap_get_for_display (device->display);
681 xkb = _gdk_wayland_keymap_get_xkb_desc (keymap);
683 end = keys->data + keys->size;
684 device->modifiers = 0;
685 for (k = keys->data; k < end; k++)
686 device->modifiers |= xkb->map->modmap[*k];
690 input_handle_keyboard_focus(void *data,
691 struct wl_input_device *input_device,
693 struct wl_surface *surface,
694 struct wl_array *keys)
696 GdkWaylandDevice *device = data;
700 if (device->keyboard_focus)
702 _gdk_wayland_window_remove_focus (device->keyboard_focus);
703 event = gdk_event_new (GDK_FOCUS_CHANGE);
704 event->focus_change.window = g_object_ref (device->keyboard_focus);
705 event->focus_change.send_event = FALSE;
706 event->focus_change.in = FALSE;
707 gdk_event_set_device (event, device->keyboard);
709 g_object_unref(device->keyboard_focus);
710 device->keyboard_focus = NULL;
713 g_message ("focus out, device %p surface %p",
714 device, device->keyboard_focus));
716 _gdk_wayland_display_deliver_event (device->display, event);
721 device->keyboard_focus = wl_surface_get_user_data(surface);
722 g_object_ref(device->keyboard_focus);
724 event = gdk_event_new (GDK_FOCUS_CHANGE);
725 event->focus_change.window = g_object_ref (device->keyboard_focus);
726 event->focus_change.send_event = FALSE;
727 event->focus_change.in = TRUE;
728 gdk_event_set_device (event, device->keyboard);
730 update_modifiers (device, keys);
733 g_message ("focus int, device %p surface %p",
734 device, device->keyboard_focus));
736 _gdk_wayland_display_deliver_event (device->display, event);
738 _gdk_wayland_window_add_focus (device->keyboard_focus);
742 static const struct wl_input_device_listener input_device_listener = {
746 input_handle_pointer_focus,
747 input_handle_keyboard_focus,
751 struct wl_data_offer *offer;
757 data_offer_offer (void *data,
758 struct wl_data_offer *wl_data_offer,
761 DataOffer *offer = (DataOffer *)data;
762 g_debug (G_STRLOC ": %s wl_data_offer = %p type = %s",
763 G_STRFUNC, wl_data_offer, type);
765 g_ptr_array_add (offer->types, g_strdup (type));
769 data_offer_unref (DataOffer *offer)
773 if (offer->ref_count == 0)
775 g_ptr_array_free (offer->types, TRUE);
780 static const struct wl_data_offer_listener data_offer_listener = {
785 data_device_data_offer (void *data,
786 struct wl_data_device *data_device,
791 g_debug (G_STRLOC ": %s data_device = %p id = %lu",
792 G_STRFUNC, data_device, (long unsigned int)id);
794 /* This structure is reference counted to handle the case where you get a
795 * leave but are in the middle of transferring data
797 offer = g_new0 (DataOffer, 1);
798 offer->ref_count = 1;
799 offer->types = g_ptr_array_new_with_free_func (g_free);
800 offer->offer = (struct wl_data_offer *)
801 wl_proxy_create_for_id ((struct wl_proxy *) data_device,
803 &wl_data_offer_interface);
805 /* The DataOffer structure is then retrieved later since this sets the user
808 wl_data_offer_add_listener (offer->offer,
809 &data_offer_listener,
814 data_device_enter (void *data,
815 struct wl_data_device *data_device,
817 struct wl_surface *surface,
820 struct wl_data_offer *offer)
822 GdkWaylandDevice *device = (GdkWaylandDevice *)data;
824 g_debug (G_STRLOC ": %s data_device = %p time = %d, surface = %p, x = %d y = %d, offer = %p",
825 G_STRFUNC, data_device, time, surface, x, y, offer);
827 /* Retrieve the DataOffer associated with with the wl_data_offer - this
828 * association is made when the listener is attached.
830 g_assert (device->drag_offer == NULL);
831 device->drag_offer = wl_data_offer_get_user_data (offer);
835 data_device_leave (void *data,
836 struct wl_data_device *data_device)
838 GdkWaylandDevice *device = (GdkWaylandDevice *)data;
840 g_debug (G_STRLOC ": %s data_device = %p",
841 G_STRFUNC, data_device);
843 data_offer_unref (device->drag_offer);
844 device->drag_offer = NULL;
848 data_device_motion (void *data,
849 struct wl_data_device *data_device,
854 g_debug (G_STRLOC ": %s data_device = %p, time = %d, x = %d, y = %d",
855 G_STRFUNC, data_device, time, x, y);
859 data_device_drop (void *data,
860 struct wl_data_device *data_device)
862 g_debug (G_STRLOC ": %s data_device = %p",
863 G_STRFUNC, data_device);
867 data_device_selection (void *data,
868 struct wl_data_device *wl_data_device,
869 struct wl_data_offer *offer)
871 GdkWaylandDevice *device = (GdkWaylandDevice *)data;
873 g_debug (G_STRLOC ": %s wl_data_device = %p wl_data_offer = %p",
874 G_STRFUNC, wl_data_device, offer);
878 if (device->selection_offer)
880 data_offer_unref (device->selection_offer);
881 device->selection_offer = NULL;
887 if (device->selection_offer)
889 data_offer_unref (device->selection_offer);
890 device->selection_offer = NULL;
893 /* Retrieve the DataOffer associated with with the wl_data_offer - this
894 * association is made when the listener is attached.
896 g_assert (device->selection_offer == NULL);
897 device->selection_offer = wl_data_offer_get_user_data (offer);
900 static const struct wl_data_device_listener data_device_listener = {
901 data_device_data_offer,
906 data_device_selection
910 _gdk_wayland_device_manager_add_device (GdkDeviceManager *device_manager,
911 struct wl_input_device *wl_device)
914 GdkWaylandDisplay *display_wayland;
915 GdkDeviceManagerCore *device_manager_core =
916 GDK_DEVICE_MANAGER_CORE(device_manager);
917 GdkWaylandDevice *device;
919 device = g_new0 (GdkWaylandDevice, 1);
920 display = gdk_device_manager_get_display (device_manager);
921 display_wayland = GDK_WAYLAND_DISPLAY (display);
923 device->display = display;
924 device->pointer = g_object_new (GDK_TYPE_DEVICE_CORE,
925 "name", "Core Pointer",
926 "type", GDK_DEVICE_TYPE_MASTER,
927 "input-source", GDK_SOURCE_MOUSE,
928 "input-mode", GDK_MODE_SCREEN,
931 "device-manager", device_manager,
934 device->keyboard = g_object_new (GDK_TYPE_DEVICE_CORE,
935 "name", "Core Keyboard",
936 "type", GDK_DEVICE_TYPE_MASTER,
937 "input-source", GDK_SOURCE_KEYBOARD,
938 "input-mode", GDK_MODE_SCREEN,
941 "device-manager", device_manager,
944 GDK_DEVICE_CORE (device->pointer)->device = device;
945 GDK_DEVICE_CORE (device->keyboard)->device = device;
946 device->device = wl_device;
948 wl_input_device_add_listener(device->device,
949 &input_device_listener, device);
951 device->data_device =
952 wl_data_device_manager_get_data_device (display_wayland->data_device_manager,
954 wl_data_device_add_listener (device->data_device,
955 &data_device_listener, device);
957 device_manager_core->devices =
958 g_list_prepend (device_manager_core->devices, device->keyboard);
959 device_manager_core->devices =
960 g_list_prepend (device_manager_core->devices, device->pointer);
962 _gdk_device_set_associated_device (device->pointer, device->keyboard);
963 _gdk_device_set_associated_device (device->keyboard, device->pointer);
967 free_device (gpointer data)
969 g_object_unref (data);
973 gdk_device_manager_core_finalize (GObject *object)
975 GdkDeviceManagerCore *device_manager_core;
977 device_manager_core = GDK_DEVICE_MANAGER_CORE (object);
979 g_list_free_full (device_manager_core->devices, free_device);
981 G_OBJECT_CLASS (gdk_device_manager_core_parent_class)->finalize (object);
985 gdk_device_manager_core_list_devices (GdkDeviceManager *device_manager,
988 GdkDeviceManagerCore *device_manager_core;
989 GList *devices = NULL;
991 if (type == GDK_DEVICE_TYPE_MASTER)
993 device_manager_core = (GdkDeviceManagerCore *) device_manager;
994 devices = g_list_copy(device_manager_core->devices);
1001 gdk_device_manager_core_get_client_pointer (GdkDeviceManager *device_manager)
1003 GdkDeviceManagerCore *device_manager_core;
1005 device_manager_core = (GdkDeviceManagerCore *) device_manager;
1006 return device_manager_core->devices->data;
1010 gdk_device_manager_core_class_init (GdkDeviceManagerCoreClass *klass)
1012 GdkDeviceManagerClass *device_manager_class = GDK_DEVICE_MANAGER_CLASS (klass);
1013 GObjectClass *object_class = G_OBJECT_CLASS (klass);
1015 object_class->finalize = gdk_device_manager_core_finalize;
1016 device_manager_class->list_devices = gdk_device_manager_core_list_devices;
1017 device_manager_class->get_client_pointer = gdk_device_manager_core_get_client_pointer;
1021 gdk_device_manager_core_init (GdkDeviceManagerCore *device_manager)
1026 _gdk_wayland_device_manager_new (GdkDisplay *display)
1028 return g_object_new (GDK_TYPE_DEVICE_MANAGER_CORE,
1034 gdk_wayland_device_get_selection_type_atoms (GdkDevice *gdk_device,
1035 GdkAtom **atoms_out)
1039 GdkWaylandDevice *device;
1041 g_return_val_if_fail (GDK_IS_DEVICE_CORE (gdk_device), 0);
1042 g_return_val_if_fail (atoms_out != NULL, 0);
1044 device = GDK_DEVICE_CORE (gdk_device)->device;
1046 if (!device->selection_offer || device->selection_offer->types->len == 0)
1052 atoms = g_new0 (GdkAtom, device->selection_offer->types->len);
1054 /* Convert list of targets to atoms */
1055 for (i = 0; i < device->selection_offer->types->len; i++)
1057 atoms[i] = gdk_atom_intern (device->selection_offer->types->pdata[i],
1060 g_message (G_STRLOC ": Adding atom for %s",
1061 (char *)device->selection_offer->types->pdata[i]));
1065 return device->selection_offer->types->len;
1070 GdkWaylandDevice *device;
1072 GIOChannel *channel;
1073 GdkDeviceWaylandRequestContentCallback cb;
1075 } RequestContentClosure;
1078 _request_content_io_func (GIOChannel *channel,
1079 GIOCondition condition,
1082 RequestContentClosure *closure = (RequestContentClosure *)userdata;
1085 GError *error = NULL;
1087 /* FIXME: We probably want to do something better than this to avoid
1088 * blocking on the transfer of large pieces of data: call the callback
1089 * multiple times I should think.
1091 if (g_io_channel_read_to_end (channel,
1094 &error) != G_IO_STATUS_NORMAL)
1096 g_warning (G_STRLOC ": Error reading content from pipe: %s", error->message);
1097 g_clear_error (&error);
1100 /* Since we use _read_to_end we've got a guaranteed EOF and thus can go
1101 * ahead and close the fd
1103 g_io_channel_shutdown (channel, TRUE, NULL);
1105 closure->cb (closure->device->pointer, data, len, closure->userdata);
1108 data_offer_unref (closure->offer);
1109 g_io_channel_unref (channel);
1116 gdk_wayland_device_request_selection_content (GdkDevice *gdk_device,
1117 const gchar *requested_mime_type,
1118 GdkDeviceWaylandRequestContentCallback cb,
1122 RequestContentClosure *closure;
1123 GdkWaylandDevice *device;
1124 GError *error = NULL;
1126 g_return_val_if_fail (GDK_IS_DEVICE_CORE (gdk_device), FALSE);
1127 g_return_val_if_fail (requested_mime_type != NULL, FALSE);
1128 g_return_val_if_fail (cb != NULL, FALSE);
1130 device = GDK_DEVICE_CORE (gdk_device)->device;
1132 if (!device->selection_offer)
1135 /* TODO: Check mimetypes */
1137 closure = g_new0 (RequestContentClosure, 1);
1139 device->selection_offer->ref_count++;
1141 pipe2 (pipe_fd, O_CLOEXEC);
1142 wl_data_offer_receive (device->selection_offer->offer,
1143 requested_mime_type,
1147 closure->device = device;
1148 closure->offer = device->selection_offer;
1149 closure->channel = g_io_channel_unix_new (pipe_fd[0]);
1151 closure->userdata = userdata;
1153 if (!g_io_channel_set_encoding (closure->channel, NULL, &error))
1155 g_warning (G_STRLOC ": Error setting encoding on channel: %s",
1157 g_clear_error (&error);
1161 g_io_add_watch (closure->channel,
1163 _request_content_io_func,
1169 data_offer_unref (closure->offer);
1170 g_io_channel_unref (closure->channel);
1177 struct _GdkWaylandSelectionOffer {
1178 GdkDeviceWaylandOfferContentCallback cb;
1180 struct wl_data_source *source;
1181 GdkWaylandDevice *device;
1185 data_source_target (void *data,
1186 struct wl_data_source *source,
1187 const char *mime_type)
1189 g_debug (G_STRLOC ": %s source = %p, mime_type = %s",
1190 G_STRFUNC, source, mime_type);
1194 data_source_send (void *data,
1195 struct wl_data_source *source,
1196 const char *mime_type,
1199 GdkWaylandSelectionOffer *offer = (GdkWaylandSelectionOffer *)data;;
1201 gssize len, bytes_written = 0;
1203 g_debug (G_STRLOC ": %s source = %p, mime_type = %s fd = %d",
1204 G_STRFUNC, source, mime_type, fd);
1206 buf = offer->cb (offer->device->pointer, mime_type, &len, offer->userdata);
1210 bytes_written += write (fd, buf + bytes_written, len);
1211 if (bytes_written == -1)
1213 len -= bytes_written;
1222 g_warning (G_STRLOC ": Error writing data to client: %s",
1223 g_strerror (errno));
1230 data_source_cancelled (void *data,
1231 struct wl_data_source *source)
1233 g_debug (G_STRLOC ": %s source = %p",
1237 static const struct wl_data_source_listener data_source_listener = {
1240 data_source_cancelled
1248 gettimeofday(&tv, NULL);
1250 return tv.tv_sec * 1000 + tv.tv_usec / 1000;
1254 gdk_wayland_device_offer_selection_content (GdkDevice *gdk_device,
1255 const gchar **mime_types,
1257 GdkDeviceWaylandOfferContentCallback cb,
1260 GdkDisplay *display;
1261 GdkWaylandDisplay *display_wayland;
1262 GdkWaylandSelectionOffer *offer;
1263 GdkWaylandDevice *device;
1266 g_return_val_if_fail (GDK_IS_DEVICE_CORE (gdk_device), 0);
1267 device = GDK_DEVICE_CORE (gdk_device)->device;
1269 display = device->display;
1270 display_wayland = GDK_WAYLAND_DISPLAY (display);
1272 offer = g_new0 (GdkWaylandSelectionOffer, 1);
1274 offer->userdata = userdata;
1276 wl_data_device_manager_create_data_source (display_wayland->data_device_manager);
1277 offer->device = device;
1279 for (i = 0; i < nr_mime_types; i++)
1281 wl_data_source_offer (offer->source,
1285 wl_data_source_add_listener (offer->source,
1286 &data_source_listener,
1289 wl_data_device_set_selection (device->data_device,
1293 device->selection_offer_out = offer;
1299 gdk_wayland_device_clear_selection_content (GdkDevice *gdk_device)
1301 GdkWaylandDevice *device;
1303 g_return_val_if_fail (GDK_IS_DEVICE_CORE (gdk_device), 0);
1304 device = GDK_DEVICE_CORE (gdk_device)->device;
1306 if (!device->selection_offer_out)
1309 wl_data_device_set_selection (device->data_device,
1313 wl_data_source_destroy (device->selection_offer_out->source);
1314 g_free (device->selection_offer_out);
1315 device->selection_offer_out = NULL;