backend/drm: extract logic to build current connector state

This commit is contained in:
Simon Ser 2024-02-14 16:50:54 +01:00
parent c397515ee5
commit feb54979c0
1 changed files with 19 additions and 12 deletions

View File

@ -95,6 +95,24 @@ struct wlr_backend *wlr_drm_backend_get_parent(struct wlr_backend *backend) {
return drm->parent ? &drm->parent->backend : NULL;
}
static void build_current_connector_state(struct wlr_output_state *state,
struct wlr_drm_connector *conn) {
bool enabled = conn->status != DRM_MODE_DISCONNECTED && conn->output.enabled;
wlr_output_state_init(state);
wlr_output_state_set_enabled(state, enabled);
if (!enabled) {
return;
}
if (conn->output.current_mode != NULL) {
wlr_output_state_set_mode(state, conn->output.current_mode);
} else {
wlr_output_state_set_custom_mode(state,
conn->output.width, conn->output.height, conn->output.refresh);
}
}
static void handle_session_active(struct wl_listener *listener, void *data) {
struct wlr_drm_backend *drm =
wl_container_of(listener, drm, session_active);
@ -125,19 +143,8 @@ static void handle_session_active(struct wl_listener *listener, void *data) {
struct wlr_drm_connector *conn;
wl_list_for_each(conn, &drm->connectors, link) {
bool enabled = conn->status != DRM_MODE_DISCONNECTED && conn->output.enabled;
struct wlr_output_state state;
wlr_output_state_init(&state);
wlr_output_state_set_enabled(&state, enabled);
if (enabled) {
if (conn->output.current_mode != NULL) {
wlr_output_state_set_mode(&state, conn->output.current_mode);
} else {
wlr_output_state_set_custom_mode(&state,
conn->output.width, conn->output.height, conn->output.refresh);
}
}
build_current_connector_state(&state, conn);
if (!drm_connector_commit_state(conn, &state)) {
wlr_drm_conn_log(conn, WLR_ERROR, "Failed to restore state after VT switch");
}