aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto E. Vargas Caballero <k0ga@shike2.com>2012-11-13 20:04:45 +0100
committerRoberto E. Vargas Caballero <k0ga@shike2.com>2012-11-13 20:04:45 +0100
commitea782bfc5d34d712bc9391e498935d2d27f3116c (patch)
tree64cda24a549c2ff74a68f0540239d5a49d3e0677
parent93f31166bfff317e050dde1723cfa8302c6f85d3 (diff)
downloadst-ea782bfc5d34d712bc9391e498935d2d27f3116c.tar.gz
st-ea782bfc5d34d712bc9391e498935d2d27f3116c.zip
Remove hardcoded keys form kpress
Some keys were in the Key array while others were hardcoded in kpress().This cause some problems with some keys which can generate more of one string based in the configuration of the terminal. --- config.def.h | 70 ++++++++++++++++++++++++++++++++++++++++----------------- st.c | 71 +++++++++++++++++++++++++--------------------------------- 2 files changed, 79 insertions(+), 62 deletions(-)
-rw-r--r--config.def.h70
-rw-r--r--st.c71
2 files changed, 79 insertions, 62 deletions
diff --git a/config.def.h b/config.def.h
index 3bf35d9..622499e 100644
--- a/config.def.h
+++ b/config.def.h
@@ -56,34 +56,62 @@ static unsigned int defaultucs = 257;
56 56
57/* 57/*
58 * Special keys (change & recompile st.info accordingly) 58 * Special keys (change & recompile st.info accordingly)
59 * Keep in mind that kpress() in st.c hardcodes some keys.
60 * 59 *
61 * Mask value: 60 * Mask value:
62 * * Use XK_ANY_MOD to match the key no matter modifiers state 61 * * Use XK_ANY_MOD to match the key no matter modifiers state
63 * * Use XK_NO_MOD to match the key alone (no modifiers) 62 * * Use XK_NO_MOD to match the key alone (no modifiers)
63 * keypad value:
64 * * 0: no value
65 * * > 0: keypad application mode enabled
66 * * < 0: keypad application mode disabled
67 * cursor value:
68 * * 0: no value
69 * * > 0: cursor application mode enabled
70 * * < 0: cursor application mode disabled
71 * crlf value
72 * * 0: no value
73 * * > 0: crlf mode is enabled
74 * * < 0: crlf mode is disabled
64 */ 75 */
65 76
66/* key, mask, output */ 77/* key, mask, output, keypad, cursor, crlf */
67static Key key[] = { 78static Key key[] = {
68 { XK_BackSpace, XK_NO_MOD, "\177" }, 79 /* keysym mask string keypad cursor crlf */
69 { XK_Insert, XK_NO_MOD, "\033[2~" }, 80 { XK_BackSpace, XK_NO_MOD, "\177", 0, 0, 0},
70 { XK_Delete, XK_NO_MOD, "\033[3~" }, 81 { XK_Up, XK_NO_MOD, "\033[A", 0, -1, 0},
71 { XK_Home, XK_NO_MOD, "\033[1~" }, 82 { XK_Up, XK_NO_MOD, "\033OA", 0, +1, 0},
72 { XK_End, XK_NO_MOD, "\033[4~" }, 83 { XK_Up, ShiftMask, "\033[a", 0, 0, 0},
73 { XK_Prior, XK_NO_MOD, "\033[5~" }, 84 { XK_Down, XK_NO_MOD, "\033[B", 0, -1, 0},
74 { XK_Next, XK_NO_MOD, "\033[6~" }, 85 { XK_Down, XK_NO_MOD, "\033OB", 0, +1, 0},
75 { XK_F1, XK_NO_MOD, "\033OP" }, 86 { XK_Down, ShiftMask, "\033[b", 0, 0, 0},
76 { XK_F2, XK_NO_MOD, "\033OQ" }, 87 { XK_Left, XK_NO_MOD, "\033[D", 0, -1, 0},
77 { XK_F3, XK_NO_MOD, "\033OR" }, 88 { XK_Left, XK_NO_MOD, "\033OD", 0, +1, 0},
78 { XK_F4, XK_NO_MOD, "\033OS" }, 89 { XK_Left, ShiftMask, "\033[d", 0, 0, 0},
79 { XK_F5, XK_NO_MOD, "\033[15~" }, 90 { XK_Right, XK_NO_MOD, "\033[C", 0, -1, 0},
80 { XK_F6, XK_NO_MOD, "\033[17~" }, 91 { XK_Right, XK_NO_MOD, "\033OC", 0, +1, 0},
81 { XK_F7, XK_NO_MOD, "\033[18~" }, 92 { XK_Right, ShiftMask, "\033[c", 0, 0, 0},
82 { XK_F8, XK_NO_MOD, "\033[19~" }, 93 { XK_Return, XK_NO_MOD, "\n", 0, 0, -1},
83 { XK_F9, XK_NO_MOD, "\033[20~" }, 94 { XK_Return, XK_NO_MOD, "\r\n", 0, 0, +1},
84 { XK_F10, XK_NO_MOD, "\033[21~" }, 95 { XK_Return, Mod1Mask, "\033\n", 0, 0, -1},
85 { XK_F11, XK_NO_MOD, "\033[23~" }, 96 { XK_Return, Mod1Mask, "\033\r\n", 0, 0, +1},
86 { XK_F12, XK_NO_MOD, "\033[24~" }, 97 { XK_Insert, XK_NO_MOD, "\033[2~", 0, 0, 0},
98 { XK_Delete, XK_NO_MOD, "\033[3~", 0, 0, 0},
99 { XK_Home, XK_NO_MOD, "\033[1~", 0, 0, 0},
100 { XK_End, XK_NO_MOD, "\033[4~", 0, 0, 0},
101 { XK_Prior, XK_NO_MOD, "\033[5~", 0, 0, 0},
102 { XK_Next, XK_NO_MOD, "\033[6~", 0, 0, 0},
103 { XK_F1, XK_NO_MOD, "\033OP" , 0, 0, 0},
104 { XK_F2, XK_NO_MOD, "\033OQ" , 0, 0, 0},
105 { XK_F3, XK_NO_MOD, "\033OR" , 0, 0, 0},
106 { XK_F4, XK_NO_MOD, "\033OS" , 0, 0, 0},
107 { XK_F5, XK_NO_MOD, "\033[15~", 0, 0, 0},
108 { XK_F6, XK_NO_MOD, "\033[17~", 0, 0, 0},
109 { XK_F7, XK_NO_MOD, "\033[18~", 0, 0, 0},
110 { XK_F8, XK_NO_MOD, "\033[19~", 0, 0, 0},
111 { XK_F9, XK_NO_MOD, "\033[20~", 0, 0, 0},
112 { XK_F10, XK_NO_MOD, "\033[21~", 0, 0, 0},
113 { XK_F11, XK_NO_MOD, "\033[23~", 0, 0, 0},
114 { XK_F12, XK_NO_MOD, "\033[24~", 0, 0, 0},
87}; 115};
88 116
89/* Internal shortcuts. */ 117/* Internal shortcuts. */
diff --git a/st.c b/st.c
index 02a3502..14408c5 100644
--- a/st.c
+++ b/st.c
@@ -228,6 +228,10 @@ typedef struct {
228 KeySym k; 228 KeySym k;
229 uint mask; 229 uint mask;
230 char s[ESC_BUF_SIZ]; 230 char s[ESC_BUF_SIZ];
231 /* three valued logic variables: 0 indifferent, 1 on, -1 off */
232 signed char appkey; /* application keypad */
233 signed char appcursor; /* application cursor */
234 signed char crlf; /* crlf mode */
231} Key; 235} Key;
232 236
233/* TODO: use better name for vars... */ 237/* TODO: use better name for vars... */
@@ -2686,17 +2690,29 @@ focus(XEvent *ev) {
2686 2690
2687char* 2691char*
2688kmap(KeySym k, uint state) { 2692kmap(KeySym k, uint state) {
2689 int i;
2690 uint mask; 2693 uint mask;
2694 Key *kp;
2691 2695
2692 state &= ~Mod2Mask; 2696 state &= ~Mod2Mask;
2693 for(i = 0; i < LEN(key); i++) { 2697 for(kp = key; kp < key + LEN(key); kp++) {
2694 mask = key[i].mask; 2698 mask = kp->mask;
2695 2699
2696 if(key[i].k == k && ((state & mask) == mask 2700 if(kp->k != k)
2697 || (mask == XK_NO_MOD && !state))) { 2701 continue;
2698 return (char*)key[i].s; 2702 if((state & mask) != mask &&
2699 } 2703 (mask == XK_NO_MOD && state))
2704 continue;
2705 if((kp->appkey < 0 && IS_SET(MODE_APPKEYPAD)) ||
2706 (kp->appkey > 0 && !IS_SET(MODE_APPKEYPAD)))
2707 continue;
2708 if((kp->appcursor < 0 && IS_SET(MODE_APPCURSOR)) ||
2709 (kp->appcursor > 0 && !IS_SET(MODE_APPCURSOR)))
2710 continue;
2711 if((kp->crlf < 0 && IS_SET(MODE_CRLF)) ||
2712 (kp->crlf > 0 && !IS_SET(MODE_CRLF)))
2713 continue;
2714
2715 return kp->s;
2700 } 2716 }
2701 return NULL; 2717 return NULL;
2702} 2718}
@@ -2706,14 +2722,12 @@ kpress(XEvent *ev) {
2706 XKeyEvent *e = &ev->xkey; 2722 XKeyEvent *e = &ev->xkey;
2707 KeySym ksym; 2723 KeySym ksym;
2708 char xstr[31], buf[32], *customkey, *cp = buf; 2724 char xstr[31], buf[32], *customkey, *cp = buf;
2709 int len, meta, shift, i; 2725 int len, i;
2710 Status status; 2726 Status status;
2711 2727
2712 if (IS_SET(MODE_KBDLOCK)) 2728 if (IS_SET(MODE_KBDLOCK))
2713 return; 2729 return;
2714 2730
2715 meta = e->state & Mod1Mask;
2716 shift = e->state & ShiftMask;
2717 len = XmbLookupString(xw.xic, e, xstr, sizeof(xstr), &ksym, &status); 2731 len = XmbLookupString(xw.xic, e, xstr, sizeof(xstr), &ksym, &status);
2718 2732
2719 /* 1. shortcuts */ 2733 /* 1. shortcuts */
@@ -2732,39 +2746,14 @@ kpress(XEvent *ev) {
2732 memcpy(buf, customkey, len); 2746 memcpy(buf, customkey, len);
2733 /* 2. hardcoded (overrides X lookup) */ 2747 /* 2. hardcoded (overrides X lookup) */
2734 } else { 2748 } else {
2735 switch(ksym) { 2749 if(len == 0)
2736 case XK_Up: 2750 return;
2737 case XK_Down:
2738 case XK_Left:
2739 case XK_Right:
2740 /* XXX: shift up/down doesn't work */
2741 sprintf(buf, "\033%c%c",
2742 IS_SET(MODE_APPKEYPAD) ? 'O' : '[',
2743 (shift ? "dacb":"DACB")[ksym - XK_Left]);
2744 len = 3;
2745 break;
2746 case XK_Return:
2747 len = 0;
2748 if(meta)
2749 *cp++ = '\033', len++;
2750
2751 *cp++ = '\r', len++;
2752
2753 if(IS_SET(MODE_CRLF))
2754 *cp = '\n', len++;
2755 break;
2756 /* 3. X lookup */
2757 default:
2758 if(len == 0)
2759 return;
2760 2751
2761 if (len == 1 && meta) 2752 if (len == 1 && e->state & Mod1Mask)
2762 *cp++ = '\033'; 2753 *cp++ = '\033';
2763 2754
2764 memcpy(cp, xstr, len); 2755 memcpy(cp, xstr, len);
2765 len = cp - buf + len; 2756 len = cp - buf + len;
2766 break;
2767 }
2768 } 2757 }
2769 ttywrite(buf, len); 2758 ttywrite(buf, len);
2770 if(IS_SET(MODE_ECHO)) 2759 if(IS_SET(MODE_ECHO))