diff options
author | Guido Günther <agx@sigxcpu.org> | 2018-06-28 12:35:55 +0200 |
---|---|---|
committer | Guido Günther <agx@sigxcpu.org> | 2018-07-07 14:51:39 +0200 |
commit | 8d72090afef998f96f243ac83e23b1bdc30667d1 (patch) | |
tree | 721adbae171b2c9bf5c6bec41be84c1448f040a6 /backend | |
parent | 159835de249acf9a87b2e75b97db6c5fab0a600b (diff) |
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
Diffstat (limited to 'backend')
-rw-r--r-- | backend/drm/drm.c | 27 |
1 files changed, 27 insertions, 0 deletions
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; |