aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--termkey.c71
1 files changed, 41 insertions, 30 deletions
diff --git a/termkey.c b/termkey.c
index 1b203de..7e5a473 100644
--- a/termkey.c
+++ b/termkey.c
@@ -173,12 +173,47 @@ static const char *res2str(TermKeyResult res)
}
#endif
-/* We might expose this as public API one day, when the ideas are finalised.
- * As yet it isn't public, so keep it static
- */
-static TermKey *termkey_new_full(int fd, int flags, size_t buffsize, int waittime)
+static TermKey *termkey_alloc(void)
{
- TermKey *tk = malloc(sizeof(*tk));
+ TermKey *tk = malloc(sizeof(TermKey));
+ if(!tk)
+ return NULL;
+
+ /* Default all the object fields but don't allocate anything */
+
+ tk->fd = -1;
+ tk->flags = 0;
+ tk->canonflags = 0;
+
+ tk->buffer = NULL;
+ tk->buffstart = 0;
+ tk->buffcount = 0;
+ tk->buffsize = 256; /* bytes */
+
+ tk->restore_termios_valid = 0;
+
+ tk->waittime = 50; /* msec */
+
+ tk->is_closed = 0;
+
+ tk->nkeynames = 64;
+ tk->keynames = NULL;
+
+ for(int i = 0; i < 32; i++)
+ tk->c0[i].sym = TERMKEY_SYM_NONE;
+
+ tk->drivers = NULL;
+
+ tk->method.emit_codepoint = &emit_codepoint;
+ tk->method.peekkey_simple = &peekkey_simple;
+ tk->method.peekkey_mouse = &peekkey_mouse;
+
+ return tk;
+}
+
+TermKey *termkey_new(int fd, int flags)
+{
+ TermKey *tk = termkey_alloc();
if(!tk)
return NULL;
@@ -203,26 +238,14 @@ static TermKey *termkey_new_full(int fd, int flags, size_t buffsize, int waittim
tk->fd = fd;
tk->flags = flags;
- tk->canonflags = 0;
if(flags & TERMKEY_FLAG_SPACESYMBOL)
tk->canonflags |= TERMKEY_CANON_SPACESYMBOL;
- tk->buffer = malloc(buffsize);
+ tk->buffer = malloc(tk->buffsize);
if(!tk->buffer)
goto abort_free_tk;
- tk->buffstart = 0;
- tk->buffcount = 0;
- tk->buffsize = buffsize;
-
- tk->restore_termios_valid = 0;
-
- tk->waittime = waittime;
-
- tk->is_closed = 0;
-
- tk->nkeynames = 64;
tk->keynames = malloc(sizeof(tk->keynames[0]) * tk->nkeynames);
if(!tk->keynames)
goto abort_free_buffer;
@@ -231,13 +254,6 @@ static TermKey *termkey_new_full(int fd, int flags, size_t buffsize, int waittim
for(i = 0; i < tk->nkeynames; i++)
tk->keynames[i] = NULL;
- for(i = 0; i < 32; i++)
- tk->c0[i].sym = TERMKEY_SYM_NONE;
-
- tk->method.emit_codepoint = &emit_codepoint;
- tk->method.peekkey_simple = &peekkey_simple;
- tk->method.peekkey_mouse = &peekkey_mouse;
-
for(i = 0; keynames[i].name; i++)
if(termkey_register_keyname(tk, keynames[i].sym, keynames[i].name) == -1)
goto abort_free_keynames;
@@ -348,11 +364,6 @@ abort_free_tk:
return NULL;
}
-TermKey *termkey_new(int fd, int flags)
-{
- return termkey_new_full(fd, flags, 256, 50);
-}
-
void termkey_free(TermKey *tk)
{
free(tk->buffer); tk->buffer = NULL;