aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2023-07-24 11:01:39 +0200
committerSimon Ser <contact@emersion.fr>2023-07-26 17:08:47 +0000
commit307720d5019c62bb8dfeea9e2cb5638cec526553 (patch)
tree92294caaafc68942aed77f741ffcc1d09ffa0d21
parent2f859f5becfc8853842eb975b54c19936a704105 (diff)
backend/drm: restore custom modes
We were only restoring fixed modes here. The DRM backend no longer creates fixed modes when the compositor sets a custom mode, so we need to handle this situation when restoring. Closes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3698
-rw-r--r--backend/drm/backend.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/backend/drm/backend.c b/backend/drm/backend.c
index 54852185..244a2df1 100644
--- a/backend/drm/backend.c
+++ b/backend/drm/backend.c
@@ -121,17 +121,18 @@ static void handle_session_active(struct wl_listener *listener, void *data) {
struct wlr_drm_connector *conn;
wl_list_for_each(conn, &drm->connectors, link) {
- struct wlr_output_mode *mode = NULL;
- if (conn->status != DRM_MODE_DISCONNECTED && conn->output.enabled
- && conn->output.current_mode != NULL) {
- mode = conn->output.current_mode;
- }
+ 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, mode != NULL);
- if (mode != NULL) {
- wlr_output_state_set_mode(&state, mode);
+ 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);
+ }
}
if (!drm_connector_commit_state(conn, &state)) {
wlr_drm_conn_log(conn, WLR_ERROR, "Failed to restore state after VT switch");