Move initialisation logic out of termkey_new into a static function
This commit is contained in:
parent
8b46e65aa3
commit
63f37cecd6
85
termkey.c
85
termkey.c
|
@ -211,38 +211,11 @@ static TermKey *termkey_alloc(void)
|
||||||
return tk;
|
return tk;
|
||||||
}
|
}
|
||||||
|
|
||||||
TermKey *termkey_new(int fd, int flags)
|
static int termkey_init(TermKey *tk, const char *term)
|
||||||
{
|
{
|
||||||
TermKey *tk = termkey_alloc();
|
|
||||||
if(!tk)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
tk->fd = fd;
|
|
||||||
|
|
||||||
if(!(flags & (TERMKEY_FLAG_RAW|TERMKEY_FLAG_UTF8))) {
|
|
||||||
int locale_is_utf8 = 0;
|
|
||||||
char *e;
|
|
||||||
|
|
||||||
if((e = getenv("LANG")) && strstr(e, "UTF-8"))
|
|
||||||
locale_is_utf8 = 1;
|
|
||||||
|
|
||||||
if(!locale_is_utf8 && (e = getenv("LC_MESSAGES")) && strstr(e, "UTF-8"))
|
|
||||||
locale_is_utf8 = 1;
|
|
||||||
|
|
||||||
if(!locale_is_utf8 && (e = getenv("LC_ALL")) && strstr(e, "UTF-8"))
|
|
||||||
locale_is_utf8 = 1;
|
|
||||||
|
|
||||||
if(locale_is_utf8)
|
|
||||||
flags |= TERMKEY_FLAG_UTF8;
|
|
||||||
else
|
|
||||||
flags |= TERMKEY_FLAG_RAW;
|
|
||||||
}
|
|
||||||
|
|
||||||
termkey_set_flags(tk, flags);
|
|
||||||
|
|
||||||
tk->buffer = malloc(tk->buffsize);
|
tk->buffer = malloc(tk->buffsize);
|
||||||
if(!tk->buffer)
|
if(!tk->buffer)
|
||||||
goto abort_free_tk;
|
return 0;
|
||||||
|
|
||||||
tk->keynames = malloc(sizeof(tk->keynames[0]) * tk->nkeynames);
|
tk->keynames = malloc(sizeof(tk->keynames[0]) * tk->nkeynames);
|
||||||
if(!tk->keynames)
|
if(!tk->keynames)
|
||||||
|
@ -261,8 +234,6 @@ TermKey *termkey_new(int fd, int flags)
|
||||||
register_c0(tk, TERMKEY_SYM_ENTER, 0x0d, NULL);
|
register_c0(tk, TERMKEY_SYM_ENTER, 0x0d, NULL);
|
||||||
register_c0(tk, TERMKEY_SYM_ESCAPE, 0x1b, NULL);
|
register_c0(tk, TERMKEY_SYM_ESCAPE, 0x1b, NULL);
|
||||||
|
|
||||||
const char *term = getenv("TERM");
|
|
||||||
|
|
||||||
struct TermKeyDriverNode *tail = NULL;
|
struct TermKeyDriverNode *tail = NULL;
|
||||||
|
|
||||||
for(i = 0; drivers[i]; i++) {
|
for(i = 0; drivers[i]; i++) {
|
||||||
|
@ -299,9 +270,9 @@ TermKey *termkey_new(int fd, int flags)
|
||||||
goto abort_free_keynames;
|
goto abort_free_keynames;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(fd != -1 && !(flags & TERMKEY_FLAG_NOTERMIOS)) {
|
if(tk->fd != -1 && !(tk->flags & TERMKEY_FLAG_NOTERMIOS)) {
|
||||||
struct termios termios;
|
struct termios termios;
|
||||||
if(tcgetattr(fd, &termios) == 0) {
|
if(tcgetattr(tk->fd, &termios) == 0) {
|
||||||
tk->restore_termios = termios;
|
tk->restore_termios = termios;
|
||||||
tk->restore_termios_valid = 1;
|
tk->restore_termios_valid = 1;
|
||||||
|
|
||||||
|
@ -310,7 +281,7 @@ TermKey *termkey_new(int fd, int flags)
|
||||||
termios.c_cc[VMIN] = 1;
|
termios.c_cc[VMIN] = 1;
|
||||||
termios.c_cc[VTIME] = 0;
|
termios.c_cc[VTIME] = 0;
|
||||||
|
|
||||||
if(flags & TERMKEY_FLAG_CTRLC)
|
if(tk->flags & TERMKEY_FLAG_CTRLC)
|
||||||
/* want no signal keys at all, so just disable ISIG */
|
/* want no signal keys at all, so just disable ISIG */
|
||||||
termios.c_lflag &= ~ISIG;
|
termios.c_lflag &= ~ISIG;
|
||||||
else {
|
else {
|
||||||
|
@ -326,7 +297,7 @@ TermKey *termkey_new(int fd, int flags)
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf(stderr, "Setting termios(3) flags\n");
|
fprintf(stderr, "Setting termios(3) flags\n");
|
||||||
#endif
|
#endif
|
||||||
tcsetattr(fd, TCSANOW, &termios);
|
tcsetattr(tk->fd, TCSANOW, &termios);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -340,7 +311,7 @@ TermKey *termkey_new(int fd, int flags)
|
||||||
fprintf(stderr, "Drivers started; termkey instance %p is ready\n", tk);
|
fprintf(stderr, "Drivers started; termkey instance %p is ready\n", tk);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return tk;
|
return 1;
|
||||||
|
|
||||||
abort_free_drivers:
|
abort_free_drivers:
|
||||||
for(p = tk->drivers; p; ) {
|
for(p = tk->drivers; p; ) {
|
||||||
|
@ -356,10 +327,46 @@ abort_free_keynames:
|
||||||
abort_free_buffer:
|
abort_free_buffer:
|
||||||
free(tk->buffer);
|
free(tk->buffer);
|
||||||
|
|
||||||
abort_free_tk:
|
return 0;
|
||||||
free(tk);
|
}
|
||||||
|
|
||||||
return NULL;
|
TermKey *termkey_new(int fd, int flags)
|
||||||
|
{
|
||||||
|
TermKey *tk = termkey_alloc();
|
||||||
|
if(!tk)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
tk->fd = fd;
|
||||||
|
|
||||||
|
if(!(flags & (TERMKEY_FLAG_RAW|TERMKEY_FLAG_UTF8))) {
|
||||||
|
int locale_is_utf8 = 0;
|
||||||
|
char *e;
|
||||||
|
|
||||||
|
if((e = getenv("LANG")) && strstr(e, "UTF-8"))
|
||||||
|
locale_is_utf8 = 1;
|
||||||
|
|
||||||
|
if(!locale_is_utf8 && (e = getenv("LC_MESSAGES")) && strstr(e, "UTF-8"))
|
||||||
|
locale_is_utf8 = 1;
|
||||||
|
|
||||||
|
if(!locale_is_utf8 && (e = getenv("LC_ALL")) && strstr(e, "UTF-8"))
|
||||||
|
locale_is_utf8 = 1;
|
||||||
|
|
||||||
|
if(locale_is_utf8)
|
||||||
|
flags |= TERMKEY_FLAG_UTF8;
|
||||||
|
else
|
||||||
|
flags |= TERMKEY_FLAG_RAW;
|
||||||
|
}
|
||||||
|
|
||||||
|
termkey_set_flags(tk, flags);
|
||||||
|
|
||||||
|
const char *term = getenv("TERM");
|
||||||
|
|
||||||
|
if(!termkey_init(tk, term)) {
|
||||||
|
free(tk);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return tk;
|
||||||
}
|
}
|
||||||
|
|
||||||
void termkey_free(TermKey *tk)
|
void termkey_free(TermKey *tk)
|
||||||
|
|
Loading…
Reference in New Issue