Fix Shift + Insert shortcut
This patch apply the same code for shortcuts that it is used now for defined keys. So it is possible use now XK_NO_MOD and XK_ANY_MOD for defining shortcuts. --- st.c | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-)dev
parent
cc86d148cb
commit
90e1427632
35
st.c
35
st.c
|
@ -65,7 +65,6 @@
|
||||||
#define REDRAW_TIMEOUT (80*1000) /* 80 ms */
|
#define REDRAW_TIMEOUT (80*1000) /* 80 ms */
|
||||||
|
|
||||||
/* macros */
|
/* macros */
|
||||||
#define CLEANMASK(mask) (mask & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask))
|
|
||||||
#define SERRNO strerror(errno)
|
#define SERRNO strerror(errno)
|
||||||
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||||
#define MAX(a, b) ((a) < (b) ? (b) : (a))
|
#define MAX(a, b) ((a) < (b) ? (b) : (a))
|
||||||
|
@ -329,6 +328,7 @@ static void tsetmode(bool, bool, int *, int);
|
||||||
static void tfulldirt(void);
|
static void tfulldirt(void);
|
||||||
static void techo(char *, int);
|
static void techo(char *, int);
|
||||||
|
|
||||||
|
static inline bool match(uint, uint);
|
||||||
static void ttynew(void);
|
static void ttynew(void);
|
||||||
static void ttyread(void);
|
static void ttyread(void);
|
||||||
static void ttyresize(void);
|
static void ttyresize(void);
|
||||||
|
@ -2696,23 +2696,29 @@ focus(XEvent *ev) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline bool
|
||||||
|
match(uint mask, uint state) {
|
||||||
|
if(mask == XK_NO_MOD && state)
|
||||||
|
return false;
|
||||||
|
if(mask != XK_ANY_MOD && mask != XK_NO_MOD && !state)
|
||||||
|
return false;
|
||||||
|
if((state & mask) != state)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
kmap(KeySym k, uint state) {
|
kmap(KeySym k, uint state) {
|
||||||
uint mask;
|
uint mask;
|
||||||
Key *kp;
|
Key *kp;
|
||||||
|
|
||||||
state &= ~Mod2Mask;
|
|
||||||
for(kp = key; kp < key + LEN(key); kp++) {
|
for(kp = key; kp < key + LEN(key); kp++) {
|
||||||
mask = kp->mask;
|
mask = kp->mask;
|
||||||
|
|
||||||
if(kp->k != k)
|
if(kp->k != k)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if(mask == XK_NO_MOD && state)
|
if(!match(mask, state))
|
||||||
continue;
|
|
||||||
if(mask != XK_ANY_MOD && mask != XK_NO_MOD && !state)
|
|
||||||
continue;
|
|
||||||
if((state & mask) != state)
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if((kp->appkey < 0 && IS_SET(MODE_APPKEYPAD)) ||
|
if((kp->appkey < 0 && IS_SET(MODE_APPKEYPAD)) ||
|
||||||
|
@ -2741,21 +2747,20 @@ kpress(XEvent *ev) {
|
||||||
XKeyEvent *e = &ev->xkey;
|
XKeyEvent *e = &ev->xkey;
|
||||||
KeySym ksym;
|
KeySym ksym;
|
||||||
char xstr[31], buf[32], *customkey, *cp = buf;
|
char xstr[31], buf[32], *customkey, *cp = buf;
|
||||||
int len, i;
|
int len;
|
||||||
Status status;
|
Status status;
|
||||||
|
Shortcut *bp;
|
||||||
|
|
||||||
if (IS_SET(MODE_KBDLOCK))
|
if (IS_SET(MODE_KBDLOCK))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
len = XmbLookupString(xw.xic, e, xstr, sizeof(xstr), &ksym, &status);
|
len = XmbLookupString(xw.xic, e, xstr, sizeof(xstr), &ksym, &status);
|
||||||
|
e->state &= ~Mod2Mask;
|
||||||
/* 1. shortcuts */
|
/* 1. shortcuts */
|
||||||
for(i = 0; i < LEN(shortcuts); i++) {
|
for(bp = shortcuts; bp < shortcuts + LEN(shortcuts); bp++) {
|
||||||
if((ksym == shortcuts[i].keysym)
|
if(ksym == bp->keysym && match(bp->mod, e->state)) {
|
||||||
&& (CLEANMASK(shortcuts[i].mod) == \
|
bp->func(&(bp->arg));
|
||||||
CLEANMASK(e->state))
|
return;
|
||||||
&& shortcuts[i].func) {
|
|
||||||
shortcuts[i].func(&(shortcuts[i].arg));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue