LAB_PLACE_AUTOMATIC
};
+enum adaptive_sync_mode {
+ LAB_ADAPTIVE_SYNC_DISABLED,
+ LAB_ADAPTIVE_SYNC_ENABLED,
+ LAB_ADAPTIVE_SYNC_FULLSCREEN,
+};
+
struct usable_area_override {
struct border margin;
char *output;
/* core */
bool xdg_shell_server_side_deco;
int gap;
- bool adaptive_sync;
+ enum adaptive_sync_mode adaptive_sync;
bool reuse_output_mode;
enum view_placement_policy placement_policy;
void *data);
void output_add_virtual(struct server *server, const char *output_name);
void output_remove_virtual(struct server *server, const char *output_name);
+void output_enable_adaptive_sync(struct wlr_output *output, bool enabled);
void server_init(struct server *server);
void server_start(struct server *server);
return FONT_PLACE_UNKNOWN;
}
+static void
+set_adaptive_sync_mode(const char *str, enum adaptive_sync_mode *variable)
+{
+ if (!strcasecmp(str, "fullscreen")) {
+ *variable = LAB_ADAPTIVE_SYNC_FULLSCREEN;
+ } else {
+ int ret = parse_bool(str, -1);
+ if (ret == 1) {
+ *variable = LAB_ADAPTIVE_SYNC_ENABLED;
+ } else {
+ *variable = LAB_ADAPTIVE_SYNC_DISABLED;
+ }
+ }
+}
+
static void
entry(xmlNode *node, char *nodename, char *content)
{
} else if (!strcmp(nodename, "gap.core")) {
rc.gap = atoi(content);
} else if (!strcasecmp(nodename, "adaptiveSync.core")) {
- set_bool(content, &rc.adaptive_sync);
+ set_adaptive_sync_mode(content, &rc.adaptive_sync);
} else if (!strcasecmp(nodename, "reuseOutputMode.core")) {
set_bool(content, &rc.reuse_output_mode);
} else if (!strcmp(nodename, "policy.placement")) {
}
}
- if (rc.adaptive_sync) {
- wlr_output_enable_adaptive_sync(wlr_output, true);
- if (!wlr_output_test(wlr_output)) {
- wlr_output_enable_adaptive_sync(wlr_output, false);
- wlr_log(WLR_DEBUG,
- "failed to enable adaptive sync for output %s", wlr_output->name);
- } else {
- wlr_log(WLR_INFO, "adaptive sync enabled for output %s", wlr_output->name);
- }
+ if (rc.adaptive_sync == LAB_ADAPTIVE_SYNC_ENABLED) {
+ output_enable_adaptive_sync(wlr_output, true);
}
wlr_output_commit(wlr_output);
}
wlr_output_set_scale(o, head->state.scale);
wlr_output_set_transform(o, head->state.transform);
- wlr_output_enable_adaptive_sync(o, head->state.adaptive_sync_enabled);
+ if (rc.adaptive_sync == LAB_ADAPTIVE_SYNC_ENABLED) {
+ output_enable_adaptive_sync(o,
+ head->state.adaptive_sync_enabled);
+ }
}
if (!wlr_output_commit(o)) {
wlr_log(WLR_ERROR, "Output config commit failed");
}
}
}
+
+void
+output_enable_adaptive_sync(struct wlr_output *output, bool enabled)
+{
+ if (output->pending.adaptive_sync_enabled == enabled) {
+ return;
+ }
+ wlr_output_enable_adaptive_sync(output, enabled);
+ if (!wlr_output_test(output)) {
+ wlr_output_enable_adaptive_sync(output, false);
+ wlr_log(WLR_DEBUG,
+ "failed to enable adaptive sync for output %s", output->name);
+ } else {
+ wlr_log(WLR_INFO, "adaptive sync %sabled for output %s",
+ enabled ? "en" : "dis", output->name);
+ }
+}
view->current.y + view->current.height / 2);
}
+static void
+set_adaptive_sync_fullscreen(struct view *view)
+{
+ if (rc.adaptive_sync != LAB_ADAPTIVE_SYNC_FULLSCREEN) {
+ return;
+ }
+ /* Enable adaptive sync if view is fullscreen */
+ output_enable_adaptive_sync(view->output->wlr_output, view->fullscreen);
+ wlr_output_commit(view->output->wlr_output);
+}
+
void
view_set_activated(struct view *view, bool activated)
{
keyboard_update_layout(&view->server->seat, view->keyboard_layout);
}
}
+ set_adaptive_sync_fullscreen(view);
}
void
} else {
view_apply_special_geometry(view);
}
+ set_adaptive_sync_fullscreen(view);
}
void
if (view->fullscreen && view->output) {
view->fullscreen = false;
desktop_update_top_layer_visiblity(server);
+ if (rc.adaptive_sync == LAB_ADAPTIVE_SYNC_FULLSCREEN) {
+ wlr_output_enable_adaptive_sync(view->output->wlr_output, false);
+ }
}
/* If we spawned a window menu, close it */