Fullscreen support

This commit is contained in:
Keith Bowes 2024-01-01 20:18:51 -05:00
parent b5f4055904
commit b274485c9c
2 changed files with 20 additions and 9 deletions

View file

@ -105,8 +105,10 @@ static struct wb_layer_surface *wb_layer_surface_create(
static void handle_surface_commit(struct wl_listener *listener, void *data) { static void handle_surface_commit(struct wl_listener *listener, void *data) {
struct wb_layer_surface *surface = struct wb_layer_surface *surface =
wl_container_of(listener, surface, surface_commit); wl_container_of(listener, surface, surface_commit);
struct wb_toplevel *current_toplevel =
wl_container_of(surface->server->toplevels.next, current_toplevel, link);
if (!surface->output) { if (!surface->output || current_toplevel->xdg_toplevel->current.fullscreen) {
return; return;
} }

View file

@ -166,17 +166,26 @@ static void xdg_toplevel_destroy(struct wl_listener *listener, void *data) {
static void xdg_toplevel_request_fullscreen( static void xdg_toplevel_request_fullscreen(
struct wl_listener *listener, void *data) { struct wl_listener *listener, void *data) {
/* This event is raised when a client would like to set itself to /* This event is raised when a client would like to set itself to
* fullscreen. waybox currently doesn't support fullscreen, but to * fullscreen. */
* conform to xdg-shell protocol we still must send a configure.
* wlr_xdg_surface_schedule_configure() is used to send an empty reply. However, if the
* request was sent before an initial commit, we don't do anything and let the client finish
* the initial surface setup.
*/
struct wb_toplevel *toplevel = struct wb_toplevel *toplevel =
wl_container_of(listener, toplevel, request_fullscreen); wl_container_of(listener, toplevel, request_fullscreen);
if (toplevel->xdg_toplevel->base->initialized) { bool is_fullscreen = toplevel->xdg_toplevel->current.fullscreen;
wlr_xdg_surface_schedule_configure(toplevel->xdg_toplevel->base); if (!is_fullscreen) {
struct wlr_output *wlr_output = get_active_output(toplevel);
struct wb_output *output = wlr_output->data;
toplevel->previous_geometry = toplevel->geometry;
toplevel->geometry.x = 0;
toplevel->geometry.y = 0;
toplevel->geometry.height = output->geometry.height;
toplevel->geometry.width = output->geometry.width;
wlr_scene_node_raise_to_top(&toplevel->scene_tree->node);
} else {
toplevel->geometry = toplevel->previous_geometry;
} }
wlr_xdg_toplevel_set_size(toplevel->xdg_toplevel, toplevel->geometry.width, toplevel->geometry.height);
wlr_xdg_toplevel_set_fullscreen(toplevel->xdg_toplevel, !is_fullscreen);
wlr_scene_node_set_position(&toplevel->scene_tree->node, toplevel->geometry.x, toplevel->geometry.y);
} }
static void xdg_toplevel_request_maximize(struct wl_listener *listener, void *data) { static void xdg_toplevel_request_maximize(struct wl_listener *listener, void *data) {