aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--demo.c19
-rw-r--r--termkey.c27
-rw-r--r--termkey.h2
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 <stdio.h>
#include <stdlib.h>
-#include <termios.h>
#include <unistd.h>
#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 <poll.h>
#include <unistd.h>
#include <string.h>
+#include <termios.h>
#include <stdio.h>
@@ -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);