]> git.mdlowis.com Git - proto/labwc.git/commitdiff
output: Call do_output_layout_change() at end of new_output_notify().
authorJohn Lindgren <john@jlindgren.net>
Tue, 20 Sep 2022 05:17:22 +0000 (01:17 -0400)
committerConsolatis <35009135+Consolatis@users.noreply.github.com>
Wed, 21 Sep 2022 05:33:00 +0000 (07:33 +0200)
This fixes an issue with the wlr_output_cursor not being properly
initialized on new outputs, because wlr_output_layout.events.change
is triggered too soon, before the wlr_output_cursor exists.

include/labwc.h
src/output.c

index 2e1d8010bc1fc95e45794594d8369aa299d679b1..cedf829dba9a68acba019db6a5dd70df835a62f7 100644 (file)
@@ -225,7 +225,14 @@ struct server {
        struct wl_listener output_layout_change;
        struct wlr_output_manager_v1 *output_manager;
        struct wl_listener output_manager_apply;
-       struct wlr_output_configuration_v1 *pending_output_config;
+       /*
+        * While an output layout change is in process, this counter is
+        * non-zero and causes change-events from the wlr_output_layout
+        * to be ignored (to prevent, for example, moving views in a
+        * transitory layout state).  Once the counter reaches zero,
+        * do_output_layout_change() must be called explicitly.
+        */
+       int pending_output_layout_change;
 
        struct wlr_foreign_toplevel_manager_v1 *foreign_toplevel_manager;
 
index 1ec1c232809fd925bfbeefb8444d0c66e9dfec42..542559e9438b394b5936d4ea0efe9b0e89006cee 100644 (file)
@@ -53,6 +53,8 @@ output_destroy_notify(struct wl_listener *listener, void *data)
        free(output);
 }
 
+static void do_output_layout_change(struct server *server);
+
 static void
 new_output_notify(struct wl_listener *listener, void *data)
 {
@@ -179,9 +181,19 @@ new_output_notify(struct wl_listener *listener, void *data)
                wlr_output_enable_adaptive_sync(wlr_output, true);
        }
 
+       /*
+        * Wait until wlr_output_layout_add_auto() returns before
+        * calling do_output_layout_change(); this ensures that the
+        * wlr_output_cursor is created for the new output.
+        */
+       server->pending_output_layout_change++;
+
        wlr_output_layout_add_auto(server->output_layout, wlr_output);
        output->scene_output = wlr_scene_get_scene_output(server->scene, wlr_output);
        assert(output->scene_output);
+
+       server->pending_output_layout_change--;
+       do_output_layout_change(server);
 }
 
 void
@@ -229,13 +241,11 @@ output_update_for_layout_change(struct server *server)
                XCURSOR_DEFAULT, server->seat.cursor);
 }
 
-static void do_output_layout_change(struct server *server);
-
 static void
 output_config_apply(struct server *server,
                struct wlr_output_configuration_v1 *config)
 {
-       server->pending_output_config = config;
+       server->pending_output_layout_change++;
 
        struct wlr_output_configuration_head_v1 *head;
        wl_list_for_each(head, &config->heads, link) {
@@ -284,7 +294,7 @@ output_config_apply(struct server *server,
 
        }
 
-       server->pending_output_config = NULL;
+       server->pending_output_layout_change--;
        do_output_layout_change(server);
 }
 
@@ -360,8 +370,7 @@ wlr_output_configuration_v1 *create_output_config(struct server *server)
 static void
 do_output_layout_change(struct server *server)
 {
-       bool done_changing = !server->pending_output_config;
-       if (done_changing) {
+       if (!server->pending_output_layout_change) {
                struct wlr_output_configuration_v1 *config =
                        create_output_config(server);
                if (config) {