parent
43eee8da71
commit
9114d0555c
95
ui.c
95
ui.c
|
@ -369,26 +369,87 @@ static void enter(void) {
|
||||||
line.end = line.buf;
|
line.end = line.buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct {
|
||||||
|
wchar_t *word;
|
||||||
|
char *prefix;
|
||||||
|
} tab;
|
||||||
|
|
||||||
|
static void accept(void) {
|
||||||
|
if (!tab.word) return;
|
||||||
|
tab.word = NULL;
|
||||||
|
free(tab.prefix);
|
||||||
|
tabAccept();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void reject(void) {
|
||||||
|
if (!tab.word) return;
|
||||||
|
tab.word = NULL;
|
||||||
|
free(tab.prefix);
|
||||||
|
tabReject();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void complete(void) {
|
||||||
|
if (!tab.word) {
|
||||||
|
wchar_t ch = *line.ptr;
|
||||||
|
*line.ptr = L'\0';
|
||||||
|
tab.word = wcsrchr(line.buf, L' ');
|
||||||
|
tab.word = (tab.word ? &tab.word[1] : line.buf);
|
||||||
|
tab.prefix = awcstombs(tab.word);
|
||||||
|
if (!tab.prefix) err(EX_DATAERR, "awcstombs");
|
||||||
|
*line.ptr = ch;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *complete = tabNext(tab.prefix);
|
||||||
|
if (!complete) {
|
||||||
|
reject();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
wchar_t *wcs = ambstowcs(complete);
|
||||||
|
if (!wcs) err(EX_DATAERR, "ambstowcs");
|
||||||
|
|
||||||
|
size_t i;
|
||||||
|
for (i = 0; wcs[i] && line.ptr > &tab.word[i]; ++i) {
|
||||||
|
tab.word[i] = wcs[i];
|
||||||
|
}
|
||||||
|
while (line.ptr > &tab.word[i]) {
|
||||||
|
backspace();
|
||||||
|
}
|
||||||
|
for (; wcs[i]; ++i) {
|
||||||
|
insert(wcs[i]);
|
||||||
|
}
|
||||||
|
free(wcs);
|
||||||
|
|
||||||
|
if (tab.word == line.buf) insert(L':');
|
||||||
|
insert(L' ');
|
||||||
|
}
|
||||||
|
|
||||||
static void keyChar(wint_t ch) {
|
static void keyChar(wint_t ch) {
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
break; case CTRL('L'): uiRedraw();
|
break; case CTRL('L'): uiRedraw();
|
||||||
break; case CTRL('B'): left();
|
break; case CTRL('B'): reject(); left();
|
||||||
break; case CTRL('F'): right();
|
break; case CTRL('F'): reject(); right();
|
||||||
break; case CTRL('A'): home();
|
break; case CTRL('A'): reject(); home();
|
||||||
break; case CTRL('E'): end();
|
break; case CTRL('E'): reject(); end();
|
||||||
break; case CTRL('D'): delete();
|
break; case CTRL('D'): reject(); delete();
|
||||||
break; case CTRL('K'): kill();
|
break; case CTRL('K'): reject(); kill();
|
||||||
break; case '\b': backspace();
|
break; case L'\b': reject(); backspace();
|
||||||
break; case '\177': backspace();
|
break; case L'\177': reject(); backspace();
|
||||||
break; case '\n': enter();
|
break; case L'\t': complete();
|
||||||
break; case CTRL('C'): insert(IRC_COLOR);
|
break; case L'\n': accept(); enter();
|
||||||
break; case CTRL('N'): insert(IRC_RESET);
|
break; case CTRL('C'): accept(); insert(IRC_COLOR);
|
||||||
break; case CTRL('O'): insert(IRC_BOLD);
|
break; case CTRL('N'): accept(); insert(IRC_RESET);
|
||||||
break; case CTRL('R'): insert(IRC_COLOR);
|
break; case CTRL('O'): accept(); insert(IRC_BOLD);
|
||||||
break; case CTRL('T'): insert(IRC_ITALIC);
|
break; case CTRL('R'): accept(); insert(IRC_COLOR);
|
||||||
break; case CTRL('U'): insert(IRC_UNDERLINE);
|
break; case CTRL('T'): accept(); insert(IRC_ITALIC);
|
||||||
break; case CTRL('V'): insert(IRC_REVERSE);
|
break; case CTRL('U'): accept(); insert(IRC_UNDERLINE);
|
||||||
break; default: if (iswprint(ch)) insert(ch);
|
break; case CTRL('V'): accept(); insert(IRC_REVERSE);
|
||||||
|
break; default: {
|
||||||
|
if (iswprint(ch)) {
|
||||||
|
accept();
|
||||||
|
insert(ch);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue