view: adjust views safety following layout change

Refactor view_adjust_for_layout_change() in order to:

- Use view_maximize() - otherwise the unmaximized geometry remains off
  the screen.
- Avoid relying on view_apply_maximized_geometry() to handle missing
  output

Issue #194
This commit is contained in:
Johan Malm 2022-01-07 22:01:44 +00:00
parent be89478f7a
commit ab07b68d7e

View file

@ -166,6 +166,10 @@ static void
view_apply_maximized_geometry(struct view *view) view_apply_maximized_geometry(struct view *view)
{ {
struct output *output = view_output(view); struct output *output = view_output(view);
if (!output) {
wlr_log(WLR_ERROR, "view %p has no output", view);
return;
}
struct wlr_box box = output_usable_area_in_layout_coords(output); struct wlr_box box = output_usable_area_in_layout_coords(output);
if (box.height == output->wlr_output->height && output->wlr_output->scale != 1) { if (box.height == output->wlr_output->height && output->wlr_output->scale != 1) {
box.height /= output->wlr_output->scale; box.height /= output->wlr_output->scale;
@ -315,19 +319,26 @@ view_adjust_for_layout_change(struct view *view)
if (wlr_output_layout_get(layout, view->fullscreen)) { if (wlr_output_layout_get(layout, view->fullscreen)) {
/* recompute fullscreen geometry */ /* recompute fullscreen geometry */
view_apply_fullscreen_geometry(view, view->fullscreen); view_apply_fullscreen_geometry(view, view->fullscreen);
return;
} else { } else {
/* output is gone, exit fullscreen */ /* output is gone, exit fullscreen */
view_set_fullscreen(view, false, NULL); view_set_fullscreen(view, false, NULL);
} }
} else if (view->maximized) { }
/* recompute maximized geometry */
view_apply_maximized_geometry(view); bool was_maximized = view->maximized;
} else { if (was_maximized) {
view_maximize(view, false);
}
/* reposition view if it's offscreen */ /* reposition view if it's offscreen */
struct wlr_box box = { view->x, view->y, view->w, view->h }; struct wlr_box box = { view->x, view->y, view->w, view->h };
if (!wlr_output_layout_intersects(layout, NULL, &box)) { if (!wlr_output_layout_intersects(layout, NULL, &box)) {
view_center(view); view_center(view);
} }
if (was_maximized) {
view_maximize(view, true);
} }
} }