Add function to remove surfaces from client

dev
Kristian Høgsberg 15 years ago
parent f15ce9f400
commit b559fcbf72
  1. 43
      wayland.c
  2. 5
      wayland.h

@ -42,7 +42,7 @@ struct wl_client {
struct wl_connection *connection; struct wl_connection *connection;
struct wl_event_source *source; struct wl_event_source *source;
struct wl_display *display; struct wl_display *display;
struct wl_list object_list; struct wl_list surface_list;
struct wl_list link; struct wl_list link;
uint32_t id_count; uint32_t id_count;
}; };
@ -59,11 +59,6 @@ struct wl_display {
struct wl_list global_list; struct wl_list global_list;
}; };
struct wl_object_ref {
struct wl_object *object;
struct wl_list link;
};
struct wl_global { struct wl_global {
struct wl_object *object; struct wl_object *object;
wl_client_connect_func_t func; wl_client_connect_func_t func;
@ -186,7 +181,7 @@ wl_client_create(struct wl_display *display, int fd)
client->connection = client->connection =
wl_connection_create(fd, wl_client_connection_update, client); wl_connection_create(fd, wl_client_connection_update, client);
wl_list_init(&client->object_list); wl_list_init(&client->surface_list);
wl_list_init(&client->link); wl_list_init(&client->link);
wl_display_post_range(display, client); wl_display_post_range(display, client);
@ -228,18 +223,17 @@ wl_object_destroy(struct wl_object *object)
void void
wl_client_destroy(struct wl_client *client) wl_client_destroy(struct wl_client *client)
{ {
struct wl_object_ref *ref; struct wl_surface *surface;
printf("disconnect from client %p\n", client); printf("disconnect from client %p\n", client);
wl_list_remove(&client->link); wl_list_remove(&client->link);
while (client->object_list.next != &client->object_list) { while (client->surface_list.next != &client->surface_list) {
ref = container_of(client->object_list.next, surface = container_of(client->surface_list.next,
struct wl_object_ref, link); struct wl_surface, link);
wl_list_remove(&ref->link); wl_list_remove(&surface->link);
wl_object_destroy(ref->object); wl_object_destroy(&surface->base);
free(ref);
} }
wl_event_source_remove(client->source); wl_event_source_remove(client->source);
@ -254,7 +248,6 @@ wl_client_add_surface(struct wl_client *client,
uint32_t id) uint32_t id)
{ {
struct wl_display *display = client->display; struct wl_display *display = client->display;
struct wl_object_ref *ref;
if (client->id_count-- < 64) if (client->id_count-- < 64)
wl_display_post_range(display, client); wl_display_post_range(display, client);
@ -264,20 +257,22 @@ wl_client_add_surface(struct wl_client *client,
surface->base.implementation = (void (**)(void)) implementation; surface->base.implementation = (void (**)(void)) implementation;
surface->client = client; surface->client = client;
ref = malloc(sizeof *ref);
if (ref == NULL) {
wl_client_post_event(client, &display->base,
WL_DISPLAY_NO_MEMORY);
return -1;
}
ref->object = &surface->base;
wl_hash_insert(display->objects, &surface->base); wl_hash_insert(display->objects, &surface->base);
wl_list_insert(client->object_list.prev, &ref->link); wl_list_insert(client->surface_list.prev, &surface->link);
return 0; return 0;
} }
WL_EXPORT void
wl_client_remove_surface(struct wl_client *client,
struct wl_surface *surface)
{
struct wl_display *display = client->display;
wl_hash_remove(display->objects, &surface->base);
wl_list_remove(&surface->link);
}
WL_EXPORT void WL_EXPORT void
wl_client_send_acknowledge(struct wl_client *client, wl_client_send_acknowledge(struct wl_client *client,
struct wl_compositor *compositor, struct wl_compositor *compositor,

@ -91,6 +91,7 @@ struct wl_compositor {
struct wl_surface { struct wl_surface {
struct wl_object base; struct wl_object base;
struct wl_client *client; struct wl_client *client;
struct wl_list link;
}; };
struct wl_compositor_interface { struct wl_compositor_interface {
@ -138,6 +139,10 @@ wl_client_add_surface(struct wl_client *client,
const struct wl_surface_interface *implementation, const struct wl_surface_interface *implementation,
uint32_t id); uint32_t id);
void
wl_client_remove_surface(struct wl_client *client,
struct wl_surface *surface);
void void
wl_client_send_acknowledge(struct wl_client *client, wl_client_send_acknowledge(struct wl_client *client,
struct wl_compositor *compositor, struct wl_compositor *compositor,

Loading…
Cancel
Save