diff options
-rw-r--r-- | config.def.h | 70 | ||||
-rw-r--r-- | st.c | 71 |
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 */ |
67 | static Key key[] = { | 78 | static 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. */ |
@@ -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 | ||
2687 | char* | 2691 | char* |
2688 | kmap(KeySym k, uint state) { | 2692 | kmap(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)) |