aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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))