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(-)
This commit is contained in:
		
							
								
								
									
										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));
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user