mirror of
https://github.com/jarun/nnn.git
synced 2024-11-04 18:33:12 +00:00
Use KEY_RESIZE when prompting user input
The problem was that a window wouldn't resize while prompting the user for input. These changes allows the input methods in nnn to resize properly if KEY_RESIZE is defined. A more portable solution would be hooking the WINCH signal and update the xlines value from there along with some resized flag. In some cases the full window isn't redrawn until the user has finished the input. This is because in some functions I wasn't sure the current "path" was available.
This commit is contained in:
parent
fee2c339cc
commit
ba12fa8b3d
44
src/nnn.c
44
src/nnn.c
|
@ -548,6 +548,15 @@ static char *xitoa(uint val)
|
||||||
return &ascbuf[++i];
|
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 */
|
/* Messages show up at the bottom */
|
||||||
static inline void printmsg(const char *msg)
|
static inline void printmsg(const char *msg)
|
||||||
{
|
{
|
||||||
|
@ -586,7 +595,20 @@ static int get_input(const char *prompt)
|
||||||
if (prompt)
|
if (prompt)
|
||||||
printprompt(prompt);
|
printprompt(prompt);
|
||||||
cleartimeout();
|
cleartimeout();
|
||||||
|
#ifdef KEY_RESIZE
|
||||||
|
do {
|
||||||
r = getch();
|
r = getch();
|
||||||
|
if ( r == KEY_RESIZE) {
|
||||||
|
if (prompt) {
|
||||||
|
clearoldprompt();
|
||||||
|
xlines = LINES;
|
||||||
|
printprompt(prompt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while ( r == KEY_RESIZE);
|
||||||
|
#else
|
||||||
|
r = getch();
|
||||||
|
#endif
|
||||||
settimeout();
|
settimeout();
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
@ -1667,6 +1689,13 @@ static int filterentries(char *path)
|
||||||
|
|
||||||
while ((r = get_wch(ch)) != ERR) {
|
while ((r = get_wch(ch)) != ERR) {
|
||||||
switch (*ch) {
|
switch (*ch) {
|
||||||
|
#ifdef KEY_RESIZE
|
||||||
|
case KEY_RESIZE:
|
||||||
|
clearoldprompt();
|
||||||
|
redraw(path);
|
||||||
|
printprompt(ln);
|
||||||
|
continue;
|
||||||
|
#endif
|
||||||
case KEY_DC: // fallthrough
|
case KEY_DC: // fallthrough
|
||||||
case KEY_BACKSPACE: // fallthrough
|
case KEY_BACKSPACE: // fallthrough
|
||||||
case '\b': // fallthrough
|
case '\b': // fallthrough
|
||||||
|
@ -1787,7 +1816,7 @@ end:
|
||||||
static char *xreadline(char *prefill, char *prompt)
|
static char *xreadline(char *prefill, char *prompt)
|
||||||
{
|
{
|
||||||
size_t len, pos;
|
size_t len, pos;
|
||||||
int x, y, r;
|
int x, r;
|
||||||
const int WCHAR_T_WIDTH = sizeof(wchar_t);
|
const int WCHAR_T_WIDTH = sizeof(wchar_t);
|
||||||
wint_t ch[2] = {0};
|
wint_t ch[2] = {0};
|
||||||
wchar_t * const buf = malloc(sizeof(wchar_t) * CMD_LEN_MAX);
|
wchar_t * const buf = malloc(sizeof(wchar_t) * CMD_LEN_MAX);
|
||||||
|
@ -1809,13 +1838,13 @@ static char *xreadline(char *prefill, char *prompt)
|
||||||
len = pos = 0;
|
len = pos = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
getyx(stdscr, y, x);
|
x = getcurx(stdscr);
|
||||||
curs_set(TRUE);
|
curs_set(TRUE);
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
buf[len] = ' ';
|
buf[len] = ' ';
|
||||||
mvaddnwstr(y, x, buf, len + 1);
|
mvaddnwstr(xlines - 1, x, buf, len + 1);
|
||||||
move(y, x + wcswidth(buf, pos));
|
move(xlines - 1, x + wcswidth(buf, pos));
|
||||||
|
|
||||||
r = get_wch(ch);
|
r = get_wch(ch);
|
||||||
if (r != ERR) {
|
if (r != ERR) {
|
||||||
|
@ -1868,6 +1897,13 @@ static char *xreadline(char *prefill, char *prompt)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
switch (*ch) {
|
switch (*ch) {
|
||||||
|
#ifdef KEY_RESIZE
|
||||||
|
case KEY_RESIZE:
|
||||||
|
clearoldprompt();
|
||||||
|
xlines = LINES;
|
||||||
|
printprompt(prompt);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
case KEY_LEFT:
|
case KEY_LEFT:
|
||||||
if (pos > 0)
|
if (pos > 0)
|
||||||
--pos;
|
--pos;
|
||||||
|
|
Loading…
Reference in a new issue