diff --git a/src/lib/ecore_drm/Ecore_Drm.h b/src/lib/ecore_drm/Ecore_Drm.h index d09e43f9d3..e2281f9eea 100644 --- a/src/lib/ecore_drm/Ecore_Drm.h +++ b/src/lib/ecore_drm/Ecore_Drm.h @@ -318,6 +318,19 @@ EAPI Eina_Stringshare *ecore_drm_output_model_get(Ecore_Drm_Output *output); */ EAPI Eina_Stringshare *ecore_drm_output_make_get(Ecore_Drm_Output *output); +/** + * Set the dpms level of an Ecore_Drm_Output + * + * This function will set the DPMS level of an Ecore_Drm_Output + * + * @param output The Ecore_Drm_Output to set the dpms level on + * @param level The level to set + * + * @ingroup Ecore_Drm_Output_Group + * @since 1.15 + */ +EAPI void ecore_drm_output_dpms_set(Ecore_Drm_Output *output, int level); + /** * Get the pointer position of Ecore_Drm_Device * diff --git a/src/lib/ecore_drm/ecore_drm_output.c b/src/lib/ecore_drm/ecore_drm_output.c index 36c4f09a76..2315fdefa4 100644 --- a/src/lib/ecore_drm/ecore_drm_output.c +++ b/src/lib/ecore_drm/ecore_drm_output.c @@ -25,6 +25,25 @@ static const char *conn_types[] = EAPI int ECORE_DRM_EVENT_OUTPUT = 0; +static drmModePropertyPtr +_ecore_drm_output_property_get(int fd, drmModeConnectorPtr conn, const char *name) +{ + drmModePropertyPtr prop; + int i = 0; + + for (; i < conn->count_props; i++) + { + if (!(prop = drmModeGetProperty(fd, conn->props[i]))) + continue; + + if (!strcmp(prop->name, name)) return prop; + + drmModeFreeProperty(prop); + } + + return NULL; +} + static void _ecore_drm_output_edid_parse_string(const uint8_t *data, char text[]) { @@ -430,6 +449,7 @@ _ecore_drm_output_create(Ecore_Drm_Device *dev, drmModeRes *res, drmModeConnecto output->conn_id = conn->connector_id; dev->conn_allocator |= (1 << output->conn_id); output->crtc = drmModeGetCrtc(dev->drm.fd, output->crtc_id); + output->dpms = _ecore_drm_output_property_get(dev->drm.fd, conn, "DPMS"); memset(&mode, 0, sizeof(mode)); if ((enc = drmModeGetEncoder(dev->drm.fd, conn->encoder_id))) @@ -500,6 +520,7 @@ mode_err: eina_stringshare_del(output->name); EINA_LIST_FREE(output->modes, mode) free(mode); + drmModeFreeProperty(output->dpms); drmModeFreeCrtc(output->crtc); dev->crtc_allocator &= ~(1 << output->crtc_id); dev->conn_allocator &= ~(1 << output->conn_id); @@ -537,6 +558,7 @@ _ecore_drm_output_free(Ecore_Drm_Output *output) if (output->model) eina_stringshare_del(output->model); if (output->make) eina_stringshare_del(output->make); + if (output->dpms) drmModeFreeProperty(output->dpms); if (output->crtc) drmModeFreeCrtc(output->crtc); free(output); @@ -871,6 +893,8 @@ ecore_drm_output_enable(Ecore_Drm_Output *output) if ((!output) || (!output->current)) return EINA_FALSE; + ecore_drm_output_dpms_set(output, DRM_MODE_DPMS_ON); + mode = output->current_mode; if (drmModeSetCrtc(output->drm_fd, output->crtc_id, output->current->id, 0, 0, &output->conn_id, 1, &mode->info) < 0) @@ -1075,3 +1099,13 @@ ecore_drm_output_make_get(Ecore_Drm_Output *output) return output->make; } + +EAPI void +ecore_drm_output_dpms_set(Ecore_Drm_Output *output, int level) +{ + EINA_SAFETY_ON_NULL_RETURN(output); + EINA_SAFETY_ON_NULL_RETURN(output->dpms); + + drmModeConnectorSetProperty(output->dev->drm.fd, output->conn_id, + output->dpms->prop_id, level); +} diff --git a/src/lib/ecore_drm/ecore_drm_private.h b/src/lib/ecore_drm/ecore_drm_private.h index 7b834cb928..a0bcf12cf1 100644 --- a/src/lib/ecore_drm/ecore_drm_private.h +++ b/src/lib/ecore_drm/ecore_drm_private.h @@ -113,6 +113,7 @@ struct _Ecore_Drm_Output unsigned int crtc_id; unsigned int conn_id; drmModeCrtcPtr crtc; + drmModePropertyPtr dpms; int x, y, phys_width, phys_height; int drm_fd;