improve basic multi output support

This commit is contained in:
DanyLE
2024-04-15 13:56:11 +02:00
parent 7df1dec7f3
commit fdb2843561
9 changed files with 100 additions and 202 deletions

61
view.c
View File

@ -195,13 +195,22 @@ bool diyac_view_update_geometry(struct diyac_view *view, bool grabbed)
// if (wlr_output_layout_intersects(view->server->output_layout,
// view->output->wlr_output, &view->current))
//{
if (!view->mapped)
if (!view->mapped || !view->output)
{
wlr_xdg_surface_schedule_configure(view->xdg_toplevel->base);
return false;
}
struct wlr_box usable = diyac_output_usable_area(view->output);
struct diyac_view *root = diyac_get_root_view(view);
struct diyac_server *server = view->server;
struct wlr_box usable = {0};
if((root && root->state.fullscreen) || view->requested.fullscreen)
{
diyac_output_full_area(view->output, &usable);
}
else
{
diyac_output_usable_area(view->output, &usable);
}
// invalidate old state if change state
if (view->state.fullscreen && !view->requested.fullscreen)
{
@ -232,21 +241,13 @@ bool diyac_view_update_geometry(struct diyac_view *view, bool grabbed)
}
else if (!view->state.fullscreen && view->requested.fullscreen)
{
struct wlr_box box = {0};
wlr_output_effective_resolution(view->output->wlr_output,
&box.width, &box.height);
double ox = 0, oy = 0;
wlr_output_layout_output_coords(view->server->output_layout,
view->output->wlr_output, &ox, &oy);
box.x -= ox;
box.y -= oy;
wlr_xdg_toplevel_set_fullscreen(view->xdg_toplevel, true);
wlr_scene_node_set_enabled(&view->output->scenes.top->node, false);
if (view->toplevel.handle)
{
wlr_foreign_toplevel_handle_v1_set_fullscreen(view->toplevel.handle, true);
}
diyac_view_configure(view, box);
diyac_view_configure(view, usable);
updated = true;
}
else if (view->requested.maximized)
@ -265,38 +266,42 @@ bool diyac_view_update_geometry(struct diyac_view *view, bool grabbed)
// view->output->wlr_output, &view->current))
//{
/**Normal state, recalculate current geometry*/
struct diyac_view *root = diyac_get_root_view(view);
struct wlr_box geometry = view->pending_size;
if (!root)
// Only adjust position only when not in fullscreen mode
if(!grabbed)
{
root = view;
}
if (!root->state.fullscreen)
{
// Only adjust position only when not in fullscreen mode
if (!grabbed && geometry.x < usable.x)
if (geometry.x > (usable.x + usable.width))
{
geometry.x = (usable.x + usable.width) - (geometry.width / 2);
}
if (geometry.y > (usable.y + usable.height))
{
geometry.y = (usable.y + usable.height) - (geometry.height / 2);
}
if (geometry.x < usable.x)
{
geometry.x = usable.x;
}
if (!grabbed && geometry.y < usable.y)
if (geometry.y < usable.y)
{
geometry.y = usable.y;
}
if (grabbed && server->seat.cursor->x <= usable.x)
}
else
{
if (server->seat.cursor->x <= usable.x)
{
geometry.x = usable.x - server->grab_x;
}
if (grabbed && server->seat.cursor->y <= usable.y)
if (server->seat.cursor->y <= usable.y)
{
geometry.y = usable.y;
}
if (grabbed && server->seat.cursor->x >= usable.x + usable.width)
if (server->seat.cursor->x >= usable.x + usable.width)
{
geometry.x = usable.x + usable.width - server->grab_x;
}
if (grabbed && server->seat.cursor->y >= usable.y + usable.height)
if (server->seat.cursor->y >= usable.y + usable.height)
{
geometry.y = usable.y + usable.height - server->grab_y;
}
@ -349,12 +354,12 @@ struct diyac_view *diyac_get_root_view(struct diyac_view *view)
struct wlr_box diyac_view_get_geometry(struct diyac_view *view)
{
struct wlr_box box;
if (view->state.fullscreen)
if (view->state.fullscreen && view->output)
{
wlr_output_layout_get_box(view->server->output_layout, view->output->wlr_output, &box);
return box;
}
if (view->state.maximized)
if (view->state.maximized && view->output)
{
return view->output->usable_area;
}