diff options
author | Simon Ser <contact@emersion.fr> | 2020-04-27 16:41:54 +0200 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2020-06-17 10:18:58 -0600 |
commit | e19bd1e47441e6292eb77d7caa8b3211666bef2e (patch) | |
tree | f86b9bc75ecb42e0eee529c131a3635514fae444 | |
parent | input/pointer: don't trigger pointer bindings for emulated input (diff) | |
download | sway-e19bd1e47441e6292eb77d7caa8b3211666bef2e.tar.gz sway-e19bd1e47441e6292eb77d7caa8b3211666bef2e.tar.zst sway-e19bd1e47441e6292eb77d7caa8b3211666bef2e.zip |
Add support for viewporter
Depends on [1].
[1]: https://github.com/swaywm/wlroots/pull/2092
-rw-r--r-- | include/sway/tree/view.h | 1 | ||||
-rw-r--r-- | sway/desktop/render.c | 31 | ||||
-rw-r--r-- | sway/server.c | 2 | ||||
-rw-r--r-- | sway/tree/view.c | 1 |
4 files changed, 24 insertions, 11 deletions
diff --git a/include/sway/tree/view.h b/include/sway/tree/view.h index 467bf78b..6007ec49 100644 --- a/include/sway/tree/view.h +++ b/include/sway/tree/view.h | |||
@@ -60,6 +60,7 @@ struct sway_saved_buffer { | |||
60 | int x, y; | 60 | int x, y; |
61 | int width, height; | 61 | int width, height; |
62 | enum wl_output_transform transform; | 62 | enum wl_output_transform transform; |
63 | struct wlr_fbox source_box; | ||
63 | struct wl_list link; // sway_view::saved_buffers | 64 | struct wl_list link; // sway_view::saved_buffers |
64 | }; | 65 | }; |
65 | 66 | ||
diff --git a/sway/desktop/render.c b/sway/desktop/render.c index 2996e135..d3d927c8 100644 --- a/sway/desktop/render.c +++ b/sway/desktop/render.c | |||
@@ -98,7 +98,8 @@ static void set_scale_filter(struct wlr_output *wlr_output, | |||
98 | 98 | ||
99 | static void render_texture(struct wlr_output *wlr_output, | 99 | static void render_texture(struct wlr_output *wlr_output, |
100 | pixman_region32_t *output_damage, struct wlr_texture *texture, | 100 | pixman_region32_t *output_damage, struct wlr_texture *texture, |
101 | const struct wlr_box *box, const float matrix[static 9], float alpha) { | 101 | const struct wlr_fbox *src_box, const struct wlr_box *dst_box, |
102 | const float matrix[static 9], float alpha) { | ||
102 | struct wlr_renderer *renderer = | 103 | struct wlr_renderer *renderer = |
103 | wlr_backend_get_renderer(wlr_output->backend); | 104 | wlr_backend_get_renderer(wlr_output->backend); |
104 | struct sway_output *output = wlr_output->data; | 105 | struct sway_output *output = wlr_output->data; |
@@ -108,8 +109,8 @@ static void render_texture(struct wlr_output *wlr_output, | |||
108 | 109 | ||
109 | pixman_region32_t damage; | 110 | pixman_region32_t damage; |
110 | pixman_region32_init(&damage); | 111 | pixman_region32_init(&damage); |
111 | pixman_region32_union_rect(&damage, &damage, box->x, box->y, | 112 | pixman_region32_union_rect(&damage, &damage, dst_box->x, dst_box->y, |
112 | box->width, box->height); | 113 | dst_box->width, dst_box->height); |
113 | pixman_region32_intersect(&damage, &damage, output_damage); | 114 | pixman_region32_intersect(&damage, &damage, output_damage); |
114 | bool damaged = pixman_region32_not_empty(&damage); | 115 | bool damaged = pixman_region32_not_empty(&damage); |
115 | if (!damaged) { | 116 | if (!damaged) { |
@@ -121,7 +122,11 @@ static void render_texture(struct wlr_output *wlr_output, | |||
121 | for (int i = 0; i < nrects; ++i) { | 122 | for (int i = 0; i < nrects; ++i) { |
122 | scissor_output(wlr_output, &rects[i]); | 123 | scissor_output(wlr_output, &rects[i]); |
123 | set_scale_filter(wlr_output, texture, output->scale_filter); | 124 | set_scale_filter(wlr_output, texture, output->scale_filter); |
124 | wlr_render_texture_with_matrix(renderer, texture, matrix, alpha); | 125 | if (src_box != NULL) { |
126 | wlr_render_subtexture_with_matrix(renderer, texture, src_box, matrix, alpha); | ||
127 | } else { | ||
128 | wlr_render_texture_with_matrix(renderer, texture, matrix, alpha); | ||
129 | } | ||
125 | } | 130 | } |
126 | 131 | ||
127 | damage_finish: | 132 | damage_finish: |
@@ -141,16 +146,20 @@ static void render_surface_iterator(struct sway_output *output, struct sway_view | |||
141 | return; | 146 | return; |
142 | } | 147 | } |
143 | 148 | ||
144 | struct wlr_box box = *_box; | 149 | struct wlr_fbox src_box; |
145 | scale_box(&box, wlr_output->scale); | 150 | wlr_surface_get_buffer_source_box(surface, &src_box); |
151 | |||
152 | struct wlr_box dst_box = *_box; | ||
153 | scale_box(&dst_box, wlr_output->scale); | ||
146 | 154 | ||
147 | float matrix[9]; | 155 | float matrix[9]; |
148 | enum wl_output_transform transform = | 156 | enum wl_output_transform transform = |
149 | wlr_output_transform_invert(surface->current.transform); | 157 | wlr_output_transform_invert(surface->current.transform); |
150 | wlr_matrix_project_box(matrix, &box, transform, rotation, | 158 | wlr_matrix_project_box(matrix, &dst_box, transform, rotation, |
151 | wlr_output->transform_matrix); | 159 | wlr_output->transform_matrix); |
152 | 160 | ||
153 | render_texture(wlr_output, output_damage, texture, &box, matrix, alpha); | 161 | render_texture(wlr_output, output_damage, texture, |
162 | &src_box, &dst_box, matrix, alpha); | ||
154 | 163 | ||
155 | wlr_presentation_surface_sampled_on_output(server.presentation, surface, | 164 | wlr_presentation_surface_sampled_on_output(server.presentation, surface, |
156 | wlr_output); | 165 | wlr_output); |
@@ -317,7 +326,7 @@ static void render_saved_view(struct sway_view *view, | |||
317 | wlr_output->transform_matrix); | 326 | wlr_output->transform_matrix); |
318 | 327 | ||
319 | render_texture(wlr_output, damage, saved_buf->buffer->texture, | 328 | render_texture(wlr_output, damage, saved_buf->buffer->texture, |
320 | &box, matrix, alpha); | 329 | &saved_buf->source_box, &box, matrix, alpha); |
321 | } | 330 | } |
322 | 331 | ||
323 | // FIXME: we should set the surface that this saved buffer originates from | 332 | // FIXME: we should set the surface that this saved buffer originates from |
@@ -497,7 +506,7 @@ static void render_titlebar(struct sway_output *output, | |||
497 | texture_box.width = ob_inner_width; | 506 | texture_box.width = ob_inner_width; |
498 | } | 507 | } |
499 | render_texture(output->wlr_output, output_damage, marks_texture, | 508 | render_texture(output->wlr_output, output_damage, marks_texture, |
500 | &texture_box, matrix, con->alpha); | 509 | NULL, &texture_box, matrix, con->alpha); |
501 | 510 | ||
502 | // Padding above | 511 | // Padding above |
503 | memcpy(&color, colors->background, sizeof(float) * 4); | 512 | memcpy(&color, colors->background, sizeof(float) * 4); |
@@ -565,7 +574,7 @@ static void render_titlebar(struct sway_output *output, | |||
565 | } | 574 | } |
566 | 575 | ||
567 | render_texture(output->wlr_output, output_damage, title_texture, | 576 | render_texture(output->wlr_output, output_damage, title_texture, |
568 | &texture_box, matrix, con->alpha); | 577 | NULL, &texture_box, matrix, con->alpha); |
569 | 578 | ||
570 | // Padding above | 579 | // Padding above |
571 | memcpy(&color, colors->background, sizeof(float) * 4); | 580 | memcpy(&color, colors->background, sizeof(float) * 4); |
diff --git a/sway/server.c b/sway/server.c index cf36962b..724a0e25 100644 --- a/sway/server.c +++ b/sway/server.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <wlr/types/wlr_screencopy_v1.h> | 22 | #include <wlr/types/wlr_screencopy_v1.h> |
23 | #include <wlr/types/wlr_server_decoration.h> | 23 | #include <wlr/types/wlr_server_decoration.h> |
24 | #include <wlr/types/wlr_tablet_v2.h> | 24 | #include <wlr/types/wlr_tablet_v2.h> |
25 | #include <wlr/types/wlr_viewporter.h> | ||
25 | #include <wlr/types/wlr_xcursor_manager.h> | 26 | #include <wlr/types/wlr_xcursor_manager.h> |
26 | #include <wlr/types/wlr_xdg_decoration_v1.h> | 27 | #include <wlr/types/wlr_xdg_decoration_v1.h> |
27 | #include <wlr/types/wlr_xdg_output_v1.h> | 28 | #include <wlr/types/wlr_xdg_output_v1.h> |
@@ -146,6 +147,7 @@ bool server_init(struct sway_server *server) { | |||
146 | wlr_screencopy_manager_v1_create(server->wl_display); | 147 | wlr_screencopy_manager_v1_create(server->wl_display); |
147 | wlr_data_control_manager_v1_create(server->wl_display); | 148 | wlr_data_control_manager_v1_create(server->wl_display); |
148 | wlr_primary_selection_v1_device_manager_create(server->wl_display); | 149 | wlr_primary_selection_v1_device_manager_create(server->wl_display); |
150 | wlr_viewporter_create(server->wl_display); | ||
149 | 151 | ||
150 | server->socket = wl_display_add_socket_auto(server->wl_display); | 152 | server->socket = wl_display_add_socket_auto(server->wl_display); |
151 | if (!server->socket) { | 153 | if (!server->socket) { |
diff --git a/sway/tree/view.c b/sway/tree/view.c index ca5af10e..e5d3948c 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c | |||
@@ -1206,6 +1206,7 @@ static void view_save_buffer_iterator(struct wlr_surface *surface, | |||
1206 | saved_buffer->x = sx; | 1206 | saved_buffer->x = sx; |
1207 | saved_buffer->y = sy; | 1207 | saved_buffer->y = sy; |
1208 | saved_buffer->transform = surface->current.transform; | 1208 | saved_buffer->transform = surface->current.transform; |
1209 | wlr_surface_get_buffer_source_box(surface, &saved_buffer->source_box); | ||
1209 | wl_list_insert(&view->saved_buffers, &saved_buffer->link); | 1210 | wl_list_insert(&view->saved_buffers, &saved_buffer->link); |
1210 | } | 1211 | } |
1211 | } | 1212 | } |