X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flibsystemd-terminal%2Fmodeset.c;h=f7bcbb2914890102ed7501de6f9ef96a56d84cda;hp=c1119c9e0fde6f366df7b569a563bbff2fbe787b;hb=56f64d95763a799ba4475daf44d8e9f72a1bd474;hpb=39cf40e846754fe37f5c8a948f37227ce1ef8472 diff --git a/src/libsystemd-terminal/modeset.c b/src/libsystemd-terminal/modeset.c index c1119c9e0..f7bcbb291 100644 --- a/src/libsystemd-terminal/modeset.c +++ b/src/libsystemd-terminal/modeset.c @@ -146,16 +146,12 @@ static int modeset_new(Modeset **out) { return log_oom(); r = sd_pid_get_session(getpid(), &m->session); - if (r < 0) { - log_error("Cannot retrieve logind session: %s", strerror(-r)); - return r; - } + if (r < 0) + return log_error_errno(r, "Cannot retrieve logind session: %m"); r = sd_session_get_seat(m->session, &m->seat); - if (r < 0) { - log_error("Cannot retrieve seat of logind session: %s", strerror(-r)); - return r; - } + if (r < 0) + return log_error_errno(r, "Cannot retrieve seat of logind session: %m"); m->my_tty = is_my_tty(m->session); m->managed = m->my_tty && geteuid() > 0; @@ -234,18 +230,18 @@ static void modeset_draw(Modeset *m, const grdev_display_target *t) { uint32_t j, k, *b; uint8_t *l; - assert(t->fb->format == DRM_FORMAT_XRGB8888 || t->fb->format == DRM_FORMAT_ARGB8888); + assert(t->back->format == DRM_FORMAT_XRGB8888 || t->back->format == DRM_FORMAT_ARGB8888); assert(!t->rotate); assert(!t->flip); - l = t->fb->maps[0]; + l = t->back->maps[0]; for (j = 0; j < t->height; ++j) { for (k = 0; k < t->width; ++k) { b = (uint32_t*)l; b[k] = (0xff << 24) | (m->r << 16) | (m->g << 8) | m->b; } - l += t->fb->strides[0]; + l += t->back->strides[0]; } } @@ -256,9 +252,9 @@ static void modeset_render(Modeset *m, grdev_display *d) { m->g = next_color(&m->g_up, m->g, 3); m->b = next_color(&m->b_up, m->b, 2); - GRDEV_DISPLAY_FOREACH_TARGET(d, t, 0) { + GRDEV_DISPLAY_FOREACH_TARGET(d, t) { modeset_draw(m, t); - grdev_display_flip_target(d, t, 1); + grdev_display_flip_target(d, t); } grdev_session_commit(m->grdev_session); @@ -270,12 +266,10 @@ static void modeset_grdev_fn(grdev_session *session, void *userdata, grdev_event switch (ev->type) { case GRDEV_EVENT_DISPLAY_ADD: grdev_display_enable(ev->display_add.display); - modeset_render(m, ev->display_add.display); break; case GRDEV_EVENT_DISPLAY_REMOVE: break; case GRDEV_EVENT_DISPLAY_CHANGE: - modeset_render(m, ev->display_change.display); break; case GRDEV_EVENT_DISPLAY_FRAME: modeset_render(m, ev->display_frame.display); @@ -311,17 +305,13 @@ static int modeset_sysview_fn(sysview_context *c, void *userdata, sysview_event name, modeset_grdev_fn, m); - if (r < 0) { - log_error("Cannot create grdev session: %s", strerror(-r)); - return r; - } + if (r < 0) + return log_error_errno(r, "Cannot create grdev session: %m"); if (m->managed) { r = sysview_session_take_control(ev->session_add.session); - if (r < 0) { - log_error("Cannot request session control: %s", strerror(-r)); - return r; - } + if (r < 0) + return log_error_errno(r, "Cannot request session control: %m"); } grdev_session_enable(m->grdev_session); @@ -334,7 +324,8 @@ static int modeset_sysview_fn(sysview_context *c, void *userdata, sysview_event grdev_session_restore(m->grdev_session); grdev_session_disable(m->grdev_session); m->grdev_session = grdev_session_free(m->grdev_session); - sd_event_exit(m->event, 0); + if (sd_event_get_exit_code(m->event, &r) == -ENODATA) + sd_event_exit(m->event, 0); break; case SYSVIEW_EVENT_SESSION_ATTACH: d = ev->session_attach.device; @@ -349,17 +340,22 @@ static int modeset_sysview_fn(sysview_context *c, void *userdata, sysview_event if (type == SYSVIEW_DEVICE_DRM) grdev_session_remove_drm(m->grdev_session, sysview_device_get_ud(d)); + break; + case SYSVIEW_EVENT_SESSION_REFRESH: + d = ev->session_refresh.device; + type = sysview_device_get_type(d); + if (type == SYSVIEW_DEVICE_DRM) + grdev_session_hotplug_drm(m->grdev_session, ev->session_refresh.ud); + break; case SYSVIEW_EVENT_SESSION_CONTROL: r = ev->session_control.error; - if (r < 0) { - log_error("Cannot acquire session control: %s", strerror(-r)); - return r; - } + if (r < 0) + return log_error_errno(r, "Cannot acquire session control: %m"); r = ioctl(1, KDSKBMODE, K_UNICODE); if (r < 0) { - log_error("Cannot set K_UNICODE on stdout: %m"); + log_error_errno(errno, "Cannot set K_UNICODE on stdout: %m"); return -errno; } @@ -474,7 +470,7 @@ int main(int argc, char *argv[]) { log_parse_environment(); log_open(); - srand(time(NULL)); + initialize_srand(); r = parse_argv(argc, argv); if (r <= 0)