X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=interactive.c;h=190cdf295130a2d711074e7c5f5927174b312076;hp=b72148cc41df54e79f0da53bd4853ba979674a0c;hb=e8d5da94efd6cbb0aa75f57290c76d9992ff8f47;hpb=f2940b2fbde865256bc35c74e3bd624d2ff48d2e diff --git a/interactive.c b/interactive.c index b72148cc..190cdf29 100644 --- a/interactive.c +++ b/interactive.c @@ -1,8 +1,4 @@ -/* - * Copyright (C) 2011 Andre Noll - * - * Licensed under the GPL v2. For licencing details see COPYING. - */ +/* Copyright (C) 2011 Andre Noll , see file COPYING. */ /** \file interactive.c Readline abstraction for interactive sessions. */ @@ -38,6 +34,7 @@ struct i9e_private { bool caught_sigterm; Keymap standard_km; Keymap bare_km; + int fd_flags[2]; }; static struct i9e_private i9e_private, *i9ep = &i9e_private; @@ -205,26 +202,7 @@ void i9e_attach_to_stdout(struct btr_node *producer) static void wipe_bottom_line(void) { - char x[] = " "; - int n = i9ep->num_columns; - - /* - * For reasons beyond my understanding, writing more than 68 characters - * here causes MacOS to mess up the terminal. Writing a line of spaces - * in smaller chunks works fine though. Weird. - */ - fprintf(i9ep->stderr_stream, "\r"); - while (n > 0) { - if (n >= sizeof(x)) { - fprintf(i9ep->stderr_stream, "%s", x); - n -= sizeof(x); - continue; - } - x[n] = '\0'; - fprintf(i9ep->stderr_stream, "%s", x); - break; - } - fprintf(i9ep->stderr_stream, "\r"); + fprintf(i9ep->stderr_stream, "\r%s\r", i9ep->empty_line); } #ifndef RL_FREE_KEYMAP_DECLARED @@ -254,6 +232,8 @@ void i9e_close(void) if (hf) write_history(hf); wipe_bottom_line(); + fcntl(i9ep->ici->fds[0], F_SETFL, i9ep->fd_flags[0]); + fcntl(i9ep->ici->fds[1], F_SETFL, i9ep->fd_flags[1]); } static void clear_bottom_line(void) @@ -476,6 +456,14 @@ int i9e_open(struct i9e_client_info *ici, struct sched *s) memset(i9ep, 0, sizeof(struct i9e_private)); if (!isatty(ici->fds[0])) return -E_I9E_SETUPTERM; + ret = fcntl(ici->fds[0], F_GETFL); + if (ret < 0) + return -E_I9E_SETUPTERM; + i9ep->fd_flags[0] = ret; + ret = fcntl(ici->fds[1], F_GETFL); + if (ret < 0) + return -E_I9E_SETUPTERM; + i9ep->fd_flags[1] = ret; ret = mark_fd_nonblocking(ici->fds[0]); if (ret < 0) return ret;