diff options
| author | nyorain <nyorain@gmail.com> | 2017-08-09 15:33:30 +0200 | 
|---|---|---|
| committer | nyorain <nyorain@gmail.com> | 2017-08-09 17:26:05 +0200 | 
| commit | 8473c3955cb8469c5f999410f68a3b3d3e6bee18 (patch) | |
| tree | aa4e694d8ddc66eba460f384a5cead619e687a0c | |
| parent | 6345d6deeda014b8a95ef4a40eef938b552ff153 (diff) | |
| download | wlroots-8473c3955cb8469c5f999410f68a3b3d3e6bee18.tar.xz | |
Add first wlr_surface example implementation
| -rw-r--r-- | examples/compositor/main.c | 9 | ||||
| -rw-r--r-- | examples/compositor/wl_compositor.c | 91 | ||||
| -rw-r--r-- | examples/compositor/wlr_surface.c | 120 | ||||
| -rw-r--r-- | examples/compositor/wlr_surface.h | 24 | ||||
| -rw-r--r-- | examples/meson.build | 1 | 
5 files changed, 155 insertions, 90 deletions
| diff --git a/examples/compositor/main.c b/examples/compositor/main.c index 6afdb391..01292f51 100644 --- a/examples/compositor/main.c +++ b/examples/compositor/main.c @@ -14,6 +14,7 @@  #include <wlr/util/log.h>  #include "shared.h"  #include "compositor.h" +#include "wlr_surface.h"  struct sample_state {  	struct wlr_renderer *renderer; @@ -32,11 +33,11 @@ void handle_output_frame(struct output_state *output, struct timespec *ts) {  	struct wl_resource *_res;  	float matrix[16];  	wl_list_for_each(_res, &sample->compositor.surfaces, link) { -		struct wlr_texture *texture = wl_resource_get_user_data(_res); -		if (texture->valid) { -			wlr_texture_get_matrix(texture, &matrix, +		struct wlr_surface *surface = wl_resource_get_user_data(_res); +		if (surface->texture->valid) { +			wlr_texture_get_matrix(surface->texture, &matrix,  					&wlr_output->transform_matrix, 200, 200); -			wlr_render_with_matrix(sample->renderer, texture, &matrix); +			wlr_render_with_matrix(sample->renderer, surface->texture, &matrix);  		}  	} diff --git a/examples/compositor/wl_compositor.c b/examples/compositor/wl_compositor.c index 03a1aa7e..8c8ee3b6 100644 --- a/examples/compositor/wl_compositor.c +++ b/examples/compositor/wl_compositor.c @@ -1,90 +1,13 @@  #include <assert.h> +#include <stdlib.h>  #include <wayland-server.h>  #include <wlr/util/log.h>  #include "compositor.h" - -static void surface_destroy(struct wl_client *client, struct wl_resource *resource) { -	wl_resource_destroy(resource); -} - -static void surface_attach(struct wl_client *client, -		struct wl_resource *resource, -		struct wl_resource *buffer_resource, int32_t sx, int32_t sy) { -	struct wlr_texture *texture = wl_resource_get_user_data(resource); -	struct wl_shm_buffer *buffer = wl_shm_buffer_get(buffer_resource); -	uint32_t format = wl_shm_buffer_get_format(buffer); -	wlr_texture_upload_shm(texture, format, buffer); -} - -static void surface_damage(struct wl_client *client, -		struct wl_resource *resource, -		int32_t x, int32_t y, int32_t width, int32_t height) { -	wlr_log(L_DEBUG, "TODO: surface damage"); -} - -static void surface_frame(struct wl_client *client, -		struct wl_resource *resource, uint32_t callback) { -	wlr_log(L_DEBUG, "TODO: surface frame"); -} - -static void surface_set_opaque_region(struct wl_client *client, -		struct wl_resource *resource, -		struct wl_resource *region_resource) { -	wlr_log(L_DEBUG, "TODO: surface opaque region"); -} - -static void surface_set_input_region(struct wl_client *client, -		struct wl_resource *resource, -		struct wl_resource *region_resource) { - -	wlr_log(L_DEBUG, "TODO: surface input region"); -} - -static void surface_commit(struct wl_client *client, -		struct wl_resource *resource) { -	wlr_log(L_DEBUG, "TODO: surface surface commit"); -} - -static void surface_set_buffer_transform(struct wl_client *client, -		struct wl_resource *resource, int transform) { -	wlr_log(L_DEBUG, "TODO: surface surface buffer transform"); -} - -static void surface_set_buffer_scale(struct wl_client *client, -		struct wl_resource *resource, -		int32_t scale) { -	wlr_log(L_DEBUG, "TODO: surface set buffer scale"); -} - - -static void surface_damage_buffer(struct wl_client *client, -		struct wl_resource *resource, -		int32_t x, int32_t y, int32_t width, -		int32_t height) { -	wlr_log(L_DEBUG, "TODO: surface damage buffer"); -} - -struct wl_surface_interface surface_interface = { -	surface_destroy, -	surface_attach, -	surface_damage, -	surface_frame, -	surface_set_opaque_region, -	surface_set_input_region, -	surface_commit, -	surface_set_buffer_transform, -	surface_set_buffer_scale, -	surface_damage_buffer -}; - -static void destroy_surface(struct wl_resource *resource) { -	struct wlr_texture *surface = wl_resource_get_user_data(resource); -	wlr_texture_destroy(surface); -} +#include "compositor/wlr_surface.h"  static void destroy_surface_listener(struct wl_listener *listener, void *data) {  	struct wl_compositor_state *state; -	struct wlr_texture *surface = data; +	struct wlr_surface *surface = data;  	state = wl_container_of(listener, state, destroy_surface_listener);  	struct wl_resource *res = NULL; @@ -101,13 +24,9 @@ static void wl_compositor_create_surface(struct wl_client *client,  	struct wl_compositor_state *state = wl_resource_get_user_data(resource);  	struct wl_resource *surface_resource = wl_resource_create(client,  			&wl_surface_interface, wl_resource_get_version(resource), id); -	struct wlr_texture *texture = wlr_render_texture_init(state->renderer); -	texture->resource = surface_resource; -	wl_resource_set_implementation(surface_resource, &surface_interface, -			texture, destroy_surface); -	wl_resource_set_user_data(surface_resource, texture); +	struct wlr_surface *surface = wlr_surface_create(surface_resource, state->renderer);  	wl_list_insert(&state->surfaces, wl_resource_get_link(surface_resource)); -	wl_signal_add(&texture->destroy_signal, &state->destroy_surface_listener); +	wl_signal_add(&surface->signals.destroy, &state->destroy_surface_listener);  }  static void wl_compositor_create_region(struct wl_client *client, diff --git a/examples/compositor/wlr_surface.c b/examples/compositor/wlr_surface.c new file mode 100644 index 00000000..5a5c3e0d --- /dev/null +++ b/examples/compositor/wlr_surface.c @@ -0,0 +1,120 @@ +#include <assert.h> +#include <stdlib.h> +#include <wayland-server.h> +#include <wlr/util/log.h> +#include <wlr/render/interface.h> +#include "wlr_surface.h" + +static void surface_destroy(struct wl_client *client, struct wl_resource *resource) { +	struct wlr_surface *surface = wl_resource_get_user_data(resource); +	wl_signal_emit(&surface->signals.destroy, surface); +	wl_resource_destroy(resource); +} + +static void surface_attach(struct wl_client *client, +		struct wl_resource *resource, +		struct wl_resource *buffer, int32_t sx, int32_t sy) { +	struct wlr_surface *surface = wl_resource_get_user_data(resource); +	surface->pending_buffer = buffer; +	surface->pending_attached = true; +} + +static void surface_damage(struct wl_client *client, +		struct wl_resource *resource, +		int32_t x, int32_t y, int32_t width, int32_t height) { +	wlr_log(L_DEBUG, "TODO: surface damage"); +} + +static void surface_frame(struct wl_client *client, +		struct wl_resource *resource, uint32_t callback) { +	wlr_log(L_DEBUG, "TODO: surface frame"); +} + +static void surface_set_opaque_region(struct wl_client *client, +		struct wl_resource *resource, +		struct wl_resource *region_resource) { +	wlr_log(L_DEBUG, "TODO: surface opaque region"); +} + +static void surface_set_input_region(struct wl_client *client, +		struct wl_resource *resource, +		struct wl_resource *region_resource) { + +	wlr_log(L_DEBUG, "TODO: surface input region"); +} + +static void surface_commit(struct wl_client *client, +		struct wl_resource *resource) { +	struct wlr_surface *surface = wl_resource_get_user_data(resource); + +	// apply pending state +	if (surface->pending_attached) { +		surface->attached = surface->pending_buffer; +		if (surface->pending_buffer) { +			struct wl_shm_buffer *buffer = wl_shm_buffer_get(surface->pending_buffer); +			if (!buffer) { +				wlr_log(L_INFO, "Unknown buffer handle attached"); +			} else { +				uint32_t format = wl_shm_buffer_get_format(buffer); +				wlr_texture_upload_shm(surface->texture, format, buffer); +			} +		} +	} + +	// reset pending state +	surface->pending_buffer = NULL; +	surface->pending_attached = false; + +	wl_signal_emit(&surface->signals.commit, surface); +} + +static void surface_set_buffer_transform(struct wl_client *client, +		struct wl_resource *resource, int transform) { +	wlr_log(L_DEBUG, "TODO: surface surface buffer transform"); +} + +static void surface_set_buffer_scale(struct wl_client *client, +		struct wl_resource *resource, +		int32_t scale) { +	wlr_log(L_DEBUG, "TODO: surface set buffer scale"); +} + + +static void surface_damage_buffer(struct wl_client *client, +		struct wl_resource *resource, +		int32_t x, int32_t y, int32_t width, +		int32_t height) { +	wlr_log(L_DEBUG, "TODO: surface damage buffer"); +} + +const struct wl_surface_interface surface_interface = { +	surface_destroy, +	surface_attach, +	surface_damage, +	surface_frame, +	surface_set_opaque_region, +	surface_set_input_region, +	surface_commit, +	surface_set_buffer_transform, +	surface_set_buffer_scale, +	surface_damage_buffer +}; + +static void destroy_surface(struct wl_resource *resource) { +	struct wlr_surface *surface = wl_resource_get_user_data(resource); +	wl_signal_emit(&surface->signals.destroy, surface); +	wlr_texture_destroy(surface->texture); +} + +struct wlr_surface *wlr_surface_create(struct wl_resource *res, +		struct wlr_renderer *renderer) { +	struct wlr_surface *surface = calloc(1, sizeof(struct wlr_surface)); +	surface->texture = wlr_render_texture_init(renderer); +	surface->resource = res; +	wl_signal_init(&surface->signals.commit); +	wl_signal_init(&surface->signals.destroy); +	wl_resource_set_implementation(res, &surface_interface, +			surface, destroy_surface); + +	return surface; +} diff --git a/examples/compositor/wlr_surface.h b/examples/compositor/wlr_surface.h new file mode 100644 index 00000000..d294bdef --- /dev/null +++ b/examples/compositor/wlr_surface.h @@ -0,0 +1,24 @@ +#ifndef _EXAMPLES_COMPOSITOR_SURFACE_H +#define _EXAMPLES_COMPOSITOR_SURFACE_H + +#include <wayland-server.h> + +struct wlr_surface { +	struct wl_resource *pending_buffer; +	bool pending_attached; +	bool attached; // whether the surface currently has a buffer attached + +	struct wlr_texture *texture; +	const char *role; // the lifetime-bound role or null +	struct wl_resource *resource; + +	struct { +		struct wl_signal destroy; +		struct wl_signal commit; +	} signals; +}; + +struct wlr_surface *wlr_surface_create(struct wl_resource *res, +		struct wlr_renderer *renderer); + +#endif diff --git a/examples/meson.build b/examples/meson.build index ed49444f..6e52a920 100644 --- a/examples/meson.build +++ b/examples/meson.build @@ -12,6 +12,7 @@ compositor_src = [      'compositor/main.c',      'compositor/wl_compositor.c',      'compositor/wl_shell.c', +    'compositor/wlr_surface.c',  ]  executable('compositor', compositor_src, dependencies: dep_wlr, link_with: lib_shared) | 
