Expose screenshooting as an interface, drop SIGUSR hack.

This pulls in a bit of extra infrastructure for discovering adertised objects on the
client side.
This commit is contained in:
Kristian Høgsberg 2008-11-23 23:41:08 -05:00 committed by Naruto Uzumaki
parent 14fcff7726
commit 1e4b86af1a
10 changed files with 295 additions and 94 deletions

View file

@ -13,28 +13,6 @@
#include "wayland.h"
#include "connection.h"
void wl_list_init(struct wl_list *list)
{
list->prev = list;
list->next = list;
}
void
wl_list_insert(struct wl_list *list, struct wl_list *elm)
{
elm->prev = list;
elm->next = list->next;
list->next = elm;
elm->next->prev = elm;
}
void
wl_list_remove(struct wl_list *elm)
{
elm->prev->next = elm->next;
elm->next->prev = elm->prev;
}
struct wl_client {
struct wl_connection *connection;
struct wl_event_source *source;
@ -56,6 +34,7 @@ struct wl_display {
struct wl_list surface_list;
struct wl_list client_list;
uint32_t client_id_range;
uint32_t id;
struct wl_list global_list;
@ -359,7 +338,7 @@ wl_client_connection_data(int fd, uint32_t mask, void *data)
return;
}
while (len > sizeof p) {
while (len >= sizeof p) {
wl_connection_copy(connection, p, sizeof p);
opcode = p[1] & 0xffff;
size = p[1] >> 16;
@ -428,6 +407,7 @@ wl_client_create(struct wl_display *display, int fd)
{
struct wl_client *client;
struct wl_object_ref *ref;
uint32_t count;
client = malloc(sizeof *client);
if (client == NULL)
@ -448,6 +428,10 @@ wl_client_create(struct wl_display *display, int fd)
sizeof display->client_id_range);
display->client_id_range += 256;
/* Write list of global objects to client. */
count = wl_list_length(&display->global_list);
wl_connection_write(client->connection, &count, sizeof count);
ref = container_of(display->global_list.next,
struct wl_object_ref, link);
while (&ref->link != &display->global_list) {
@ -542,7 +526,7 @@ wl_display_create_input_devices(struct wl_display *display)
display->pointer = wl_input_device_create(display, path, 1);
if (display->pointer != NULL)
wl_hash_insert(&display->objects, display->pointer);
wl_display_add_object(display, display->pointer);
display->pointer_x = 100;
display->pointer_y = 100;
@ -563,9 +547,6 @@ wl_display_create(void)
return NULL;
}
display->base.id = 0;
display->base.interface = &display_interface;
wl_hash_insert(&display->objects, &display->base);
wl_list_init(&display->surface_list);
wl_list_init(&display->client_list);
wl_list_init(&display->global_list);
@ -574,6 +555,9 @@ wl_display_create(void)
display->client_id_range = 256; /* Gah, arbitrary... */
display->id = 1;
display->base.interface = &display_interface;
wl_display_add_object(display, &display->base);
if (wl_display_add_global(display, &display->base)) {
wl_event_loop_destroy(display->loop);
free(display);
@ -583,6 +567,13 @@ wl_display_create(void)
return display;
}
WL_EXPORT void
wl_display_add_object(struct wl_display *display, struct wl_object *object)
{
object->id = display->id++;
wl_hash_insert(&display->objects, object);
}
WL_EXPORT int
wl_display_add_global(struct wl_display *display, struct wl_object *object)
{