diff options
Diffstat (limited to 'x.c')
| -rw-r--r-- | x.c | 48 | 
1 files changed, 48 insertions, 0 deletions
@@ -116,6 +116,8 @@ static void selrequest(XEvent *);  static void selcopy(Time);  static void getbuttoninfo(XEvent *);  static void mousereport(XEvent *); +static char *kmap(KeySym, uint); +static int match(uint, uint);  static void run(void);  static void usage(void); @@ -1603,6 +1605,52 @@ focus(XEvent *ev)  	}  } +int +match(uint mask, uint state) +{ +	return mask == XK_ANY_MOD || mask == (state & ~ignoremod); +} + +char* +kmap(KeySym k, uint state) +{ +	Key *kp; +	int i; + +	/* Check for mapped keys out of X11 function keys. */ +	for (i = 0; i < mappedkeyslen; i++) { +		if (mappedkeys[i] == k) +			break; +	} +	if (i == mappedkeyslen) { +		if ((k & 0xFFFF) < 0xFD00) +			return NULL; +	} + +	for (kp = key; kp < key + keyslen; kp++) { +		if (kp->k != k) +			continue; + +		if (!match(kp->mask, state)) +			continue; + +		if (IS_SET(MODE_APPKEYPAD) ? kp->appkey < 0 : kp->appkey > 0) +			continue; +		if (term.numlock && kp->appkey == 2) +			continue; + +		if (IS_SET(MODE_APPCURSOR) ? kp->appcursor < 0 : kp->appcursor > 0) +			continue; + +		if (IS_SET(MODE_CRLF) ? kp->crlf < 0 : kp->crlf > 0) +			continue; + +		return kp->s; +	} + +	return NULL; +} +  void  kpress(XEvent *ev)  {  | 
