data-device: Change resources in wl_data_offer and wl_data_source to pointers.
Because of its links to selection.c and xwayland, a destroy_signal field was also added to wl_data_source. Before selection.c and xwayland were manually initializing the resource.destroy_signal field so that it could be used without a valid resource. Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
committed by
Kristian Høgsberg
parent
1fd4b01d10
commit
8a4a9eb2e4
+4
-4
@@ -60,8 +60,8 @@ clipboard_source_unref(struct clipboard_source *source)
|
|||||||
|
|
||||||
if (source->event_source)
|
if (source->event_source)
|
||||||
wl_event_source_remove(source->event_source);
|
wl_event_source_remove(source->event_source);
|
||||||
wl_signal_emit(&source->base.resource.destroy_signal,
|
wl_signal_emit(&source->base.destroy_signal,
|
||||||
&source->base.resource);
|
&source->base);
|
||||||
s = source->base.mime_types.data;
|
s = source->base.mime_types.data;
|
||||||
free(*s);
|
free(*s);
|
||||||
wl_array_release(&source->base.mime_types);
|
wl_array_release(&source->base.mime_types);
|
||||||
@@ -136,11 +136,11 @@ clipboard_source_create(struct clipboard *clipboard,
|
|||||||
source = malloc(sizeof *source);
|
source = malloc(sizeof *source);
|
||||||
wl_array_init(&source->contents);
|
wl_array_init(&source->contents);
|
||||||
wl_array_init(&source->base.mime_types);
|
wl_array_init(&source->base.mime_types);
|
||||||
|
source->base.resource = NULL;
|
||||||
source->base.accept = clipboard_source_accept;
|
source->base.accept = clipboard_source_accept;
|
||||||
source->base.send = clipboard_source_send;
|
source->base.send = clipboard_source_send;
|
||||||
source->base.cancel = clipboard_source_cancel;
|
source->base.cancel = clipboard_source_cancel;
|
||||||
source->base.resource.data = &source->base;
|
wl_signal_init(&source->base.destroy_signal);
|
||||||
wl_signal_init(&source->base.resource.destroy_signal);
|
|
||||||
source->refcount = 1;
|
source->refcount = 1;
|
||||||
source->clipboard = clipboard;
|
source->clipboard = clipboard;
|
||||||
source->serial = serial;
|
source->serial = serial;
|
||||||
|
|||||||
+3
-2
@@ -271,13 +271,14 @@ struct weston_touch_grab {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct wl_data_offer {
|
struct wl_data_offer {
|
||||||
struct wl_resource resource;
|
struct wl_resource *resource;
|
||||||
struct wl_data_source *source;
|
struct wl_data_source *source;
|
||||||
struct wl_listener source_destroy_listener;
|
struct wl_listener source_destroy_listener;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct wl_data_source {
|
struct wl_data_source {
|
||||||
struct wl_resource resource;
|
struct wl_resource *resource;
|
||||||
|
struct wl_signal destroy_signal;
|
||||||
struct wl_array mime_types;
|
struct wl_array mime_types;
|
||||||
|
|
||||||
void (*accept)(struct wl_data_source *source,
|
void (*accept)(struct wl_data_source *source,
|
||||||
|
|||||||
+43
-53
@@ -51,7 +51,7 @@ static void
|
|||||||
data_offer_accept(struct wl_client *client, struct wl_resource *resource,
|
data_offer_accept(struct wl_client *client, struct wl_resource *resource,
|
||||||
uint32_t serial, const char *mime_type)
|
uint32_t serial, const char *mime_type)
|
||||||
{
|
{
|
||||||
struct wl_data_offer *offer = resource->data;
|
struct wl_data_offer *offer = wl_resource_get_user_data(resource);
|
||||||
|
|
||||||
/* FIXME: Check that client is currently focused by the input
|
/* FIXME: Check that client is currently focused by the input
|
||||||
* device that is currently dragging this data source. Should
|
* device that is currently dragging this data source. Should
|
||||||
@@ -65,7 +65,7 @@ static void
|
|||||||
data_offer_receive(struct wl_client *client, struct wl_resource *resource,
|
data_offer_receive(struct wl_client *client, struct wl_resource *resource,
|
||||||
const char *mime_type, int32_t fd)
|
const char *mime_type, int32_t fd)
|
||||||
{
|
{
|
||||||
struct wl_data_offer *offer = resource->data;
|
struct wl_data_offer *offer = wl_resource_get_user_data(resource);
|
||||||
|
|
||||||
if (offer->source)
|
if (offer->source)
|
||||||
offer->source->send(offer->source, mime_type, fd);
|
offer->source->send(offer->source, mime_type, fd);
|
||||||
@@ -88,7 +88,7 @@ static const struct wl_data_offer_interface data_offer_interface = {
|
|||||||
static void
|
static void
|
||||||
destroy_data_offer(struct wl_resource *resource)
|
destroy_data_offer(struct wl_resource *resource)
|
||||||
{
|
{
|
||||||
struct wl_data_offer *offer = resource->data;
|
struct wl_data_offer *offer = wl_resource_get_user_data(resource);
|
||||||
|
|
||||||
if (offer->source)
|
if (offer->source)
|
||||||
wl_list_remove(&offer->source_destroy_listener.link);
|
wl_list_remove(&offer->source_destroy_listener.link);
|
||||||
@@ -117,23 +117,22 @@ wl_data_source_send_offer(struct wl_data_source *source,
|
|||||||
if (offer == NULL)
|
if (offer == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
wl_resource_init(&offer->resource, &wl_data_offer_interface,
|
offer->resource = wl_client_new_object(wl_resource_get_client(target),
|
||||||
&data_offer_interface, 0, offer);
|
&wl_data_offer_interface,
|
||||||
offer->resource.destroy = destroy_data_offer;
|
&data_offer_interface, offer);
|
||||||
|
wl_resource_set_destructor(offer->resource, destroy_data_offer);
|
||||||
|
|
||||||
offer->source = source;
|
offer->source = source;
|
||||||
offer->source_destroy_listener.notify = destroy_offer_data_source;
|
offer->source_destroy_listener.notify = destroy_offer_data_source;
|
||||||
wl_signal_add(&source->resource.destroy_signal,
|
wl_signal_add(&source->destroy_signal,
|
||||||
&offer->source_destroy_listener);
|
&offer->source_destroy_listener);
|
||||||
|
|
||||||
wl_client_add_resource(target->client, &offer->resource);
|
wl_data_device_send_data_offer(target, offer->resource);
|
||||||
|
|
||||||
wl_data_device_send_data_offer(target, &offer->resource);
|
|
||||||
|
|
||||||
wl_array_for_each(p, &source->mime_types)
|
wl_array_for_each(p, &source->mime_types)
|
||||||
wl_data_offer_send_offer(&offer->resource, *p);
|
wl_data_offer_send_offer(offer->resource, *p);
|
||||||
|
|
||||||
return &offer->resource;
|
return offer->resource;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -141,7 +140,7 @@ data_source_offer(struct wl_client *client,
|
|||||||
struct wl_resource *resource,
|
struct wl_resource *resource,
|
||||||
const char *type)
|
const char *type)
|
||||||
{
|
{
|
||||||
struct wl_data_source *source = resource->data;
|
struct wl_data_source *source = wl_resource_get_user_data(resource);
|
||||||
char **p;
|
char **p;
|
||||||
|
|
||||||
p = wl_array_add(&source->mime_types, sizeof *p);
|
p = wl_array_add(&source->mime_types, sizeof *p);
|
||||||
@@ -162,19 +161,6 @@ static struct wl_data_source_interface data_source_interface = {
|
|||||||
data_source_destroy
|
data_source_destroy
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct wl_resource *
|
|
||||||
find_resource(struct wl_list *list, struct wl_client *client)
|
|
||||||
{
|
|
||||||
struct wl_resource *r;
|
|
||||||
|
|
||||||
wl_list_for_each(r, list, link) {
|
|
||||||
if (r->client == client)
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
drag_surface_configure(struct weston_surface *es, int32_t sx, int32_t sy, int32_t width, int32_t height)
|
drag_surface_configure(struct weston_surface *es, int32_t sx, int32_t sy, int32_t width, int32_t height)
|
||||||
{
|
{
|
||||||
@@ -234,12 +220,12 @@ weston_drag_set_focus(struct weston_drag *drag, struct weston_surface *surface,
|
|||||||
wl_resource_get_client(surface->resource) != drag->client)
|
wl_resource_get_client(surface->resource) != drag->client)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
resource = find_resource(&pointer->seat->drag_resource_list,
|
resource = wl_resource_find_for_client(&pointer->seat->drag_resource_list,
|
||||||
wl_resource_get_client(surface->resource));
|
wl_resource_get_client(surface->resource));
|
||||||
if (!resource)
|
if (!resource)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
display = wl_client_get_display(resource->client);
|
display = wl_client_get_display(wl_resource_get_client(resource));
|
||||||
serial = wl_display_next_serial(display);
|
serial = wl_display_next_serial(display);
|
||||||
|
|
||||||
if (drag->data_source)
|
if (drag->data_source)
|
||||||
@@ -250,7 +236,7 @@ weston_drag_set_focus(struct weston_drag *drag, struct weston_surface *surface,
|
|||||||
|
|
||||||
drag->focus = surface;
|
drag->focus = surface;
|
||||||
drag->focus_listener.notify = destroy_drag_focus;
|
drag->focus_listener.notify = destroy_drag_focus;
|
||||||
wl_signal_add(&resource->destroy_signal, &drag->focus_listener);
|
wl_resource_add_destroy_listener(resource, &drag->focus_listener);
|
||||||
drag->focus_resource = resource;
|
drag->focus_resource = resource;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -397,9 +383,9 @@ data_device_start_drag(struct wl_client *client, struct wl_resource *resource,
|
|||||||
drag->client = client;
|
drag->client = client;
|
||||||
|
|
||||||
if (source_resource) {
|
if (source_resource) {
|
||||||
drag->data_source = source_resource->data;
|
drag->data_source = wl_resource_get_user_data(source_resource);
|
||||||
drag->data_source_listener.notify = destroy_data_device_source;
|
drag->data_source_listener.notify = destroy_data_device_source;
|
||||||
wl_signal_add(&source_resource->destroy_signal,
|
wl_resource_add_destroy_listener(source_resource,
|
||||||
&drag->data_source_listener);
|
&drag->data_source_listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -431,8 +417,8 @@ destroy_selection_data_source(struct wl_listener *listener, void *data)
|
|||||||
if (seat->keyboard)
|
if (seat->keyboard)
|
||||||
focus = seat->keyboard->focus_resource;
|
focus = seat->keyboard->focus_resource;
|
||||||
if (focus) {
|
if (focus) {
|
||||||
data_device = find_resource(&seat->drag_resource_list,
|
data_device = wl_resource_find_for_client(&seat->drag_resource_list,
|
||||||
focus->client);
|
wl_resource_get_client(focus));
|
||||||
if (data_device)
|
if (data_device)
|
||||||
wl_data_device_send_selection(data_device, NULL);
|
wl_data_device_send_selection(data_device, NULL);
|
||||||
}
|
}
|
||||||
@@ -463,8 +449,8 @@ weston_seat_set_selection(struct weston_seat *seat,
|
|||||||
if (seat->keyboard)
|
if (seat->keyboard)
|
||||||
focus = seat->keyboard->focus_resource;
|
focus = seat->keyboard->focus_resource;
|
||||||
if (focus) {
|
if (focus) {
|
||||||
data_device = find_resource(&seat->drag_resource_list,
|
data_device = wl_resource_find_for_client(&seat->drag_resource_list,
|
||||||
focus->client);
|
wl_resource_get_client(focus));
|
||||||
if (data_device && source) {
|
if (data_device && source) {
|
||||||
offer = wl_data_source_send_offer(seat->selection_data_source,
|
offer = wl_data_source_send_offer(seat->selection_data_source,
|
||||||
data_device);
|
data_device);
|
||||||
@@ -479,7 +465,7 @@ weston_seat_set_selection(struct weston_seat *seat,
|
|||||||
if (source) {
|
if (source) {
|
||||||
seat->selection_data_source_listener.notify =
|
seat->selection_data_source_listener.notify =
|
||||||
destroy_selection_data_source;
|
destroy_selection_data_source;
|
||||||
wl_signal_add(&source->resource.destroy_signal,
|
wl_signal_add(&source->destroy_signal,
|
||||||
&seat->selection_data_source_listener);
|
&seat->selection_data_source_listener);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -493,7 +479,8 @@ data_device_set_selection(struct wl_client *client,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
/* FIXME: Store serial and check against incoming serial here. */
|
/* FIXME: Store serial and check against incoming serial here. */
|
||||||
weston_seat_set_selection(resource->data, wl_resource_get_user_data(source_resource),
|
weston_seat_set_selection(wl_resource_get_user_data(resource),
|
||||||
|
wl_resource_get_user_data(source_resource),
|
||||||
serial);
|
serial);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -505,37 +492,38 @@ static const struct wl_data_device_interface data_device_interface = {
|
|||||||
static void
|
static void
|
||||||
destroy_data_source(struct wl_resource *resource)
|
destroy_data_source(struct wl_resource *resource)
|
||||||
{
|
{
|
||||||
struct wl_data_source *source =
|
struct wl_data_source *source = wl_resource_get_user_data(resource);
|
||||||
container_of(resource, struct wl_data_source, resource);
|
|
||||||
char **p;
|
char **p;
|
||||||
|
|
||||||
|
wl_signal_emit(&source->destroy_signal, source);
|
||||||
|
|
||||||
wl_array_for_each(p, &source->mime_types)
|
wl_array_for_each(p, &source->mime_types)
|
||||||
free(*p);
|
free(*p);
|
||||||
|
|
||||||
wl_array_release(&source->mime_types);
|
wl_array_release(&source->mime_types);
|
||||||
|
|
||||||
source->resource.object.id = 0;
|
source->resource = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
client_source_accept(struct wl_data_source *source,
|
client_source_accept(struct wl_data_source *source,
|
||||||
uint32_t time, const char *mime_type)
|
uint32_t time, const char *mime_type)
|
||||||
{
|
{
|
||||||
wl_data_source_send_target(&source->resource, mime_type);
|
wl_data_source_send_target(source->resource, mime_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
client_source_send(struct wl_data_source *source,
|
client_source_send(struct wl_data_source *source,
|
||||||
const char *mime_type, int32_t fd)
|
const char *mime_type, int32_t fd)
|
||||||
{
|
{
|
||||||
wl_data_source_send_send(&source->resource, mime_type, fd);
|
wl_data_source_send_send(source->resource, mime_type, fd);
|
||||||
close(fd);
|
close(fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
client_source_cancel(struct wl_data_source *source)
|
client_source_cancel(struct wl_data_source *source)
|
||||||
{
|
{
|
||||||
wl_data_source_send_cancelled(&source->resource);
|
wl_data_source_send_cancelled(source->resource);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -550,21 +538,23 @@ create_data_source(struct wl_client *client,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
wl_resource_init(&source->resource, &wl_data_source_interface,
|
wl_signal_init(&source->destroy_signal);
|
||||||
&data_source_interface, id, source);
|
|
||||||
source->resource.destroy = destroy_data_source;
|
|
||||||
|
|
||||||
source->accept = client_source_accept;
|
source->accept = client_source_accept;
|
||||||
source->send = client_source_send;
|
source->send = client_source_send;
|
||||||
source->cancel = client_source_cancel;
|
source->cancel = client_source_cancel;
|
||||||
|
|
||||||
wl_array_init(&source->mime_types);
|
wl_array_init(&source->mime_types);
|
||||||
wl_client_add_resource(client, &source->resource);
|
|
||||||
|
source->resource = wl_client_add_object(client,
|
||||||
|
&wl_data_source_interface,
|
||||||
|
&data_source_interface,
|
||||||
|
id, source);
|
||||||
|
wl_resource_set_destructor(source->resource, destroy_data_source);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void unbind_data_device(struct wl_resource *resource)
|
static void unbind_data_device(struct wl_resource *resource)
|
||||||
{
|
{
|
||||||
wl_list_remove(&resource->link);
|
wl_list_remove(wl_resource_get_link(resource));
|
||||||
free(resource);
|
free(resource);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -580,8 +570,8 @@ get_data_device(struct wl_client *client,
|
|||||||
&data_device_interface, id,
|
&data_device_interface, id,
|
||||||
seat);
|
seat);
|
||||||
|
|
||||||
wl_list_insert(&seat->drag_resource_list, &resource->link);
|
wl_list_insert(&seat->drag_resource_list, wl_resource_get_link(resource));
|
||||||
resource->destroy = unbind_data_device;
|
wl_resource_set_destructor(resource, unbind_data_device);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct wl_data_device_manager_interface manager_interface = {
|
static const struct wl_data_device_manager_interface manager_interface = {
|
||||||
@@ -610,8 +600,8 @@ wl_data_device_set_keyboard_focus(struct weston_seat *seat)
|
|||||||
if (!focus)
|
if (!focus)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
data_device = find_resource(&seat->drag_resource_list,
|
data_device = wl_resource_find_for_client(&seat->drag_resource_list,
|
||||||
focus->client);
|
wl_resource_get_client(focus));
|
||||||
if (!data_device)
|
if (!data_device)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|||||||
@@ -177,11 +177,10 @@ weston_wm_get_selection_targets(struct weston_wm *wm)
|
|||||||
if (source == NULL)
|
if (source == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
wl_signal_init(&source->base.resource.destroy_signal);
|
wl_signal_init(&source->base.destroy_signal);
|
||||||
source->base.accept = data_source_accept;
|
source->base.accept = data_source_accept;
|
||||||
source->base.send = data_source_send;
|
source->base.send = data_source_send;
|
||||||
source->base.cancel = data_source_cancel;
|
source->base.cancel = data_source_cancel;
|
||||||
source->base.resource.data = source;
|
|
||||||
source->wm = wm;
|
source->wm = wm;
|
||||||
|
|
||||||
wl_array_init(&source->base.mime_types);
|
wl_array_init(&source->base.mime_types);
|
||||||
|
|||||||
Reference in New Issue
Block a user