commit 6d2e2b48a8e99d30c4cf554718d65127700dc9b9
parent eab1c18e5c94734f3e320da512ce2e896e1ff192
Author: Michael Forney <mforney@mforney.org>
Date: Fri, 14 Jun 2013 03:49:49 -0700
Move client/resource handling of surface into swc_surface_initialize
Diffstat:
4 files changed, 62 insertions(+), 82 deletions(-)
diff --git a/compositor.c b/compositor.c
@@ -162,10 +162,13 @@ static void handle_drm_event(struct wl_listener * listener, void * data)
drm_listener);
}
-static void destroy_surface(struct wl_resource * resource)
+static void handle_surface_destroy(struct wl_listener * listener, void * data)
{
+ struct wl_resource * resource = data;
struct swc_surface * surface = resource->data;
+ wl_list_remove(&surface->link);
+
free(surface);
}
@@ -208,20 +211,20 @@ static void create_surface(struct wl_client * client,
.compositor = compositor,
.event_listener = (struct wl_listener) {
.notify = &handle_surface_event
+ },
+ .destroy_listener = {
+ .notify = &handle_surface_destroy
}
};
- swc_surface_initialize(surface);
+ swc_surface_initialize(surface, client, id);
wl_signal_add(&surface->event_signal,
&surface->compositor_state.event_listener);
+ wl_resource_add_destroy_listener(surface->resource,
+ &surface->compositor_state.destroy_listener);
wl_list_insert(&compositor->surfaces, &surface->link);
surface->output_mask |= 1 << output->id;
-
- surface->resource
- = wl_client_add_object(client, &wl_surface_interface,
- &swc_surface_interface, id, surface);
- wl_resource_set_destructor(surface->resource, &destroy_surface);
}
static void create_region(struct wl_client * client,
diff --git a/surface.c b/surface.c
@@ -4,16 +4,6 @@
#include <stdio.h>
-struct wl_surface_interface swc_surface_interface = {
- .destroy = &swc_surface_destroy,
- .attach = &swc_surface_attach,
- .damage = &swc_surface_damage,
- .frame = &swc_surface_frame,
- .set_opaque_region = &swc_surface_set_opaque_region,
- .set_input_region = &swc_surface_set_input_region,
- .commit = &swc_surface_commit,
-};
-
static void state_initialize(struct swc_surface_state * state)
{
state->buffer = NULL;
@@ -25,33 +15,20 @@ static void state_initialize(struct swc_surface_state * state)
wl_list_init(&state->frame_callbacks);
}
-bool swc_surface_initialize(struct swc_surface * surface)
+static void destroy_surface_resource(struct wl_resource * resource)
{
- state_initialize(&surface->state);
- state_initialize(&surface->pending.state);
-
- wl_signal_init(&surface->event_signal);
-
- surface->output_mask = 0;
-
- return true;
-}
+ struct swc_surface * surface = resource->data;
-void swc_surface_finish(struct swc_surface * surface)
-{
+ swc_surface_finish(surface);
}
-void swc_surface_destroy(struct wl_client * client,
- struct wl_resource * resource)
+static void destroy(struct wl_client * client, struct wl_resource * resource)
{
wl_resource_destroy(resource);
}
-void swc_surface_attach(struct wl_client * client,
- struct wl_resource * resource,
- struct wl_resource * buffer_resource,
- int32_t x,
- int32_t y)
+static void attach(struct wl_client * client, struct wl_resource * resource,
+ struct wl_resource * buffer_resource, int32_t x, int32_t y)
{
struct swc_surface * surface = resource->data;
struct wl_buffer * buffer = buffer_resource->data;
@@ -66,10 +43,8 @@ void swc_surface_attach(struct wl_client * client,
surface->geometry.height = buffer->height;
}
-void swc_surface_damage(struct wl_client * client,
- struct wl_resource * resource,
- int32_t x, int32_t y,
- int32_t width, int32_t height)
+static void damage(struct wl_client * client, struct wl_resource * resource,
+ int32_t x, int32_t y, int32_t width, int32_t height)
{
printf("surface_damage\n");
struct swc_surface * surface = resource->data;
@@ -79,9 +54,8 @@ void swc_surface_damage(struct wl_client * client,
x, y, width, height);
}
-void swc_surface_frame(struct wl_client * client,
- struct wl_resource * resource,
- uint32_t id)
+static void frame(struct wl_client * client, struct wl_resource * resource,
+ uint32_t id)
{
struct swc_surface * surface = resource->data;
struct wl_resource * callback_resource;
@@ -93,9 +67,9 @@ void swc_surface_frame(struct wl_client * client,
wl_list_insert(surface->pending.state.frame_callbacks.prev, &resource->link);
}
-void swc_surface_set_opaque_region(struct wl_client * client,
- struct wl_resource * resource,
- struct wl_resource * region_resource)
+static void set_opaque_region(struct wl_client * client,
+ struct wl_resource * resource,
+ struct wl_resource * region_resource)
{
struct swc_surface * surface = resource->data;
@@ -111,9 +85,9 @@ void swc_surface_set_opaque_region(struct wl_client * client,
pixman_region32_clear(&surface->pending.state.opaque);
}
-void swc_surface_set_input_region(struct wl_client * client,
- struct wl_resource * resource,
- struct wl_resource * region_resource)
+static void set_input_region(struct wl_client * client,
+ struct wl_resource * resource,
+ struct wl_resource * region_resource)
{
struct swc_surface * surface = resource->data;
@@ -129,8 +103,7 @@ void swc_surface_set_input_region(struct wl_client * client,
pixman_region32_clear(&surface->pending.state.input);
}
-void swc_surface_commit(struct wl_client * client,
- struct wl_resource * resource)
+static void commit(struct wl_client * client, struct wl_resource * resource)
{
struct swc_surface * surface = resource->data;
struct swc_event event;
@@ -168,3 +141,35 @@ void swc_surface_commit(struct wl_client * client,
wl_signal_emit(&surface->event_signal, &event);
}
+struct wl_surface_interface surface_implementation = {
+ .destroy = &destroy,
+ .attach = &attach,
+ .damage = &damage,
+ .frame = &frame,
+ .set_opaque_region = &set_opaque_region,
+ .set_input_region = &set_input_region,
+ .commit = &commit,
+};
+
+bool swc_surface_initialize(struct swc_surface * surface,
+ struct wl_client * client, uint32_t id)
+{
+ state_initialize(&surface->state);
+ state_initialize(&surface->pending.state);
+
+ surface->resource = wl_client_add_object(client, &wl_surface_interface,
+ &surface_implementation, id, surface);
+ wl_resource_set_destructor(surface->resource, &destroy_surface_resource);
+
+ wl_signal_init(&surface->event_signal);
+
+ surface->output_mask = 0;
+
+ return true;
+}
+
+void swc_surface_finish(struct swc_surface * surface)
+{
+}
+
+
diff --git a/surface.h b/surface.h
@@ -56,39 +56,10 @@ struct swc_surface
struct wl_list link;
};
-bool swc_surface_initialize(struct swc_surface * surface);
+bool swc_surface_initialize(struct swc_surface * surface,
+ struct wl_client * client, uint32_t id);
void swc_surface_finish(struct swc_surface * surface);
-extern struct wl_surface_interface swc_surface_interface;
-
-void swc_surface_destroy(struct wl_client * client,
- struct wl_resource * resource);
-
-void swc_surface_attach(struct wl_client * client,
- struct wl_resource * resource,
- struct wl_resource * buffer_resource,
- int32_t x, int32_t y);
-
-void swc_surface_damage(struct wl_client * client,
- struct wl_resource * resource,
- int32_t x, int32_t y,
- int32_t width, int32_t height);
-
-void swc_surface_frame(struct wl_client * client,
- struct wl_resource * resource,
- uint32_t callback);
-
-void swc_surface_set_opaque_region(struct wl_client * client,
- struct wl_resource * resource,
- struct wl_resource * region_resource);
-
-void swc_surface_set_input_region(struct wl_client * client,
- struct wl_resource * resource,
- struct wl_resource * region_resource);
-
-void swc_surface_commit(struct wl_client * client,
- struct wl_resource * resource);
-
#endif
diff --git a/surface_state.h b/surface_state.h
@@ -22,6 +22,7 @@ union swc_renderer_surface_state
struct swc_compositor_surface_state
{
struct swc_compositor * compositor;
+ struct wl_listener destroy_listener;
struct wl_listener event_listener;
};