# st

Unnamed repository; edit this file 'description' to name the repository.

| Log | Files | Refs | README | LICENSE

    commit 90e1427632d6c5852d10c8d2bafa787012903eb9
    parent cc86d148cb4092a57af2b58eeae96bbd721de803
    Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
    Date:   Thu, 15 Nov 2012 19:01:16 +0100

    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(-)
    Diffstat:
    Mst.c | 35++++++++++++++++++++---------------

    1 file changed, 20 insertions(+), 15 deletions(-)
    diff --git a/st.c b/st.c
    @@ -65,7 +65,6 @@
     #define REDRAW_TIMEOUT (80*1000) /* 80 ms */

     /* macros */
    -#define CLEANMASK(mask) (mask & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask))
     #define SERRNO strerror(errno)
     #define MIN(a, b)  ((a) < (b) ? (a) : (b))
     #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 techo(char *, int);

    +static inline bool match(uint, uint);
     static void ttynew(void);
     static void ttyread(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*
     kmap(KeySym k, uint state) {
     	uint mask;
     	Key *kp;

    -	state &= ~Mod2Mask;
     	for(kp = key; kp < key + LEN(key); kp++) {
     		mask = kp->mask;

     		if(kp->k != k)
     			continue;

    -		if(mask == XK_NO_MOD && state)
    -			continue;
    -		if(mask != XK_ANY_MOD && mask != XK_NO_MOD && !state)
    -			continue;
    -		if((state & mask) != state)
    +		if(!match(mask, state))
     			continue;

     		if((kp->appkey < 0 && IS_SET(MODE_APPKEYPAD)) ||
    @@ -2741,21 +2747,20 @@ kpress(XEvent *ev) {
     	XKeyEvent *e = &ev->xkey;
     	KeySym ksym;
     	char xstr[31], buf[32], *customkey, *cp = buf;
    -	int len, i;
    +	int len;
     	Status status;
    +	Shortcut *bp;

     	if (IS_SET(MODE_KBDLOCK))
     		return;

     	len = XmbLookupString(xw.xic, e, xstr, sizeof(xstr), &ksym, &status);
    -
    +	e->state &= ~Mod2Mask;
     	/* 1. shortcuts */
    -	for(i = 0; i < LEN(shortcuts); i++) {
    -		if((ksym == shortcuts[i].keysym)
    -				&& (CLEANMASK(shortcuts[i].mod) == \
    -					CLEANMASK(e->state))
    -				&& shortcuts[i].func) {
    -			shortcuts[i].func(&(shortcuts[i].arg));
    +	for(bp = shortcuts; bp < shortcuts + LEN(shortcuts); bp++) {
    +		if(ksym == bp->keysym && match(bp->mod, e->state)) {
    +			bp->func(&(bp->arg));
    +			return;
     		}
     	}