Moved termios magic out of demo.c into termkey.c where it belongs
This commit is contained in:
parent
8f8e96f015
commit
46e53d124d
19
demo.c
19
demo.c
|
@ -1,24 +1,10 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <termios.h>
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "termkey.h"
|
#include "termkey.h"
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
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_t *tk = termkey_new(0, 0);
|
||||||
|
|
||||||
termkey_result ret;
|
termkey_result ret;
|
||||||
|
@ -44,8 +30,5 @@ int main(int argc, char *argv[]) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
termios.c_lflag = old_lflag;
|
termkey_destroy(tk);
|
||||||
tcsetattr(0, TCSANOW, &termios);
|
|
||||||
|
|
||||||
termkey_free(tk);
|
|
||||||
}
|
}
|
||||||
|
|
27
termkey.c
27
termkey.c
|
@ -4,6 +4,7 @@
|
||||||
#include <poll.h>
|
#include <poll.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <termios.h>
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
@ -21,6 +22,9 @@ struct termkey {
|
||||||
size_t buffcount; // NUMBER of entires valid in buffer
|
size_t buffcount; // NUMBER of entires valid in buffer
|
||||||
size_t buffsize; // Total malloc'ed size
|
size_t buffsize; // Total malloc'ed size
|
||||||
|
|
||||||
|
struct termios restore_termios;
|
||||||
|
char restore_termios_valid;
|
||||||
|
|
||||||
int waittime; // msec
|
int waittime; // msec
|
||||||
|
|
||||||
char is_closed;
|
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->buffcount = 0;
|
||||||
tk->buffsize = buffsize;
|
tk->buffsize = buffsize;
|
||||||
|
|
||||||
|
tk->restore_termios_valid = 0;
|
||||||
|
|
||||||
tk->waittime = waittime;
|
tk->waittime = waittime;
|
||||||
|
|
||||||
tk->is_closed = 0;
|
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_F19, 33, "F19");
|
||||||
termkey_register_csifunc(tk, TERMKEY_SYM_F20, 34, "F20");
|
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;
|
return tk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -198,6 +217,14 @@ void termkey_free(termkey_t *tk)
|
||||||
free(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)
|
void termkey_setwaittime(termkey_t *tk, int msec)
|
||||||
{
|
{
|
||||||
tk->waittime = msec;
|
tk->waittime = msec;
|
||||||
|
|
|
@ -115,10 +115,12 @@ enum {
|
||||||
TERMKEY_FLAG_CONVERTKP = 0x02, // Convert KP codes to regular keypresses
|
TERMKEY_FLAG_CONVERTKP = 0x02, // Convert KP codes to regular keypresses
|
||||||
TERMKEY_FLAG_RAW = 0x04, // Input is raw bytes, not UTF-8
|
TERMKEY_FLAG_RAW = 0x04, // Input is raw bytes, not UTF-8
|
||||||
TERMKEY_FLAG_UTF8 = 0x08, // Input is definitely 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);
|
termkey_t *termkey_new(int fd, int flags);
|
||||||
void termkey_free(termkey_t *tk);
|
void termkey_free(termkey_t *tk);
|
||||||
|
void termkey_destroy(termkey_t *tk);
|
||||||
|
|
||||||
void termkey_setwaittime(termkey_t *tk, int msec);
|
void termkey_setwaittime(termkey_t *tk, int msec);
|
||||||
int termkey_getwaittime(termkey_t *tk);
|
int termkey_getwaittime(termkey_t *tk);
|
||||||
|
|
Loading…
Reference in New Issue