terminal: work around macos poll() bug
On macos the builtin "add -p" does not handle keys that generate escape sequences because poll() does not work with terminals there. Switch to using select() on non-windows platforms to work around this. Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
e4938ce3cc
commit
6606d99bae
@ -92,6 +92,31 @@ static int enable_non_canonical(enum save_term_flags flags)
|
|||||||
return disable_bits(flags, ICANON | ECHO);
|
return disable_bits(flags, ICANON | ECHO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* On macos it is not possible to use poll() with a terminal so use select
|
||||||
|
* instead.
|
||||||
|
*/
|
||||||
|
static int getchar_with_timeout(int timeout)
|
||||||
|
{
|
||||||
|
struct timeval tv, *tvp = NULL;
|
||||||
|
fd_set readfds;
|
||||||
|
int res;
|
||||||
|
|
||||||
|
if (timeout >= 0) {
|
||||||
|
tv.tv_sec = timeout / 1000;
|
||||||
|
tv.tv_usec = (timeout % 1000) * 1000;
|
||||||
|
tvp = &tv;
|
||||||
|
}
|
||||||
|
|
||||||
|
FD_ZERO(&readfds);
|
||||||
|
FD_SET(0, &readfds);
|
||||||
|
res = select(1, &readfds, NULL, NULL, tvp);
|
||||||
|
if (res <= 0)
|
||||||
|
return EOF;
|
||||||
|
|
||||||
|
return getchar();
|
||||||
|
}
|
||||||
|
|
||||||
#elif defined(GIT_WINDOWS_NATIVE)
|
#elif defined(GIT_WINDOWS_NATIVE)
|
||||||
|
|
||||||
#define INPUT_PATH "CONIN$"
|
#define INPUT_PATH "CONIN$"
|
||||||
@ -257,6 +282,16 @@ static int mingw_getchar(void)
|
|||||||
}
|
}
|
||||||
#define getchar mingw_getchar
|
#define getchar mingw_getchar
|
||||||
|
|
||||||
|
static int getchar_with_timeout(int timeout)
|
||||||
|
{
|
||||||
|
struct pollfd pfd = { .fd = 0, .events = POLLIN };
|
||||||
|
|
||||||
|
if (poll(&pfd, 1, timeout) < 1)
|
||||||
|
return EOF;
|
||||||
|
|
||||||
|
return getchar();
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef FORCE_TEXT
|
#ifndef FORCE_TEXT
|
||||||
@ -407,12 +442,7 @@ int read_key_without_echo(struct strbuf *buf)
|
|||||||
* half a second when we know that the sequence is complete.
|
* half a second when we know that the sequence is complete.
|
||||||
*/
|
*/
|
||||||
while (!is_known_escape_sequence(buf->buf)) {
|
while (!is_known_escape_sequence(buf->buf)) {
|
||||||
struct pollfd pfd = { .fd = 0, .events = POLLIN };
|
ch = getchar_with_timeout(500);
|
||||||
|
|
||||||
if (poll(&pfd, 1, 500) < 1)
|
|
||||||
break;
|
|
||||||
|
|
||||||
ch = getchar();
|
|
||||||
if (ch == EOF)
|
if (ch == EOF)
|
||||||
break;
|
break;
|
||||||
strbuf_addch(buf, ch);
|
strbuf_addch(buf, ch);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user