mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-11 19:30:10 +00:00
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:
parent
55b2286c3e
commit
8c1f8c0668
@ -43,6 +43,8 @@ typedef struct _GdkDeviceCore GdkDeviceCore;
|
||||
typedef struct _GdkDeviceCoreClass GdkDeviceCoreClass;
|
||||
typedef struct _GdkWaylandDevice GdkWaylandDevice;
|
||||
|
||||
typedef struct _DataOffer DataOffer;
|
||||
|
||||
struct _GdkWaylandDevice
|
||||
{
|
||||
GdkDisplay *display;
|
||||
@ -55,6 +57,9 @@ struct _GdkWaylandDevice
|
||||
struct wl_data_device *data_device;
|
||||
int32_t x, y, surface_x, surface_y;
|
||||
uint32_t time;
|
||||
|
||||
DataOffer *drag_offer;
|
||||
DataOffer *selection_offer;
|
||||
};
|
||||
|
||||
struct _GdkDeviceCore
|
||||
@ -596,6 +601,158 @@ static const struct wl_input_device_listener input_device_listener = {
|
||||
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
|
||||
_gdk_wayland_device_manager_add_device (GdkDeviceManager *device_manager,
|
||||
struct wl_input_device *wl_device)
|
||||
@ -641,6 +798,8 @@ _gdk_wayland_device_manager_add_device (GdkDeviceManager *device_manager,
|
||||
device->data_device =
|
||||
wl_data_device_manager_get_data_device (display_wayland->data_device_manager,
|
||||
device->device);
|
||||
wl_data_device_add_listener (device->data_device,
|
||||
&data_device_listener, device);
|
||||
|
||||
device_manager_core->devices =
|
||||
g_list_prepend (device_manager_core->devices, device->keyboard);
|
||||
|
Loading…
Reference in New Issue
Block a user