From: Eric Pouech Subject: [PATCH] To: wine-patches@winehq.org Message-Id: <20110120205705.7057.34563.stgit@localhost6.localdomain6> Date: Thu, 20 Jan 2011 21:57:05 +0100 [Kernel32]: in bare console with curses, ensure control stream is sent to tty (even when some fd:s are redirected) A+ --- dlls/kernel32/term.c | 25 +++++++++++++++++++------ 1 files changed, 19 insertions(+), 6 deletions(-) diff --git a/dlls/kernel32/term.c b/dlls/kernel32/term.c index a7e18ec..889d8a0 100644 --- a/dlls/kernel32/term.c +++ b/dlls/kernel32/term.c @@ -157,7 +157,7 @@ static void *nc_handle = NULL; #define MAKE_FUNCPTR(f) static typeof(f) * p_##f; -MAKE_FUNCPTR(putp) +MAKE_FUNCPTR(tputs) MAKE_FUNCPTR(setupterm) MAKE_FUNCPTR(tigetstr) MAKE_FUNCPTR(tparm) @@ -188,7 +188,7 @@ static BOOL TERM_bind_libcurses(void) goto sym_not_found; \ } - LOAD_FUNCPTR(putp) + LOAD_FUNCPTR(tputs) LOAD_FUNCPTR(setupterm) LOAD_FUNCPTR(tigetstr) LOAD_FUNCPTR(tparm) @@ -207,7 +207,7 @@ sym_not_found: return FALSE; } -#define putp p_putp +#define tputs p_tputs #define setupterm p_setupterm #define tigetstr p_tigetstr #define tparm p_tparm @@ -317,20 +317,33 @@ static BOOL TERM_BuildKeyDB(void) return TRUE; } +static int TERM_output_fd; + +static int TERM_putchar(int ich) +{ + char ch = ich; + return write(TERM_output_fd, &ch, 1); +} + BOOL TERM_Init(void) { + /* if output is redirected from shell to a file or pipe, still enforce control + * flows to be sent to TTY + */ + TERM_output_fd = open("/dev/tty", O_RDWR); if (!TERM_bind_libcurses()) return FALSE; - if (setupterm(NULL, 1 /* really ?? */, NULL) == -1) return FALSE; + if (setupterm(NULL, TERM_output_fd, NULL) == -1) return FALSE; TERM_BuildKeyDB(); /* set application key mode */ - putp(tigetstr("smkx")); + tputs(tigetstr("smkx"), 1, TERM_putchar); return TRUE; } BOOL TERM_Exit(void) { /* put back the cursor key mode */ - putp(tigetstr("rmkx")); + tputs(tigetstr("rmkx"), 1, TERM_putchar); + close(TERM_output_fd); return TRUE; }