X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=st.c;h=683a0e9b19fb751fd70c72bdc73846674e0c0e89;hb=69ee3ba3a771ca60bc8738174c79fc851818a36b;hp=c043e3fc544171a52bfb6082ed90323010130d3c;hpb=c4a9ccec19b14a6bdc980d149e2c27c30f250945;p=st.git diff --git a/st.c b/st.c index c043e3f..683a0e9 100644 --- a/st.c +++ b/st.c @@ -110,17 +110,19 @@ enum glyph_state { }; enum term_mode { - MODE_WRAP = 1, + MODE_WRAP = 1, MODE_INSERT = 2, MODE_APPKEYPAD = 4, MODE_ALTSCREEN = 8, - MODE_CRLF = 16, + MODE_CRLF = 16, MODE_MOUSEBTN = 32, MODE_MOUSEMOTION = 64, MODE_MOUSE = 32|64, MODE_REVERSE = 128, MODE_KBDLOCK = 256, - MODE_HIDE = 512 + MODE_HIDE = 512, + MODE_ECHO = 1024, + MODE_APPCURSOR = 2048 }; enum escape_state { @@ -277,7 +279,6 @@ typedef struct { /* Drawing Context */ typedef struct { Colour col[LEN(colorname) < 256 ? 256 : LEN(colorname)]; - GC gc; Font font, bfont, ifont, ibfont; } DC; @@ -321,6 +322,7 @@ static void tswapscreen(void); static void tsetdirt(int, int); static void tsetmode(bool, bool, int *, int); static void tfulldirt(void); +static void techo(char *, int); static void ttynew(void); static void ttyread(void); @@ -1470,7 +1472,7 @@ tsetmode(bool priv, bool set, int *args, int narg) { switch(*args) { break; case 1: /* DECCKM -- Cursor key */ - MODBIT(term.mode, set, MODE_APPKEYPAD); + MODBIT(term.mode, set, MODE_APPCURSOR); break; case 5: /* DECSCNM -- Reverse video */ mode = term.mode; @@ -1535,7 +1537,8 @@ tsetmode(bool priv, bool set, int *args, int narg) { case 4: /* IRM -- Insertion-replacement */ MODBIT(term.mode, set, MODE_INSERT); break; - case 12: /* XXX: SRM -- Send/Receive */ + case 12: /* SRM -- Send/Receive */ + MODBIT(term.mode, !set, MODE_ECHO); break; case 20: /* LNM -- Linefeed/new line */ MODBIT(term.mode, set, MODE_CRLF); @@ -1850,6 +1853,28 @@ tputtab(bool forward) { } void +techo(char *buf, int len) { + for(; len > 0; buf++, len--) { + char c = *buf; + + if(c == '\033') { /* escape */ + tputc("^", 1); + tputc("[", 1); + } else if (c < '\x20') { /* control code */ + if(c != '\n' && c != '\r' && c != '\t') { + c |= '\x40'; + tputc("^", 1); + } + tputc(&c, 1); + } else { + break; + } + } + if (len) + tputc(buf, len); +} + +void tputc(char *c, int len) { uchar ascii = *c; bool control = ascii < '\x20' || ascii == 0177; @@ -2398,8 +2423,6 @@ xinit(void) { xw.xic = XCreateIC(xw.xim, XNInputStyle, XIMPreeditNothing | XIMStatusNothing, XNClientWindow, xw.win, XNFocusWindow, xw.win, NULL); - /* gc */ - dc.gc = XCreateGC(xw.dpy, xw.win, 0, NULL); /* white cursor, black outline */ cursor = XCreateFontCursor(xw.dpy, XC_xterm); @@ -2682,7 +2705,7 @@ void kpress(XEvent *ev) { XKeyEvent *e = &ev->xkey; KeySym ksym; - char buf[32], *customkey; + char xstr[31], buf[32], *customkey, *cp = buf; int len, meta, shift, i; Status status; @@ -2691,7 +2714,7 @@ kpress(XEvent *ev) { meta = e->state & Mod1Mask; shift = e->state & ShiftMask; - len = XmbLookupString(xw.xic, e, buf, sizeof(buf), &ksym, &status); + len = XmbLookupString(xw.xic, e, xstr, sizeof(xstr), &ksym, &status); /* 1. shortcuts */ for(i = 0; i < LEN(shortcuts); i++) { @@ -2705,7 +2728,8 @@ kpress(XEvent *ev) { /* 2. custom keys from config.h */ if((customkey = kmap(ksym, e->state))) { - ttywrite(customkey, strlen(customkey)); + len = strlen(customkey); + memcpy(buf, customkey, len); /* 2. hardcoded (overrides X lookup) */ } else { switch(ksym) { @@ -2717,34 +2741,44 @@ kpress(XEvent *ev) { sprintf(buf, "\033%c%c", IS_SET(MODE_APPKEYPAD) ? 'O' : '[', (shift ? "dacb":"DACB")[ksym - XK_Left]); - ttywrite(buf, 3); + len = 3; break; case XK_Insert: - if(shift) + if(shift) { selpaste(); + return; + } + memcpy(buf, xstr, len); break; case XK_Return: + len = 0; if(meta) - ttywrite("\033", 1); + *cp++ = '\033', len++; - if(IS_SET(MODE_CRLF)) { - ttywrite("\r\n", 2); - } else { - ttywrite("\r", 1); - } + *cp++ = '\r', len++; + + if(IS_SET(MODE_CRLF)) + *cp = '\n', len++; break; /* 3. X lookup */ default: - if(len > 0) { - if(meta && len == 1) - ttywrite("\033", 1); - ttywrite(buf, len); - } + if(len == 0) + return; + + if (len == 1 && meta) + *cp++ = '\033'; + + memcpy(cp, xstr, len); + len = cp - buf + len; break; } } + ttywrite(buf, len); + if(IS_SET(MODE_ECHO)) + techo(buf, len); } + void cmessage(XEvent *e) { /* See xembed specs