WL_EXPORT void
wl_input_device_set_selection(struct wl_input_device *device,
- struct wl_data_source *source)
+ struct wl_data_source *source, uint32_t serial)
{
struct wl_resource *data_device, *focus, *offer;
+ if (device->selection_data_source &&
+ device->selection_serial - serial < UINT32_MAX / 2)
+ return;
+
if (device->selection_data_source) {
device->selection_data_source->cancel(device->selection_data_source);
wl_list_remove(&device->selection_data_source_listener.link);
}
device->selection_data_source = source;
+ device->selection_serial = serial;
focus = device->keyboard_focus_resource;
if (focus) {
return;
/* FIXME: Store serial and check against incoming serial here. */
- wl_input_device_set_selection(resource->data, source_resource->data);
+ wl_input_device_set_selection(resource->data, source_resource->data,
+ serial);
}
static const struct wl_data_device_interface data_device_interface = {
struct wl_listener drag_icon_listener;
struct wl_signal drag_icon_signal;
+ uint32_t selection_serial;
struct wl_data_source *selection_data_source;
struct wl_listener selection_data_source_listener;
struct wl_signal selection_signal;
void
wl_input_device_set_selection(struct wl_input_device *device,
- struct wl_data_source *source);
+ struct wl_data_source *source, uint32_t serial);
void *