wayland: Add dummy implementation of the wl_data_device functionality
Setup listener functions for the drag and drop events as well as the selection events. Then create and save a data structure representing the data offer from the other client.
This commit is contained in:
		| @ -43,6 +43,8 @@ typedef struct _GdkDeviceCore GdkDeviceCore; | |||||||
| typedef struct _GdkDeviceCoreClass GdkDeviceCoreClass; | typedef struct _GdkDeviceCoreClass GdkDeviceCoreClass; | ||||||
| typedef struct _GdkWaylandDevice GdkWaylandDevice; | typedef struct _GdkWaylandDevice GdkWaylandDevice; | ||||||
|  |  | ||||||
|  | typedef struct _DataOffer DataOffer; | ||||||
|  |  | ||||||
| struct _GdkWaylandDevice | struct _GdkWaylandDevice | ||||||
| { | { | ||||||
|   GdkDisplay *display; |   GdkDisplay *display; | ||||||
| @ -55,6 +57,9 @@ struct _GdkWaylandDevice | |||||||
|   struct wl_data_device *data_device; |   struct wl_data_device *data_device; | ||||||
|   int32_t x, y, surface_x, surface_y; |   int32_t x, y, surface_x, surface_y; | ||||||
|   uint32_t time; |   uint32_t time; | ||||||
|  |  | ||||||
|  |   DataOffer *drag_offer; | ||||||
|  |   DataOffer *selection_offer; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| struct _GdkDeviceCore | struct _GdkDeviceCore | ||||||
| @ -596,6 +601,158 @@ static const struct wl_input_device_listener input_device_listener = { | |||||||
|   input_handle_keyboard_focus, |   input_handle_keyboard_focus, | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | struct _DataOffer { | ||||||
|  |   struct wl_data_offer *offer; | ||||||
|  |   gint ref_count; | ||||||
|  |   GPtrArray *types; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | static void | ||||||
|  | data_offer_offer (void                 *data, | ||||||
|  |                   struct wl_data_offer *wl_data_offer, | ||||||
|  |                   const char           *type) | ||||||
|  | { | ||||||
|  |   DataOffer *offer = (DataOffer *)data; | ||||||
|  |   g_debug (G_STRLOC ": %s wl_data_offer = %p type = %s", | ||||||
|  |            G_STRFUNC, wl_data_offer, type); | ||||||
|  |  | ||||||
|  |   g_ptr_array_add (offer->types, g_strdup (type)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void | ||||||
|  | data_offer_unref (DataOffer *offer) | ||||||
|  | { | ||||||
|  |   offer->ref_count--; | ||||||
|  |  | ||||||
|  |   if (offer->ref_count == 0) | ||||||
|  |     { | ||||||
|  |       g_ptr_array_free (offer->types, TRUE); | ||||||
|  |       g_free (offer); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static const struct wl_data_offer_listener data_offer_listener = { | ||||||
|  |   data_offer_offer, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | static void | ||||||
|  | data_device_data_offer (void                  *data, | ||||||
|  |                         struct wl_data_device *data_device, | ||||||
|  |                         uint32_t               id) | ||||||
|  | { | ||||||
|  |   DataOffer *offer; | ||||||
|  |  | ||||||
|  |   g_debug (G_STRLOC ": %s data_device = %p id = %lu", | ||||||
|  |            G_STRFUNC, data_device, (long unsigned int)id); | ||||||
|  |  | ||||||
|  |   /* This structure is reference counted to handle the case where you get a | ||||||
|  |    * leave but are in the middle of transferring data | ||||||
|  |    */ | ||||||
|  |   offer = g_new0 (DataOffer, 1); | ||||||
|  |   offer->ref_count = 1; | ||||||
|  |   offer->types = g_ptr_array_new_with_free_func (g_free); | ||||||
|  |   offer->offer = (struct wl_data_offer *) | ||||||
|  |     wl_proxy_create_for_id ((struct wl_proxy *) data_device, | ||||||
|  |                             id, | ||||||
|  |                             &wl_data_offer_interface); | ||||||
|  |  | ||||||
|  |   /* The DataOffer structure is then retrieved later since this sets the user | ||||||
|  |    * data. | ||||||
|  |    */ | ||||||
|  |   wl_data_offer_add_listener (offer->offer, | ||||||
|  |                               &data_offer_listener, | ||||||
|  |                               offer); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void | ||||||
|  | data_device_enter (void                  *data, | ||||||
|  |                    struct wl_data_device *data_device, | ||||||
|  |                    uint32_t               time, | ||||||
|  |                    struct wl_surface     *surface, | ||||||
|  |                    int32_t                x, | ||||||
|  |                    int32_t                y, | ||||||
|  |                    struct wl_data_offer  *offer) | ||||||
|  | { | ||||||
|  |   GdkWaylandDevice *device = (GdkWaylandDevice *)data; | ||||||
|  |  | ||||||
|  |   g_debug (G_STRLOC ": %s data_device = %p time = %d, surface = %p, x = %d y = %d, offer = %p", | ||||||
|  |            G_STRFUNC, data_device, time, surface, x, y, offer); | ||||||
|  |  | ||||||
|  |   /* Retrieve the DataOffer associated with with the wl_data_offer - this | ||||||
|  |    * association is made when the listener is attached. | ||||||
|  |    */ | ||||||
|  |   g_assert (device->drag_offer == NULL); | ||||||
|  |   device->drag_offer = wl_data_offer_get_user_data (offer); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void | ||||||
|  | data_device_leave (void                  *data, | ||||||
|  |                    struct wl_data_device *data_device) | ||||||
|  | { | ||||||
|  |   GdkWaylandDevice *device = (GdkWaylandDevice *)data; | ||||||
|  |  | ||||||
|  |   g_debug (G_STRLOC ": %s data_device = %p", | ||||||
|  |            G_STRFUNC, data_device); | ||||||
|  |  | ||||||
|  |   data_offer_unref (device->drag_offer); | ||||||
|  |   device->drag_offer = NULL; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void | ||||||
|  | data_device_motion (void                  *data, | ||||||
|  |                     struct wl_data_device *data_device, | ||||||
|  |                     uint32_t               time, | ||||||
|  |                     int32_t                x, | ||||||
|  |                     int32_t                y) | ||||||
|  | { | ||||||
|  |   g_debug (G_STRLOC ": %s data_device = %p, time = %d, x = %d, y = %d", | ||||||
|  |            G_STRFUNC, data_device, time, x, y); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void | ||||||
|  | data_device_drop (void                  *data, | ||||||
|  |                   struct wl_data_device *data_device) | ||||||
|  | { | ||||||
|  |   g_debug (G_STRLOC ": %s data_device = %p", | ||||||
|  |            G_STRFUNC, data_device); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void | ||||||
|  | data_device_selection (void                  *data, | ||||||
|  |                        struct wl_data_device *wl_data_device, | ||||||
|  |                        struct wl_data_offer  *offer) | ||||||
|  | { | ||||||
|  |   GdkWaylandDevice *device = (GdkWaylandDevice *)data; | ||||||
|  |   GdkDeviceManager *device_manager = | ||||||
|  |     gdk_display_get_device_manager (device->display); | ||||||
|  |   GdkDeviceManagerCore *device_manager_core = | ||||||
|  |     GDK_DEVICE_MANAGER_CORE (device_manager); | ||||||
|  |  | ||||||
|  |   g_debug (G_STRLOC ": %s wl_data_device = %p wl_data_offer = %p", | ||||||
|  |            G_STRFUNC, wl_data_device, offer); | ||||||
|  |  | ||||||
|  |   if (device->selection_offer) | ||||||
|  |     { | ||||||
|  |       data_offer_unref (device->selection_offer); | ||||||
|  |       device->selection_offer = NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |   /* Retrieve the DataOffer associated with with the wl_data_offer - this | ||||||
|  |    * association is made when the listener is attached. | ||||||
|  |    */ | ||||||
|  |   g_assert (device->selection_offer == NULL); | ||||||
|  |   device->selection_offer = wl_data_offer_get_user_data (offer); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static const struct wl_data_device_listener data_device_listener = { | ||||||
|  |   data_device_data_offer, | ||||||
|  |   data_device_enter, | ||||||
|  |   data_device_leave, | ||||||
|  |   data_device_motion, | ||||||
|  |   data_device_drop, | ||||||
|  |   data_device_selection | ||||||
|  | }; | ||||||
|  |  | ||||||
| void | void | ||||||
| _gdk_wayland_device_manager_add_device (GdkDeviceManager *device_manager, | _gdk_wayland_device_manager_add_device (GdkDeviceManager *device_manager, | ||||||
| 					struct wl_input_device *wl_device) | 					struct wl_input_device *wl_device) | ||||||
| @ -641,6 +798,8 @@ _gdk_wayland_device_manager_add_device (GdkDeviceManager *device_manager, | |||||||
|   device->data_device = |   device->data_device = | ||||||
|     wl_data_device_manager_get_data_device (display_wayland->data_device_manager, |     wl_data_device_manager_get_data_device (display_wayland->data_device_manager, | ||||||
|                                             device->device); |                                             device->device); | ||||||
|  |   wl_data_device_add_listener (device->data_device, | ||||||
|  |                                &data_device_listener, device); | ||||||
|  |  | ||||||
|   device_manager_core->devices = |   device_manager_core->devices = | ||||||
|     g_list_prepend (device_manager_core->devices, device->keyboard); |     g_list_prepend (device_manager_core->devices, device->keyboard); | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 Rob Bradford
					Rob Bradford