diff --git a/include/view.h b/include/view.h index b1c7b65d..c00de784 100644 --- a/include/view.h +++ b/include/view.h @@ -214,11 +214,10 @@ struct view { */ struct wlr_box natural_geometry; /* - * last_placement represents the last view position set by the user - * before layout changes. output_name and relative_geo are used to - * keep or restore the view position relative to the output and - * layout_geo is used to keep the global position when the output is - * lost. + * last_placement represents the last view position set by the user. + * output_name and relative_geo are used to keep or restore the view + * position relative to the output and layout_geo is used to keep the + * global position when the output is lost. */ struct { char *output_name; @@ -542,7 +541,6 @@ bool view_titlebar_visible(struct view *view); void view_set_ssd_mode(struct view *view, enum lab_ssd_mode mode); void view_set_decorations(struct view *view, enum lab_ssd_mode mode, bool force_ssd); void view_toggle_fullscreen(struct view *view); -void views_save_last_placement(struct server *server); void view_adjust_for_layout_change(struct view *view); void view_move_to_edge(struct view *view, enum lab_edge direction, bool snap_to_windows); void view_grow_to_edge(struct view *view, enum lab_edge direction); diff --git a/src/output.c b/src/output.c index 85968c25..b70861a1 100644 --- a/src/output.c +++ b/src/output.c @@ -190,9 +190,6 @@ handle_output_destroy(struct wl_listener *listener, void *data) output->workspace_osd = NULL; } - /* save the last placement before clearing view->output */ - views_save_last_placement(server); - struct view *view; wl_list_for_each(view, &server->views, link) { if (view->output == output) { @@ -662,7 +659,6 @@ output_config_apply(struct server *server, { bool success = true; server->pending_output_layout_change++; - views_save_last_placement(server); struct wlr_output_configuration_head_v1 *head; wl_list_for_each(head, &config->heads, link) { diff --git a/src/view.c b/src/view.c index 5271404b..40f047b2 100644 --- a/src/view.c +++ b/src/view.c @@ -14,6 +14,7 @@ #include "common/list.h" #include "common/match.h" #include "common/mem.h" +#include "common/string-helpers.h" #include "config/rcxml.h" #include "cycle.h" #include "foreign-toplevel/foreign.h" @@ -577,7 +578,7 @@ view_moved(struct view *view) } } -static void clear_last_placement(struct view *view); +static void save_last_placement(struct view *view); void view_move_resize(struct view *view, struct wlr_box geo) @@ -589,7 +590,7 @@ view_move_resize(struct view *view, struct wlr_box geo) /* * If the move/resize was user-initiated (rather than due to - * output layout change), then invalidate the saved geometry. + * output layout change), then update the last placement info. * * TODO: consider also updating view->output here for floating * views (based on view->pending) rather than waiting until @@ -598,7 +599,7 @@ view_move_resize(struct view *view, struct wlr_box geo) * Not sure if it might have other side-effects though. */ if (!view->adjusting_for_layout_change) { - clear_last_placement(view); + save_last_placement(view); } } @@ -1748,36 +1749,20 @@ save_last_placement(struct view *view) { assert(view); struct output *output = view->output; - /* - * Save the view's geometry if this is the first layout change - * since a user-initiated move/resize. Do not save it again for - * subsequent layout changes, since the point is to be able to - * restore to the original location after multiple changes - * (e.g. output disconnected and then reconnected). - */ - if (!wlr_box_empty(&view->last_placement.layout_geo)) { - return; - } if (!output_is_usable(output)) { wlr_log(WLR_ERROR, "cannot save last placement in unusable output"); return; } - xstrdup_replace(view->last_placement.output_name, output->wlr_output->name); + if (!str_equal(view->last_placement.output_name, output->wlr_output->name)) { + xstrdup_replace(view->last_placement.output_name, + output->wlr_output->name); + } view->last_placement.layout_geo = view->pending; view->last_placement.relative_geo = view->pending; view->last_placement.relative_geo.x -= output->scene_output->x; view->last_placement.relative_geo.y -= output->scene_output->y; } -void -views_save_last_placement(struct server *server) -{ - struct view *view; - wl_list_for_each(view, &server->views, link) { - save_last_placement(view); - } -} - static void clear_last_placement(struct view *view) { @@ -1792,10 +1777,7 @@ view_adjust_for_layout_change(struct view *view) { assert(view); if (wlr_box_empty(&view->last_placement.layout_geo)) { - /* - * views_save_last_placement() should be called before layout - * changes. Not using assert() just in case. - */ + /* Not using assert() just in case */ wlr_log(WLR_ERROR, "view has no last placement info"); return; }