From 46e53d124d03faedd11e99fdb0153d84ce174f99 Mon Sep 17 00:00:00 2001 From: Paul LeoNerd Evans Date: Sat, 23 Feb 2008 20:26:04 +0000 Subject: [PATCH] Moved termios magic out of demo.c into termkey.c where it belongs --- demo.c | 19 +------------------ termkey.c | 27 +++++++++++++++++++++++++++ termkey.h | 2 ++ 3 files changed, 30 insertions(+), 18 deletions(-) diff --git a/demo.c b/demo.c index df1627a..1bc27eb 100644 --- a/demo.c +++ b/demo.c @@ -1,24 +1,10 @@ #include #include -#include #include #include "termkey.h" int main(int argc, char *argv[]) { - struct termios termios; - - if(tcgetattr(0, &termios)) { - perror("ioctl(TCIOGETS)"); - exit(1); - } - - int old_lflag = termios.c_lflag; - termios.c_iflag &= ~(IXON|INLCR|ICRNL); - termios.c_lflag &= ~(ICANON|ECHO|ISIG); - - tcsetattr(0, TCSANOW, &termios); - termkey_t *tk = termkey_new(0, 0); termkey_result ret; @@ -44,8 +30,5 @@ int main(int argc, char *argv[]) { break; } - termios.c_lflag = old_lflag; - tcsetattr(0, TCSANOW, &termios); - - termkey_free(tk); + termkey_destroy(tk); } diff --git a/termkey.c b/termkey.c index 2830f01..7ea6ff2 100644 --- a/termkey.c +++ b/termkey.c @@ -4,6 +4,7 @@ #include #include #include +#include #include @@ -21,6 +22,9 @@ struct termkey { size_t buffcount; // NUMBER of entires valid in buffer size_t buffsize; // Total malloc'ed size + struct termios restore_termios; + char restore_termios_valid; + int waittime; // msec char is_closed; @@ -78,6 +82,8 @@ termkey_t *termkey_new_full(int fd, int flags, size_t buffsize, int waittime) tk->buffcount = 0; tk->buffsize = buffsize; + tk->restore_termios_valid = 0; + tk->waittime = waittime; tk->is_closed = 0; @@ -181,6 +187,19 @@ termkey_t *termkey_new_full(int fd, int flags, size_t buffsize, int waittime) termkey_register_csifunc(tk, TERMKEY_SYM_F19, 33, "F19"); termkey_register_csifunc(tk, TERMKEY_SYM_F20, 34, "F20"); + if(!(flags & TERMKEY_FLAG_NOTERMIOS)) { + struct termios termios; + if(tcgetattr(fd, &termios) == 0) { + tk->restore_termios = termios; + tk->restore_termios_valid = 1; + + termios.c_iflag &= ~(IXON|INLCR|ICRNL); + termios.c_lflag &= ~(ICANON|ECHO|ISIG); + + tcsetattr(fd, TCSANOW, &termios); + } + } + return tk; } @@ -198,6 +217,14 @@ void termkey_free(termkey_t *tk) free(tk); } +void termkey_destroy(termkey_t *tk) +{ + if(tk->restore_termios_valid) + tcsetattr(tk->fd, TCSANOW, &tk->restore_termios); + + termkey_free(tk); +} + void termkey_setwaittime(termkey_t *tk, int msec) { tk->waittime = msec; diff --git a/termkey.h b/termkey.h index 5479f2b..486819f 100644 --- a/termkey.h +++ b/termkey.h @@ -115,10 +115,12 @@ enum { TERMKEY_FLAG_CONVERTKP = 0x02, // Convert KP codes to regular keypresses TERMKEY_FLAG_RAW = 0x04, // Input is raw bytes, not UTF-8 TERMKEY_FLAG_UTF8 = 0x08, // Input is definitely UTF-8 + TERMKEY_FLAG_NOTERMIOS = 0x10, // Do not make initial termios calls on construction }; termkey_t *termkey_new(int fd, int flags); void termkey_free(termkey_t *tk); +void termkey_destroy(termkey_t *tk); void termkey_setwaittime(termkey_t *tk, int msec); int termkey_getwaittime(termkey_t *tk);