diff options
author | Marius Vlad <marius.vlad@collabora.com> | 2020-10-15 14:52:27 +0300 |
---|---|---|
committer | Marius Vlad <marius.vlad@collabora.com> | 2020-12-01 13:07:53 +0200 |
commit | e6ad86a86fe3ed73cac6478e07eb1220399ace1f (patch) | |
tree | 58beffdda0ac9fce19432709a79c7c46ce300890 /src/wth-receiver-surface.c | |
parent | e0c6ec4cf049522b662874f069244b5c19229906 (diff) |
Init waltham-receiver
Bug-AGL: SPEC-3605
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Change-Id: Ia352702d0c43f1f2ccecbffea85f3d0f17f2fd56
Diffstat (limited to 'src/wth-receiver-surface.c')
-rw-r--r-- | src/wth-receiver-surface.c | 291 |
1 files changed, 291 insertions, 0 deletions
diff --git a/src/wth-receiver-surface.c b/src/wth-receiver-surface.c new file mode 100644 index 0000000..ec89677 --- /dev/null +++ b/src/wth-receiver-surface.c @@ -0,0 +1,291 @@ +/* + * Copyright © 2019 Advanced Driver Information Technology GmbH + * Copyright © 2020 Collabora, Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#include "wth-receiver-comm.h" +#include "wth-receiver-buffer.h" +#include "wth-receiver-seat.h" +#include "wth-receiver-surface.h" + +void +wth_receiver_weston_shm_attach(struct window *window, uint32_t data_sz, void * data, + int32_t width, int32_t height, int32_t stride, uint32_t format) +{ + /* stub */ +} + +void +wth_receiver_weston_shm_damage(struct window *window) +{ + /* stub */ +} + +void +wth_receiver_weston_shm_commit(struct window *window) +{ + /* stub */ +} + +/* + * waltham surface implementation + */ +void +surface_destroy(struct surface *surface) +{ + wthp_surface_free(surface->obj); + wl_list_remove(&surface->link); + free(surface); +} + +static void +surface_handle_destroy(struct wthp_surface *wthp_surface) +{ + struct surface *surface = wth_object_get_user_data((struct wth_object *)wthp_surface); + + assert(wthp_surface == surface->obj); + surface_destroy(surface); +} + +static void +surface_handle_attach(struct wthp_surface *wthp_surface, + struct wthp_buffer *wthp_buff, int32_t x, int32_t y) +{ + struct surface *surf = wth_object_get_user_data((struct wth_object *)wthp_surface); + struct buffer *buf = container_of(&wthp_buff, struct buffer, obj); + + if (surf->ivi_id != 0) { + wth_receiver_weston_shm_attach(surf->shm_window, + buf->data_sz, + buf->data, + buf->width, + buf->height, + buf->stride, + buf->format); + + wthp_buffer_send_complete(wthp_buff, 0); + } +} + +static void +surface_handle_damage(struct wthp_surface *wthp_surface, + int32_t x, int32_t y, int32_t width, int32_t height) +{ + struct surface *surf = wth_object_get_user_data((struct wth_object *)wthp_surface); + + if (surf->ivi_id != 0) { + wth_receiver_weston_shm_damage(surf->shm_window); + } +} + +static void +surface_handle_frame(struct wthp_surface *wthp_surface, + struct wthp_callback *callback) +{ + struct surface *surf = wth_object_get_user_data((struct wth_object *)wthp_surface); + surf->cb = callback; +} + +static void +surface_handle_set_opaque_region(struct wthp_surface *wthp_surface, + struct wthp_region *region) +{ + +} + +static void +surface_handle_set_input_region(struct wthp_surface *wthp_surface, + struct wthp_region *region) +{ + +} + +static void +surface_handle_commit(struct wthp_surface *wthp_surface) +{ + struct surface *surf = wth_object_get_user_data((struct wth_object *)wthp_surface); + + if (surf->ivi_id != 0) { + wth_receiver_weston_shm_commit(surf->shm_window); + } +} + +static void +surface_handle_set_buffer_transform(struct wthp_surface *wthp_surface, + int32_t transform) +{ + +} + +static void +surface_handle_set_buffer_scale(struct wthp_surface *wthp_surface, + int32_t scale) +{ + +} + +static void +surface_handle_damage_buffer(struct wthp_surface *wthp_surface, + int32_t x, int32_t y, int32_t width, int32_t height) +{ + +} + +static const struct wthp_surface_interface surface_implementation = { + surface_handle_destroy, + surface_handle_attach, + surface_handle_damage, + surface_handle_frame, + surface_handle_set_opaque_region, + surface_handle_set_input_region, + surface_handle_commit, + surface_handle_set_buffer_transform, + surface_handle_set_buffer_scale, + surface_handle_damage_buffer +}; + +static void +compositor_handle_create_surface(struct wthp_compositor *compositor, + struct wthp_surface *id) +{ + + struct compositor *comp = wth_object_get_user_data((struct wth_object *)compositor); + struct client *client = comp->client; + struct surface *surface; + struct seat *seat, *tmp; + + surface = zalloc(sizeof *surface); + if (!surface) { + client_post_out_of_memory(comp->client); + return; + } + + surface->obj = id; + wl_list_insert(&comp->client->surface_list, &surface->link); + + wthp_surface_set_interface(id, &surface_implementation, surface); + + surface->shm_window = calloc(1, sizeof *surface->shm_window); + if (!surface->shm_window) + return; + + surface->shm_window->receiver_surf = surface; + surface->shm_window->ready = false; + surface->ivi_id = 0; + + wl_list_for_each_safe(seat, tmp, &client->seat_list, link) { + surface->shm_window->receiver_seat = seat; + } +} + +/* + * waltham region implementation + */ +void +region_destroy(struct region *region) +{ + wthp_region_free(region->obj); + wl_list_remove(®ion->link); + free(region); +} + +static void +region_handle_destroy(struct wthp_region *wthp_region) +{ + struct region *region = wth_object_get_user_data((struct wth_object *)wthp_region); + assert(wthp_region == region->obj); + region_destroy(region); +} + +static void +region_handle_add(struct wthp_region *wthp_region, + int32_t x, int32_t y, int32_t width, int32_t height) +{ +} + +static void +region_handle_subtract(struct wthp_region *wthp_region, + int32_t x, int32_t y, + int32_t width, int32_t height) +{ +} + +static const struct wthp_region_interface region_implementation = { + region_handle_destroy, + region_handle_add, + region_handle_subtract +}; + +/* + * waltham compositor implementation + */ +void +compositor_destroy(struct compositor *comp) +{ + wthp_compositor_free(comp->obj); + wl_list_remove(&comp->link); + free(comp); +} + +static void +compositor_handle_create_region(struct wthp_compositor *compositor, + struct wthp_region *id) +{ + struct compositor *comp = wth_object_get_user_data((struct wth_object *)compositor); + struct region *region; + + region = zalloc(sizeof *region); + if (!region) { + client_post_out_of_memory(comp->client); + return; + } + + region->obj = id; + wl_list_insert(&comp->client->region_list, ®ion->link); + + wthp_region_set_interface(id, ®ion_implementation, region); +} + +static const struct wthp_compositor_interface compositor_implementation = { + compositor_handle_create_surface, + compositor_handle_create_region +}; + +void +client_bind_compositor(struct client *c, struct wthp_compositor *obj) +{ + + struct compositor *comp; + + comp = zalloc(sizeof *comp); + if (!comp) { + client_post_out_of_memory(c); + return; + } + + comp->obj = obj; + comp->client = c; + wl_list_insert(&c->compositor_list, &comp->link); + + wthp_compositor_set_interface(obj, &compositor_implementation, comp); +} |