From 1b30edc778d597e06d74c7fbec62c7a8b13fab4e Mon Sep 17 00:00:00 2001 From: bi4k8 Date: Sat, 17 Dec 2022 20:47:46 +0000 Subject: [PATCH] don't set view->w and view->h when mapping xdg views these should only be set on commit. doing so before then confuses code that expects these fields to be in sync with the scene tree, such as `handle_commit`. these were only being set so that `view_center` could read them to compute a centered position, so instead we can simply forward the values directly to `view_compute_centered_position` and `view_move`. --- include/view.h | 3 +++ src/view.c | 2 +- src/xdg.c | 17 +++++++++++++---- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/include/view.h b/include/view.h index 1cbe8b22..f65f7f90 100644 --- a/include/view.h +++ b/include/view.h @@ -159,6 +159,9 @@ void view_reload_ssd(struct view *view); void view_impl_map(struct view *view); void view_adjust_size(struct view *view, int *w, int *h); +bool view_compute_centered_position(struct view *view, int w, int h, + int *x, int *y); + void view_on_output_destroy(struct view *view); void view_destroy(struct view *view); diff --git a/src/view.c b/src/view.c index b7a87a95..b367045e 100644 --- a/src/view.c +++ b/src/view.c @@ -267,7 +267,7 @@ view_output(struct view *view) return output_from_wlr_output(view->server, wlr_output); } -static bool +bool view_compute_centered_position(struct view *view, int w, int h, int *x, int *y) { struct output *output = view_output(view); diff --git a/src/xdg.c b/src/xdg.c index 6ae53993..0f5e8b52 100644 --- a/src/xdg.c +++ b/src/xdg.c @@ -285,10 +285,19 @@ position_xdg_toplevel_view(struct view *view) output_usable_area_from_cursor_coords(view->server); view->x = box.x; view->y = box.y; - view->w = xdg_surface->current.geometry.width; - view->h = xdg_surface->current.geometry.height; - if (view->w && view->h) { - view_center(view); + + /* Center the view without touching its w and h fields. This means we + * can't simply set w/h and call view_center(). w and h fields should + * only be modified at commit, or they will not be in sync with the + * scene tree + */ + int w = xdg_surface->current.geometry.width; + int h = xdg_surface->current.geometry.height; + if (w && h) { + int x, y; + if (view_compute_centered_position(view, w, h, &x, &y)) { + view_move(view, x, y); + } } } else { /*