strdup() the terminfo keypad_local and keypad_xmit strings at construct time, in case multiple instances and they change beneath us
This commit is contained in:
parent
2c1bea4f15
commit
43a99e64f2
38
driver-ti.c
38
driver-ti.c
|
@ -1,3 +1,6 @@
|
||||||
|
// we want strdup()
|
||||||
|
#define _XOPEN_SOURCE 500
|
||||||
|
|
||||||
#include "termkey.h"
|
#include "termkey.h"
|
||||||
#include "termkey-internal.h"
|
#include "termkey-internal.h"
|
||||||
|
|
||||||
|
@ -39,6 +42,9 @@ typedef struct {
|
||||||
termkey_t *tk;
|
termkey_t *tk;
|
||||||
|
|
||||||
struct trie_node *root;
|
struct trie_node *root;
|
||||||
|
|
||||||
|
char *start_string;
|
||||||
|
char *stop_string;
|
||||||
} termkey_ti;
|
} termkey_ti;
|
||||||
|
|
||||||
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);
|
||||||
|
@ -189,6 +195,20 @@ static void *new_driver(termkey_t *tk, const char *term)
|
||||||
|
|
||||||
ti->root = compress_trie(ti->root);
|
ti->root = compress_trie(ti->root);
|
||||||
|
|
||||||
|
/* Take copies of these terminfo strings, in case we build multiple termkey
|
||||||
|
* instances for multiple different termtypes, and it's different by the
|
||||||
|
* time we want to use it
|
||||||
|
*/
|
||||||
|
if(keypad_xmit)
|
||||||
|
ti->start_string = strdup(keypad_xmit);
|
||||||
|
else
|
||||||
|
ti->start_string = NULL;
|
||||||
|
|
||||||
|
if(keypad_local)
|
||||||
|
ti->stop_string = strdup(keypad_local);
|
||||||
|
else
|
||||||
|
ti->stop_string = NULL;
|
||||||
|
|
||||||
return ti;
|
return ti;
|
||||||
|
|
||||||
abort_free_trie:
|
abort_free_trie:
|
||||||
|
@ -202,20 +222,24 @@ abort_free_ti:
|
||||||
|
|
||||||
static void start_driver(termkey_t *tk, void *info)
|
static void start_driver(termkey_t *tk, void *info)
|
||||||
{
|
{
|
||||||
|
termkey_ti *ti = info;
|
||||||
|
|
||||||
/* The terminfo database will contain keys in application cursor key mode.
|
/* The terminfo database will contain keys in application cursor key mode.
|
||||||
* We may need to enable that mode
|
* We may need to enable that mode
|
||||||
*/
|
*/
|
||||||
if(keypad_xmit) {
|
if(ti->start_string) {
|
||||||
// Can't call putp or tputs because they suck and don't give us fd control
|
// Can't call putp or tputs because they suck and don't give us fd control
|
||||||
write(tk->fd, keypad_xmit, strlen(keypad_xmit));
|
write(tk->fd, ti->start_string, strlen(ti->start_string));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void stop_driver(termkey_t *tk, void *info)
|
static void stop_driver(termkey_t *tk, void *info)
|
||||||
{
|
{
|
||||||
if(keypad_local) {
|
termkey_ti *ti = info;
|
||||||
|
|
||||||
|
if(ti->stop_string) {
|
||||||
// Can't call putp or tputs because they suck and don't give us fd control
|
// Can't call putp or tputs because they suck and don't give us fd control
|
||||||
write(tk->fd, keypad_local, strlen(keypad_local));
|
write(tk->fd, ti->stop_string, strlen(ti->stop_string));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -225,6 +249,12 @@ static void free_driver(void *info)
|
||||||
|
|
||||||
free_trie(ti->root);
|
free_trie(ti->root);
|
||||||
|
|
||||||
|
if(ti->start_string)
|
||||||
|
free(ti->start_string);
|
||||||
|
|
||||||
|
if(ti->stop_string)
|
||||||
|
free(ti->stop_string);
|
||||||
|
|
||||||
free(ti);
|
free(ti);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue