diff --git a/include/view.h b/include/view.h index cd64a694..3bcad7b6 100644 --- a/include/view.h +++ b/include/view.h @@ -138,9 +138,7 @@ void view_restore_to(struct view *view, struct wlr_box geometry); void view_set_untiled(struct view *view); void view_maximize(struct view *view, bool maximize, bool store_natural_geometry); -/* output is optional, defaults to current nearest output */ -void view_set_fullscreen(struct view *view, bool fullscreen, - struct output *output); +void view_set_fullscreen(struct view *view, bool fullscreen); void view_toggle_maximize(struct view *view); void view_toggle_decorations(struct view *view); void view_toggle_always_on_top(struct view *view); diff --git a/src/foreign.c b/src/foreign.c index 9a576b16..9b7c324d 100644 --- a/src/foreign.c +++ b/src/foreign.c @@ -25,7 +25,7 @@ handle_request_fullscreen(struct wl_listener *listener, void *data) { struct view *view = wl_container_of(listener, view, toplevel.fullscreen); struct wlr_foreign_toplevel_handle_v1_fullscreen_event *event = data; - view_set_fullscreen(view, event->fullscreen, NULL); + view_set_fullscreen(view, event->fullscreen); } static void diff --git a/src/view.c b/src/view.c index dbcbe2f4..f10e0143 100644 --- a/src/view.c +++ b/src/view.c @@ -687,7 +687,7 @@ void view_toggle_fullscreen(struct view *view) { assert(view); - view_set_fullscreen(view, !view->fullscreen, NULL); + view_set_fullscreen(view, !view->fullscreen); } /* For internal use only. Does not update geometry. */ @@ -722,19 +722,17 @@ set_fullscreen(struct view *view, bool fullscreen) } void -view_set_fullscreen(struct view *view, bool fullscreen, struct output *output) +view_set_fullscreen(struct view *view, bool fullscreen) { assert(view); if (fullscreen == view->fullscreen) { return; } if (fullscreen) { + struct output *output = view_output(view); if (!output_is_usable(output)) { - output = view_output(view); - if (!output_is_usable(output)) { - /* Prevent fullscreen with no available outputs */ - return; - } + /* Prevent fullscreen with no available outputs */ + return; } /* * Fullscreen via keybind or client request cancels diff --git a/src/xdg.c b/src/xdg.c index 665fab12..7123ce58 100644 --- a/src/xdg.c +++ b/src/xdg.c @@ -185,6 +185,24 @@ handle_request_maximize(struct wl_listener *listener, void *data) /*store_natural_geometry*/ true); } +static void +set_fullscreen_from_request(struct view *view, + struct wlr_xdg_toplevel_requested *requested) +{ + if (!view->fullscreen && requested->fullscreen + && requested->fullscreen_output) { + struct output *output = output_from_wlr_output(view->server, + requested->fullscreen_output); + if (output_is_usable(output)) { + view->output = output; + } else { + wlr_log(WLR_ERROR, + "invalid output in fullscreen request"); + } + } + view_set_fullscreen(view, requested->fullscreen); +} + static void handle_request_fullscreen(struct wl_listener *listener, void *data) { @@ -192,10 +210,8 @@ handle_request_fullscreen(struct wl_listener *listener, void *data) if (!view->mapped && !view->output) { view->output = output_nearest_to_cursor(view->server); } - struct wlr_xdg_toplevel *xdg_toplevel = xdg_toplevel_from_view(view); - struct output *output = output_from_wlr_output(view->server, - xdg_toplevel->requested.fullscreen_output); - view_set_fullscreen(view, xdg_toplevel->requested.fullscreen, output); + set_fullscreen_from_request(view, + &xdg_toplevel_from_view(view)->requested); } static void @@ -361,9 +377,7 @@ xdg_toplevel_view_map(struct view *view) } if (!view->fullscreen && requested->fullscreen) { - struct output *output = output_from_wlr_output( - view->server, requested->fullscreen_output); - view_set_fullscreen(view, true, output); + set_fullscreen_from_request(view, requested); } else if (!view->maximized && requested->maximized) { view_maximize(view, true, /*store_natural_geometry*/ true); diff --git a/src/xwayland.c b/src/xwayland.c index 4b7c2958..5235cd57 100644 --- a/src/xwayland.c +++ b/src/xwayland.c @@ -313,7 +313,7 @@ handle_request_fullscreen(struct wl_listener *listener, void *data) if (!view->mapped) { ensure_initial_geometry_and_output(view); } - view_set_fullscreen(view, fullscreen, NULL); + view_set_fullscreen(view, fullscreen); } static void @@ -429,7 +429,7 @@ xwayland_view_map(struct view *view) struct wlr_xwayland_surface *xwayland_surface = xwayland_surface_from_view(view); if (!view->fullscreen && xwayland_surface->fullscreen) { - view_set_fullscreen(view, true, NULL); + view_set_fullscreen(view, true); } if (view->surface != xwayland_surface->surface) {