diff options
Diffstat (limited to 'sway/desktop')
-rw-r--r-- | sway/desktop/render.c | 9 | ||||
-rw-r--r-- | sway/desktop/transaction.c | 20 | ||||
-rw-r--r-- | sway/desktop/xdg_shell.c | 7 | ||||
-rw-r--r-- | sway/desktop/xdg_shell_v6.c | 7 | ||||
-rw-r--r-- | sway/desktop/xwayland.c | 7 |
5 files changed, 33 insertions, 17 deletions
diff --git a/sway/desktop/render.c b/sway/desktop/render.c index fa27500e..9102dc34 100644 --- a/sway/desktop/render.c +++ b/sway/desktop/render.c | |||
@@ -204,9 +204,9 @@ static void render_view_toplevels(struct sway_view *view, | |||
204 | .alpha = alpha, | 204 | .alpha = alpha, |
205 | }; | 205 | }; |
206 | // Render all toplevels without descending into popups | 206 | // Render all toplevels without descending into popups |
207 | double ox = view->container->current.content_x - | 207 | double ox = view->container->surface_x - |
208 | output->wlr_output->lx - view->geometry.x; | 208 | output->wlr_output->lx - view->geometry.x; |
209 | double oy = view->container->current.content_y - | 209 | double oy = view->container->surface_y - |
210 | output->wlr_output->ly - view->geometry.y; | 210 | output->wlr_output->ly - view->geometry.y; |
211 | output_surface_for_each_surface(output, view->surface, ox, oy, | 211 | output_surface_for_each_surface(output, view->surface, ox, oy, |
212 | render_surface_iterator, &data); | 212 | render_surface_iterator, &data); |
@@ -240,9 +240,9 @@ static void render_saved_view(struct sway_view *view, | |||
240 | return; | 240 | return; |
241 | } | 241 | } |
242 | struct wlr_box box = { | 242 | struct wlr_box box = { |
243 | .x = view->container->current.content_x - output->wlr_output->lx - | 243 | .x = view->container->surface_x - output->wlr_output->lx - |
244 | view->saved_geometry.x, | 244 | view->saved_geometry.x, |
245 | .y = view->container->current.content_y - output->wlr_output->ly - | 245 | .y = view->container->surface_y - output->wlr_output->ly - |
246 | view->saved_geometry.y, | 246 | view->saved_geometry.y, |
247 | .width = view->saved_buffer_width, | 247 | .width = view->saved_buffer_width, |
248 | .height = view->saved_buffer_height, | 248 | .height = view->saved_buffer_height, |
@@ -1004,7 +1004,6 @@ void output_render(struct sway_output *output, struct timespec *when, | |||
1004 | wlr_renderer_clear(renderer, clear_color); | 1004 | wlr_renderer_clear(renderer, clear_color); |
1005 | } | 1005 | } |
1006 | 1006 | ||
1007 | // TODO: handle views smaller than the output | ||
1008 | if (fullscreen_con->view) { | 1007 | if (fullscreen_con->view) { |
1009 | if (fullscreen_con->view->saved_buffer) { | 1008 | if (fullscreen_con->view->saved_buffer) { |
1010 | render_saved_view(fullscreen_con->view, output, damage, 1.0f); | 1009 | render_saved_view(fullscreen_con->view, output, damage, 1.0f); |
diff --git a/sway/desktop/transaction.c b/sway/desktop/transaction.c index 9155f0a1..e0c3a5d1 100644 --- a/sway/desktop/transaction.c +++ b/sway/desktop/transaction.c | |||
@@ -249,6 +249,26 @@ static void apply_container_state(struct sway_container *container, | |||
249 | desktop_damage_box(&box); | 249 | desktop_damage_box(&box); |
250 | } | 250 | } |
251 | 251 | ||
252 | // If the view hasn't responded to the configure, center it within | ||
253 | // the container. This is important for fullscreen views which | ||
254 | // refuse to resize to the size of the output. | ||
255 | if (view && view->surface) { | ||
256 | if (view->surface->current.width < container->width) { | ||
257 | container->surface_x = container->content_x + | ||
258 | (container->content_width - view->surface->current.width) / 2; | ||
259 | } else { | ||
260 | container->surface_x = container->content_x; | ||
261 | } | ||
262 | if (view->surface->current.height < container->height) { | ||
263 | container->surface_y = container->content_y + | ||
264 | (container->content_height - view->surface->current.height) / 2; | ||
265 | } else { | ||
266 | container->surface_y = container->content_y; | ||
267 | } | ||
268 | container->surface_width = view->surface->current.width; | ||
269 | container->surface_height = view->surface->current.height; | ||
270 | } | ||
271 | |||
252 | if (!container->node.destroying) { | 272 | if (!container->node.destroying) { |
253 | container_discover_outputs(container); | 273 | container_discover_outputs(container); |
254 | } | 274 | } |
diff --git a/sway/desktop/xdg_shell.c b/sway/desktop/xdg_shell.c index 007b0a94..b5dcfb0f 100644 --- a/sway/desktop/xdg_shell.c +++ b/sway/desktop/xdg_shell.c | |||
@@ -291,10 +291,9 @@ static void handle_commit(struct wl_listener *listener, void *data) { | |||
291 | wlr_xdg_surface_get_geometry(xdg_surface, &new_geo); | 291 | wlr_xdg_surface_get_geometry(xdg_surface, &new_geo); |
292 | struct sway_container *con = view->container; | 292 | struct sway_container *con = view->container; |
293 | 293 | ||
294 | if ((new_geo.width != con->content_width || | 294 | if ((new_geo.width != con->surface_width || |
295 | new_geo.height != con->content_height) && | 295 | new_geo.height != con->surface_height)) { |
296 | container_is_floating(con)) { | 296 | // The view has unexpectedly sent a new size |
297 | // A floating view has unexpectedly sent a new size | ||
298 | desktop_damage_view(view); | 297 | desktop_damage_view(view); |
299 | view_update_size(view, new_geo.width, new_geo.height); | 298 | view_update_size(view, new_geo.width, new_geo.height); |
300 | memcpy(&view->geometry, &new_geo, sizeof(struct wlr_box)); | 299 | memcpy(&view->geometry, &new_geo, sizeof(struct wlr_box)); |
diff --git a/sway/desktop/xdg_shell_v6.c b/sway/desktop/xdg_shell_v6.c index 386e350e..a7ea163f 100644 --- a/sway/desktop/xdg_shell_v6.c +++ b/sway/desktop/xdg_shell_v6.c | |||
@@ -284,10 +284,9 @@ static void handle_commit(struct wl_listener *listener, void *data) { | |||
284 | wlr_xdg_surface_v6_get_geometry(xdg_surface_v6, &new_geo); | 284 | wlr_xdg_surface_v6_get_geometry(xdg_surface_v6, &new_geo); |
285 | struct sway_container *con = view->container; | 285 | struct sway_container *con = view->container; |
286 | 286 | ||
287 | if ((new_geo.width != con->content_width || | 287 | if ((new_geo.width != con->surface_width || |
288 | new_geo.height != con->content_height) && | 288 | new_geo.height != con->surface_height)) { |
289 | container_is_floating(con)) { | 289 | // The view has unexpectedly sent a new size |
290 | // A floating view has unexpectedly sent a new size | ||
291 | desktop_damage_view(view); | 290 | desktop_damage_view(view); |
292 | view_update_size(view, new_geo.width, new_geo.height); | 291 | view_update_size(view, new_geo.width, new_geo.height); |
293 | memcpy(&view->geometry, &new_geo, sizeof(struct wlr_box)); | 292 | memcpy(&view->geometry, &new_geo, sizeof(struct wlr_box)); |
diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c index d9e1b0a9..e0d307e8 100644 --- a/sway/desktop/xwayland.c +++ b/sway/desktop/xwayland.c | |||
@@ -333,10 +333,9 @@ static void handle_commit(struct wl_listener *listener, void *data) { | |||
333 | get_geometry(view, &new_geo); | 333 | get_geometry(view, &new_geo); |
334 | struct sway_container *con = view->container; | 334 | struct sway_container *con = view->container; |
335 | 335 | ||
336 | if ((new_geo.width != con->content_width || | 336 | if ((new_geo.width != con->surface_width || |
337 | new_geo.height != con->content_height) && | 337 | new_geo.height != con->surface_height)) { |
338 | container_is_floating(con)) { | 338 | // The view has unexpectedly sent a new size |
339 | // A floating view has unexpectedly sent a new size | ||
340 | // eg. The Firefox "Save As" dialog when downloading a file | 339 | // eg. The Firefox "Save As" dialog when downloading a file |
341 | desktop_damage_view(view); | 340 | desktop_damage_view(view); |
342 | view_update_size(view, new_geo.width, new_geo.height); | 341 | view_update_size(view, new_geo.width, new_geo.height); |