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.
28 #include <gdk/gdkwindow.h>
29 #include <gdk/gdktypes.h>
30 #include "gdkprivate-wayland.h"
31 #include "gdkwayland.h"
32 #include "gdkkeysyms.h"
33 #include "gdkdeviceprivate.h"
34 #include "gdkdevicemanagerprivate.h"
35 #include "gdkprivate-wayland.h"
37 #include <X11/extensions/XKBcommon.h>
38 #include <X11/keysym.h>
42 #define GDK_TYPE_DEVICE_CORE (gdk_device_core_get_type ())
43 #define GDK_DEVICE_CORE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GDK_TYPE_DEVICE_CORE, GdkDeviceCore))
44 #define GDK_DEVICE_CORE_CLASS(c) (G_TYPE_CHECK_CLASS_CAST ((c), GDK_TYPE_DEVICE_CORE, GdkDeviceCoreClass))
45 #define GDK_IS_DEVICE_CORE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GDK_TYPE_DEVICE_CORE))
46 #define GDK_IS_DEVICE_CORE_CLASS(c) (G_TYPE_CHECK_CLASS_TYPE ((c), GDK_TYPE_DEVICE_CORE))
47 #define GDK_DEVICE_CORE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GDK_TYPE_DEVICE_CORE, GdkDeviceCoreClass))
49 typedef struct _GdkDeviceCore GdkDeviceCore;
50 typedef struct _GdkDeviceCoreClass GdkDeviceCoreClass;
51 typedef struct _GdkWaylandDevice GdkWaylandDevice;
53 typedef struct _DataOffer DataOffer;
55 typedef struct _GdkWaylandSelectionOffer GdkWaylandSelectionOffer;
57 struct _GdkWaylandDevice
62 GdkModifierType modifiers;
63 GdkWindow *pointer_focus;
64 GdkWindow *keyboard_focus;
65 struct wl_input_device *device;
66 struct wl_data_device *data_device;
67 int32_t x, y, surface_x, surface_y;
69 GdkWindow *pointer_grab_window;
70 uint32_t pointer_grab_time;
75 DataOffer *drag_offer;
76 DataOffer *selection_offer;
78 GdkWaylandSelectionOffer *selection_offer_out;
83 GdkDevice parent_instance;
84 GdkWaylandDevice *device;
87 struct _GdkDeviceCoreClass
89 GdkDeviceClass parent_class;
92 G_DEFINE_TYPE (GdkDeviceCore, gdk_device_core, GDK_TYPE_DEVICE)
94 #define GDK_TYPE_DEVICE_MANAGER_CORE (gdk_device_manager_core_get_type ())
95 #define GDK_DEVICE_MANAGER_CORE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GDK_TYPE_DEVICE_MANAGER_CORE, GdkDeviceManagerCore))
96 #define GDK_DEVICE_MANAGER_CORE_CLASS(c) (G_TYPE_CHECK_CLASS_CAST ((c), GDK_TYPE_DEVICE_MANAGER_CORE, GdkDeviceManagerCoreClass))
97 #define GDK_IS_DEVICE_MANAGER_CORE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GDK_TYPE_DEVICE_MANAGER_CORE))
98 #define GDK_IS_DEVICE_MANAGER_CORE_CLASS(c) (G_TYPE_CHECK_CLASS_TYPE ((c), GDK_TYPE_DEVICE_MANAGER_CORE))
99 #define GDK_DEVICE_MANAGER_CORE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GDK_TYPE_DEVICE_MANAGER_CORE, GdkDeviceManagerCoreClass))
101 typedef struct _GdkDeviceManagerCore GdkDeviceManagerCore;
102 typedef struct _GdkDeviceManagerCoreClass GdkDeviceManagerCoreClass;
104 struct _GdkDeviceManagerCore
106 GdkDeviceManager parent_object;
107 GdkDevice *core_pointer;
108 GdkDevice *core_keyboard;
112 struct _GdkDeviceManagerCoreClass
114 GdkDeviceManagerClass parent_class;
117 G_DEFINE_TYPE (GdkDeviceManagerCore,
118 gdk_device_manager_core, GDK_TYPE_DEVICE_MANAGER)
121 gdk_device_core_get_history (GdkDevice *device,
125 GdkTimeCoord ***events,
132 gdk_device_core_get_state (GdkDevice *device,
135 GdkModifierType *mask)
139 gdk_window_get_device_position (window, device, &x_int, &y_int, mask);
149 gdk_device_core_set_window_cursor (GdkDevice *device,
153 GdkWaylandDevice *wd = GDK_DEVICE_CORE(device)->device;
154 struct wl_buffer *buffer;
158 g_object_ref (cursor);
160 /* Setting the cursor to NULL means that we should use the default cursor */
163 /* FIXME: Is this the best sensible default ? */
164 cursor = _gdk_wayland_display_get_cursor_for_type (device->display,
168 buffer = _gdk_wayland_cursor_get_buffer(cursor, &x, &y);
169 wl_input_device_attach(wd->device, wd->time, buffer, x, y);
171 g_object_unref (cursor);
175 gdk_device_core_warp (GdkDevice *device,
183 gdk_device_core_query_state (GdkDevice *device,
185 GdkWindow **root_window,
186 GdkWindow **child_window,
191 GdkModifierType *mask)
193 GdkWaylandDevice *wd;
194 GdkScreen *default_screen;
196 wd = GDK_DEVICE_CORE(device)->device;
197 default_screen = gdk_display_get_default_screen (wd->display);
200 *root_window = gdk_screen_get_root_window (default_screen);
202 *child_window = wd->pointer_focus;
208 *win_x = wd->surface_x;
210 *win_y = wd->surface_y;
212 *mask = wd->modifiers;
218 gdk_device_core_grab (GdkDevice *device,
220 gboolean owner_events,
221 GdkEventMask event_mask,
222 GdkWindow *confine_to,
226 GdkWaylandDevice *wayland_device = GDK_DEVICE_CORE (device)->device;
228 if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
230 /* Device is a keyboard */
231 return GDK_GRAB_SUCCESS;
235 /* Device is a pointer */
237 if (wayland_device->pointer_grab_window != NULL &&
238 time_ != 0 && wayland_device->pointer_grab_time > time_)
240 return GDK_GRAB_ALREADY_GRABBED;
244 time_ = wayland_device->time;
246 wayland_device->pointer_grab_window = window;
247 wayland_device->pointer_grab_time = time_;
250 return GDK_GRAB_SUCCESS;
254 gdk_device_core_ungrab (GdkDevice *device,
258 GdkDeviceGrabInfo *grab;
260 display = gdk_device_get_display (device);
262 if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
264 /* Device is a keyboard */
268 /* Device is a pointer */
269 grab = _gdk_display_get_last_device_grab (display, device);
272 grab->serial_end = grab->serial_start;
277 gdk_device_core_window_at_position (GdkDevice *device,
280 GdkModifierType *mask,
281 gboolean get_toplevel)
283 GdkWaylandDevice *wd;
285 wd = GDK_DEVICE_CORE(device)->device;
287 *win_x = wd->surface_x;
289 *win_y = wd->surface_y;
291 *mask = wd->modifiers;
293 return wd->pointer_focus;
297 gdk_device_core_select_window_events (GdkDevice *device,
299 GdkEventMask event_mask)
304 gdk_device_core_class_init (GdkDeviceCoreClass *klass)
306 GdkDeviceClass *device_class = GDK_DEVICE_CLASS (klass);
308 device_class->get_history = gdk_device_core_get_history;
309 device_class->get_state = gdk_device_core_get_state;
310 device_class->set_window_cursor = gdk_device_core_set_window_cursor;
311 device_class->warp = gdk_device_core_warp;
312 device_class->query_state = gdk_device_core_query_state;
313 device_class->grab = gdk_device_core_grab;
314 device_class->ungrab = gdk_device_core_ungrab;
315 device_class->window_at_position = gdk_device_core_window_at_position;
316 device_class->select_window_events = gdk_device_core_select_window_events;
320 gdk_device_core_init (GdkDeviceCore *device_core)
324 device = GDK_DEVICE (device_core);
326 _gdk_device_add_axis (device, GDK_NONE, GDK_AXIS_X, 0, 0, 1);
327 _gdk_device_add_axis (device, GDK_NONE, GDK_AXIS_Y, 0, 0, 1);
330 struct wl_input_device *
331 _gdk_wayland_device_get_device (GdkDevice *device)
333 return GDK_DEVICE_CORE (device)->device->device;
337 input_handle_motion(void *data, struct wl_input_device *input_device,
339 int32_t x, int32_t y, int32_t sx, int32_t sy)
341 GdkWaylandDevice *device = data;
342 GdkDisplayWayland *display = GDK_DISPLAY_WAYLAND (device->display);
345 event = gdk_event_new (GDK_NOTHING);
350 device->surface_x = sx;
351 device->surface_y = sy;
353 event->motion.type = GDK_MOTION_NOTIFY;
354 event->motion.window = g_object_ref (device->pointer_focus);
355 gdk_event_set_device (event, device->pointer);
356 event->motion.time = time;
357 event->motion.x = (gdouble) sx;
358 event->motion.y = (gdouble) sy;
359 event->motion.x_root = (gdouble) x;
360 event->motion.y_root = (gdouble) y;
361 event->motion.axes = NULL;
362 event->motion.state = device->modifiers;
363 event->motion.is_hint = 0;
364 gdk_event_set_screen (event, display->screen);
367 g_message ("motion %d %d, state %d",
368 sx, sy, event->button.state));
370 _gdk_wayland_display_deliver_event (device->display, event);
374 input_handle_button(void *data, struct wl_input_device *input_device,
375 uint32_t time, uint32_t button, uint32_t state)
377 GdkWaylandDevice *device = data;
378 GdkDisplayWayland *display = GDK_DISPLAY_WAYLAND (device->display);
391 gdk_button = button - 271;
396 event = gdk_event_new (state ? GDK_BUTTON_PRESS : GDK_BUTTON_RELEASE);
397 event->button.window = g_object_ref (device->pointer_focus);
398 gdk_event_set_device (event, device->pointer);
399 event->button.time = time;
400 event->button.x = (gdouble) device->surface_x;
401 event->button.y = (gdouble) device->surface_y;
402 event->button.x_root = (gdouble) device->x;
403 event->button.y_root = (gdouble) device->y;
404 event->button.axes = NULL;
405 event->button.state = device->modifiers;
406 event->button.button = gdk_button;
407 gdk_event_set_screen (event, display->screen);
409 modifier = 1 << (8 + gdk_button - 1);
411 device->modifiers |= modifier;
413 device->modifiers &= ~modifier;
416 g_message ("button %d %s, state %d",
417 event->button.button,
418 state ? "press" : "release", event->button.state));
420 _gdk_wayland_display_deliver_event (device->display, event);
424 translate_keyboard_string (GdkEventKey *event)
429 /* Fill in event->string crudely, since various programs
432 event->string = NULL;
434 if (event->keyval != GDK_KEY_VoidSymbol)
435 c = gdk_keyval_to_unicode (event->keyval);
442 /* Apply the control key - Taken from Xlib
444 if (event->state & GDK_CONTROL_MASK)
446 if ((c >= '@' && c < '\177') || c == ' ') c &= 0x1F;
449 event->string = g_memdup ("\0\0", 2);
454 else if (c >= '3' && c <= '7') c -= ('3' - '\033');
455 else if (c == '8') c = '\177';
456 else if (c == '/') c = '_' & 0x1F;
459 len = g_unichar_to_utf8 (c, buf);
462 event->string = g_locale_from_utf8 (buf, len,
463 NULL, &bytes_written,
466 event->length = bytes_written;
468 else if (event->keyval == GDK_KEY_Escape)
471 event->string = g_strdup ("\033");
473 else if (event->keyval == GDK_KEY_Return ||
474 event->keyval == GDK_KEY_KP_Enter)
477 event->string = g_strdup ("\r");
483 event->string = g_strdup ("");
488 keyboard_repeat (gpointer data);
491 deliver_key_event(GdkWaylandDevice *device,
492 uint32_t time, uint32_t key, uint32_t state)
495 uint32_t code, modifier, level;
496 struct xkb_desc *xkb;
499 keymap = gdk_keymap_get_for_display (device->display);
500 xkb = _gdk_wayland_keymap_get_xkb_desc (keymap);
503 event = gdk_event_new (state ? GDK_KEY_PRESS : GDK_KEY_RELEASE);
504 event->key.window = g_object_ref (device->keyboard_focus);
505 gdk_event_set_device (event, device->keyboard);
506 event->button.time = time;
507 event->key.state = device->modifiers;
508 event->key.group = 0;
509 code = key + xkb->min_key_code;
510 event->key.hardware_keycode = code;
513 if (device->modifiers & XKB_COMMON_SHIFT_MASK &&
514 XkbKeyGroupWidth(xkb, code, 0) > 1)
517 event->key.keyval = XkbKeySymEntry(xkb, code, level, 0);
519 modifier = xkb->map->modmap[code];
521 device->modifiers |= modifier;
523 device->modifiers &= ~modifier;
525 event->key.is_modifier = modifier > 0;
527 translate_keyboard_string (&event->key);
529 _gdk_wayland_display_deliver_event (device->display, event);
532 g_message ("keyboard event, code %d, sym %d, "
533 "string %s, mods 0x%x",
534 code, event->key.keyval,
535 event->key.string, event->key.state));
537 device->repeat_count++;
538 device->repeat_key = key;
542 if (device->repeat_timer)
544 g_source_remove (device->repeat_timer);
545 device->repeat_timer = 0;
553 else switch (device->repeat_count)
556 if (device->repeat_timer)
558 g_source_remove (device->repeat_timer);
559 device->repeat_timer = 0;
562 device->repeat_timer =
563 gdk_threads_add_timeout (400, keyboard_repeat, device);
566 device->repeat_timer =
567 gdk_threads_add_timeout (80, keyboard_repeat, device);
575 keyboard_repeat (gpointer data)
577 GdkWaylandDevice *device = data;
579 return deliver_key_event (device, device->time, device->repeat_key, 1);
583 input_handle_key(void *data, struct wl_input_device *input_device,
584 uint32_t time, uint32_t key, uint32_t state)
586 GdkWaylandDevice *device = data;
588 device->repeat_count = 0;
589 deliver_key_event (data, time, key, state);
593 input_handle_pointer_focus(void *data,
594 struct wl_input_device *input_device,
595 uint32_t time, struct wl_surface *surface,
596 int32_t x, int32_t y, int32_t sx, int32_t sy)
598 GdkWaylandDevice *device = data;
602 if (device->pointer_focus)
604 event = gdk_event_new (GDK_LEAVE_NOTIFY);
605 event->crossing.window = g_object_ref (device->pointer_focus);
606 gdk_event_set_device (event, device->pointer);
607 event->crossing.subwindow = NULL;
608 event->crossing.time = time;
609 event->crossing.x = (gdouble) device->surface_x;
610 event->crossing.y = (gdouble) device->surface_y;
611 event->crossing.x_root = (gdouble) device->x;
612 event->crossing.y_root = (gdouble) device->y;
614 event->crossing.mode = GDK_CROSSING_NORMAL;
615 event->crossing.detail = GDK_NOTIFY_ANCESTOR;
616 event->crossing.focus = TRUE;
617 event->crossing.state = 0;
619 _gdk_wayland_display_deliver_event (device->display, event);
622 g_message ("leave, device %p surface %p",
623 device, device->pointer_focus));
625 g_object_unref(device->pointer_focus);
626 device->pointer_focus = NULL;
631 device->pointer_focus = wl_surface_get_user_data(surface);
632 g_object_ref(device->pointer_focus);
634 event = gdk_event_new (GDK_ENTER_NOTIFY);
635 event->crossing.window = g_object_ref (device->pointer_focus);
636 gdk_event_set_device (event, device->pointer);
637 event->crossing.subwindow = NULL;
638 event->crossing.time = time;
639 event->crossing.x = (gdouble) sx;
640 event->crossing.y = (gdouble) sy;
641 event->crossing.x_root = (gdouble) x;
642 event->crossing.y_root = (gdouble) y;
644 event->crossing.mode = GDK_CROSSING_NORMAL;
645 event->crossing.detail = GDK_NOTIFY_ANCESTOR;
646 event->crossing.focus = TRUE;
647 event->crossing.state = 0;
649 device->surface_x = sx;
650 device->surface_y = sy;
654 _gdk_wayland_display_deliver_event (device->display, event);
657 g_message ("enter, device %p surface %p",
658 device, device->pointer_focus));
663 update_modifiers(GdkWaylandDevice *device, struct wl_array *keys)
667 struct xkb_desc *xkb;
669 keymap = gdk_keymap_get_for_display (device->display);
670 xkb = _gdk_wayland_keymap_get_xkb_desc (keymap);
672 end = keys->data + keys->size;
673 device->modifiers = 0;
674 for (k = keys->data; k < end; k++)
675 device->modifiers |= xkb->map->modmap[*k];
679 input_handle_keyboard_focus(void *data,
680 struct wl_input_device *input_device,
682 struct wl_surface *surface,
683 struct wl_array *keys)
685 GdkWaylandDevice *device = data;
689 if (device->keyboard_focus)
691 _gdk_wayland_window_remove_focus (device->keyboard_focus);
692 event = gdk_event_new (GDK_FOCUS_CHANGE);
693 event->focus_change.window = g_object_ref (device->keyboard_focus);
694 event->focus_change.send_event = FALSE;
695 event->focus_change.in = FALSE;
696 gdk_event_set_device (event, device->keyboard);
698 g_object_unref(device->keyboard_focus);
699 device->keyboard_focus = NULL;
702 g_message ("focus out, device %p surface %p",
703 device, device->keyboard_focus));
705 _gdk_wayland_display_deliver_event (device->display, event);
710 device->keyboard_focus = wl_surface_get_user_data(surface);
711 g_object_ref(device->keyboard_focus);
713 event = gdk_event_new (GDK_FOCUS_CHANGE);
714 event->focus_change.window = g_object_ref (device->keyboard_focus);
715 event->focus_change.send_event = FALSE;
716 event->focus_change.in = TRUE;
717 gdk_event_set_device (event, device->keyboard);
719 update_modifiers (device, keys);
722 g_message ("focus int, device %p surface %p",
723 device, device->keyboard_focus));
725 _gdk_wayland_display_deliver_event (device->display, event);
727 _gdk_wayland_window_add_focus (device->keyboard_focus);
731 static const struct wl_input_device_listener input_device_listener = {
735 input_handle_pointer_focus,
736 input_handle_keyboard_focus,
740 struct wl_data_offer *offer;
746 data_offer_offer (void *data,
747 struct wl_data_offer *wl_data_offer,
750 DataOffer *offer = (DataOffer *)data;
751 g_debug (G_STRLOC ": %s wl_data_offer = %p type = %s",
752 G_STRFUNC, wl_data_offer, type);
754 g_ptr_array_add (offer->types, g_strdup (type));
758 data_offer_unref (DataOffer *offer)
762 if (offer->ref_count == 0)
764 g_ptr_array_free (offer->types, TRUE);
769 static const struct wl_data_offer_listener data_offer_listener = {
774 data_device_data_offer (void *data,
775 struct wl_data_device *data_device,
780 g_debug (G_STRLOC ": %s data_device = %p id = %lu",
781 G_STRFUNC, data_device, (long unsigned int)id);
783 /* This structure is reference counted to handle the case where you get a
784 * leave but are in the middle of transferring data
786 offer = g_new0 (DataOffer, 1);
787 offer->ref_count = 1;
788 offer->types = g_ptr_array_new_with_free_func (g_free);
789 offer->offer = (struct wl_data_offer *)
790 wl_proxy_create_for_id ((struct wl_proxy *) data_device,
792 &wl_data_offer_interface);
794 /* The DataOffer structure is then retrieved later since this sets the user
797 wl_data_offer_add_listener (offer->offer,
798 &data_offer_listener,
803 data_device_enter (void *data,
804 struct wl_data_device *data_device,
806 struct wl_surface *surface,
809 struct wl_data_offer *offer)
811 GdkWaylandDevice *device = (GdkWaylandDevice *)data;
813 g_debug (G_STRLOC ": %s data_device = %p time = %d, surface = %p, x = %d y = %d, offer = %p",
814 G_STRFUNC, data_device, time, surface, x, y, offer);
816 /* Retrieve the DataOffer associated with with the wl_data_offer - this
817 * association is made when the listener is attached.
819 g_assert (device->drag_offer == NULL);
820 device->drag_offer = wl_data_offer_get_user_data (offer);
824 data_device_leave (void *data,
825 struct wl_data_device *data_device)
827 GdkWaylandDevice *device = (GdkWaylandDevice *)data;
829 g_debug (G_STRLOC ": %s data_device = %p",
830 G_STRFUNC, data_device);
832 data_offer_unref (device->drag_offer);
833 device->drag_offer = NULL;
837 data_device_motion (void *data,
838 struct wl_data_device *data_device,
843 g_debug (G_STRLOC ": %s data_device = %p, time = %d, x = %d, y = %d",
844 G_STRFUNC, data_device, time, x, y);
848 data_device_drop (void *data,
849 struct wl_data_device *data_device)
851 g_debug (G_STRLOC ": %s data_device = %p",
852 G_STRFUNC, data_device);
856 data_device_selection (void *data,
857 struct wl_data_device *wl_data_device,
858 struct wl_data_offer *offer)
860 GdkWaylandDevice *device = (GdkWaylandDevice *)data;
862 g_debug (G_STRLOC ": %s wl_data_device = %p wl_data_offer = %p",
863 G_STRFUNC, wl_data_device, offer);
867 if (device->selection_offer)
869 data_offer_unref (device->selection_offer);
870 device->selection_offer = NULL;
876 if (device->selection_offer)
878 data_offer_unref (device->selection_offer);
879 device->selection_offer = NULL;
882 /* Retrieve the DataOffer associated with with the wl_data_offer - this
883 * association is made when the listener is attached.
885 g_assert (device->selection_offer == NULL);
886 device->selection_offer = wl_data_offer_get_user_data (offer);
889 static const struct wl_data_device_listener data_device_listener = {
890 data_device_data_offer,
895 data_device_selection
899 _gdk_wayland_device_manager_add_device (GdkDeviceManager *device_manager,
900 struct wl_input_device *wl_device)
903 GdkDisplayWayland *display_wayland;
904 GdkDeviceManagerCore *device_manager_core =
905 GDK_DEVICE_MANAGER_CORE(device_manager);
906 GdkWaylandDevice *device;
908 device = g_new0 (GdkWaylandDevice, 1);
909 display = gdk_device_manager_get_display (device_manager);
910 display_wayland = GDK_DISPLAY_WAYLAND (display);
912 device->display = display;
913 device->pointer = g_object_new (GDK_TYPE_DEVICE_CORE,
914 "name", "Core Pointer",
915 "type", GDK_DEVICE_TYPE_MASTER,
916 "input-source", GDK_SOURCE_MOUSE,
917 "input-mode", GDK_MODE_SCREEN,
920 "device-manager", device_manager,
923 device->keyboard = g_object_new (GDK_TYPE_DEVICE_CORE,
924 "name", "Core Keyboard",
925 "type", GDK_DEVICE_TYPE_MASTER,
926 "input-source", GDK_SOURCE_KEYBOARD,
927 "input-mode", GDK_MODE_SCREEN,
930 "device-manager", device_manager,
933 GDK_DEVICE_CORE (device->pointer)->device = device;
934 GDK_DEVICE_CORE (device->keyboard)->device = device;
935 device->device = wl_device;
937 wl_input_device_add_listener(device->device,
938 &input_device_listener, device);
940 device->data_device =
941 wl_data_device_manager_get_data_device (display_wayland->data_device_manager,
943 wl_data_device_add_listener (device->data_device,
944 &data_device_listener, device);
946 device_manager_core->devices =
947 g_list_prepend (device_manager_core->devices, device->keyboard);
948 device_manager_core->devices =
949 g_list_prepend (device_manager_core->devices, device->pointer);
951 _gdk_device_set_associated_device (device->pointer, device->keyboard);
952 _gdk_device_set_associated_device (device->keyboard, device->pointer);
956 free_device (gpointer data)
958 g_object_unref (data);
962 gdk_device_manager_core_finalize (GObject *object)
964 GdkDeviceManagerCore *device_manager_core;
966 device_manager_core = GDK_DEVICE_MANAGER_CORE (object);
968 g_list_free_full (device_manager_core->devices, free_device);
970 G_OBJECT_CLASS (gdk_device_manager_core_parent_class)->finalize (object);
974 gdk_device_manager_core_list_devices (GdkDeviceManager *device_manager,
977 GdkDeviceManagerCore *device_manager_core;
978 GList *devices = NULL;
980 if (type == GDK_DEVICE_TYPE_MASTER)
982 device_manager_core = (GdkDeviceManagerCore *) device_manager;
983 devices = g_list_copy(device_manager_core->devices);
990 gdk_device_manager_core_get_client_pointer (GdkDeviceManager *device_manager)
992 GdkDeviceManagerCore *device_manager_core;
994 device_manager_core = (GdkDeviceManagerCore *) device_manager;
995 return device_manager_core->devices->data;
999 gdk_device_manager_core_class_init (GdkDeviceManagerCoreClass *klass)
1001 GdkDeviceManagerClass *device_manager_class = GDK_DEVICE_MANAGER_CLASS (klass);
1002 GObjectClass *object_class = G_OBJECT_CLASS (klass);
1004 object_class->finalize = gdk_device_manager_core_finalize;
1005 device_manager_class->list_devices = gdk_device_manager_core_list_devices;
1006 device_manager_class->get_client_pointer = gdk_device_manager_core_get_client_pointer;
1010 gdk_device_manager_core_init (GdkDeviceManagerCore *device_manager)
1015 _gdk_wayland_device_manager_new (GdkDisplay *display)
1017 return g_object_new (GDK_TYPE_DEVICE_MANAGER_CORE,
1023 gdk_wayland_device_get_selection_type_atoms (GdkDevice *gdk_device,
1024 GdkAtom **atoms_out)
1028 GdkWaylandDevice *device;
1030 g_return_val_if_fail (GDK_IS_DEVICE_CORE (gdk_device), 0);
1031 g_return_val_if_fail (atoms_out != NULL, 0);
1033 device = GDK_DEVICE_CORE (gdk_device)->device;
1035 if (!device->selection_offer || device->selection_offer->types->len == 0)
1041 atoms = g_new0 (GdkAtom, device->selection_offer->types->len);
1043 /* Convert list of targets to atoms */
1044 for (i = 0; i < device->selection_offer->types->len; i++)
1046 atoms[i] = gdk_atom_intern (device->selection_offer->types->pdata[i],
1049 g_message (G_STRLOC ": Adding atom for %s",
1050 (char *)device->selection_offer->types->pdata[i]));
1054 return device->selection_offer->types->len;
1059 GdkWaylandDevice *device;
1061 GIOChannel *channel;
1062 GdkDeviceWaylandRequestContentCallback cb;
1064 } RequestContentClosure;
1067 _request_content_io_func (GIOChannel *channel,
1068 GIOCondition condition,
1071 RequestContentClosure *closure = (RequestContentClosure *)userdata;
1074 GError *error = NULL;
1076 /* FIXME: We probably want to do something better than this to avoid
1077 * blocking on the transfer of large pieces of data: call the callback
1078 * multiple times I should think.
1080 if (g_io_channel_read_to_end (channel,
1083 &error) != G_IO_STATUS_NORMAL)
1085 g_warning (G_STRLOC ": Error reading content from pipe: %s", error->message);
1086 g_clear_error (&error);
1089 /* Since we use _read_to_end we've got a guaranteed EOF and thus can go
1090 * ahead and close the fd
1092 g_io_channel_shutdown (channel, TRUE, NULL);
1094 closure->cb (closure->device->pointer, data, len, closure->userdata);
1097 data_offer_unref (closure->offer);
1098 g_io_channel_unref (channel);
1105 gdk_wayland_device_request_selection_content (GdkDevice *gdk_device,
1106 const gchar *requested_mime_type,
1107 GdkDeviceWaylandRequestContentCallback cb,
1111 RequestContentClosure *closure;
1112 GdkWaylandDevice *device;
1113 GError *error = NULL;
1115 g_return_val_if_fail (GDK_IS_DEVICE_CORE (gdk_device), FALSE);
1116 g_return_val_if_fail (requested_mime_type != NULL, FALSE);
1117 g_return_val_if_fail (cb != NULL, FALSE);
1119 device = GDK_DEVICE_CORE (gdk_device)->device;
1121 if (!device->selection_offer)
1124 /* TODO: Check mimetypes */
1126 closure = g_new0 (RequestContentClosure, 1);
1128 device->selection_offer->ref_count++;
1130 pipe2 (pipe_fd, O_CLOEXEC);
1131 wl_data_offer_receive (device->selection_offer->offer,
1132 requested_mime_type,
1136 closure->device = device;
1137 closure->offer = device->selection_offer;
1138 closure->channel = g_io_channel_unix_new (pipe_fd[0]);
1140 closure->userdata = userdata;
1142 if (!g_io_channel_set_encoding (closure->channel, NULL, &error))
1144 g_warning (G_STRLOC ": Error setting encoding on channel: %s",
1146 g_clear_error (&error);
1150 g_io_add_watch (closure->channel,
1152 _request_content_io_func,
1158 data_offer_unref (closure->offer);
1159 g_io_channel_unref (closure->channel);
1166 struct _GdkWaylandSelectionOffer {
1167 GdkDeviceWaylandOfferContentCallback cb;
1169 struct wl_data_source *source;
1170 GdkWaylandDevice *device;
1174 data_source_target (void *data,
1175 struct wl_data_source *source,
1176 const char *mime_type)
1178 g_debug (G_STRLOC ": %s source = %p, mime_type = %s",
1179 G_STRFUNC, source, mime_type);
1183 data_source_send (void *data,
1184 struct wl_data_source *source,
1185 const char *mime_type,
1188 GdkWaylandSelectionOffer *offer = (GdkWaylandSelectionOffer *)data;;
1190 gssize len, bytes_written = 0;
1192 g_debug (G_STRLOC ": %s source = %p, mime_type = %s fd = %d",
1193 G_STRFUNC, source, mime_type, fd);
1195 buf = offer->cb (offer->device->pointer, mime_type, &len, offer->userdata);
1199 bytes_written += write (fd, buf + bytes_written, len);
1200 if (bytes_written == -1)
1202 len -= bytes_written;
1211 g_warning (G_STRLOC ": Error writing data to client: %s",
1212 g_strerror (errno));
1219 data_source_cancelled (void *data,
1220 struct wl_data_source *source)
1222 g_debug (G_STRLOC ": %s source = %p",
1226 static const struct wl_data_source_listener data_source_listener = {
1229 data_source_cancelled
1237 gettimeofday(&tv, NULL);
1239 return tv.tv_sec * 1000 + tv.tv_usec / 1000;
1243 gdk_wayland_device_offer_selection_content (GdkDevice *gdk_device,
1244 const gchar **mime_types,
1246 GdkDeviceWaylandOfferContentCallback cb,
1249 GdkDisplay *display;
1250 GdkDisplayWayland *display_wayland;
1251 GdkWaylandSelectionOffer *offer;
1252 GdkWaylandDevice *device;
1255 g_return_val_if_fail (GDK_IS_DEVICE_CORE (gdk_device), 0);
1256 device = GDK_DEVICE_CORE (gdk_device)->device;
1258 display = device->display;
1259 display_wayland = GDK_DISPLAY_WAYLAND (display);
1261 offer = g_new0 (GdkWaylandSelectionOffer, 1);
1263 offer->userdata = userdata;
1265 wl_data_device_manager_create_data_source (display_wayland->data_device_manager);
1266 offer->device = device;
1268 for (i = 0; i < nr_mime_types; i++)
1270 wl_data_source_offer (offer->source,
1274 wl_data_source_add_listener (offer->source,
1275 &data_source_listener,
1278 wl_data_device_set_selection (device->data_device,
1282 device->selection_offer_out = offer;
1288 gdk_wayland_device_clear_selection_content (GdkDevice *gdk_device)
1290 GdkWaylandDevice *device;
1292 g_return_val_if_fail (GDK_IS_DEVICE_CORE (gdk_device), 0);
1293 device = GDK_DEVICE_CORE (gdk_device)->device;
1295 if (!device->selection_offer_out)
1298 wl_data_device_set_selection (device->data_device,
1302 wl_data_source_destroy (device->selection_offer_out->source);
1303 g_free (device->selection_offer_out);
1304 device->selection_offer_out = NULL;