]> git.mdlowis.com Git - proto/labwc.git/commitdiff
xdg,xwayland: Set initial output for views
authorJohn Lindgren <john@jlindgren.net>
Fri, 3 Feb 2023 19:45:04 +0000 (14:45 -0500)
committerJohan Malm <johanmalm@users.noreply.github.com>
Sun, 5 Mar 2023 08:44:03 +0000 (08:44 +0000)
src/xdg.c
src/xwayland.c

index 11785d15ff85e77236153b42c54eed486a017ce6..665fab1223bac828de3da20711004ba47ecb06e0 100644 (file)
--- a/src/xdg.c
+++ b/src/xdg.c
@@ -178,6 +178,9 @@ static void
 handle_request_maximize(struct wl_listener *listener, void *data)
 {
        struct view *view = wl_container_of(listener, view, request_maximize);
+       if (!view->mapped && !view->output) {
+               view->output = output_nearest_to_cursor(view->server);
+       }
        view_maximize(view, xdg_toplevel_from_view(view)->requested.maximized,
                /*store_natural_geometry*/ true);
 }
@@ -186,6 +189,9 @@ static void
 handle_request_fullscreen(struct wl_listener *listener, void *data)
 {
        struct view *view = wl_container_of(listener, view, request_fullscreen);
+       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);
@@ -317,6 +323,9 @@ xdg_toplevel_view_map(struct view *view)
                return;
        }
        view->mapped = true;
+       if (!view->output) {
+               view->output = output_nearest_to_cursor(view->server);
+       }
        struct wlr_xdg_surface *xdg_surface = xdg_surface_from_view(view);
        view->surface = xdg_surface->surface;
        wlr_scene_node_set_enabled(&view->scene_tree->node, true);
index 07c91f65cfe18ff74d3185835801bfc4336d6f01..4b7c29587c78a3c8b93054f13554e5dce29783df 100644 (file)
@@ -74,7 +74,7 @@ xwayland_surface_from_view(struct view *view)
 }
 
 static void
-ensure_initial_geometry(struct view *view)
+ensure_initial_geometry_and_output(struct view *view)
 {
        if (wlr_box_empty(&view->current)) {
                struct wlr_xwayland_surface *xwayland_surface =
@@ -91,6 +91,13 @@ ensure_initial_geometry(struct view *view)
                        view->pending = view->current;
                }
        }
+       if (!view->output) {
+               /*
+                * Just use the cursor output since we don't know yet
+                * whether the surface position is meaningful.
+                */
+               view->output = output_nearest_to_cursor(view->server);
+       }
 }
 
 static bool
@@ -286,8 +293,8 @@ static void
 handle_request_maximize(struct wl_listener *listener, void *data)
 {
        struct view *view = wl_container_of(listener, view, request_maximize);
-       if (!view->been_mapped) {
-               ensure_initial_geometry(view);
+       if (!view->mapped) {
+               ensure_initial_geometry_and_output(view);
                /*
                 * Set decorations early to avoid changing geometry
                 * after maximize (reduces visual glitches).
@@ -303,8 +310,8 @@ handle_request_fullscreen(struct wl_listener *listener, void *data)
 {
        struct view *view = wl_container_of(listener, view, request_fullscreen);
        bool fullscreen = xwayland_surface_from_view(view)->fullscreen;
-       if (!view->been_mapped) {
-               ensure_initial_geometry(view);
+       if (!view->mapped) {
+               ensure_initial_geometry_and_output(view);
        }
        view_set_fullscreen(view, fullscreen, NULL);
 }
@@ -417,7 +424,7 @@ xwayland_view_map(struct view *view)
                return;
        }
        view->mapped = true;
-       ensure_initial_geometry(view);
+       ensure_initial_geometry_and_output(view);
        wlr_scene_node_set_enabled(&view->scene_tree->node, true);
        struct wlr_xwayland_surface *xwayland_surface =
                xwayland_surface_from_view(view);