void uterm_video_sleep(struct uterm_video *video) { if (!video || !video_is_awake(video)) return; VIDEO_CB(video, NULL, UTERM_SLEEP); VIDEO_CALL(video->ops->sleep, 0, video); }
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); }
SHL_EXPORT void uterm_video_sleep(struct uterm_video *video) { if (!video || !video_is_awake(video)) return; log_debug("go asleep"); VIDEO_CB(video, NULL, UTERM_SLEEP); video->flags &= ~VIDEO_AWAKE; VIDEO_CALL(video->ops->sleep, 0, video); }
SHL_EXPORT void uterm_display_unbind(struct uterm_display *disp) { if (!disp || !disp->video) return; VIDEO_CB(disp->video, disp, UTERM_GONE); uterm_display_deactivate(disp); disp->video = NULL; shl_dlist_unlink(&disp->list); ev_eloop_rm_timer(disp->vblank_timer); uterm_display_unref(disp); }
int uterm_video_wake_up(struct uterm_video *video) { int ret; if (!video) return -EINVAL; if (video_is_awake(video)) return 0; ret = VIDEO_CALL(video->ops->wake_up, 0, video); if (ret) return ret; VIDEO_CB(video, NULL, UTERM_WAKE_UP); return 0; }
SHL_EXPORT int uterm_display_bind(struct uterm_display *disp, struct uterm_video *video) { int ret; if (!disp || !video || disp->video) return -EINVAL; ret = ev_eloop_add_timer(video->eloop, disp->vblank_timer); if (ret) return ret; shl_dlist_link_tail(&video->displays, &disp->list); disp->video = video; uterm_display_ref(disp); VIDEO_CB(disp->video, disp, UTERM_NEW); return 0; }
static void bind_display(struct uterm_video *video, drmModeRes *res, drmModeConnector *conn) { struct uterm_display *disp; struct uterm_mode *mode; int ret, i; ret = display_new(&disp, &dumb_display_ops); if (ret) return; for (i = 0; i < conn->count_modes; ++i) { ret = mode_new(&mode, &dumb_mode_ops); if (ret) continue; mode->dumb.info = conn->modes[i]; mode->next = disp->modes; disp->modes = mode; /* TODO: more sophisticated default-mode selection */ if (!disp->default_mode) disp->default_mode = mode; } if (!disp->modes) { log_warn("no valid mode for display found"); uterm_display_unref(disp); return; } disp->video = video; disp->dumb.conn_id = conn->connector_id; disp->flags |= DISPLAY_AVAILABLE; disp->next = video->displays; video->displays = disp; disp->dpms = get_dpms(disp, conn); log_info("display %p DPMS is %s", disp, uterm_dpms_to_name(disp->dpms)); VIDEO_CB(video, disp, UTERM_NEW); }
SHL_EXPORT int uterm_video_wake_up(struct uterm_video *video) { int ret; if (!video) return -EINVAL; if (video_is_awake(video)) return 0; log_debug("wake up"); ret = VIDEO_CALL(video->ops->wake_up, 0, video); if (ret) { video->flags &= ~VIDEO_AWAKE; return ret; } video->flags |= VIDEO_AWAKE; VIDEO_CB(video, NULL, UTERM_WAKE_UP); return 0; }