---
main.c | 35 ++++++++++++++++++-
.../wlr-output-management-unstable-v1.xml | 19 ++++++++++
2 files changed, 53 insertions(+), 1 deletion(-)
diff --git a/main.c b/main.c
index 87f94af..2d3b234 100644
--- a/main.c
+++ b/main.c
@@ -42,6 +42,7 @@ struct randr_head {
int32_t x, y;
enum wl_output_transform transform;
double scale;
+ bool adaptive_sync_enabled;
};
struct randr_state {
@@ -115,6 +116,11 @@ static void print_state(struct randr_state *state) {
printf(" Position: %d,%d\n", head->x, head->y);
printf(" Transform: %s\n", output_transform_map[head->transform]);
printf(" Scale: %f\n", head->scale);
+
+ if (zwlr_output_manager_v1_get_version(state->output_manager) >= 3) {
+ printf(" Adaptive Sync: %s\n",
+ head->adaptive_sync_enabled ? "enabled" : "disabled");
+ }
}
state->running = false;
@@ -182,6 +188,11 @@ static void apply_state(struct randr_state *state, bool dry_run) {
head->transform);
zwlr_output_configuration_head_v1_set_scale(config_head,
wl_fixed_from_double(head->scale));
+
+ if (zwlr_output_manager_v1_get_version(state->output_manager) >= 3) {
+ zwlr_output_configuration_head_v1_set_adaptive_sync(config_head,
+ head->adaptive_sync_enabled);
+ }
}
if (dry_run) {
@@ -336,6 +347,12 @@ static void head_handle_serial_number(void *data,
head->serial_number = strdup(serial_number);
}
+static void head_handle_adaptive_sync(void *data,
+ struct zwlr_output_head_v1 *wlr_head, int32_t enabled) {
+ struct randr_head *head = data;
+ head->adaptive_sync_enabled = enabled != 0;
+}
+
static const struct zwlr_output_head_v1_listener head_listener = {
.name = head_handle_name,
.description = head_handle_description,
@@ -350,6 +367,7 @@ static const struct zwlr_output_head_v1_listener head_listener = {
.make = head_handle_make,
.model = head_handle_model,
.serial_number = head_handle_serial_number,
+ .adaptive_sync = head_handle_adaptive_sync,
};
static void output_manager_handle_head(void *data,
@@ -420,6 +438,7 @@ static const struct option long_options[] = {
{"pos", required_argument, 0, 0},
{"transform", required_argument, 0, 0},
{"scale", required_argument, 0, 0},
+ {"adaptive-sync", required_argument, 0, 0},
{0},
};
@@ -611,6 +630,19 @@ static bool parse_output_arg(struct randr_head *head,
}
head->scale = scale;
+ } else if (strcmp(name, "adaptive-sync") == 0) {
+ if (zwlr_output_head_v1_get_version(head->wlr_head) < 3) {
+ fprintf(stderr, "setting adaptive sync not supported by the compositor\n");
+ return false;
+ }
+ if (strcmp(value, "enabled") == 0) {
+ head->adaptive_sync_enabled = true;
+ } else if (strcmp(value, "disabed") == 0) {
+ head->adaptive_sync_enabled = false;
+ } else {
+ fprintf(stderr, "invalid adaptive sync state: %s\n", value);
+ return false;
+ }
} else {
fprintf(stderr, "invalid option: %s\n", name);
return false;
@@ -631,7 +663,8 @@ static const char usage[] =
" --preferred\n"
" --pos <x>,<y>\n"
" --transform normal|90|180|270|flipped|flipped-90|flipped-180|flipped-270\n"
- " --scale <factor>\n";
+ " --scale <factor>\n"
+ " --adaptive-sync enabled|disabled\n";
int main(int argc, char *argv[]) {
struct randr_state state = { .running = true };
diff --git a/protocol/wlr-output-management-unstable-v1.xml b/protocol/wlr-output-management-unstable-v1.xml
index 3568e04..aa5c8af 100644
--- a/protocol/wlr-output-management-unstable-v1.xml
+++ b/protocol/wlr-output-management-unstable-v1.xml
@@ -338,6 +338,15 @@
object.
</description>
</request>
+
+ <event name="adaptive_sync" since="3">
+ <description summary="current adaptive sync state">
+ This event describes whether adaptive sync is currently enabled for
+ the head or not. Adaptive sync is also known as Variable Refresh
+ Rate or VRR.
+ </description>
+ <arg name="enabled" type="int" summary="zero if disabled, non-zero if enabled"/>
+ </event>
</interface>
<interface name="zwlr_output_mode_v1" version="3">
@@ -569,5 +578,15 @@
</description>
<arg name="scale" type="fixed"/>
</request>
+
+ <!-- Version 3 additions -->
+
+ <request name="set_adaptive_sync" since="3">
+ <description summary="enable/disable adaptive sync">
+ This request enables/disables adaptive sync. Adaptive sync is also
+ known as Variable Refresh Rate or VRR.
+ </description>
+ <arg name="enabled" type="int" summary="zero to disable, non-zero to enable"/>
+ </request>
</interface>
</protocol>
--
2.36.1