aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto E. Vargas Caballero <k0ga@shike2.com>2012-11-25 09:23:02 +0100
committerRoberto E. Vargas Caballero <k0ga@shike2.com>2012-11-25 09:23:02 +0100
commit172f65436ce14a52842d67b862fdc45f8ff3ada3 (patch)
treec68972acb67be790fc29816359eb814e42bef2ab
parentb26df1d0d3f7791504150820e7c105b20c6b1c3b (diff)
downloadst-172f65436ce14a52842d67b862fdc45f8ff3ada3.tar.gz
st-172f65436ce14a52842d67b862fdc45f8ff3ada3.zip
Add key for toogling numlock handling
Keypad will generate keycodes when keypad application mode is enabled. It can cause problems with some programs like vi, which operates in such mode. This patch change by default don't generate the keycodes never, but this behaviour can be changed using the combination Alt + NumLock. --- config.def.h | 34 ++++++++++++++++++---------------- st.c | 17 +++++++++++++++-- 2 files changed, 33 insertions(+), 18 deletions(-)
-rw-r--r--config.def.h34
-rw-r--r--st.c17
2 files changed, 33 insertions, 18 deletions
diff --git a/config.def.h b/config.def.h
index 8543ea2..7c55ef2 100644
--- a/config.def.h
+++ b/config.def.h
@@ -62,6 +62,7 @@ static Shortcut shortcuts[] = {
62 { MODKEY|ShiftMask, XK_Prior, xzoom, {.i = +1} }, 62 { MODKEY|ShiftMask, XK_Prior, xzoom, {.i = +1} },
63 { MODKEY|ShiftMask, XK_Next, xzoom, {.i = -1} }, 63 { MODKEY|ShiftMask, XK_Next, xzoom, {.i = -1} },
64 { ShiftMask, XK_Insert, selpaste, {.i = 0} }, 64 { ShiftMask, XK_Insert, selpaste, {.i = 0} },
65 { MODKEY, XK_Num_Lock, numlock, {.i = 0} },
65}; 66};
66 67
67/* 68/*
@@ -73,6 +74,7 @@ static Shortcut shortcuts[] = {
73 * keypad value: 74 * keypad value:
74 * * 0: no value 75 * * 0: no value
75 * * > 0: keypad application mode enabled 76 * * > 0: keypad application mode enabled
77 * * = 2: term.numlock = 1
76 * * < 0: keypad application mode disabled 78 * * < 0: keypad application mode disabled
77 * cursor value: 79 * cursor value:
78 * * 0: no value 80 * * 0: no value
@@ -123,24 +125,24 @@ static Key key[] = {
123 { XK_KP_Insert, XK_ANY_MOD, "\033[2~", 0, 0, 0}, 125 { XK_KP_Insert, XK_ANY_MOD, "\033[2~", 0, 0, 0},
124 { XK_KP_Delete, ShiftMask, "\033[3;2~", 0, 0, 0}, 126 { XK_KP_Delete, ShiftMask, "\033[3;2~", 0, 0, 0},
125 { XK_KP_Delete, XK_ANY_MOD, "\033[3~", 0, 0, 0}, 127 { XK_KP_Delete, XK_ANY_MOD, "\033[3~", 0, 0, 0},
126 { XK_KP_Multiply, XK_ANY_MOD, "\033Oj", +1, 0, 0}, 128 { XK_KP_Multiply, XK_ANY_MOD, "\033Oj", +2, 0, 0},
127 { XK_KP_Add, XK_ANY_MOD, "\033Ok", +1, 0, 0}, 129 { XK_KP_Add, XK_ANY_MOD, "\033Ok", +2, 0, 0},
128 { XK_KP_Enter, XK_ANY_MOD, "\033OM", +1, 0, 0}, 130 { XK_KP_Enter, XK_ANY_MOD, "\033OM", +2, 0, 0},
129 { XK_KP_Enter, XK_ANY_MOD, "\r", -1, 0, -1}, 131 { XK_KP_Enter, XK_ANY_MOD, "\r", -1, 0, -1},
130 { XK_KP_Enter, XK_ANY_MOD, "\r\n", -1, 0, +1}, 132 { XK_KP_Enter, XK_ANY_MOD, "\r\n", -1, 0, +1},
131 { XK_KP_Subtract, XK_ANY_MOD, "\033Om", +1, 0, 0}, 133 { XK_KP_Subtract, XK_ANY_MOD, "\033Om", +2, 0, 0},
132 { XK_KP_Decimal, XK_ANY_MOD, "\033On", +1, 0, 0}, 134 { XK_KP_Decimal, XK_ANY_MOD, "\033On", +2, 0, 0},
133 { XK_KP_Divide, XK_ANY_MOD, "\033Oo", +1, 0, 0}, 135 { XK_KP_Divide, XK_ANY_MOD, "\033Oo", +2, 0, 0},
134 { XK_KP_0, XK_ANY_MOD, "\033Op", +1, 0, 0}, 136 { XK_KP_0, XK_ANY_MOD, "\033Op", +2, 0, 0},
135 { XK_KP_1, XK_ANY_MOD, "\033Oq", +1, 0, 0}, 137 { XK_KP_1, XK_ANY_MOD, "\033Oq", +2, 0, 0},
136 { XK_KP_2, XK_ANY_MOD, "\033Or", +1, 0, 0}, 138 { XK_KP_2, XK_ANY_MOD, "\033Or", +2, 0, 0},
137 { XK_KP_3, XK_ANY_MOD, "\033Os", +1, 0, 0}, 139 { XK_KP_3, XK_ANY_MOD, "\033Os", +2, 0, 0},
138 { XK_KP_4, XK_ANY_MOD, "\033Ot", +1, 0, 0}, 140 { XK_KP_4, XK_ANY_MOD, "\033Ot", +2, 0, 0},
139 { XK_KP_5, XK_ANY_MOD, "\033Ou", +1, 0, 0}, 141 { XK_KP_5, XK_ANY_MOD, "\033Ou", +2, 0, 0},
140 { XK_KP_6, XK_ANY_MOD, "\033Ov", +1, 0, 0}, 142 { XK_KP_6, XK_ANY_MOD, "\033Ov", +2, 0, 0},
141 { XK_KP_7, XK_ANY_MOD, "\033Ow", +1, 0, 0}, 143 { XK_KP_7, XK_ANY_MOD, "\033Ow", +2, 0, 0},
142 { XK_KP_8, XK_ANY_MOD, "\033Ox", +1, 0, 0}, 144 { XK_KP_8, XK_ANY_MOD, "\033Ox", +2, 0, 0},
143 { XK_KP_9, XK_ANY_MOD, "\033Oy", +1, 0, 0}, 145 { XK_KP_9, XK_ANY_MOD, "\033Oy", +2, 0, 0},
144 { XK_BackSpace, XK_NO_MOD, "\177", 0, 0, 0}, 146 { XK_BackSpace, XK_NO_MOD, "\177", 0, 0, 0},
145 { XK_Up, ShiftMask, "\033[1;2A", 0, 0, 0}, 147 { XK_Up, ShiftMask, "\033[1;2A", 0, 0, 0},
146 { XK_Up, ControlMask, "\033[1;5A", 0, 0, 0}, 148 { XK_Up, ControlMask, "\033[1;5A", 0, 0, 0},
diff --git a/st.c b/st.c
index 1647cbd..671b386 100644
--- a/st.c
+++ b/st.c
@@ -194,6 +194,7 @@ typedef struct {
194 int bot; /* bottom scroll limit */ 194 int bot; /* bottom scroll limit */
195 int mode; /* terminal mode flags */ 195 int mode; /* terminal mode flags */
196 int esc; /* escape state flags */ 196 int esc; /* escape state flags */
197 bool numlock; /* lock numbers in keyboard */
197 bool *tabs; 198 bool *tabs;
198} Term; 199} Term;
199 200
@@ -261,6 +262,7 @@ typedef struct {
261/* function definitions used in config.h */ 262/* function definitions used in config.h */
262static void xzoom(const Arg *); 263static void xzoom(const Arg *);
263static void selpaste(const Arg *); 264static void selpaste(const Arg *);
265static void numlock(const Arg *);
264 266
265/* Config.h for applying patches and the configuration. */ 267/* Config.h for applying patches and the configuration. */
266#include "config.h" 268#include "config.h"
@@ -1100,6 +1102,7 @@ tnew(int col, int row) {
1100 term.alt [row] = xmalloc(term.col * sizeof(Glyph)); 1102 term.alt [row] = xmalloc(term.col * sizeof(Glyph));
1101 term.dirty[row] = 0; 1103 term.dirty[row] = 0;
1102 } 1104 }
1105 term.numlock = 1;
1103 memset(term.tabs, 0, term.col * sizeof(*term.tabs)); 1106 memset(term.tabs, 0, term.col * sizeof(*term.tabs));
1104 /* setup screen */ 1107 /* setup screen */
1105 treset(); 1108 treset();
@@ -2700,6 +2703,12 @@ match(uint mask, uint state) {
2700 return true; 2703 return true;
2701} 2704}
2702 2705
2706void
2707numlock(const Arg *dummy)
2708{
2709 term.numlock ^= 1;
2710}
2711
2703char* 2712char*
2704kmap(KeySym k, uint state) { 2713kmap(KeySym k, uint state) {
2705 uint mask; 2714 uint mask;
@@ -2725,8 +2734,12 @@ kmap(KeySym k, uint state) {
2725 if(!match(mask, state)) 2734 if(!match(mask, state))
2726 continue; 2735 continue;
2727 2736
2728 if((kp->appkey < 0 && IS_SET(MODE_APPKEYPAD)) || 2737 if(kp->appkey > 0) {
2729 (kp->appkey > 0 && !IS_SET(MODE_APPKEYPAD))) { 2738 if(!IS_SET(MODE_APPKEYPAD))
2739 continue;
2740 if(term.numlock && kp->appkey == 2)
2741 continue;
2742 } else if (kp->appkey < 0 && IS_SET(MODE_APPKEYPAD)) {
2730 continue; 2743 continue;
2731 } 2744 }
2732 2745