From d5aaacda5a4b6cbea654c0d0cca3c901b8dda3d3 Mon Sep 17 00:00:00 2001 From: Nguyễn Thái Ngọc Duy Date: Sat, 9 May 2009 16:52:07 +1000 Subject: introduce libbb/termios.c for terminal-related functions --- libbb/termios.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 libbb/termios.c (limited to 'libbb/termios.c') diff --git a/libbb/termios.c b/libbb/termios.c new file mode 100644 index 000000000..f47593a49 --- /dev/null +++ b/libbb/termios.c @@ -0,0 +1,73 @@ +#include "libbb.h" +#include +#include +#include "strbuf.h" +#include "cygwin_termios.h" + +int tcgetattr(int fd, struct termios *t) +{ + t->c_lflag = ECHO; + return 0; +} + + +int tcsetattr(int fd, int mode, const struct termios *t) +{ + return 0; +} + +static int get_wincon_width_height(const int fd, int *width, int *height) +{ + HANDLE console; + CONSOLE_SCREEN_BUFFER_INFO sbi; + + console = GetStdHandle(STD_OUTPUT_HANDLE); + if (console == INVALID_HANDLE_VALUE || !console) + return -1; + + GetConsoleScreenBufferInfo(console, &sbi); + + if (width) + *width = sbi.srWindow.Right - sbi.srWindow.Left; + if (height) + *height = sbi.srWindow.Bottom - sbi.srWindow.Top; + return 0; +} + +int get_terminal_width_height(const int fd, int *width, int *height) +{ + return get_wincon_width_height(fd, width, height); +} + +int wincon_read(int fd, char *buf, int size) +{ + static struct strbuf input = STRBUF_INIT; + HANDLE cin = GetStdHandle(STD_INPUT_HANDLE); + static int initialized = 0; + + if (fd != 0) + die("wincon_read is for stdin only"); + if (cin == INVALID_HANDLE_VALUE || is_cygwin_tty(fd)) + return safe_read(fd, buf, size); + if (!initialized) { + SetConsoleMode(cin, ENABLE_ECHO_INPUT); + initialized = 1; + } + while (input.len < size) { + INPUT_RECORD record; + DWORD nevent_out; + int ch; + + if (!ReadConsoleInput(cin, &record, 1, &nevent_out)) + return -1; + if (record.EventType != KEY_EVENT || !record.Event.KeyEvent.bKeyDown) + continue; + ch = record.Event.KeyEvent.uChar.AsciiChar; + /* Ctrl-X is handled by ReadConsoleInput, Alt-X is not needed anyway */ + strbuf_addch(&input, ch); + } + memcpy(buf, input.buf, size); + memcpy(input.buf, input.buf+size, input.len-size+1); + strbuf_setlen(&input, input.len-size); + return size; +} -- cgit v1.2.3-55-g6feb