Преглед на файлове

Fix keyresize handling of cur in filterentries()

master
0xACE преди 5 години
родител
ревизия
dcad704ae9
променени са 1 файла, в които са добавени 45 реда и са изтрити 4 реда
  1. +45
    -4
      src/nnn.c

+ 45
- 4
src/nnn.c Целия файл

@@ -554,6 +554,15 @@ static char *xitoa(uint val)
return &ascbuf[++i];
}

#ifdef KEY_RESIZE
/* Clear the old prompt */
static inline void clearoldprompt()
{
move(xlines - 1, 0);
clrtoeol();
}
#endif

/* Messages show up at the bottom */
static inline void printmsg(const char *msg)
{
@@ -592,7 +601,20 @@ static int get_input(const char *prompt)
if (prompt)
printprompt(prompt);
cleartimeout();
#ifdef KEY_RESIZE
do {
r = getch();
if ( r == KEY_RESIZE) {
if (prompt) {
clearoldprompt();
xlines = LINES;
printprompt(prompt);
}
}
} while ( r == KEY_RESIZE);
#else
r = getch();
#endif
settimeout();
return r;
}
@@ -1716,6 +1738,18 @@ static int filterentries(char *path)

while ((r = get_wch(ch)) != ERR) {
switch (*ch) {
#ifdef KEY_RESIZE
case KEY_RESIZE:
clearoldprompt();
if (len == 1) {
cur = oldcur;
redraw(path);
cur = 0;
} else
redraw(path);
printprompt(ln);
continue;
#endif
case KEY_DC: // fallthrough
case KEY_BACKSPACE: // fallthrough
case '\b': // fallthrough
@@ -1841,7 +1875,7 @@ end:
static char *xreadline(char *prefill, char *prompt)
{
size_t len, pos;
int x, y, r;
int x, r;
const int WCHAR_T_WIDTH = sizeof(wchar_t);
wint_t ch[2] = {0};
wchar_t * const buf = malloc(sizeof(wchar_t) * CMD_LEN_MAX);
@@ -1863,13 +1897,13 @@ static char *xreadline(char *prefill, char *prompt)
len = pos = 0;
}

getyx(stdscr, y, x);
x = getcurx(stdscr);
curs_set(TRUE);

while (1) {
buf[len] = ' ';
mvaddnwstr(y, x, buf, len + 1);
move(y, x + wcswidth(buf, pos));
mvaddnwstr(xlines - 1, x, buf, len + 1);
move(xlines - 1, x + wcswidth(buf, pos));

r = get_wch(ch);
if (r != ERR) {
@@ -1922,6 +1956,13 @@ static char *xreadline(char *prefill, char *prompt)
}
} else {
switch (*ch) {
#ifdef KEY_RESIZE
case KEY_RESIZE:
clearoldprompt();
xlines = LINES;
printprompt(prompt);
break;
#endif
case KEY_LEFT:
if (pos > 0)
--pos;


Loading…
Отказ
Запис