X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd-terminal%2Fsubterm.c;h=75a25e5590e3ada98ee3e0ca23784fa6efe9e106;hb=be795898c0d2fa21e3389b89793dcd45c47f8b9f;hp=563cbf0823a9928689f2c2740785ad29faab63c4;hpb=cb51a41fa632790ea839aa126844dfc2d74eb341;p=elogind.git diff --git a/src/libsystemd-terminal/subterm.c b/src/libsystemd-terminal/subterm.c index 563cbf082..75a25e559 100644 --- a/src/libsystemd-terminal/subterm.c +++ b/src/libsystemd-terminal/subterm.c @@ -102,10 +102,8 @@ static int output_winch(Output *o) { assert_return(o, -EINVAL); r = ioctl(o->fd, TIOCGWINSZ, &wsz); - if (r < 0) { - log_error("error: cannot read window-size: %m"); - return -errno; - } + if (r < 0) + return log_error_errno(errno, "error: cannot read window-size: %m"); if (wsz.ws_col != o->width || wsz.ws_row != o->height) { o->width = wsz.ws_col; @@ -125,10 +123,8 @@ static int output_flush(Output *o) { return 0; len = loop_write(o->fd, o->obuf, o->n_obuf, false); - if (len < 0) { - log_error("error: cannot write to TTY (%zd): %s", len, strerror(-len)); - return len; - } + if (len < 0) + return log_error_errno(len, "error: cannot write to TTY (%zd): %m", len); o->n_obuf = 0; @@ -156,10 +152,8 @@ static int output_write(Output *o, const void *buf, size_t size) { return r; len = loop_write(o->fd, buf, size, false); - if (len < 0) { - log_error("error: cannot write to TTY (%zd): %s", len, strerror(-len)); - return len; - } + if (len < 0) + return log_error_errno(len, "error: cannot write to TTY (%zd): %m", len); return 0; } @@ -286,6 +280,8 @@ static Output *output_free(Output *o) { if (!o) return NULL; + /* re-enable cursor */ + output_printf(o, "\e[?25h"); /* disable alternate screen buffer */ output_printf(o, "\e[?1049l"); output_flush(o); @@ -317,6 +313,11 @@ static int output_new(Output **out, int fd) { if (r < 0) goto error; + /* always hide cursor */ + r = output_printf(o, "\e[?25l"); + if (r < 0) + goto error; + r = output_flush(o); if (r < 0) goto error; @@ -421,10 +422,7 @@ static int output_draw_cell_fn(term_screen *screen, output_printf(o, "\e[38;2;%u;%u;%um", attr->fg.red, attr->fg.green, attr->fg.blue); break; case TERM_CCODE_BLACK ... TERM_CCODE_WHITE: - if (attr->bold) - output_printf(o, "\e[%um", attr->fg.ccode - TERM_CCODE_BLACK + 90); - else - output_printf(o, "\e[%um", attr->fg.ccode - TERM_CCODE_BLACK + 30); + output_printf(o, "\e[%um", attr->fg.ccode - TERM_CCODE_BLACK + 30); break; case TERM_CCODE_LIGHT_BLACK ... TERM_CCODE_LIGHT_WHITE: output_printf(o, "\e[%um", attr->fg.ccode - TERM_CCODE_LIGHT_BLACK + 90); @@ -475,7 +473,6 @@ static void output_draw_screen(Output *o, term_screen *s) { term_screen_draw(s, output_draw_cell_fn, o, NULL); - output_move_to(o, s->cursor_x + 1, s->cursor_y + 3); output_printf(o, "\e[m"); } @@ -539,10 +536,6 @@ static void output_draw(Output *o, bool menu, term_screen *screen) { else output_draw_screen(o, screen); - /* show cursor */ - if (!(screen->flags & TERM_FLAG_HIDE_CURSOR)) - output_printf(o, "\e[?25h"); - /* * Hack: sd-term was not written to support TTY as output-objects, thus * expects callers to use term_screen_feed_keyboard(). However, we @@ -613,12 +606,12 @@ static int terminal_winch_fn(sd_event_source *source, const struct signalfd_sigi if (t->pty) { r = pty_resize(t->pty, t->output->in_width, t->output->in_height); if (r < 0) - log_error("error: pty_resize() (%d): %s", r, strerror(-r)); + log_error_errno(r, "error: pty_resize() (%d): %m", r); } r = term_screen_resize(t->screen, t->output->in_width, t->output->in_height); if (r < 0) - log_error("error: term_screen_resize() (%d): %s", r, strerror(-r)); + log_error_errno(r, "error: term_screen_resize() (%d): %m", r); terminal_dirty(t); @@ -657,10 +650,8 @@ static int terminal_write_tmp(Terminal *t) { if (t->pty) { for (i = 0; i < num; ++i) { r = pty_write(t->pty, vec[i].iov_base, vec[i].iov_len); - if (r < 0) { - log_error("error: cannot write to PTY (%d): %s", r, strerror(-r)); - return r; - } + if (r < 0) + return log_error_errno(r, "error: cannot write to PTY (%d): %m", r); } } @@ -714,7 +705,7 @@ static int terminal_io_fn(sd_event_source *source, int fd, uint32_t revents, voi if (errno == EAGAIN || errno == EINTR) return 0; - log_error("error: cannot read from TTY (%d): %m", -errno); + log_error_errno(errno, "error: cannot read from TTY (%d): %m", -errno); return -errno; } @@ -726,10 +717,8 @@ static int terminal_io_fn(sd_event_source *source, int fd, uint32_t revents, voi n_str = term_utf8_decode(&t->utf8, &str, buf[i]); for (j = 0; j < n_str; ++j) { type = term_parser_feed(t->parser, &seq, str[j]); - if (type < 0) { - log_error("error: term_parser_feed() (%d): %s", type, strerror(-type)); - return type; - } + if (type < 0) + return log_error_errno(type, "error: term_parser_feed() (%d): %m", type); if (!t->is_menu) { r = terminal_push_tmp(t, str[j]); @@ -778,10 +767,8 @@ static int terminal_pty_fn(Pty *pty, void *userdata, unsigned int event, const v break; case PTY_DATA: r = term_screen_feed_text(t->screen, ptr, size); - if (r < 0) { - log_error("error: term_screen_feed_text() (%d): %s", r, strerror(-r)); - return r; - } + if (r < 0) + return log_error_errno(r, "error: term_screen_feed_text() (%d): %m", r); terminal_dirty(t); break; @@ -833,16 +820,12 @@ static int terminal_new(Terminal **out, int in_fd, int out_fd) { assert_return(out, -EINVAL); r = tcgetattr(in_fd, &in_attr); - if (r < 0) { - log_error("error: tcgetattr() (%d): %m", -errno); - return -errno; - } + if (r < 0) + return log_error_errno(errno, "error: tcgetattr() (%d): %m", -errno); r = tcgetattr(out_fd, &out_attr); - if (r < 0) { - log_error("error: tcgetattr() (%d): %m", -errno); - return -errno; - } + if (r < 0) + return log_error_errno(errno, "error: tcgetattr() (%d): %m", -errno); t = new0(Terminal, 1); if (!t) @@ -858,49 +841,49 @@ static int terminal_new(Terminal **out, int in_fd, int out_fd) { r = tcsetattr(t->in_fd, TCSANOW, &in_attr); if (r < 0) { - log_error("error: tcsetattr() (%d): %s", r, strerror(-r)); + log_error_errno(r, "error: tcsetattr() (%d): %m", r); goto error; } r = tcsetattr(t->out_fd, TCSANOW, &out_attr); if (r < 0) { - log_error("error: tcsetattr() (%d): %s", r, strerror(-r)); + log_error_errno(r, "error: tcsetattr() (%d): %m", r); goto error; } r = sd_event_default(&t->event); if (r < 0) { - log_error("error: sd_event_default() (%d): %s", r, strerror(-r)); + log_error_errno(r, "error: sd_event_default() (%d): %m", r); goto error; } r = sigprocmask_many(SIG_BLOCK, SIGINT, SIGQUIT, SIGTERM, SIGWINCH, SIGCHLD, -1); if (r < 0) { - log_error("error: sigprocmask_many() (%d): %s", r, strerror(-r)); + log_error_errno(r, "error: sigprocmask_many() (%d): %m", r); goto error; } r = sd_event_add_signal(t->event, NULL, SIGINT, NULL, NULL); if (r < 0) { - log_error("error: sd_event_add_signal() (%d): %s", r, strerror(-r)); + log_error_errno(r, "error: sd_event_add_signal() (%d): %m", r); goto error; } r = sd_event_add_signal(t->event, NULL, SIGQUIT, NULL, NULL); if (r < 0) { - log_error("error: sd_event_add_signal() (%d): %s", r, strerror(-r)); + log_error_errno(r, "error: sd_event_add_signal() (%d): %m", r); goto error; } r = sd_event_add_signal(t->event, NULL, SIGTERM, NULL, NULL); if (r < 0) { - log_error("error: sd_event_add_signal() (%d): %s", r, strerror(-r)); + log_error_errno(r, "error: sd_event_add_signal() (%d): %m", r); goto error; } r = sd_event_add_signal(t->event, NULL, SIGWINCH, terminal_winch_fn, t); if (r < 0) { - log_error("error: sd_event_add_signal() (%d): %s", r, strerror(-r)); + log_error_errno(r, "error: sd_event_add_signal() (%d): %m", r); goto error; } @@ -908,7 +891,7 @@ static int terminal_new(Terminal **out, int in_fd, int out_fd) { t->is_dirty = true; r = sd_event_add_time(t->event, &t->frame_timer, CLOCK_MONOTONIC, 0, 0, terminal_frame_timer_fn, t); if (r < 0) { - log_error("error: sd_event_add_time() (%d): %s", r, strerror(-r)); + log_error_errno(r, "error: sd_event_add_time() (%d): %m", r); goto error; } @@ -930,7 +913,7 @@ static int terminal_new(Terminal **out, int in_fd, int out_fd) { r = term_screen_resize(t->screen, t->output->in_width, t->output->in_height); if (r < 0) { - log_error("error: term_screen_resize() (%d): %s", r, strerror(-r)); + log_error_errno(r, "error: term_screen_resize() (%d): %m", r); goto error; } @@ -952,10 +935,9 @@ static int terminal_run(Terminal *t) { assert_return(t, -EINVAL); pid = pty_fork(&t->pty, t->event, terminal_pty_fn, t, t->output->in_width, t->output->in_height); - if (pid < 0) { - log_error("error: cannot fork PTY (%d): %s", pid, strerror(-pid)); - return pid; - } else if (pid == 0) { + if (pid < 0) + return log_error_errno(pid, "error: cannot fork PTY (%d): %m", pid); + else if (pid == 0) { /* child */ char **argv = (char*[]){ @@ -967,7 +949,7 @@ static int terminal_run(Terminal *t) { setenv("COLORTERM", "systemd-subterm", 1); execve(argv[0], argv, environ); - log_error("error: cannot exec %s (%d): %m", argv[0], -errno); + log_error_errno(errno, "error: cannot exec %s (%d): %m", argv[0], -errno); _exit(1); } @@ -994,7 +976,7 @@ int main(int argc, char *argv[]) { out: if (r < 0) - log_error("error: terminal failed (%d): %s", r, strerror(-r)); + log_error_errno(r, "error: terminal failed (%d): %m", r); terminal_free(t); return -r; }