Browse Source

Implementing 8 bit mode for meta.

Christoph Lohmann 12 years ago
parent
commit
2bd6afd1c9
2 changed files with 22 additions and 4 deletions
  1. 19 4
      st.c
  2. 3 0
      st.info

+ 19 - 4
st.c

@@ -114,6 +114,7 @@ enum term_mode {
 	MODE_ECHO	 = 1024,
 	MODE_APPCURSOR	 = 2048,
 	MODE_MOUSESGR    = 4096,
+	MODE_8BIT	 = 8192,
 };
 
 enum escape_state {
@@ -1650,6 +1651,9 @@ tsetmode(bool priv, bool set, int *args, int narg) {
 			case 1006:
 				MODBIT(term.mode, set, MODE_MOUSESGR);
 				break;
+			case 1034:
+				MODBIT(term.mode, set, MODE_8BIT);
+				break;
 			case 1049: /* = 1047 and 1048 */
 			case 47:
 			case 1047:
@@ -3228,7 +3232,8 @@ kpress(XEvent *ev) {
 	XKeyEvent *e = &ev->xkey;
 	KeySym ksym;
 	char xstr[31], buf[32], *customkey, *cp = buf;
-	int len;
+	int len, ret;
+	long c;
 	Status status;
 	Shortcut *bp;
 
@@ -3249,13 +3254,23 @@ kpress(XEvent *ev) {
 	if((customkey = kmap(ksym, e->state))) {
 		len = strlen(customkey);
 		memcpy(buf, customkey, len);
-	/* 2. hardcoded (overrides X lookup) */
+	/* 3. hardcoded (overrides X lookup) */
 	} else {
 		if(len == 0)
 			return;
 
-		if(len == 1 && e->state & Mod1Mask)
-			*cp++ = '\033';
+		if(len == 1 && e->state & Mod1Mask) {
+			if(IS_SET(MODE_8BIT)) {
+				if(*xstr < 0177) {
+					c = *xstr | B7;
+					ret = utf8encode(&c, cp);
+					cp += ret;
+					len = 0;
+				}
+			} else {
+				*cp++ = '\033';
+			}
+		}
 
 		memcpy(cp, xstr, len);
 		len = cp - buf + len;

+ 3 - 0
st.info

@@ -147,6 +147,7 @@ st| simpleterm,
 	kich1=\E[2~,
 	knp=\E[6~,
 	kmous=\E[M,
+	km,
 	kpp=\E[5~,
 	lines#24,
 	mir,
@@ -162,6 +163,7 @@ st| simpleterm,
 	rmcup=\E[?1049l,
 	rmir=\E[4l,
 	rmkx=\E[?1l\E>,
+	rmm=\E[?1034l,
 	rmso=\E[27m,
 	rmul=\E[m,
 	rs1=\Ec,
@@ -178,6 +180,7 @@ st| simpleterm,
 	smcup=\E[?1049h,
 	smir=\E[4h,
 	smkx=\E[?1h\E=,
+	smm=\E[?1034h,
 	smso=\E[7m,
 	smul=\E[4m,
 	tbc=\E[3g,