int uterm_display_get_dpms(const struct uterm_display *disp) { if (!disp || !display_is_conn(disp)) return UTERM_DPMS_OFF; return disp->dpms; }
int uterm_display_set_dpms(struct uterm_display *disp, int state) { if (!disp || !display_is_conn(disp)) return -EINVAL; return VIDEO_CALL(disp->ops->set_dpms, 0, disp, state); }
int uterm_display_activate(struct uterm_display *disp, struct uterm_mode *mode) { if (!disp || !display_is_conn(disp) || display_is_online(disp)) return -EINVAL; if (!mode) mode = disp->default_mode; return VIDEO_CALL(disp->ops->activate, 0, disp, mode); }
static void unbind_display(struct uterm_display *disp) { if (!display_is_conn(disp)) return; VIDEO_CB(disp->video, disp, UTERM_GONE); display_deactivate(disp); disp->video = NULL; disp->flags &= ~DISPLAY_AVAILABLE; uterm_display_unref(disp); }
static int display_set_dpms(struct uterm_display *disp, int state) { int i, ret, set; drmModeConnector *conn; drmModePropertyRes *prop; if (!display_is_conn(disp) || !video_is_awake(disp->video)) return -EINVAL; switch (state) { case UTERM_DPMS_ON: set = DRM_MODE_DPMS_ON; break; case UTERM_DPMS_STANDBY: set = DRM_MODE_DPMS_STANDBY; break; case UTERM_DPMS_SUSPEND: set = DRM_MODE_DPMS_SUSPEND; break; case UTERM_DPMS_OFF: set = DRM_MODE_DPMS_OFF; break; default: return -EINVAL; } log_info("setting DPMS of display %p to %s", disp, uterm_dpms_to_name(state)); conn = drmModeGetConnector(disp->video->dumb.fd, disp->dumb.conn_id); if (!conn) { log_err("cannot get display connector"); return -EFAULT; } ret = 0; for (i = 0; i < conn->count_props; ++i) { prop = drmModeGetProperty(disp->video->dumb.fd, conn->props[i]); if (!prop) continue; if (!strcmp(prop->name, "DPMS")) { ret = drmModeConnectorSetProperty(disp->video->dumb.fd, disp->dumb.conn_id, prop->prop_id, set); if (ret) { log_info("cannot set DPMS"); ret = -EFAULT; } drmModeFreeProperty(prop); break; } drmModeFreeProperty(prop); } if (i == conn->count_props) { ret = 0; log_warn("display does not support DPMS"); state = UTERM_DPMS_UNKNOWN; } drmModeFreeConnector(conn); disp->dpms = state; return ret; }