diff --git a/st.c b/st.c index 3321c31..c46126a 100644 --- a/st.c +++ b/st.c @@ -60,6 +60,7 @@ char *argv0; #define STR_BUF_SIZ ESC_BUF_SIZ #define STR_ARG_SIZ ESC_ARG_SIZ #define DRAW_BUF_SIZ 20*1024 +#define KEY_STR_SIZ 16 #define XK_ANY_MOD UINT_MAX #define XK_NO_MOD 0 #define XK_SWITCH_MOD (1<<13) @@ -78,6 +79,7 @@ char *argv0; #define IS_SET(flag) ((term.mode & (flag)) != 0) #define TIMEDIFF(t1, t2) ((t1.tv_sec-t2.tv_sec)*1000 + (t1.tv_usec-t2.tv_usec)/1000) #define CEIL(x) (((x) != (int) (x)) ? (x) + 1 : (x)) +#define STRNLEN(s) ((s)[LEN((s)) - 1] == '\0' ? strlen((s)) : LEN((s))) #define TRUECOLOR(r,g,b) (1 << 24 | (r) << 16 | (g) << 8 | (b)) #define IS_TRUECOL(x) (1 << 24 & (x)) @@ -244,13 +246,13 @@ typedef struct { typedef struct { int b; uint mask; - char s[ESC_BUF_SIZ]; + char s[KEY_STR_SIZ]; } Mousekey; typedef struct { KeySym k; uint mask; - char s[ESC_BUF_SIZ]; + char s[KEY_STR_SIZ]; /* three valued logic variables: 0 indifferent, 1 on, -1 off */ signed char appkey; /* application keypad */ signed char appcursor; /* application cursor */ @@ -395,7 +397,7 @@ static void xresize(int, int); static void expose(XEvent *); static void visibility(XEvent *); static void unmap(XEvent *); -static char *kmap(KeySym, uint); +static Key *kmap(KeySym, uint); static void kpress(XEvent *); static void cmessage(XEvent *); static void cresize(int, int); @@ -877,9 +879,9 @@ bpress(XEvent *e) { for(mk = mshortcuts; mk < mshortcuts + LEN(mshortcuts); mk++) { if(e->xbutton.button == mk->b && match(mk->mask, e->xbutton.state)) { - ttywrite(mk->s, strlen(mk->s)); + ttywrite(mk->s, STRNLEN(mk->s)); if(IS_SET(MODE_ECHO)) - techo(mk->s, strlen(mk->s)); + techo(mk->s, STRNLEN(mk->s)); return; } } @@ -3464,7 +3466,7 @@ numlock(const Arg *dummy) { term.numlock ^= 1; } -char* +Key * kmap(KeySym k, uint state) { Key *kp; int i; @@ -3506,7 +3508,7 @@ kmap(KeySym k, uint state) { continue; } - return kp->s; + return kp; } return NULL; @@ -3516,10 +3518,11 @@ void kpress(XEvent *ev) { XKeyEvent *e = &ev->xkey; KeySym ksym; - char xstr[31], buf[32], *customkey, *cp = buf; + char xstr[KEY_STR_SIZ - 1], buf[KEY_STR_SIZ], *cp = buf; int len, ret; long c; Status status; + Key *kp; Shortcut *bp; if(IS_SET(MODE_KBDLOCK)) @@ -3536,9 +3539,9 @@ kpress(XEvent *ev) { } /* 2. custom keys from config.h */ - if((customkey = kmap(ksym, e->state))) { - len = strlen(customkey); - memcpy(buf, customkey, len); + if((kp = kmap(ksym, e->state))) { + len = STRNLEN(kp->s); + memcpy(buf, kp->s, len); /* 3. hardcoded (overrides X lookup) */ } else { if(len == 0)