]> git.mdlowis.com Git - proto/labwc.git/commitdiff
view: assign output on surface creation instead of mapping...
authorAndrew J. Hesford <ajh@sideband.org>
Wed, 17 Jan 2024 18:12:35 +0000 (13:12 -0500)
committerJohan Malm <johanmalm@users.noreply.github.com>
Wed, 17 Jan 2024 21:07:33 +0000 (21:07 +0000)
...and notify the client of the preferred output scale when doing so.
This should allow clients to better determine an optimal size if they
are initially configured (unmapped) with zero size.

In particular, this fixes an issue with foot:

    https://codeberg.org/dnkl/foot/issues/1579

src/xdg.c

index 6497837a7f6fcbffc889713042053b6ffde14071..5787836bc9957327fa85e5e9d467d802773be6fd 100644 (file)
--- a/src/xdg.c
+++ b/src/xdg.c
@@ -1,6 +1,8 @@
 // SPDX-License-Identifier: GPL-2.0-only
 
 #include <assert.h>
+#include <wlr/types/wlr_fractional_scale_v1.h>
+
 #include "common/macros.h"
 #include "common/mem.h"
 #include "decorations.h"
@@ -483,7 +485,13 @@ xdg_toplevel_view_map(struct view *view)
        if (view->mapped) {
                return;
        }
+
        view->mapped = true;
+
+       /*
+        * An output should have been chosen when the surface was first
+        * created, but take one more opportunity to assign an output if not.
+        */
        if (!view->output) {
                view_set_output(view, output_nearest_to_cursor(view->server));
        }
@@ -641,6 +649,17 @@ xdg_surface_new(struct wl_listener *listener, void *data)
        view->impl = &xdg_toplevel_view_impl;
        xdg_toplevel_view->xdg_surface = xdg_surface;
 
+       /*
+        * Pick an output for the surface as soon as its created, so that the
+        * client can be notified about any fractional scale before it is given
+        * the chance to configure itself (and possibly pick its dimensions).
+        */
+       view_set_output(view, output_nearest_to_cursor(server));
+       if (view->output) {
+               wlr_fractional_scale_v1_notify_scale(xdg_surface->surface,
+                       view->output->wlr_output->scale);
+       }
+
        view->workspace = server->workspace_current;
        view->scene_tree = wlr_scene_tree_create(view->workspace->tree);
        wlr_scene_node_set_enabled(&view->scene_tree->node, false);