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(-)dev
parent
b26df1d0d3
commit
172f65436c
34
config.def.h
34
config.def.h
|
@ -62,6 +62,7 @@ static Shortcut shortcuts[] = {
|
||||||
{ MODKEY|ShiftMask, XK_Prior, xzoom, {.i = +1} },
|
{ MODKEY|ShiftMask, XK_Prior, xzoom, {.i = +1} },
|
||||||
{ MODKEY|ShiftMask, XK_Next, xzoom, {.i = -1} },
|
{ MODKEY|ShiftMask, XK_Next, xzoom, {.i = -1} },
|
||||||
{ ShiftMask, XK_Insert, selpaste, {.i = 0} },
|
{ ShiftMask, XK_Insert, selpaste, {.i = 0} },
|
||||||
|
{ MODKEY, XK_Num_Lock, numlock, {.i = 0} },
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -73,6 +74,7 @@ static Shortcut shortcuts[] = {
|
||||||
* keypad value:
|
* keypad value:
|
||||||
* * 0: no value
|
* * 0: no value
|
||||||
* * > 0: keypad application mode enabled
|
* * > 0: keypad application mode enabled
|
||||||
|
* * = 2: term.numlock = 1
|
||||||
* * < 0: keypad application mode disabled
|
* * < 0: keypad application mode disabled
|
||||||
* cursor value:
|
* cursor value:
|
||||||
* * 0: no value
|
* * 0: no value
|
||||||
|
@ -123,24 +125,24 @@ static Key key[] = {
|
||||||
{ XK_KP_Insert, XK_ANY_MOD, "\033[2~", 0, 0, 0},
|
{ XK_KP_Insert, XK_ANY_MOD, "\033[2~", 0, 0, 0},
|
||||||
{ XK_KP_Delete, ShiftMask, "\033[3;2~", 0, 0, 0},
|
{ XK_KP_Delete, ShiftMask, "\033[3;2~", 0, 0, 0},
|
||||||
{ XK_KP_Delete, XK_ANY_MOD, "\033[3~", 0, 0, 0},
|
{ XK_KP_Delete, XK_ANY_MOD, "\033[3~", 0, 0, 0},
|
||||||
{ XK_KP_Multiply, XK_ANY_MOD, "\033Oj", +1, 0, 0},
|
{ XK_KP_Multiply, XK_ANY_MOD, "\033Oj", +2, 0, 0},
|
||||||
{ XK_KP_Add, XK_ANY_MOD, "\033Ok", +1, 0, 0},
|
{ XK_KP_Add, XK_ANY_MOD, "\033Ok", +2, 0, 0},
|
||||||
{ XK_KP_Enter, XK_ANY_MOD, "\033OM", +1, 0, 0},
|
{ XK_KP_Enter, XK_ANY_MOD, "\033OM", +2, 0, 0},
|
||||||
{ XK_KP_Enter, XK_ANY_MOD, "\r", -1, 0, -1},
|
{ XK_KP_Enter, XK_ANY_MOD, "\r", -1, 0, -1},
|
||||||
{ XK_KP_Enter, XK_ANY_MOD, "\r\n", -1, 0, +1},
|
{ XK_KP_Enter, XK_ANY_MOD, "\r\n", -1, 0, +1},
|
||||||
{ XK_KP_Subtract, XK_ANY_MOD, "\033Om", +1, 0, 0},
|
{ XK_KP_Subtract, XK_ANY_MOD, "\033Om", +2, 0, 0},
|
||||||
{ XK_KP_Decimal, XK_ANY_MOD, "\033On", +1, 0, 0},
|
{ XK_KP_Decimal, XK_ANY_MOD, "\033On", +2, 0, 0},
|
||||||
{ XK_KP_Divide, XK_ANY_MOD, "\033Oo", +1, 0, 0},
|
{ XK_KP_Divide, XK_ANY_MOD, "\033Oo", +2, 0, 0},
|
||||||
{ XK_KP_0, XK_ANY_MOD, "\033Op", +1, 0, 0},
|
{ XK_KP_0, XK_ANY_MOD, "\033Op", +2, 0, 0},
|
||||||
{ XK_KP_1, XK_ANY_MOD, "\033Oq", +1, 0, 0},
|
{ XK_KP_1, XK_ANY_MOD, "\033Oq", +2, 0, 0},
|
||||||
{ XK_KP_2, XK_ANY_MOD, "\033Or", +1, 0, 0},
|
{ XK_KP_2, XK_ANY_MOD, "\033Or", +2, 0, 0},
|
||||||
{ XK_KP_3, XK_ANY_MOD, "\033Os", +1, 0, 0},
|
{ XK_KP_3, XK_ANY_MOD, "\033Os", +2, 0, 0},
|
||||||
{ XK_KP_4, XK_ANY_MOD, "\033Ot", +1, 0, 0},
|
{ XK_KP_4, XK_ANY_MOD, "\033Ot", +2, 0, 0},
|
||||||
{ XK_KP_5, XK_ANY_MOD, "\033Ou", +1, 0, 0},
|
{ XK_KP_5, XK_ANY_MOD, "\033Ou", +2, 0, 0},
|
||||||
{ XK_KP_6, XK_ANY_MOD, "\033Ov", +1, 0, 0},
|
{ XK_KP_6, XK_ANY_MOD, "\033Ov", +2, 0, 0},
|
||||||
{ XK_KP_7, XK_ANY_MOD, "\033Ow", +1, 0, 0},
|
{ XK_KP_7, XK_ANY_MOD, "\033Ow", +2, 0, 0},
|
||||||
{ XK_KP_8, XK_ANY_MOD, "\033Ox", +1, 0, 0},
|
{ XK_KP_8, XK_ANY_MOD, "\033Ox", +2, 0, 0},
|
||||||
{ XK_KP_9, XK_ANY_MOD, "\033Oy", +1, 0, 0},
|
{ XK_KP_9, XK_ANY_MOD, "\033Oy", +2, 0, 0},
|
||||||
{ XK_BackSpace, XK_NO_MOD, "\177", 0, 0, 0},
|
{ XK_BackSpace, XK_NO_MOD, "\177", 0, 0, 0},
|
||||||
{ XK_Up, ShiftMask, "\033[1;2A", 0, 0, 0},
|
{ XK_Up, ShiftMask, "\033[1;2A", 0, 0, 0},
|
||||||
{ XK_Up, ControlMask, "\033[1;5A", 0, 0, 0},
|
{ XK_Up, ControlMask, "\033[1;5A", 0, 0, 0},
|
||||||
|
|
17
st.c
17
st.c
|
@ -194,6 +194,7 @@ typedef struct {
|
||||||
int bot; /* bottom scroll limit */
|
int bot; /* bottom scroll limit */
|
||||||
int mode; /* terminal mode flags */
|
int mode; /* terminal mode flags */
|
||||||
int esc; /* escape state flags */
|
int esc; /* escape state flags */
|
||||||
|
bool numlock; /* lock numbers in keyboard */
|
||||||
bool *tabs;
|
bool *tabs;
|
||||||
} Term;
|
} Term;
|
||||||
|
|
||||||
|
@ -261,6 +262,7 @@ typedef struct {
|
||||||
/* function definitions used in config.h */
|
/* function definitions used in config.h */
|
||||||
static void xzoom(const Arg *);
|
static void xzoom(const Arg *);
|
||||||
static void selpaste(const Arg *);
|
static void selpaste(const Arg *);
|
||||||
|
static void numlock(const Arg *);
|
||||||
|
|
||||||
/* Config.h for applying patches and the configuration. */
|
/* Config.h for applying patches and the configuration. */
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
@ -1100,6 +1102,7 @@ tnew(int col, int row) {
|
||||||
term.alt [row] = xmalloc(term.col * sizeof(Glyph));
|
term.alt [row] = xmalloc(term.col * sizeof(Glyph));
|
||||||
term.dirty[row] = 0;
|
term.dirty[row] = 0;
|
||||||
}
|
}
|
||||||
|
term.numlock = 1;
|
||||||
memset(term.tabs, 0, term.col * sizeof(*term.tabs));
|
memset(term.tabs, 0, term.col * sizeof(*term.tabs));
|
||||||
/* setup screen */
|
/* setup screen */
|
||||||
treset();
|
treset();
|
||||||
|
@ -2700,6 +2703,12 @@ match(uint mask, uint state) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
numlock(const Arg *dummy)
|
||||||
|
{
|
||||||
|
term.numlock ^= 1;
|
||||||
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
kmap(KeySym k, uint state) {
|
kmap(KeySym k, uint state) {
|
||||||
uint mask;
|
uint mask;
|
||||||
|
@ -2725,8 +2734,12 @@ kmap(KeySym k, uint state) {
|
||||||
if(!match(mask, state))
|
if(!match(mask, state))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if((kp->appkey < 0 && IS_SET(MODE_APPKEYPAD)) ||
|
if(kp->appkey > 0) {
|
||||||
(kp->appkey > 0 && !IS_SET(MODE_APPKEYPAD))) {
|
if(!IS_SET(MODE_APPKEYPAD))
|
||||||
|
continue;
|
||||||
|
if(term.numlock && kp->appkey == 2)
|
||||||
|
continue;
|
||||||
|
} else if (kp->appkey < 0 && IS_SET(MODE_APPKEYPAD)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue