X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Ftinfo%2Flib_raw.c;h=928692b0cb272ad52433dbb98ad2502dd5866303;hp=6df95714a9b17923872ec8a6e2e6cbec4ecbb965;hb=4aaab5e7c855d212deaa53608a08de5648fd86f6;hpb=c633e5103a29a38532cf1925257b91cea33fd090 diff --git a/ncurses/tinfo/lib_raw.c b/ncurses/tinfo/lib_raw.c index 6df95714..928692b0 100644 --- a/ncurses/tinfo/lib_raw.c +++ b/ncurses/tinfo/lib_raw.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998,1999,2000 Free Software Foundation, Inc. * + * Copyright (c) 1998-2011,2012 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -29,6 +29,8 @@ /**************************************************************************** * Author: Zeyd M. Ben-Halim 1992,1995 * * and: Eric S. Raymond * + * and: Thomas E. Dickey 1998-on * + * and: Juergen Pfeifer 2009 * ****************************************************************************/ /* @@ -46,13 +48,8 @@ */ #include -#include /* cur_term */ -MODULE_ID("$Id: lib_raw.c,v 1.8 2000/09/02 18:08:48 tom Exp $") - -#if SVR4_TERMIO && !defined(_POSIX_SOURCE) -#define _POSIX_SOURCE -#endif +MODULE_ID("$Id: lib_raw.c,v 1.21 2012/01/21 19:21:29 KO.Myung-Hun Exp $") #if HAVE_SYS_TERMIO_H #include /* needed for ISC */ @@ -60,177 +57,321 @@ MODULE_ID("$Id: lib_raw.c,v 1.8 2000/09/02 18:08:48 tom Exp $") #ifdef __EMX__ #include +#define _nc_setmode(mode) setmode(SP_PARM->_ifd, mode) +#else +#define _nc_setmode(mode) /* nothing */ +#endif + +#if USE_KLIBC_KBD +#define INCL_KBD +#include #endif #define COOKED_INPUT (IXON|BRKINT|PARMRK) #ifdef TRACE -#define BEFORE(N) if (_nc_tracing&TRACE_BITS) _tracef("%s before bits: %s", N, _nc_tracebits()) -#define AFTER(N) if (_nc_tracing&TRACE_BITS) _tracef("%s after bits: %s", N, _nc_tracebits()) +#define BEFORE(N) if (USE_TRACEF(TRACE_BITS)) _nc_locked_tracef("%s before bits: %s", N, _nc_tracebits()) +#define AFTER(N) if (USE_TRACEF(TRACE_BITS)) _nc_locked_tracef("%s after bits: %s", N, _nc_tracebits()) #else #define BEFORE(s) #define AFTER(s) #endif /* TRACE */ -int -raw(void) +NCURSES_EXPORT(int) +NCURSES_SP_NAME(raw) (NCURSES_SP_DCL0) { - T((T_CALLED("raw()"))); - if (SP != 0 && cur_term != 0) { + int result = ERR; + TERMINAL *termp; - SP->_raw = TRUE; - SP->_cbreak = 1; + T((T_CALLED("raw(%p)"), (void *) SP_PARM)); + if ((termp = TerminalOf(SP_PARM)) != 0) { + TTY buf; -#ifdef __EMX__ - setmode(SP->_ifd, O_BINARY); -#endif + BEFORE("raw"); + _nc_setmode(O_BINARY); + buf = termp->Nttyb; #ifdef TERMIOS - BEFORE("raw"); - cur_term->Nttyb.c_lflag &= ~(ICANON | ISIG | IEXTEN); - cur_term->Nttyb.c_iflag &= ~(COOKED_INPUT); - cur_term->Nttyb.c_cc[VMIN] = 1; - cur_term->Nttyb.c_cc[VTIME] = 0; + buf.c_lflag &= (unsigned) ~(ICANON | ISIG | IEXTEN); + buf.c_iflag &= (unsigned) ~(COOKED_INPUT); + buf.c_cc[VMIN] = 1; + buf.c_cc[VTIME] = 0; +#else + buf.sg_flags |= RAW; +#endif + result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); + if (result == OK) { +#if USE_KLIBC_KBD + KBDINFO kbdinfo; + + kbdinfo.cb = sizeof(kbdinfo); + KbdGetStatus(&kbdinfo, 0); + + kbdinfo.cb = sizeof(kbdinfo); + kbdinfo.fsMask &= ~KEYBOARD_ASCII_MODE; + kbdinfo.fsMask |= KEYBOARD_BINARY_MODE; + KbdSetStatus(&kbdinfo, 0); +#endif + SP_PARM->_raw = TRUE; + SP_PARM->_cbreak = 1; + termp->Nttyb = buf; + } AFTER("raw"); + } + returnCode(result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +raw(void) +{ + return NCURSES_SP_NAME(raw) (CURRENT_SCREEN); +} +#endif + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(cbreak) (NCURSES_SP_DCL0) +{ + int result = ERR; + TERMINAL *termp; + + T((T_CALLED("cbreak(%p)"), (void *) SP_PARM)); + if ((termp = TerminalOf(SP_PARM)) != 0) { + TTY buf; + + BEFORE("cbreak"); + _nc_setmode(O_BINARY); + + buf = termp->Nttyb; +#ifdef TERMIOS + buf.c_lflag &= (unsigned) ~ICANON; + buf.c_iflag &= (unsigned) ~ICRNL; + buf.c_lflag |= ISIG; + buf.c_cc[VMIN] = 1; + buf.c_cc[VTIME] = 0; #else - cur_term->Nttyb.sg_flags |= RAW; + buf.sg_flags |= CBREAK; #endif - returnCode(_nc_set_tty_mode(&cur_term->Nttyb)); + result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); + if (result == OK) { + SP_PARM->_cbreak = 1; + termp->Nttyb = buf; + } + AFTER("cbreak"); } - returnCode(ERR); + returnCode(result); } -int +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) cbreak(void) { - T((T_CALLED("cbreak()"))); + return NCURSES_SP_NAME(cbreak) (CURRENT_SCREEN); +} +#endif - SP->_cbreak = 1; +/* + * Note: + * this implementation may be wrong. See the comment under intrflush(). + */ +NCURSES_EXPORT(void) +NCURSES_SP_NAME(qiflush) (NCURSES_SP_DCL0) +{ + int result = ERR; + TERMINAL *termp; -#ifdef __EMX__ - setmode(SP->_ifd, O_BINARY); -#endif + T((T_CALLED("qiflush(%p)"), (void *) SP_PARM)); + if ((termp = TerminalOf(SP_PARM)) != 0) { + TTY buf; + BEFORE("qiflush"); + buf = termp->Nttyb; #ifdef TERMIOS - BEFORE("cbreak"); - cur_term->Nttyb.c_lflag &= ~ICANON; - cur_term->Nttyb.c_iflag &= ~ICRNL; - cur_term->Nttyb.c_lflag |= ISIG; - cur_term->Nttyb.c_cc[VMIN] = 1; - cur_term->Nttyb.c_cc[VTIME] = 0; - AFTER("cbreak"); + buf.c_lflag &= (unsigned) ~(NOFLSH); + result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); #else - cur_term->Nttyb.sg_flags |= CBREAK; + /* FIXME */ #endif - returnCode(_nc_set_tty_mode(&cur_term->Nttyb)); + if (result == OK) + termp->Nttyb = buf; + AFTER("qiflush"); + } + returnVoid; } -void +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(void) qiflush(void) { - T((T_CALLED("qiflush()"))); + NCURSES_SP_NAME(qiflush) (CURRENT_SCREEN); +} +#endif + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(noraw) (NCURSES_SP_DCL0) +{ + int result = ERR; + TERMINAL *termp; + + T((T_CALLED("noraw(%p)"), (void *) SP_PARM)); + if ((termp = TerminalOf(SP_PARM)) != 0) { + TTY buf; - /* - * Note: this implementation may be wrong. See the comment under - * intrflush(). - */ + BEFORE("noraw"); + _nc_setmode(O_TEXT); + buf = termp->Nttyb; #ifdef TERMIOS - BEFORE("qiflush"); - cur_term->Nttyb.c_lflag &= ~(NOFLSH); - AFTER("qiflush"); - (void) _nc_set_tty_mode(&cur_term->Nttyb); - returnVoid; + buf.c_lflag |= ISIG | ICANON | + (termp->Ottyb.c_lflag & IEXTEN); + buf.c_iflag |= COOKED_INPUT; +#else + buf.sg_flags &= ~(RAW | CBREAK); #endif + result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); + if (result == OK) { +#if USE_KLIBC_KBD + KBDINFO kbdinfo; + + kbdinfo.cb = sizeof(kbdinfo); + KbdGetStatus(&kbdinfo, 0); + + kbdinfo.cb = sizeof(kbdinfo); + kbdinfo.fsMask &= ~KEYBOARD_BINARY_MODE; + kbdinfo.fsMask |= KEYBOARD_ASCII_MODE; + KbdSetStatus(&kbdinfo, 0); +#endif + SP_PARM->_raw = FALSE; + SP_PARM->_cbreak = 0; + termp->Nttyb = buf; + } + AFTER("noraw"); + } + returnCode(result); } -int +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) noraw(void) { - T((T_CALLED("noraw()"))); + return NCURSES_SP_NAME(noraw) (CURRENT_SCREEN); +} +#endif - SP->_raw = FALSE; - SP->_cbreak = 0; +NCURSES_EXPORT(int) +NCURSES_SP_NAME(nocbreak) (NCURSES_SP_DCL0) +{ + int result = ERR; + TERMINAL *termp; -#ifdef __EMX__ - setmode(SP->_ifd, O_TEXT); -#endif + T((T_CALLED("nocbreak(%p)"), (void *) SP_PARM)); + if ((termp = TerminalOf(SP_PARM)) != 0) { + TTY buf; + + BEFORE("nocbreak"); + _nc_setmode(O_TEXT); + buf = termp->Nttyb; #ifdef TERMIOS - BEFORE("noraw"); - cur_term->Nttyb.c_lflag |= ISIG | ICANON | - (cur_term->Ottyb.c_lflag & IEXTEN); - cur_term->Nttyb.c_iflag |= COOKED_INPUT; - AFTER("noraw"); + buf.c_lflag |= ICANON; + buf.c_iflag |= ICRNL; #else - cur_term->Nttyb.sg_flags &= ~(RAW | CBREAK); + buf.sg_flags &= ~CBREAK; #endif - returnCode(_nc_set_tty_mode(&cur_term->Nttyb)); + result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); + if (result == OK) { + SP_PARM->_cbreak = 0; + termp->Nttyb = buf; + } + AFTER("nocbreak"); + } + returnCode(result); } -int +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) nocbreak(void) { - T((T_CALLED("nocbreak()"))); + return NCURSES_SP_NAME(nocbreak) (CURRENT_SCREEN); +} +#endif - SP->_cbreak = 0; +NCURSES_EXPORT(void) +NCURSES_SP_NAME(noqiflush) (NCURSES_SP_DCL0) +{ + int result = ERR; + TERMINAL *termp; -#ifdef __EMX__ - setmode(SP->_ifd, O_TEXT); -#endif + T((T_CALLED("noqiflush(%p)"), (void *) SP_PARM)); + if ((termp = TerminalOf(SP_PARM)) != 0) { + TTY buf; + BEFORE("noqiflush"); + buf = termp->Nttyb; #ifdef TERMIOS - BEFORE("nocbreak"); - cur_term->Nttyb.c_lflag |= ICANON; - cur_term->Nttyb.c_iflag |= ICRNL; - AFTER("nocbreak"); + buf.c_lflag |= NOFLSH; + result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); #else - cur_term->Nttyb.sg_flags &= ~CBREAK; + /* FIXME */ #endif - returnCode(_nc_set_tty_mode(&cur_term->Nttyb)); + if (result == OK) + termp->Nttyb = buf; + AFTER("noqiflush"); + } + returnVoid; } -void +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(void) noqiflush(void) { - T((T_CALLED("noqiflush()"))); - - /* - * Note: this implementation may be wrong. See the comment under - * intrflush(). - */ - -#ifdef TERMIOS - BEFORE("noqiflush"); - cur_term->Nttyb.c_lflag |= NOFLSH; - AFTER("noqiflush"); - (void) _nc_set_tty_mode(&cur_term->Nttyb); - returnVoid; -#endif + NCURSES_SP_NAME(noqiflush) (CURRENT_SCREEN); } +#endif -int -intrflush(WINDOW *win GCC_UNUSED, bool flag) +/* + * This call does the same thing as the qiflush()/noqiflush() pair. We know + * for certain that SVr3 intrflush() tweaks the NOFLSH bit; on the other hand, + * the match (in the SVr4 man pages) between the language describing NOFLSH in + * termio(7) and the language describing qiflush()/noqiflush() in + * curs_inopts(3x) is too exact to be coincidence. + */ +NCURSES_EXPORT(int) +NCURSES_SP_NAME(intrflush) (NCURSES_SP_DCLx WINDOW *win GCC_UNUSED, bool flag) { - T((T_CALLED("intrflush(%d)"), flag)); + int result = ERR; + TERMINAL *termp; + + T((T_CALLED("intrflush(%p,%d)"), (void *) SP_PARM, flag)); + if (SP_PARM == 0) + returnCode(ERR); - /* - * This call does the same thing as the qiflush()/noqiflush() pair. We - * know for certain that SVr3 intrflush() tweaks the NOFLSH bit; on the - * other hand, the match (in the SVr4 man pages) between the language - * describing NOFLSH in termio(7) and the language describing - * qiflush()/noqiflush() in curs_inopts(3x) is too exact to be coincidence. - */ + if ((termp = TerminalOf(SP_PARM)) != 0) { + TTY buf; + BEFORE("intrflush"); + buf = termp->Nttyb; #ifdef TERMIOS - BEFORE("intrflush"); - if (flag) - cur_term->Nttyb.c_lflag &= ~(NOFLSH); - else - cur_term->Nttyb.c_lflag |= (NOFLSH); - AFTER("intrflush"); - returnCode(_nc_set_tty_mode(&cur_term->Nttyb)); + if (flag) + buf.c_lflag &= (unsigned) ~(NOFLSH); + else + buf.c_lflag |= (NOFLSH); + result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); #else - returnCode(ERR); + /* FIXME */ #endif + if (result == OK) { + termp->Nttyb = buf; + } + AFTER("intrflush"); + } + returnCode(result); } + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +intrflush(WINDOW *win GCC_UNUSED, bool flag) +{ + return NCURSES_SP_NAME(intrflush) (CURRENT_SCREEN, win, flag); +} +#endif