From f4754ad1a21eaede20f6e9c5d4e0c78294119cc1 Mon Sep 17 00:00:00 2001 From: emersion Date: Thu, 30 Nov 2017 23:58:12 +0100 Subject: Fix surface transforms --- rootston/output.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'rootston') diff --git a/rootston/output.c b/rootston/output.c index bf684f2f..c1d2e9f3 100644 --- a/rootston/output.c +++ b/rootston/output.c @@ -63,10 +63,25 @@ static void render_surface(struct wlr_surface *surface, float scale[16]; wlr_matrix_scale(&scale, render_width, render_height, 1); + float translate_mdr[16]; + wlr_matrix_translate(&translate_mdr, 0.5, 0.5, 0); + + float surface_transform[16]; + wlr_matrix_transform(surface_transform, + wlr_output_transform_invert(surface->current->transform)); // TODO + + float translate_mdr2[16]; + wlr_matrix_translate(&translate_mdr2, -0.5, -0.5, 0); + float transform[16]; wlr_matrix_mul(&translate_origin, &rotate, &transform); wlr_matrix_mul(&transform, &translate_center, &transform); wlr_matrix_mul(&transform, &scale, &transform); + + wlr_matrix_mul(&transform, &translate_mdr, &transform); + wlr_matrix_mul(&transform, &surface_transform, &transform); + wlr_matrix_mul(&transform, &translate_mdr2, &transform); + wlr_matrix_mul(&wlr_output->transform_matrix, &transform, &matrix); wlr_render_with_matrix(desktop->server->renderer, surface->texture, -- cgit v1.2.3 From acc8f368945d540796078f0530234734e5cb1b37 Mon Sep 17 00:00:00 2001 From: emersion Date: Fri, 1 Dec 2017 16:08:01 +0100 Subject: Fix pointer input for transformed surfaces --- rootston/desktop.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'rootston') diff --git a/rootston/desktop.c b/rootston/desktop.c index bb3af258..8cede819 100644 --- a/rootston/desktop.c +++ b/rootston/desktop.c @@ -295,10 +295,8 @@ static bool view_at(struct roots_view *view, double lx, double ly, struct wlr_surface_state *state = view->wlr_surface->current; struct wlr_box box = { - .x = 0, - .y = 0, - .width = state->buffer_width / state->scale, - .height = state->buffer_height / state->scale, + .x = 0, .y = 0, + .width = state->width, .height = state->height, }; if (view->rotation != 0.0) { // Coordinates relative to the center of the view -- cgit v1.2.3 From d1b29a54b92c5d13739430fe98b12ff169964272 Mon Sep 17 00:00:00 2001 From: emersion Date: Fri, 1 Dec 2017 16:13:24 +0100 Subject: Refactor: rename matrices in rootston --- rootston/output.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) (limited to 'rootston') diff --git a/rootston/output.c b/rootston/output.c index c1d2e9f3..9df95a91 100644 --- a/rootston/output.c +++ b/rootston/output.c @@ -49,38 +49,38 @@ static void render_surface(struct wlr_surface *surface, lx, ly, lx + render_width, ly + render_height)) { float matrix[16]; - float translate_origin[16]; - wlr_matrix_translate(&translate_origin, + float translate_center[16]; + wlr_matrix_translate(&translate_center, (int)ox + render_width / 2, (int)oy + render_height / 2, 0); float rotate[16]; wlr_matrix_rotate(&rotate, rotation); - float translate_center[16]; - wlr_matrix_translate(&translate_center, -render_width / 2, + float translate_origin[16]; + wlr_matrix_translate(&translate_origin, -render_width / 2, -render_height / 2, 0); float scale[16]; wlr_matrix_scale(&scale, render_width, render_height, 1); - float translate_mdr[16]; - wlr_matrix_translate(&translate_mdr, 0.5, 0.5, 0); + float surface_translate_center[16]; + wlr_matrix_translate(&surface_translate_center, 0.5, 0.5, 0); float surface_transform[16]; wlr_matrix_transform(surface_transform, - wlr_output_transform_invert(surface->current->transform)); // TODO + wlr_output_transform_invert(surface->current->transform)); - float translate_mdr2[16]; - wlr_matrix_translate(&translate_mdr2, -0.5, -0.5, 0); + float surface_translate_origin[16]; + wlr_matrix_translate(&surface_translate_origin, -0.5, -0.5, 0); float transform[16]; - wlr_matrix_mul(&translate_origin, &rotate, &transform); - wlr_matrix_mul(&transform, &translate_center, &transform); + wlr_matrix_mul(&translate_center, &rotate, &transform); + wlr_matrix_mul(&transform, &translate_origin, &transform); wlr_matrix_mul(&transform, &scale, &transform); - wlr_matrix_mul(&transform, &translate_mdr, &transform); + wlr_matrix_mul(&transform, &surface_translate_center, &transform); wlr_matrix_mul(&transform, &surface_transform, &transform); - wlr_matrix_mul(&transform, &translate_mdr2, &transform); + wlr_matrix_mul(&transform, &surface_translate_origin, &transform); wlr_matrix_mul(&wlr_output->transform_matrix, &transform, &matrix); -- cgit v1.2.3 From eb763439f75d3c9174280d0c75ef44941dd99340 Mon Sep 17 00:00:00 2001 From: emersion Date: Fri, 1 Dec 2017 16:20:09 +0100 Subject: optimize a bit rootston renderer if there's no surface transform --- rootston/output.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) (limited to 'rootston') diff --git a/rootston/output.c b/rootston/output.c index 9df95a91..996f819d 100644 --- a/rootston/output.c +++ b/rootston/output.c @@ -63,24 +63,28 @@ static void render_surface(struct wlr_surface *surface, float scale[16]; wlr_matrix_scale(&scale, render_width, render_height, 1); - float surface_translate_center[16]; - wlr_matrix_translate(&surface_translate_center, 0.5, 0.5, 0); - - float surface_transform[16]; - wlr_matrix_transform(surface_transform, - wlr_output_transform_invert(surface->current->transform)); - - float surface_translate_origin[16]; - wlr_matrix_translate(&surface_translate_origin, -0.5, -0.5, 0); - float transform[16]; wlr_matrix_mul(&translate_center, &rotate, &transform); wlr_matrix_mul(&transform, &translate_origin, &transform); wlr_matrix_mul(&transform, &scale, &transform); - wlr_matrix_mul(&transform, &surface_translate_center, &transform); - wlr_matrix_mul(&transform, &surface_transform, &transform); - wlr_matrix_mul(&transform, &surface_translate_origin, &transform); + if (surface->current->transform != WL_OUTPUT_TRANSFORM_NORMAL) { + float surface_translate_center[16]; + wlr_matrix_translate(&surface_translate_center, 0.5, 0.5, 0); + + float surface_transform[16]; + wlr_matrix_transform(surface_transform, + wlr_output_transform_invert(surface->current->transform)); + + float surface_translate_origin[16]; + wlr_matrix_translate(&surface_translate_origin, -0.5, -0.5, 0); + + wlr_matrix_mul(&transform, &surface_translate_center, + &transform); + wlr_matrix_mul(&transform, &surface_transform, &transform); + wlr_matrix_mul(&transform, &surface_translate_origin, + &transform); + } wlr_matrix_mul(&wlr_output->transform_matrix, &transform, &matrix); -- cgit v1.2.3 From dfe11a2b0ef3806d3c2241e3bc8e69fc93905d8c Mon Sep 17 00:00:00 2001 From: emersion Date: Thu, 7 Dec 2017 00:13:06 +0100 Subject: Add display destroy listener in screenshooter, destroy display in rootston --- include/wlr/types/wlr_screenshooter.h | 8 ++++++ rootston/main.c | 2 ++ types/wlr_screenshooter.c | 49 ++++++++++++++++++++++++++++------- 3 files changed, 49 insertions(+), 10 deletions(-) (limited to 'rootston') diff --git a/include/wlr/types/wlr_screenshooter.h b/include/wlr/types/wlr_screenshooter.h index 4bda3d3c..e8b59669 100644 --- a/include/wlr/types/wlr_screenshooter.h +++ b/include/wlr/types/wlr_screenshooter.h @@ -5,6 +5,13 @@ struct wlr_screenshooter { struct wl_global *wl_global; struct wlr_renderer *renderer; + struct wl_list screenshots; // wlr_screenshot::link + + struct wl_listener display_destroy; + + struct { + struct wl_signal destroy; + } events; void *data; }; @@ -12,6 +19,7 @@ struct wlr_screenshooter { struct wlr_screenshot { struct wl_resource *resource; struct wl_resource *output_resource; + struct wl_list link; struct wlr_output *output; struct wlr_screenshooter *screenshooter; diff --git a/rootston/main.c b/rootston/main.c index 46548094..3b65a067 100644 --- a/rootston/main.c +++ b/rootston/main.c @@ -51,6 +51,7 @@ int main(int argc, char **argv) { if (!wlr_backend_start(server.backend)) { wlr_log(L_ERROR, "Failed to start backend"); wlr_backend_destroy(server.backend); + wl_display_destroy(server.wl_display); return 1; } @@ -69,5 +70,6 @@ int main(int argc, char **argv) { wl_display_run(server.wl_display); wlr_backend_destroy(server.backend); + wl_display_destroy(server.wl_display); return 0; } diff --git a/types/wlr_screenshooter.c b/types/wlr_screenshooter.c index 94b45384..d62820e6 100644 --- a/types/wlr_screenshooter.c +++ b/types/wlr_screenshooter.c @@ -26,6 +26,18 @@ struct screenshot_state { struct wl_listener frame_listener; }; +static void screenshot_destroy(struct wlr_screenshot *screenshot) { + wl_list_remove(&screenshot->link); + free(screenshot); +} + +static void handle_screenshot_resource_destroy( + struct wl_resource *screenshot_resource) { + struct wlr_screenshot *screenshot = + wl_resource_get_user_data(screenshot_resource); + screenshot_destroy(screenshot); +} + static void output_frame_notify(struct wl_listener *listener, void *_data) { struct screenshot_state *state = wl_container_of(listener, state, frame_listener); @@ -102,7 +114,8 @@ static void screenshooter_shoot(struct wl_client *client, return; } wl_resource_set_implementation(screenshot->resource, NULL, screenshot, - NULL); + handle_screenshot_resource_destroy); + wl_list_insert(&screenshooter->screenshots, &screenshot->link); wlr_log(L_DEBUG, "new screenshot %p (res %p)", screenshot, screenshot->resource); @@ -144,6 +157,25 @@ static void screenshooter_bind(struct wl_client *wl_client, void *data, screenshooter, NULL); } +void wlr_screenshooter_destroy(struct wlr_screenshooter *screenshooter) { + if (!screenshooter) { + return; + } + wl_signal_emit(&screenshooter->events.destroy, screenshooter); + struct wlr_screenshot *screenshot, *tmp; + wl_list_for_each_safe(screenshot, tmp, &screenshooter->screenshots, link) { + screenshot_destroy(screenshot); + } + wl_global_destroy(screenshooter->wl_global); + free(screenshooter); +} + +static void handle_display_destroy(struct wl_listener *listener, void *data) { + struct wlr_screenshooter *screenshooter = + wl_container_of(listener, screenshooter, display_destroy); + wlr_screenshooter_destroy(screenshooter); +} + struct wlr_screenshooter *wlr_screenshooter_create(struct wl_display *display, struct wlr_renderer *renderer) { struct wlr_screenshooter *screenshooter = @@ -153,6 +185,12 @@ struct wlr_screenshooter *wlr_screenshooter_create(struct wl_display *display, } screenshooter->renderer = renderer; + wl_list_init(&screenshooter->screenshots); + wl_signal_init(&screenshooter->events.destroy); + + screenshooter->display_destroy.notify = handle_display_destroy; + wl_display_add_destroy_listener(display, &screenshooter->display_destroy); + screenshooter->wl_global = wl_global_create(display, &orbital_screenshooter_interface, 1, screenshooter, screenshooter_bind); if (screenshooter->wl_global == NULL) { @@ -162,12 +200,3 @@ struct wlr_screenshooter *wlr_screenshooter_create(struct wl_display *display, return screenshooter; } - -void wlr_screenshooter_destroy(struct wlr_screenshooter *screenshooter) { - if (!screenshooter) { - return; - } - // TODO: this segfault (wl_display->registry_resource_list is not init) - // wl_global_destroy(screenshooter->wl_global); - free(screenshooter); -} -- cgit v1.2.3