Pass 'term' string into new_driver virtual method; have drivers sensitive to it and return NULL if they can't handle. Try CSI driver first; only for xterm-alikes
This commit is contained in:
parent
a61b916c18
commit
05639c4773
12
driver-csi.c
12
driver-csi.c
@ -24,8 +24,18 @@ static termkey_keysym register_csi_ss3_full(termkey_csi *csi, termkey_type type,
|
|||||||
static termkey_keysym register_ss3kpalt_full(termkey_csi *csi, termkey_type type, termkey_keysym sym, int modifier_set, int modifier_mask, unsigned char cmd, const char *name, char kpalt);
|
static termkey_keysym register_ss3kpalt_full(termkey_csi *csi, termkey_type type, termkey_keysym sym, int modifier_set, int modifier_mask, unsigned char cmd, const char *name, char kpalt);
|
||||||
static termkey_keysym register_csifunc_full(termkey_csi *csi, termkey_type type, termkey_keysym sym, int modifier_set, int modifier_mask, int number, const char *name);
|
static termkey_keysym register_csifunc_full(termkey_csi *csi, termkey_type type, termkey_keysym sym, int modifier_set, int modifier_mask, int number, const char *name);
|
||||||
|
|
||||||
static void *new_driver(termkey_t *tk)
|
static void *new_driver(termkey_t *tk, const char *term)
|
||||||
{
|
{
|
||||||
|
// Only care about term types beginning "xterm"
|
||||||
|
if(strncmp(term, "xterm", 5) != 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
// We want "xterm" or "xtermc" or "xterm-..."
|
||||||
|
if(term[5] != 0 && term[5] != '-' && term[5] != 'c')
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
// Excellent - we'll continue
|
||||||
|
|
||||||
termkey_csi *csi = malloc(sizeof *csi);
|
termkey_csi *csi = malloc(sizeof *csi);
|
||||||
|
|
||||||
csi->tk = tk;
|
csi->tk = tk;
|
||||||
|
@ -25,9 +25,12 @@ typedef struct {
|
|||||||
static int funcname2keysym(const char *funcname, termkey_type *typep, termkey_keysym *symp, int *modmask, int *modsetp);
|
static int funcname2keysym(const char *funcname, termkey_type *typep, termkey_keysym *symp, int *modmask, int *modsetp);
|
||||||
static void register_seq(termkey_ti *ti, const char *seq, termkey_type type, termkey_keysym sym, int modmask, int modset);
|
static void register_seq(termkey_ti *ti, const char *seq, termkey_type type, termkey_keysym sym, int modmask, int modset);
|
||||||
|
|
||||||
static void *new_driver(termkey_t *tk)
|
static void *new_driver(termkey_t *tk, const char *term)
|
||||||
{
|
{
|
||||||
setupterm((char*)0, 1, (int*)0);
|
int err;
|
||||||
|
|
||||||
|
if(setupterm(term, 1, &err) != OK)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
termkey_ti *ti = malloc(sizeof *ti);
|
termkey_ti *ti = malloc(sizeof *ti);
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
struct termkey_driver
|
struct termkey_driver
|
||||||
{
|
{
|
||||||
void *(*new_driver)(termkey_t *tk);
|
void *(*new_driver)(termkey_t *tk, const char *term);
|
||||||
void (*free_driver)(void *);
|
void (*free_driver)(void *);
|
||||||
termkey_result (*getkey)(termkey_t *tk, termkey_key *key, int force);
|
termkey_result (*getkey)(termkey_t *tk, termkey_key *key, int force);
|
||||||
};
|
};
|
||||||
|
@ -9,8 +9,8 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
static struct termkey_driver *drivers[] = {
|
static struct termkey_driver *drivers[] = {
|
||||||
&termkey_driver_ti,
|
|
||||||
&termkey_driver_csi,
|
&termkey_driver_csi,
|
||||||
|
&termkey_driver_ti,
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -133,8 +133,10 @@ termkey_t *termkey_new_full(int fd, int flags, size_t buffsize, int waittime)
|
|||||||
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");
|
||||||
|
|
||||||
for(i = 0; drivers[i]; i++) {
|
for(i = 0; drivers[i]; i++) {
|
||||||
void *driver_info = (*drivers[i]->new_driver)(tk);
|
void *driver_info = (*drivers[i]->new_driver)(tk, term);
|
||||||
if(!driver_info)
|
if(!driver_info)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user