improve basic multi output support
This commit is contained in:
61
view.c
61
view.c
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user