From 5062c5bea33c0595446f6c6d5bfc8ee8f2cd98ff Mon Sep 17 00:00:00 2001 From: John Lindgren Date: Sat, 18 Feb 2023 00:23:19 -0500 Subject: [PATCH] view: Add optional output parameter to view_center() Allows centering the view on a specific output without the workaround of overwriting view->current.x/y. --- include/labwc.h | 2 +- include/view.h | 4 +++- src/output.c | 7 +++---- src/view.c | 27 +++++++++++++-------------- src/xdg.c | 6 +----- src/xwayland.c | 6 +----- 6 files changed, 22 insertions(+), 30 deletions(-) diff --git a/include/labwc.h b/include/labwc.h index 99aafb4c..85097924 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -420,7 +420,7 @@ bool output_is_usable(struct output *output); void output_update_usable_area(struct output *output); void output_update_all_usable_areas(struct server *server, bool layout_changed); struct wlr_box output_usable_area_in_layout_coords(struct output *output); -struct wlr_box output_usable_area_from_cursor_coords(struct server *server); +struct output *output_from_cursor_coords(struct server *server); void handle_output_power_manager_set_mode(struct wl_listener *listener, void *data); diff --git a/include/view.h b/include/view.h index b790baea..777056c8 100644 --- a/include/view.h +++ b/include/view.h @@ -130,11 +130,13 @@ void view_move(struct view *view, int x, int y); void view_moved(struct view *view); void view_minimize(struct view *view, bool minimized); void view_store_natural_geometry(struct view *view); -void view_center(struct view *view); +/* output is optional, defaults to current nearest output */ +void view_center(struct view *view, struct output *output); void view_restore_to(struct view *view, struct wlr_box geometry); void view_set_untiled(struct view *view); void view_maximize(struct view *view, bool maximize, bool store_natural_geometry); +/* output is optional, defaults to current nearest output */ void view_set_fullscreen(struct view *view, bool fullscreen, struct output *output); void view_toggle_maximize(struct view *view); diff --git a/src/output.c b/src/output.c index 53218508..efbd14ef 100644 --- a/src/output.c +++ b/src/output.c @@ -518,14 +518,13 @@ output_usable_area_in_layout_coords(struct output *output) return box; } -struct wlr_box -output_usable_area_from_cursor_coords(struct server *server) +struct output * +output_from_cursor_coords(struct server *server) { struct wlr_output *wlr_output; wlr_output = wlr_output_layout_output_at(server->output_layout, server->seat.cursor->x, server->seat.cursor->y); - struct output *output = output_from_wlr_output(server, wlr_output); - return output_usable_area_in_layout_coords(output); + return output_from_wlr_output(server, wlr_output); } void diff --git a/src/view.c b/src/view.c index 6e2af1e1..591595b5 100644 --- a/src/view.c +++ b/src/view.c @@ -238,19 +238,18 @@ view_output(struct view *view) } static bool -view_compute_centered_position(struct view *view, int w, int h, int *x, int *y) +view_compute_centered_position(struct view *view, struct output *output, + int w, int h, int *x, int *y) { if (w <= 0 || h <= 0) { wlr_log(WLR_ERROR, "view has empty geometry, not centering"); return false; } - struct output *output = view_output(view); - if (!output) { - return false; - } - struct wlr_output *wlr_output = output->wlr_output; - if (!wlr_output) { - return false; + if (!output_is_usable(output)) { + output = view_output(view); + if (!output_is_usable(output)) { + return false; + } } struct border margin = ssd_get_margin(view->ssd); @@ -284,7 +283,7 @@ set_fallback_geometry(struct view *view) { view->natural_geometry.width = LAB_FALLBACK_WIDTH; view->natural_geometry.height = LAB_FALLBACK_HEIGHT; - view_compute_centered_position(view, + view_compute_centered_position(view, NULL, view->natural_geometry.width, view->natural_geometry.height, &view->natural_geometry.x, @@ -316,11 +315,11 @@ view_store_natural_geometry(struct view *view) } void -view_center(struct view *view) +view_center(struct view *view, struct output *output) { assert(view); int x, y; - if (view_compute_centered_position(view, view->pending.width, + if (view_compute_centered_position(view, output, view->pending.width, view->pending.height, &x, &y)) { view_move(view, x, y); } @@ -337,8 +336,8 @@ view_apply_natural_geometry(struct view *view) } else { /* reposition if original geometry is offscreen */ struct wlr_box box = view->natural_geometry; - if (view_compute_centered_position(view, box.width, box.height, - &box.x, &box.y)) { + if (view_compute_centered_position(view, NULL, box.width, + box.height, &box.x, &box.y)) { view_move_resize(view, box); } } @@ -745,7 +744,7 @@ view_adjust_for_layout_change(struct view *view) /* reposition view if it's offscreen */ if (!wlr_output_layout_intersects(view->server->output_layout, NULL, &view->pending)) { - view_center(view); + view_center(view, NULL); } } if (view->toplevel.handle) { diff --git a/src/xdg.c b/src/xdg.c index 1c185eeb..c9e1a3c3 100644 --- a/src/xdg.c +++ b/src/xdg.c @@ -278,11 +278,7 @@ position_xdg_toplevel_view(struct view *view) xdg_toplevel_from_view(view)->parent; if (!parent_xdg_toplevel) { - struct wlr_box box = - output_usable_area_from_cursor_coords(view->server); - view->current.x = box.x; - view->current.y = box.y; - view_center(view); + view_center(view, output_from_cursor_coords(view->server)); } else { /* * If child-toplevel-views, we center-align relative to their diff --git a/src/xwayland.c b/src/xwayland.c index 0e3b6165..8f94b105 100644 --- a/src/xwayland.c +++ b/src/xwayland.c @@ -440,11 +440,7 @@ set_initial_position(struct view *view, /* Just make sure the view is on-screen */ view_adjust_for_layout_change(view); } else { - struct wlr_box box = - output_usable_area_from_cursor_coords(view->server); - view->current.x = box.x; - view->current.y = box.y; - view_center(view); + view_center(view, output_from_cursor_coords(view->server)); } }