mirror of
https://github.com/labwc/labwc.git
synced 2025-11-04 13:30:07 -05:00
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.
This commit is contained in:
parent
df7c47b8d7
commit
5062c5bea3
6 changed files with 22 additions and 30 deletions
|
|
@ -420,7 +420,7 @@ bool output_is_usable(struct output *output);
|
||||||
void output_update_usable_area(struct output *output);
|
void output_update_usable_area(struct output *output);
|
||||||
void output_update_all_usable_areas(struct server *server, bool layout_changed);
|
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_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 handle_output_power_manager_set_mode(struct wl_listener *listener,
|
||||||
void *data);
|
void *data);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -130,11 +130,13 @@ void view_move(struct view *view, int x, int y);
|
||||||
void view_moved(struct view *view);
|
void view_moved(struct view *view);
|
||||||
void view_minimize(struct view *view, bool minimized);
|
void view_minimize(struct view *view, bool minimized);
|
||||||
void view_store_natural_geometry(struct view *view);
|
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_restore_to(struct view *view, struct wlr_box geometry);
|
||||||
void view_set_untiled(struct view *view);
|
void view_set_untiled(struct view *view);
|
||||||
void view_maximize(struct view *view, bool maximize,
|
void view_maximize(struct view *view, bool maximize,
|
||||||
bool store_natural_geometry);
|
bool store_natural_geometry);
|
||||||
|
/* output is optional, defaults to current nearest output */
|
||||||
void view_set_fullscreen(struct view *view, bool fullscreen,
|
void view_set_fullscreen(struct view *view, bool fullscreen,
|
||||||
struct output *output);
|
struct output *output);
|
||||||
void view_toggle_maximize(struct view *view);
|
void view_toggle_maximize(struct view *view);
|
||||||
|
|
|
||||||
|
|
@ -518,14 +518,13 @@ output_usable_area_in_layout_coords(struct output *output)
|
||||||
return box;
|
return box;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct wlr_box
|
struct output *
|
||||||
output_usable_area_from_cursor_coords(struct server *server)
|
output_from_cursor_coords(struct server *server)
|
||||||
{
|
{
|
||||||
struct wlr_output *wlr_output;
|
struct wlr_output *wlr_output;
|
||||||
wlr_output = wlr_output_layout_output_at(server->output_layout,
|
wlr_output = wlr_output_layout_output_at(server->output_layout,
|
||||||
server->seat.cursor->x, server->seat.cursor->y);
|
server->seat.cursor->x, server->seat.cursor->y);
|
||||||
struct output *output = output_from_wlr_output(server, wlr_output);
|
return output_from_wlr_output(server, wlr_output);
|
||||||
return output_usable_area_in_layout_coords(output);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
23
src/view.c
23
src/view.c
|
|
@ -238,19 +238,18 @@ view_output(struct view *view)
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
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) {
|
if (w <= 0 || h <= 0) {
|
||||||
wlr_log(WLR_ERROR, "view has empty geometry, not centering");
|
wlr_log(WLR_ERROR, "view has empty geometry, not centering");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
struct output *output = view_output(view);
|
if (!output_is_usable(output)) {
|
||||||
if (!output) {
|
output = view_output(view);
|
||||||
|
if (!output_is_usable(output)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
struct wlr_output *wlr_output = output->wlr_output;
|
|
||||||
if (!wlr_output) {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct border margin = ssd_get_margin(view->ssd);
|
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.width = LAB_FALLBACK_WIDTH;
|
||||||
view->natural_geometry.height = LAB_FALLBACK_HEIGHT;
|
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.width,
|
||||||
view->natural_geometry.height,
|
view->natural_geometry.height,
|
||||||
&view->natural_geometry.x,
|
&view->natural_geometry.x,
|
||||||
|
|
@ -316,11 +315,11 @@ view_store_natural_geometry(struct view *view)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
view_center(struct view *view)
|
view_center(struct view *view, struct output *output)
|
||||||
{
|
{
|
||||||
assert(view);
|
assert(view);
|
||||||
int x, y;
|
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->pending.height, &x, &y)) {
|
||||||
view_move(view, x, y);
|
view_move(view, x, y);
|
||||||
}
|
}
|
||||||
|
|
@ -337,8 +336,8 @@ view_apply_natural_geometry(struct view *view)
|
||||||
} else {
|
} else {
|
||||||
/* reposition if original geometry is offscreen */
|
/* reposition if original geometry is offscreen */
|
||||||
struct wlr_box box = view->natural_geometry;
|
struct wlr_box box = view->natural_geometry;
|
||||||
if (view_compute_centered_position(view, box.width, box.height,
|
if (view_compute_centered_position(view, NULL, box.width,
|
||||||
&box.x, &box.y)) {
|
box.height, &box.x, &box.y)) {
|
||||||
view_move_resize(view, box);
|
view_move_resize(view, box);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -745,7 +744,7 @@ view_adjust_for_layout_change(struct view *view)
|
||||||
/* reposition view if it's offscreen */
|
/* reposition view if it's offscreen */
|
||||||
if (!wlr_output_layout_intersects(view->server->output_layout,
|
if (!wlr_output_layout_intersects(view->server->output_layout,
|
||||||
NULL, &view->pending)) {
|
NULL, &view->pending)) {
|
||||||
view_center(view);
|
view_center(view, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (view->toplevel.handle) {
|
if (view->toplevel.handle) {
|
||||||
|
|
|
||||||
|
|
@ -278,11 +278,7 @@ position_xdg_toplevel_view(struct view *view)
|
||||||
xdg_toplevel_from_view(view)->parent;
|
xdg_toplevel_from_view(view)->parent;
|
||||||
|
|
||||||
if (!parent_xdg_toplevel) {
|
if (!parent_xdg_toplevel) {
|
||||||
struct wlr_box box =
|
view_center(view, output_from_cursor_coords(view->server));
|
||||||
output_usable_area_from_cursor_coords(view->server);
|
|
||||||
view->current.x = box.x;
|
|
||||||
view->current.y = box.y;
|
|
||||||
view_center(view);
|
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* If child-toplevel-views, we center-align relative to their
|
* If child-toplevel-views, we center-align relative to their
|
||||||
|
|
|
||||||
|
|
@ -440,11 +440,7 @@ set_initial_position(struct view *view,
|
||||||
/* Just make sure the view is on-screen */
|
/* Just make sure the view is on-screen */
|
||||||
view_adjust_for_layout_change(view);
|
view_adjust_for_layout_change(view);
|
||||||
} else {
|
} else {
|
||||||
struct wlr_box box =
|
view_center(view, output_from_cursor_coords(view->server));
|
||||||
output_usable_area_from_cursor_coords(view->server);
|
|
||||||
view->current.x = box.x;
|
|
||||||
view->current.y = box.y;
|
|
||||||
view_center(view);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue