diff options
Diffstat (limited to 'backend')
-rw-r--r-- | backend/drm/drm.c | 11 | ||||
-rw-r--r-- | backend/drm/util.c | 2 |
2 files changed, 10 insertions, 3 deletions
diff --git a/backend/drm/drm.c b/backend/drm/drm.c index 0acb0324..332abfe5 100644 --- a/backend/drm/drm.c +++ b/backend/drm/drm.c @@ -550,11 +550,18 @@ bool wlr_drm_connector_add_mode(struct wlr_output *output, const drmModeModeInfo *modeinfo) { struct wlr_drm_connector *conn = get_drm_connector_from_output(output); - assert(modeinfo); if (modeinfo->type != DRM_MODE_TYPE_USERDEF) { return false; } + struct wlr_output_mode *wlr_mode; + wl_list_for_each(wlr_mode, &conn->output.modes, link) { + struct wlr_drm_mode *mode = (struct wlr_drm_mode *)wlr_mode; + if (memcmp(&mode->drm_mode, modeinfo, sizeof(*modeinfo)) == 0) { + return true; + } + } + struct wlr_drm_mode *mode = calloc(1, sizeof(*mode)); if (!mode) { return false; @@ -563,7 +570,7 @@ bool wlr_drm_connector_add_mode(struct wlr_output *output, mode->wlr_mode.width = mode->drm_mode.hdisplay; mode->wlr_mode.height = mode->drm_mode.vdisplay; - mode->wlr_mode.refresh = mode->drm_mode.vrefresh; + mode->wlr_mode.refresh = calculate_refresh_rate(modeinfo); wlr_log(WLR_INFO, "Registered custom mode " "%"PRId32"x%"PRId32"@%"PRId32, diff --git a/backend/drm/util.c b/backend/drm/util.c index 6b2c0981..6a8b346a 100644 --- a/backend/drm/util.c +++ b/backend/drm/util.c @@ -6,7 +6,7 @@ #include <wlr/util/log.h> #include "backend/drm/util.h" -int32_t calculate_refresh_rate(drmModeModeInfo *mode) { +int32_t calculate_refresh_rate(const drmModeModeInfo *mode) { int32_t refresh = (mode->clock * 1000000LL / mode->htotal + mode->vtotal / 2) / mode->vtotal; |