Use vtable in driver to indirect calls to the CSI driver
This commit is contained in:
parent
f5c6ecf9af
commit
e3eca8d51a
13
driver-csi.c
13
driver-csi.c
|
@ -24,7 +24,7 @@ typedef struct {
|
||||||
struct keyinfo *csifuncs;
|
struct keyinfo *csifuncs;
|
||||||
} termkey_csi;
|
} termkey_csi;
|
||||||
|
|
||||||
void *termkeycsi_new_driver(termkey_t *tk)
|
static void *new_driver(termkey_t *tk)
|
||||||
{
|
{
|
||||||
termkey_csi *csi = malloc(sizeof *csi);
|
termkey_csi *csi = malloc(sizeof *csi);
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ void *termkeycsi_new_driver(termkey_t *tk)
|
||||||
return csi;
|
return csi;
|
||||||
}
|
}
|
||||||
|
|
||||||
void termkeycsi_free_driver(void *private)
|
static void free_driver(void *private)
|
||||||
{
|
{
|
||||||
termkey_csi *csi = private;
|
termkey_csi *csi = private;
|
||||||
|
|
||||||
|
@ -324,7 +324,7 @@ static termkey_result getkey_ss3(termkey_t *tk, size_t introlen, termkey_key *ke
|
||||||
return TERMKEY_RES_KEY;
|
return TERMKEY_RES_KEY;
|
||||||
}
|
}
|
||||||
|
|
||||||
termkey_result termkeycsi_getkey(termkey_t *tk, termkey_key *key)
|
static termkey_result getkey(termkey_t *tk, termkey_key *key)
|
||||||
{
|
{
|
||||||
if(tk->buffcount == 0)
|
if(tk->buffcount == 0)
|
||||||
return tk->is_closed ? TERMKEY_RES_EOF : TERMKEY_RES_NONE;
|
return tk->is_closed ? TERMKEY_RES_EOF : TERMKEY_RES_NONE;
|
||||||
|
@ -580,3 +580,10 @@ termkey_keysym termkey_register_csifunc_full(termkey_t *tk, termkey_type type, t
|
||||||
|
|
||||||
return sym;
|
return sym;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct termkey_driver termkey_driver_csi = {
|
||||||
|
.new_driver = new_driver,
|
||||||
|
.free_driver = free_driver,
|
||||||
|
|
||||||
|
.getkey = getkey,
|
||||||
|
};
|
||||||
|
|
|
@ -8,8 +8,9 @@
|
||||||
|
|
||||||
struct termkey_driver
|
struct termkey_driver
|
||||||
{
|
{
|
||||||
void *(*new_driver)(void);
|
void *(*new_driver)(termkey_t *tk);
|
||||||
void (*free_driver)(void *);
|
void (*free_driver)(void *);
|
||||||
|
termkey_result (*getkey)(termkey_t *tk, termkey_key *key);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct termkey {
|
struct termkey {
|
||||||
|
@ -34,6 +35,6 @@ struct termkey {
|
||||||
void *driver_info;
|
void *driver_info;
|
||||||
};
|
};
|
||||||
|
|
||||||
void *termkeycsi_new_driver(termkey_t *t);
|
extern struct termkey_driver termkey_driver_csi;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
14
termkey.c
14
termkey.c
|
@ -8,12 +8,6 @@
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
// TODO: Move these into t->driver
|
|
||||||
void *termkeycsi_new_driver(termkey_t *tk);
|
|
||||||
void termkeycsi_free_driver(void *private);
|
|
||||||
termkey_result termkeycsi_getkey(termkey_t *tk, termkey_key *key);
|
|
||||||
// END TODO
|
|
||||||
|
|
||||||
termkey_t *termkey_new_full(int fd, int flags, size_t buffsize, int waittime)
|
termkey_t *termkey_new_full(int fd, int flags, size_t buffsize, int waittime)
|
||||||
{
|
{
|
||||||
termkey_t *tk = malloc(sizeof(*tk));
|
termkey_t *tk = malloc(sizeof(*tk));
|
||||||
|
@ -65,7 +59,9 @@ termkey_t *termkey_new_full(int fd, int flags, size_t buffsize, int waittime)
|
||||||
for(i = 0; i < tk->nkeynames; i++)
|
for(i = 0; i < tk->nkeynames; i++)
|
||||||
tk->keynames[i] = NULL;
|
tk->keynames[i] = NULL;
|
||||||
|
|
||||||
tk->driver_info = termkeycsi_new_driver(tk);
|
tk->driver = termkey_driver_csi;
|
||||||
|
|
||||||
|
tk->driver_info = (*tk->driver.new_driver)(tk);
|
||||||
|
|
||||||
// Special built-in names
|
// Special built-in names
|
||||||
termkey_register_keyname(tk, TERMKEY_SYM_NONE, "NONE");
|
termkey_register_keyname(tk, TERMKEY_SYM_NONE, "NONE");
|
||||||
|
@ -168,7 +164,7 @@ void termkey_free(termkey_t *tk)
|
||||||
free(tk->buffer); tk->buffer = NULL;
|
free(tk->buffer); tk->buffer = NULL;
|
||||||
free(tk->keynames); tk->keynames = NULL;
|
free(tk->keynames); tk->keynames = NULL;
|
||||||
|
|
||||||
termkeycsi_free_driver(tk->driver_info);
|
(*tk->driver.free_driver)(tk->driver_info);
|
||||||
tk->driver_info = NULL; /* Be nice to GC'ers, etc */
|
tk->driver_info = NULL; /* Be nice to GC'ers, etc */
|
||||||
|
|
||||||
free(tk);
|
free(tk);
|
||||||
|
@ -194,7 +190,7 @@ int termkey_getwaittime(termkey_t *tk)
|
||||||
|
|
||||||
termkey_result termkey_getkey(termkey_t *tk, termkey_key *key)
|
termkey_result termkey_getkey(termkey_t *tk, termkey_key *key)
|
||||||
{
|
{
|
||||||
return termkeycsi_getkey(tk, key);
|
return (*tk->driver.getkey)(tk, key);
|
||||||
}
|
}
|
||||||
|
|
||||||
termkey_result termkey_getkey_force(termkey_t *tk, termkey_key *key)
|
termkey_result termkey_getkey_force(termkey_t *tk, termkey_key *key)
|
||||||
|
|
Loading…
Reference in New Issue