Skip to content

Commit

Permalink
output: Transition to wlr_output_state
Browse files Browse the repository at this point in the history
We previously used the wlr_output's built-in pending state and
wlr_output_rollback. The modern state API is much nicer.
  • Loading branch information
kennylevinsen authored and emersion committed Jan 26, 2024
1 parent f0bc13b commit 8a00921
Showing 1 changed file with 28 additions and 22 deletions.
50 changes: 28 additions & 22 deletions output.c
Original file line number Diff line number Diff line change
Expand Up @@ -101,9 +101,10 @@ output_enable(struct cg_output *output)
* duplicate the enabled property in cg_output. */
wlr_log(WLR_DEBUG, "Enabling output %s", wlr_output->name);

wlr_output_enable(wlr_output, true);
struct wlr_output_state state = {0};
wlr_output_state_set_enabled(&state, true);

if (wlr_output_commit(wlr_output)) {
if (wlr_output_commit_state(wlr_output, &state)) {
output_layout_add_auto(output);
}

Expand All @@ -114,44 +115,45 @@ static void
output_disable(struct cg_output *output)
{
struct wlr_output *wlr_output = output->wlr_output;

if (!wlr_output->enabled) {
wlr_log(WLR_DEBUG, "Not disabling already disabled output %s", wlr_output->name);
return;
}

wlr_log(WLR_DEBUG, "Disabling output %s", wlr_output->name);
wlr_output_enable(wlr_output, false);
wlr_output_commit(wlr_output);
struct wlr_output_state state = {0};
wlr_output_state_set_enabled(&state, false);
wlr_output_commit_state(wlr_output, &state);
output_layout_remove(output);
}

static bool
output_apply_config(struct cg_output *output, struct wlr_output_configuration_head_v1 *head, bool test_only)
{
wlr_output_enable(output->wlr_output, head->state.enabled);
struct wlr_output_state state = {0};
wlr_output_state_set_enabled(&state, head->state.enabled);

if (head->state.enabled) {
/* Do not mess with these parameters for output to be disabled */
wlr_output_set_scale(output->wlr_output, head->state.scale);
wlr_output_set_transform(output->wlr_output, head->state.transform);
wlr_output_state_set_scale(&state, head->state.scale);
wlr_output_state_set_transform(&state, head->state.transform);

if (head->state.mode) {
wlr_output_set_mode(output->wlr_output, head->state.mode);
wlr_output_state_set_mode(&state, head->state.mode);
} else {
wlr_output_set_custom_mode(output->wlr_output, head->state.custom_mode.width,
head->state.custom_mode.height, head->state.custom_mode.refresh);
wlr_output_state_set_custom_mode(&state, head->state.custom_mode.width,
head->state.custom_mode.height,
head->state.custom_mode.refresh);
}
}

if (test_only) {
bool ret = wlr_output_test(output->wlr_output);
wlr_output_rollback(output->wlr_output);
bool ret = wlr_output_test_state(output->wlr_output, &state);
return ret;
}

/* Apply output configuration */
if (!wlr_output_commit(output->wlr_output)) {
if (!wlr_output_commit_state(output->wlr_output, &state)) {
return false;
}

Expand Down Expand Up @@ -301,23 +303,22 @@ handle_new_output(struct wl_listener *listener, void *data)
return;
}

struct wlr_output_state state = {0};
wlr_output_state_set_enabled(&state, true);
if (!wl_list_empty(&wlr_output->modes)) {
/* Ensure the output is marked as enabled before trying to set mode */
wlr_output_enable(wlr_output, true);

struct wlr_output_mode *preferred_mode = wlr_output_preferred_mode(wlr_output);
if (preferred_mode) {
wlr_output_set_mode(wlr_output, preferred_mode);
wlr_output_state_set_mode(&state, preferred_mode);
}
if (!wlr_output_test(wlr_output)) {
if (!wlr_output_test_state(wlr_output, &state)) {
struct wlr_output_mode *mode;
wl_list_for_each (mode, &wlr_output->modes, link) {
if (mode == preferred_mode) {
continue;
}

wlr_output_set_mode(wlr_output, mode);
if (wlr_output_test(wlr_output)) {
wlr_output_state_set_mode(&state, mode);
if (wlr_output_test_state(wlr_output, &state)) {
break;
}
}
Expand All @@ -334,8 +335,13 @@ handle_new_output(struct wl_listener *listener, void *data)
wlr_output->scale);
}

output_enable(output);
wlr_log(WLR_DEBUG, "Enabling new output %s", wlr_output->name);
if (wlr_output_commit_state(wlr_output, &state)) {
output_layout_add_auto(output);
}

view_position_all(output->server);
update_output_manager_config(output->server);
}

void
Expand Down

0 comments on commit 8a00921

Please sign in to comment.