From 8d72090afef998f96f243ac83e23b1bdc30667d1 Mon Sep 17 00:00:00 2001
From: Guido Günther <agx@sigxcpu.org>
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