]> git.mdlowis.com Git - proto/labwc.git/commitdiff
xdg: Set view->output prior to view_set_fullscreen()
authorJohn Lindgren <john@jlindgren.net>
Mon, 20 Feb 2023 18:36:15 +0000 (13:36 -0500)
committerJohan Malm <johanmalm@users.noreply.github.com>
Sun, 5 Mar 2023 08:44:03 +0000 (08:44 +0000)
include/view.h
src/foreign.c
src/view.c
src/xdg.c
src/xwayland.c

index cd64a69449ffbef01266dcb59bdb610c9f06ac3c..3bcad7b6e2d6383d599b9d39f9187630487a919a 100644 (file)
@@ -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);
index 9a576b16ed45d1dd873bbe7e2f21e021dcf4b066..9b7c324d6cef99e89f2750e43818fbb916aecbb8 100644 (file)
@@ -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
index dbcbe2f4253be4eb8ef6483b8e98128e6e090458..f10e014376b142aa8d06558d1df0ef45d80e518c 100644 (file)
@@ -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
index 665fab1223bac828de3da20711004ba47ecb06e0..7123ce58ee88f43aa9db03590cda50d174c437e2 100644 (file)
--- 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);
index 4b7c29587c78a3c8b93054f13554e5dce29783df..5235cd5750bc0ba16e8341dad2bef63fbae05889 100644 (file)
@@ -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) {