From 8d72090afef998f96f243ac83e23b1bdc30667d1 Mon Sep 17 00:00:00 2001 From: Guido Günther Date: Thu, 28 Jun 2018 12:35:55 +0200 Subject: drm: Allow to add additional modes This allows to add additional modes to the list of available video modes using VESA Coordinated Video Timing information. Closes #1080 --- backend/drm/drm.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'backend') diff --git a/backend/drm/drm.c b/backend/drm/drm.c index c5db480e..39906342 100644 --- a/backend/drm/drm.c +++ b/backend/drm/drm.c @@ -566,6 +566,33 @@ error_conn: return false; } +bool wlr_drm_connector_add_mode(struct wlr_output *output, + const drmModeModeInfo *modeinfo) { + struct wlr_drm_connector *conn = (struct wlr_drm_connector *)output; + + assert(modeinfo); + if (modeinfo->type != DRM_MODE_TYPE_USERDEF) { + return false; + } + + struct wlr_drm_mode *mode = calloc(1, sizeof(*mode)); + if (!mode) { + return false; + } + memcpy(&mode->drm_mode, modeinfo, sizeof(*modeinfo)); + + mode->wlr_mode.width = mode->drm_mode.hdisplay; + mode->wlr_mode.height = mode->drm_mode.vdisplay; + mode->wlr_mode.refresh = mode->drm_mode.vrefresh; + + wlr_log(L_INFO, "Registered custom mode " + "%"PRId32"x%"PRId32"@%"PRId32, + mode->wlr_mode.width, mode->wlr_mode.height, + mode->wlr_mode.refresh); + wl_list_insert(&conn->output.modes, &mode->wlr_mode.link); + return true; +} + static void drm_connector_transform(struct wlr_output *output, enum wl_output_transform transform) { output->transform = transform; -- cgit v1.2.3