%% options copyright owner = Dirk Krause copyright year = 2011-2014 license = bsd %% header #include "dk3conf.h" #if DK3_HAVE_TCGETATTR /** Terminal IO structure. */ typedef struct termios dk3_termios_t; #else #if defined(TCGETS) /** Terminal IO structure. */ typedef struct termios dk3_termios_t; #else #endif #endif /** Keyboard echo configuration. */ typedef struct { #if DK3_ON_WINDOWS /** Handle for console. */ HANDLE consoleHandle; /** Original console flags. */ DWORD ori; #else /* DK3_ON_WINDOWS */ #if DK3_HAVE_TCGETATTR /** Original terminal settings. */ dk3_termios_t ori; #else /* DK3_HAVE_TCGETATTR */ #if defined(TCGETS) /** Original terminal settings. */ dk3_termios_t ori; #else /* defined(TCGETS) */ #endif /* defined(TCGETS) */ #endif /* DK3_HAVE_TCGETATTR */ #endif /* DK3_ON_WINDOWS */ /** Flag: Standard input is a terminal. */ int is_tty; } dk3_echo_t; #ifdef __cplusplus extern "C" { #endif /** Save current keyboard echo settings. @param ep Keyboard echo settings structure. @param app Application structure for diagnostics, may be NULL. @return 1 on success, 0 on error. */ int dk3echo_save_app(dk3_echo_t *ep, dk3_app_t *app); /** Restore keyboard echo settings. @param ep Keyboard echo settings structure. @param app Application structure for diagnostics, may be NULL. @return 1 on success, 0 on error. */ int dk3echo_restore_app(dk3_echo_t *ep, dk3_app_t *app); /** Disable keyboard echo. @param ep Keyboard echo settings structure. @param app Application structure for diagnostics, may be NULL. @return 1 on success, 0 on error. */ int dk3echo_off_app(dk3_echo_t *ep, dk3_app_t *app); /** Check whether standard input is from terminal for settings structure. @param ep Keyboard echo settings structure. @param app Application structure for diagnostics, may be NULL. @return 1 on success, 0 on error. */ int dk3echo_is_tty_app(dk3_echo_t const *ep, dk3_app_t *app); /** Check whether standard input is from terminal. @param ep Keyboard echo settings structure. @param app Application structure for diagnostics, may be NULL. @return 1 on success, 0 on error. */ int dk3echo_test_tty_app(dk3_echo_t *ep, dk3_app_t *app); /** Save current keyboard echo settings. @param ep Keyboard echo settings structure. @return 1 on success, 0 on error. */ int dk3echo_save(dk3_echo_t *ep); /** Restore keyboard echo settings. @param ep Keyboard echo settings structure. @return 1 on success, 0 on error. */ int dk3echo_restore(dk3_echo_t *ep); /** Disable keyboard echo. @param ep Keyboard echo settings structure. @return 1 on success, 0 on error. */ int dk3echo_off(dk3_echo_t *ep); /** Check whether standard input is from terminal for settings structure. @param ep Keyboard echo settings structure. @return 1 on success, 0 on error. */ int dk3echo_is_tty(dk3_echo_t *ep); /** Check whether standard input is from terminal. @param ep Keyboard echo settings structure. @return 1 on success, 0 on error. */ int dk3echo_test_tty(dk3_echo_t *ep); #ifdef __cplusplus } #endif %% module #include "dk3all.h" #include "dk3echo.h" $!trace-include int dk3echo_save(dk3_echo_t *ep) { int back; back = dk3echo_save_app(ep, NULL); return back; } int dk3echo_save_app(dk3_echo_t *ep, dk3_app_t *app) { int back = 0; if(ep) { #if DK3_ON_WINDOWS ep->consoleHandle = GetStdHandle(STD_INPUT_HANDLE); if(ep->consoleHandle != INVALID_HANDLE_VALUE) { ep->is_tty = 1; if(GetConsoleMode(ep->consoleHandle, &(ep->ori))) { back = 1; } else { if(app) { /* ERROR: Failed to retrieve console settings! */ dk3app_log_i1(app, DK3_LL_ERROR, 265); } } } else { if(app) { /* ERROR: Failed to obtain handle for standard input! */ dk3app_log_i1(app, DK3_LL_ERROR, 265); } } #else #if DK3_HAVE_ISATTY ep->is_tty = isatty(0); #else ep->is_tty = 1; #endif #if DK3_HAVE_TCGETATTR if(tcgetattr(0, &(ep->ori)) == 0) { back = 1; } else { if(app) { /* ERROR: Failed to retrieve console settings! */ dk3app_log_i1(app, DK3_LL_ERROR, 265); } } #else #if defined(TCGETS) if(ioctl(0, TCGETS, &(ep->ori)) == 0) { back = 1; } else { if(app) { /* ERROR: Failed to retrieve console settings! */ dk3app_log_i1(app, DK3_LL_ERROR, 265); } } #else #endif #endif #endif } return back; } int dk3echo_restore(dk3_echo_t *ep) { int back; back = dk3echo_restore_app(ep, NULL); return back; } int dk3echo_restore_app(dk3_echo_t *ep, dk3_app_t *app) { int back = 0; if(ep) { #if DK3_ON_WINDOWS if(ep->consoleHandle != INVALID_HANDLE_VALUE) { if(SetConsoleMode(ep->consoleHandle, ep->ori)) { back = 1; } else { if(app) { /* ERROR: Failed to restore console settings! */ dk3app_log_i1(app, DK3_LL_ERROR, 266); } } } #else #if DK3_HAVE_TCGETATTR if(tcsetattr(0, TCSANOW, &(ep->ori)) == 0) { back = 1; } else { if(app) { /* ERROR: Failed to restore console settings! */ dk3app_log_i1(app, DK3_LL_ERROR, 266); } } #else #if defined(TCGETS) if(ioctl(0, TCSETS, &(ep->ori)) == 0) { back = 1; } else { if(app) { /* ERROR: Failed to restore console settings! */ dk3app_log_i1(app, DK3_LL_ERROR, 266); } } #else #endif #endif #endif } return back; } int dk3echo_off(dk3_echo_t *ep) { int back; back = dk3echo_off_app(ep, NULL); return back; } int dk3echo_off_app(dk3_echo_t *ep, dk3_app_t *app) { int back = 0; if(ep) { #if DK3_ON_WINDOWS if(ep->consoleHandle != INVALID_HANDLE_VALUE) { if(SetConsoleMode(ep->consoleHandle,((ep->ori) & (~(ENABLE_ECHO_INPUT))))) { back = 1; } else { if(app) { /* ERROR: Failed to modify console settings! */ dk3app_log_i1(app, DK3_LL_ERROR, 267); } } } #else #if DK3_HAVE_TCGETATTR dk3_termios_t nti; dk3mem_cpy((void *)(&nti), (void *)(&(ep->ori)), sizeof(dk3_termios_t)); #if defined(ECHO) nti.c_lflag &= (~(ECHO)); #endif #if defined(ECHONL) nti.c_lflag &= (~(ECHONL)); #endif if(tcsetattr(0, TCSANOW, &nti) == 0) { back = 1; #if DK3_HAVE_TCFLUSH tcflush(0, TCIFLUSH); #endif } else { if(app) { /* ERROR: Failed to modify terminal settings! */ dk3app_log_i1(app, DK3_LL_ERROR, 267); } } #else #if defined(TCGETS) dk3_termios_t nti; dk3mem_cpy((void *)(&nti), (void *)(&(ep->ori)), sizeof(dk3_termios_t)); #if defined(ECHO) nti.c_lflag &= (~(ECHO)); #endif #if defined(ECHONL) nti.c_lflag &= (~(ECHONL)); #endif if(ioctl(0, TCSETS, &nti) == 0) { back = 1; (void)ioctl(0, TCFLSH, 0); } else { if(app) { /* ERROR: Failed to modify terminal settings! */ dk3app_log_i1(app, DK3_LL_ERROR, 267); } } #else #endif #endif #endif } return back; } int dk3echo_is_tty(dk3_echo_t *ep) { int back; back = dk3echo_is_tty_app(ep, NULL); return back; } int dk3echo_is_tty_app(dk3_echo_t const *ep, dk3_app_t *app) { int back = 0; if(ep) { back = ep->is_tty; } return back; } int dk3echo_test_tty(dk3_echo_t *ep) { int back; back = dk3echo_test_tty_app(ep, NULL); return back; } int dk3echo_test_tty_app(dk3_echo_t *ep, dk3_app_t *app) { int back = 0; if(ep) { #if DK3_ON_WINDOWS if(GetStdHandle(STD_INPUT_HANDLE) != INVALID_HANDLE_VALUE) { back = 1; } else { if(app) { /* ERROR: Failed to retrieve console settings! */ dk3app_log_i1(app, DK3_LL_ERROR, 265); } } #else #if DK3_HAVE_ISATTY back = isatty(0); #endif dk3app_log_i1(app, DK3_LL_ERROR, 265); #endif } return back; } /* vim: set ai sw=2 : */