diff options
| -rw-r--r-- | config.def.h | 70 | ||||
| -rw-r--r-- | st.c | 71 | 
2 files changed, 79 insertions, 62 deletions
diff --git a/config.def.h b/config.def.h index 3bf35d9..622499e 100644 --- a/config.def.h +++ b/config.def.h @@ -56,34 +56,62 @@ static unsigned int defaultucs = 257;  /*   * Special keys (change & recompile st.info accordingly) - * Keep in mind that kpress() in st.c hardcodes some keys.   *   * Mask value:   * * Use XK_ANY_MOD to match the key no matter modifiers state   * * Use XK_NO_MOD to match the key alone (no modifiers) + * keypad value: + * * 0: no value + * * > 0: keypad application mode enabled + * * < 0: keypad application mode disabled + * cursor value: + * * 0: no value + * * > 0: cursor application mode enabled + * * < 0: cursor application mode disabled + * crlf value + * * 0: no value + * * > 0: crlf mode is enabled + * * < 0: crlf mode is disabled   */ -/* key, mask, output */ +/* key, mask, output, keypad, cursor, crlf */  static Key key[] = { -	{ XK_BackSpace, XK_NO_MOD, "\177" }, -	{ XK_Insert,    XK_NO_MOD, "\033[2~" }, -	{ XK_Delete,    XK_NO_MOD, "\033[3~" }, -	{ XK_Home,      XK_NO_MOD, "\033[1~" }, -	{ XK_End,       XK_NO_MOD, "\033[4~" }, -	{ XK_Prior,     XK_NO_MOD, "\033[5~" }, -	{ XK_Next,      XK_NO_MOD, "\033[6~" }, -	{ XK_F1,        XK_NO_MOD, "\033OP"   }, -	{ XK_F2,        XK_NO_MOD, "\033OQ"   }, -	{ XK_F3,        XK_NO_MOD, "\033OR"   }, -	{ XK_F4,        XK_NO_MOD, "\033OS"   }, -	{ XK_F5,        XK_NO_MOD, "\033[15~" }, -	{ XK_F6,        XK_NO_MOD, "\033[17~" }, -	{ XK_F7,        XK_NO_MOD, "\033[18~" }, -	{ XK_F8,        XK_NO_MOD, "\033[19~" }, -	{ XK_F9,        XK_NO_MOD, "\033[20~" }, -	{ XK_F10,       XK_NO_MOD, "\033[21~" }, -	{ XK_F11,       XK_NO_MOD, "\033[23~" }, -	{ XK_F12,       XK_NO_MOD, "\033[24~" }, +	/* keysym             mask         string         keypad cursor crlf */ +	{ XK_BackSpace,     XK_NO_MOD,      "\177",          0,    0,    0}, +	{ XK_Up,            XK_NO_MOD,      "\033[A",        0,   -1,    0}, +	{ XK_Up,            XK_NO_MOD,      "\033OA",        0,   +1,    0}, +	{ XK_Up,            ShiftMask,      "\033[a",        0,    0,    0}, +	{ XK_Down,          XK_NO_MOD,      "\033[B",        0,   -1,    0}, +	{ XK_Down,          XK_NO_MOD,      "\033OB",        0,   +1,    0}, +	{ XK_Down,          ShiftMask,      "\033[b",        0,    0,    0}, +	{ XK_Left,     	    XK_NO_MOD,      "\033[D",        0,   -1,    0}, +	{ XK_Left,          XK_NO_MOD,      "\033OD",        0,   +1,    0}, +	{ XK_Left,          ShiftMask,      "\033[d",        0,    0,    0}, +	{ XK_Right,         XK_NO_MOD,      "\033[C",        0,   -1,    0}, +	{ XK_Right,         XK_NO_MOD,      "\033OC",        0,   +1,    0}, +	{ XK_Right,         ShiftMask,      "\033[c",        0,    0,    0}, +	{ XK_Return,        XK_NO_MOD,      "\n",            0,    0,   -1}, +	{ XK_Return,        XK_NO_MOD,      "\r\n",          0,    0,   +1}, +	{ XK_Return,        Mod1Mask,       "\033\n",        0,    0,   -1}, +	{ XK_Return,        Mod1Mask,       "\033\r\n",      0,    0,   +1}, +	{ XK_Insert,        XK_NO_MOD,      "\033[2~",       0,    0,    0}, +	{ XK_Delete,        XK_NO_MOD,      "\033[3~",       0,    0,    0}, +	{ XK_Home,          XK_NO_MOD,      "\033[1~",       0,    0,    0}, +	{ XK_End,           XK_NO_MOD,      "\033[4~",       0,    0,    0}, +	{ XK_Prior,         XK_NO_MOD,      "\033[5~",       0,    0,    0}, +	{ XK_Next,          XK_NO_MOD,      "\033[6~",       0,    0,    0}, +	{ XK_F1,            XK_NO_MOD,      "\033OP" ,       0,    0,    0}, +	{ XK_F2,            XK_NO_MOD,      "\033OQ" ,       0,    0,    0}, +	{ XK_F3,            XK_NO_MOD,      "\033OR" ,       0,    0,    0}, +	{ XK_F4,            XK_NO_MOD,      "\033OS" ,       0,    0,    0}, +	{ XK_F5,            XK_NO_MOD,      "\033[15~",      0,    0,    0}, +	{ XK_F6,            XK_NO_MOD,      "\033[17~",      0,    0,    0}, +	{ XK_F7,            XK_NO_MOD,      "\033[18~",      0,    0,    0}, +	{ XK_F8,            XK_NO_MOD,      "\033[19~",      0,    0,    0}, +	{ XK_F9,            XK_NO_MOD,      "\033[20~",      0,    0,    0}, +	{ XK_F10,           XK_NO_MOD,      "\033[21~",      0,    0,    0}, +	{ XK_F11,           XK_NO_MOD,      "\033[23~",      0,    0,    0}, +	{ XK_F12,           XK_NO_MOD,      "\033[24~",      0,    0,    0},  };  /* Internal shortcuts. */ @@ -228,6 +228,10 @@ typedef struct {  	KeySym k;  	uint mask;  	char s[ESC_BUF_SIZ]; +	/* three valued logic variables: 0 indifferent, 1 on, -1 off */ +	signed char appkey;		/* application keypad */ +	signed char appcursor;		/* application cursor */ +	signed char crlf;		/* crlf mode          */  } Key;  /* TODO: use better name for vars... */ @@ -2686,17 +2690,29 @@ focus(XEvent *ev) {  char*  kmap(KeySym k, uint state) { -	int i;  	uint mask; +	Key *kp;  	state &= ~Mod2Mask; -	for(i = 0; i < LEN(key); i++) { -		mask = key[i].mask; +	for(kp = key; kp < key + LEN(key); kp++) { +		mask = kp->mask; -		if(key[i].k == k && ((state & mask) == mask -				|| (mask == XK_NO_MOD && !state))) { -			return (char*)key[i].s; -		} +		if(kp->k != k) +			continue; +		if((state & mask) != mask && +		   (mask == XK_NO_MOD && state)) +			continue; +		if((kp->appkey < 0 && IS_SET(MODE_APPKEYPAD)) || +		   (kp->appkey > 0 && !IS_SET(MODE_APPKEYPAD))) +			continue; +		if((kp->appcursor < 0 && IS_SET(MODE_APPCURSOR)) || +		   (kp->appcursor > 0 && !IS_SET(MODE_APPCURSOR))) +			continue; +		if((kp->crlf < 0 && IS_SET(MODE_CRLF)) || +		   (kp->crlf > 0 && !IS_SET(MODE_CRLF))) +			continue; + +		return kp->s;  	}  	return NULL;  } @@ -2706,14 +2722,12 @@ kpress(XEvent *ev) {  	XKeyEvent *e = &ev->xkey;  	KeySym ksym;  	char xstr[31], buf[32], *customkey, *cp = buf; -	int len, meta, shift, i; +	int len, i;  	Status status;  	if (IS_SET(MODE_KBDLOCK))  		return; -	meta = e->state & Mod1Mask; -	shift = e->state & ShiftMask;  	len = XmbLookupString(xw.xic, e, xstr, sizeof(xstr), &ksym, &status);  	/* 1. shortcuts */ @@ -2732,39 +2746,14 @@ kpress(XEvent *ev) {  		memcpy(buf, customkey, len);  	/* 2. hardcoded (overrides X lookup) */  	} else { -		switch(ksym) { -		case XK_Up: -		case XK_Down: -		case XK_Left: -		case XK_Right: -			/* XXX: shift up/down doesn't work */ -			sprintf(buf, "\033%c%c", -				IS_SET(MODE_APPKEYPAD) ? 'O' : '[', -				(shift ? "dacb":"DACB")[ksym - XK_Left]); -			len = 3; -			break; -		case XK_Return: -			len = 0; -			if(meta) -				*cp++ = '\033', len++; - -			*cp++ = '\r', len++; - -			if(IS_SET(MODE_CRLF)) -				*cp = '\n', len++; -			break; -			/* 3. X lookup  */ -		default: -			if(len == 0) -				return; +		if(len == 0) +			return; -			if (len == 1 && meta) -				*cp++ = '\033'; +		if (len == 1 && e->state & Mod1Mask) +			*cp++ = '\033'; -			memcpy(cp, xstr, len); -			len = cp - buf + len; -			break; -		} +		memcpy(cp, xstr, len); +		len = cp - buf + len;  	}  	ttywrite(buf, len);  	if(IS_SET(MODE_ECHO))  | 
