X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=src%2Flib%2Fcmdline_rdline.c;h=91217bea19aa5b5e6ae1be3b72ebca04f0ad2610;hb=12df0462d324d6aaced9491955628c46b9ea853c;hp=15f096d7f406350b399d8645e146e82747d09277;hpb=62115fff94ec9f1d023a3b713f178980f6bb5691;p=libcmdline.git diff --git a/src/lib/cmdline_rdline.c b/src/lib/cmdline_rdline.c index 15f096d..91217be 100644 --- a/src/lib/cmdline_rdline.c +++ b/src/lib/cmdline_rdline.c @@ -135,6 +135,12 @@ rdline_stop(struct rdline *rdl) rdl->status = RDLINE_INIT; } +void +rdline_quit(struct rdline *rdl) +{ + rdl->status = RDLINE_EXITED; +} + void rdline_restart(struct rdline *rdl) { @@ -158,19 +164,21 @@ rdline_get_buffer(struct rdline *rdl) } static void -display_right_buffer(struct rdline *rdl) +display_right_buffer(struct rdline *rdl, int force) { unsigned int i; char tmp; + if (!force && CIRBUF_IS_EMPTY(&rdl->right)) + return; + rdline_puts(rdl, vt100_clear_right); - if (!CIRBUF_IS_EMPTY(&rdl->right)) { - CIRBUF_FOREACH(&rdl->right, i, tmp) { - rdl->write_char(rdl, tmp); - } + CIRBUF_FOREACH(&rdl->right, i, tmp) { + rdl->write_char(rdl, tmp); + } + if (!CIRBUF_IS_EMPTY(&rdl->right)) rdline_miniprintf(rdl, vt100_multi_left, CIRBUF_GET_LEN(&rdl->right)); - } } void @@ -185,7 +193,7 @@ rdline_redisplay(struct rdline *rdl) CIRBUF_FOREACH(&rdl->left, i, tmp) { rdl->write_char(rdl, tmp); } - display_right_buffer(rdl); + display_right_buffer(rdl, 1); } int @@ -198,6 +206,8 @@ rdline_char_in(struct rdline *rdl, char c) char *buf; #endif + if (rdl->status == RDLINE_EXITED) + return RDLINE_RES_EXITED; if (rdl->status != RDLINE_RUNNING) return RDLINE_RES_NOT_RUNNING; @@ -264,11 +274,12 @@ rdline_char_in(struct rdline *rdl, char c) case CMDLINE_KEY_BKSPACE: if(!cirbuf_del_tail_safe(&rdl->left)) { rdline_puts(rdl, vt100_bs); - display_right_buffer(rdl); + display_right_buffer(rdl, 1); } break; case CMDLINE_KEY_META_BKSPACE: + case CMDLINE_KEY_CTRL_W: while (! CIRBUF_IS_EMPTY(&rdl->left) && isblank2(cirbuf_get_tail(&rdl->left))) { rdline_puts(rdl, vt100_bs); cirbuf_del_tail(&rdl->left); @@ -277,7 +288,7 @@ rdline_char_in(struct rdline *rdl, char c) rdline_puts(rdl, vt100_bs); cirbuf_del_tail(&rdl->left); } - display_right_buffer(rdl); + display_right_buffer(rdl, 1); break; case CMDLINE_KEY_SUPPR: @@ -288,7 +299,7 @@ rdline_char_in(struct rdline *rdl, char c) return RDLINE_RES_EOF; } if (!cirbuf_del_head_safe(&rdl->right)) { - display_right_buffer(rdl); + display_right_buffer(rdl, 1); } break; @@ -333,7 +344,7 @@ rdline_char_in(struct rdline *rdl, char c) rdl->write_char(rdl, rdl->kill_buf[i]); i++; } - display_right_buffer(rdl); + display_right_buffer(rdl, 0); break; #endif /* !NO_RDLINE_KILL_BUF */ @@ -381,7 +392,7 @@ rdline_char_in(struct rdline *rdl, char c) rdl->write_char(rdl, tmp_buf[i]); i++; } - display_right_buffer(rdl); + display_right_buffer(rdl, 1); return RDLINE_RES_COMPLETE; /* ?? */ } @@ -413,6 +424,9 @@ rdline_char_in(struct rdline *rdl, char c) if (rdl->validate) rdl->validate(rdl, rdl->left_buf, CIRBUF_GET_LEN(&rdl->left)+2); + /* user may have stopped rdline */ + if (rdl->status == RDLINE_EXITED) + return RDLINE_RES_EXITED; return RDLINE_RES_VALIDATED; #ifndef NO_RDLINE_HISTORY @@ -473,7 +487,7 @@ rdline_char_in(struct rdline *rdl, char c) return RDLINE_RES_SUCCESS; rdl->write_char(rdl, c); - display_right_buffer(rdl); + display_right_buffer(rdl, 0); return RDLINE_RES_SUCCESS; }