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;
free(output);
}
+static void do_output_layout_change(struct server *server);
+
static void
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
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) {
}
- server->pending_output_config = NULL;
+ server->pending_output_layout_change--;
do_output_layout_change(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) {