feat: allows fullscreen support

This commit is contained in:
DanyLE
2024-04-02 23:00:11 +02:00
parent 68b1890d61
commit 1ae9cd000a
4 changed files with 65 additions and 93 deletions

74
view.c
View File

@ -155,91 +155,95 @@ void diyac_arrange_all_views(struct diyac_server *server)
bool diyac_view_update_geometry(struct diyac_view *view, bool grabbed)
{
assert(view);
bool adjusted = false;
struct wlr_box geo_box;
struct wlr_box geo_box, intersect_box;
struct wlr_box *geometry = &view->original;
// if (wlr_output_layout_intersects(view->server->output_layout,
// view->output->wlr_output, &view->current))
//{
if (!view->mapped)
{
wlr_xdg_surface_schedule_configure(view->xdg_toplevel->base);
return false;
}
struct wlr_box usable = diyac_output_usable_area(view->output);
wlr_log(WLR_DEBUG, "diyac_view_update_geometry: current: [%d,%d,%d,%d], usable: [%d,%d,%d,%d] ",
geometry->x, geometry->y, geometry->width, geometry->height,
usable.x, usable.y, usable.width, usable.height);
struct diyac_server *server = view->server;
if (!view->mapped)
wlr_box_intersection(&intersect_box,geometry, &usable);
wlr_xdg_surface_get_geometry(view->xdg_toplevel->base, &geo_box);
if ( wlr_box_equal(geometry, &geo_box) && (view->state == view->requested) && wlr_box_empty(&intersect_box))
{
view->state = DIYAC_VIEW_NORMAL;
wlr_log(WLR_INFO, "No geometry update needed");
return false;
}
switch (view->state)
// invalidate old state if change state
if(view->requested != view->state)
{
switch (view->state)
{
case DIYAC_VIEW_MAXIMIZE:
wlr_xdg_toplevel_set_maximized(view->xdg_toplevel, false);
break;
case DIYAC_VIEW_FULL_SCREEN:
wlr_xdg_toplevel_set_fullscreen(view->xdg_toplevel, false);
wlr_scene_node_set_enabled(&view->output->scenes.top->node, true);
break;
default:
break;
}
}
switch (view->requested)
{
case DIYAC_VIEW_MAXIMIZE:
/**
* We dont change the current_view geometry in maximize state
*
*/
wlr_scene_node_set_position(&view->scene_tree->node, usable.x, usable.y);
wlr_xdg_toplevel_set_size(view->xdg_toplevel, usable.width, usable.height);
wlr_xdg_toplevel_set_maximized(view->xdg_toplevel, true);
view->state = DIYAC_VIEW_MAXIMIZE;
return true;
case DIYAC_VIEW_MINIMIZE:
view->state = DIYAC_VIEW_NORMAL;
wlr_log(WLR_INFO, "diyac_view_update_geometry: minimize ignore");
return false;
case DIYAC_VIEW_FULL_SCREEN:
/*TODO: implement full-screen */
//view->state = DIYAC_VIEW_NORMAL;
wlr_log(WLR_INFO, "diyac_view_update_geometry: full-screen ignore");
wlr_scene_node_set_enabled(&view->output->scenes.top->node, false);
wlr_scene_node_set_position(&view->scene_tree->node, 0, 0);
wlr_xdg_toplevel_set_size(view->xdg_toplevel, view->output->wlr_output->width, view->output->wlr_output->height);
view->state = DIYAC_VIEW_FULL_SCREEN;
wlr_xdg_toplevel_set_fullscreen(view->xdg_toplevel, false);
return false;
default:
wlr_xdg_surface_get_geometry(view->xdg_toplevel->base, &geo_box);
if (!wlr_box_equal(geometry, &geo_box))
{
adjusted = true;
}
// if (wlr_output_layout_intersects(view->server->output_layout,
// view->output->wlr_output, &view->current))
//{
/**Normal state, recalculate current geometry*/
view->state = DIYAC_VIEW_NORMAL;
if (!grabbed && geometry->x < usable.x)
{
geometry->x = usable.x;
adjusted = true;
}
if (!grabbed && geometry->y < usable.y)
{
geometry->y = usable.y;
adjusted = true;
}
if (grabbed && server->seat.cursor->x <= usable.x)
{
geometry->x = usable.x - server->grab_x;
adjusted = true;
}
if (grabbed && server->seat.cursor->y <= usable.y)
{
geometry->y = usable.y;
adjusted = true;
}
if (grabbed && server->seat.cursor->x >= usable.x + usable.width)
{
geometry->x = usable.x + usable.width - server->grab_x;
adjusted = true;
}
if (grabbed && server->seat.cursor->y >= usable.y + usable.height)
{
geometry->y = usable.y + usable.height - server->grab_y;
adjusted = true;
}
if (adjusted)
{
wlr_log(WLR_DEBUG, "diyac_view_update_geometry: updating geometry: %d %d %d %d", geometry->x, geometry->y, geometry->width, geometry->height);
wlr_scene_node_set_position(&view->scene_tree->node, geometry->x, geometry->y);
wlr_xdg_toplevel_set_size(view->xdg_toplevel, geometry->width, geometry->height);
}
return adjusted;
wlr_log(WLR_DEBUG, "diyac_view_update_geometry: updating geometry: %d %d %d %d", geometry->x, geometry->y, geometry->width, geometry->height);
wlr_scene_node_set_position(&view->scene_tree->node, geometry->x, geometry->y);
wlr_xdg_toplevel_set_size(view->xdg_toplevel, geometry->width, geometry->height);
return true;
}
}