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)
