aboutsummaryrefslogtreecommitdiffstats
path: root/sway/desktop
diff options
context:
space:
mode:
Diffstat (limited to 'sway/desktop')
-rw-r--r--sway/desktop/render.c9
-rw-r--r--sway/desktop/transaction.c20
-rw-r--r--sway/desktop/xdg_shell.c7
-rw-r--r--sway/desktop/xdg_shell_v6.c7
-rw-r--r--sway/desktop/xwayland.c7
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);