feat: allows fullscreen support
This commit is contained in:
74
view.c
74
view.c
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user