output: Call do_output_layout_change() at end of new_output_notify().

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.
This commit is contained in:
John Lindgren 2022-09-20 01:17:22 -04:00 committed by Consolatis
parent dcedfee5d1
commit 7233495c3a
2 changed files with 23 additions and 7 deletions

View 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;

View 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) {