better handling different window state, support fullscreen mode
This commit is contained in:
124
view.c
124
view.c
@@ -172,72 +172,84 @@ bool diyac_view_update_geometry(struct diyac_view *view, bool grabbed)
|
||||
struct diyac_server *server = view->server;
|
||||
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))
|
||||
if ( wlr_box_equal(geometry, &geo_box) && diyac_view_state_equal(view->state,view->requested) && wlr_box_empty(&intersect_box))
|
||||
{
|
||||
wlr_log(WLR_INFO, "No geometry update needed");
|
||||
return false;
|
||||
}
|
||||
// invalidate old state if change state
|
||||
if(view->requested != view->state)
|
||||
// invalidate old state if change state
|
||||
if(view->state.fullscreen && !view->requested.fullscreen)
|
||||
{
|
||||
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;
|
||||
}
|
||||
wlr_xdg_toplevel_set_fullscreen(view->xdg_toplevel, false);
|
||||
wlr_scene_node_set_enabled(&view->output->scenes.top->node, true);
|
||||
view->state.fullscreen = false;
|
||||
}
|
||||
switch (view->requested)
|
||||
if(view->state.maximized && !view->requested.maximized)
|
||||
{
|
||||
wlr_xdg_toplevel_set_maximized(view->xdg_toplevel, false);
|
||||
view->state.maximized = false;
|
||||
}
|
||||
view->state = view->requested;
|
||||
|
||||
if(view->requested.minimized)
|
||||
{
|
||||
// TODO implement minimize
|
||||
return false;
|
||||
}
|
||||
else if(view->requested.fullscreen)
|
||||
{
|
||||
case DIYAC_VIEW_MAXIMIZE:
|
||||
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_FULL_SCREEN:
|
||||
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:
|
||||
return true;
|
||||
}
|
||||
else if(view->requested.maximized)
|
||||
{
|
||||
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);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 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)
|
||||
struct diyac_view * root = diyac_get_root_view(view);
|
||||
if(!root)
|
||||
{
|
||||
geometry->x = usable.x;
|
||||
root = view;
|
||||
}
|
||||
if (!grabbed && geometry->y < usable.y)
|
||||
if(!root->state.fullscreen)
|
||||
{
|
||||
geometry->y = usable.y;
|
||||
}
|
||||
if (grabbed && server->seat.cursor->x <= usable.x)
|
||||
{
|
||||
geometry->x = usable.x - server->grab_x;
|
||||
}
|
||||
if (grabbed && server->seat.cursor->y <= usable.y)
|
||||
{
|
||||
geometry->y = usable.y;
|
||||
}
|
||||
if (grabbed && 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)
|
||||
{
|
||||
geometry->y = usable.y + usable.height - server->grab_y;
|
||||
// Only adjust position only when not in fullscreen mode
|
||||
|
||||
if (!grabbed && geometry->x < usable.x)
|
||||
{
|
||||
geometry->x = usable.x;
|
||||
}
|
||||
if (!grabbed && geometry->y < usable.y)
|
||||
{
|
||||
geometry->y = usable.y;
|
||||
}
|
||||
if (grabbed && server->seat.cursor->x <= usable.x)
|
||||
{
|
||||
geometry->x = usable.x - server->grab_x;
|
||||
}
|
||||
if (grabbed && server->seat.cursor->y <= usable.y)
|
||||
{
|
||||
geometry->y = usable.y;
|
||||
}
|
||||
if (grabbed && 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)
|
||||
{
|
||||
geometry->y = usable.y + usable.height - server->grab_y;
|
||||
}
|
||||
}
|
||||
|
||||
wlr_log(WLR_DEBUG, "diyac_view_update_geometry: updating geometry: %d %d %d %d", geometry->x, geometry->y, geometry->width, geometry->height);
|
||||
@@ -282,14 +294,14 @@ 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;
|
||||
switch(view->state)
|
||||
if(view->state.fullscreen)
|
||||
{
|
||||
case DIYAC_VIEW_FULL_SCREEN:
|
||||
wlr_output_layout_get_box(view->server->output_layout, view->output->wlr_output, &box);
|
||||
return box;
|
||||
case DIYAC_VIEW_MAXIMIZE:
|
||||
return view->output->usable_area;
|
||||
default:
|
||||
return view->original;
|
||||
wlr_output_layout_get_box(view->server->output_layout, view->output->wlr_output, &box);
|
||||
return box;
|
||||
}
|
||||
if(view->state.maximized)
|
||||
{
|
||||
return view->output->usable_area;
|
||||
}
|
||||
return view->original;
|
||||
}
|
Reference in New Issue
Block a user