e4938ce3cc
read_key_without_echo() reads from stdin but uses /dev/tty when it
disables echo. This is unfortunate as there no guarantee that stdin is
the same device as /dev/tty. The perl version of "add -p" uses stdin
when it sets the terminal mode, this commit does the same for the
builtin version. There is still a difference between the perl and
builtin versions though - the perl version will ignore any errors when
setting the terminal mode[1] and will still read single bytes when
stdin is not a terminal. The builtin version displays a warning if
setting the terminal mode fails and switches to reading a line at a
time.
[1] b061c913bb/ReadKey.xs (L1090)
Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
28 lines
875 B
C
28 lines
875 B
C
#ifndef COMPAT_TERMINAL_H
|
|
#define COMPAT_TERMINAL_H
|
|
|
|
enum save_term_flags {
|
|
/* Save input and output settings */
|
|
SAVE_TERM_DUPLEX = 1 << 0,
|
|
/* Save stdin rather than /dev/tty (fails if stdin is not a terminal) */
|
|
SAVE_TERM_STDIN = 1 << 1,
|
|
};
|
|
|
|
/*
|
|
* Save the terminal attributes so they can be restored later by a
|
|
* call to restore_term(). Note that every successful call to
|
|
* save_term() must be matched by a call to restore_term() even if the
|
|
* attributes have not been changed. Returns 0 on success, -1 on
|
|
* failure.
|
|
*/
|
|
int save_term(enum save_term_flags flags);
|
|
/* Restore the terminal attributes that were saved with save_term() */
|
|
void restore_term(void);
|
|
|
|
char *git_terminal_prompt(const char *prompt, int echo);
|
|
|
|
/* Read a single keystroke, without echoing it to the terminal */
|
|
int read_key_without_echo(struct strbuf *buf);
|
|
|
|
#endif /* COMPAT_TERMINAL_H */
|