From d89285f7835d87cb873e2c5de1219ebdaae5d929 Mon Sep 17 00:00:00 2001
From: Simon Ser <contact@emersion.fr>
Date: Tue, 7 Jun 2022 21:52:47 +0200
Subject: [PATCH] output-management-v1: add wlr_output_head_v1_state_apply()

This function applies a configuration sent by a client on a
struct wlr_output_state.
---
 include/wlr/types/wlr_output_management_v1.h | 12 +++++++++++
 types/wlr_output_management_v1.c             | 22 ++++++++++++++++++++
 2 files changed, 34 insertions(+)

diff --git a/include/wlr/types/wlr_output_management_v1.h b/include/wlr/types/wlr_output_management_v1.h
index 0b8d8c20..be56e812 100644
--- a/include/wlr/types/wlr_output_management_v1.h
+++ b/include/wlr/types/wlr_output_management_v1.h
@@ -141,4 +141,16 @@ struct wlr_output_configuration_head_v1 *
 	wlr_output_configuration_head_v1_create(
 	struct wlr_output_configuration_v1 *config, struct wlr_output *output);
 
+/**
+ * Apply the head state on the supplied struct wlr_output_state.
+ *
+ * Compositors can then pass the resulting struct wlr_output_state to
+ * wlr_output_commit_state() or wlr_output_test_state().
+ *
+ * The position needs to be applied manually by the caller.
+ */
+void wlr_output_head_v1_state_apply(
+	const struct wlr_output_head_v1_state *head_state,
+	struct wlr_output_state *output_state);
+
 #endif
diff --git a/types/wlr_output_management_v1.c b/types/wlr_output_management_v1.c
index 2c3ae027..c44352f1 100644
--- a/types/wlr_output_management_v1.c
+++ b/types/wlr_output_management_v1.c
@@ -907,3 +907,25 @@ void wlr_output_manager_v1_set_configuration(
 	}
 	manager->current_configuration_dirty = false;
 }
+
+void wlr_output_head_v1_state_apply(
+		const struct wlr_output_head_v1_state *head_state,
+		struct wlr_output_state *output_state) {
+	wlr_output_state_set_enabled(output_state, head_state->enabled);
+
+	if (!head_state->enabled) {
+		return;
+	}
+
+	if (head_state->mode != NULL) {
+		wlr_output_state_set_mode(output_state, head_state->mode);
+	} else {
+		wlr_output_state_set_custom_mode(output_state,
+			head_state->custom_mode.width,
+			head_state->custom_mode.height,
+			head_state->custom_mode.refresh);
+	}
+
+	wlr_output_state_set_scale(output_state, head_state->scale);
+	wlr_output_state_set_transform(output_state, head_state->transform);
+}