X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=st.c;h=a1932dd4e69de6b0b8a9bf62981f9dbee33073e5;hb=efd04ccad6d3c4e981b3efdb0423d8f5ca40f984;hp=1a407652cbd670f1f612e6dea491f606c342932b;hpb=57f39defaf3f84b5d9efb3e7a8494cc7ff09e7af;p=st.git diff --git a/st.c b/st.c index 1a40765..a1932dd 100644 --- a/st.c +++ b/st.c @@ -117,7 +117,8 @@ enum term_mode { MODE_KBDLOCK = 256, MODE_HIDE = 512, MODE_ECHO = 1024, - MODE_APPCURSOR = 2048 + MODE_APPCURSOR = 2048, + MODE_MOUSESGR = 4096, }; enum escape_state { @@ -666,11 +667,10 @@ getbuttoninfo(XEvent *e) { void mousereport(XEvent *e) { - int x = x2col(e->xbutton.x); - int y = y2row(e->xbutton.y); - int button = e->xbutton.button; - int state = e->xbutton.state; - char buf[] = { '\033', '[', 'M', 0, 32+x+1, 32+y+1 }; + int x = x2col(e->xbutton.x), y = y2row(e->xbutton.y), + button = e->xbutton.button, state = e->xbutton.state, + len; + char buf[40]; static int ob, ox, oy; /* from urxvt */ @@ -679,7 +679,9 @@ mousereport(XEvent *e) { return; button = ob + 32; ox = x, oy = y; - } else if(e->xbutton.type == ButtonRelease || button == AnyButton) { + } else if(!IS_SET(MODE_MOUSESGR) + && (e->xbutton.type == ButtonRelease + || button == AnyButton)) { button = 3; } else { button -= Button1; @@ -691,11 +693,23 @@ mousereport(XEvent *e) { } } - buf[3] = 32 + button + (state & ShiftMask ? 4 : 0) + button += (state & ShiftMask ? 4 : 0) + (state & Mod4Mask ? 8 : 0) + (state & ControlMask ? 16 : 0); - ttywrite(buf, sizeof(buf)); + len = 0; + if(IS_SET(MODE_MOUSESGR)) { + len = snprintf(buf, sizeof(buf), "\033[<%d;%d;%d%c", + button, x+1, y+1, + e->xbutton.type == ButtonRelease ? 'm' : 'M'); + } else if(x < 223 && y < 223) { + len = snprintf(buf, sizeof(buf), "\033[M%c%c%c", + 32+button, 32+x+1, 32+y+1); + } else { + return; + } + + ttywrite(buf, len); } void @@ -844,7 +858,6 @@ xsetsel(char *str) { void brelease(XEvent *e) { - fprintf(stderr, "brelease\n"); struct timeval now; if(IS_SET(MODE_MOUSE)) { @@ -1408,7 +1421,8 @@ tsetattr(int *attr, int l) { case 4: term.c.attr.mode |= ATTR_UNDERLINE; break; - case 5: + case 5: /* slow blink */ + case 6: /* rapid blink */ term.c.attr.mode |= ATTR_BLINK; break; case 7: @@ -1425,6 +1439,7 @@ tsetattr(int *attr, int l) { term.c.attr.mode &= ~ATTR_UNDERLINE; break; case 25: + case 26: term.c.attr.mode &= ~ATTR_BLINK; break; case 27: @@ -1548,6 +1563,9 @@ tsetmode(bool priv, bool set, int *args, int narg) { case 1002: MODBIT(term.mode, set, MODE_MOUSEMOTION); break; + case 1006: + MODBIT(term.mode, set, MODE_MOUSESGR); + break; case 1049: /* = 1047 and 1048 */ case 47: case 1047: { @@ -1727,8 +1745,8 @@ csihandle(void) { break; case 'X': /* ECH -- Erase char */ DEFAULT(csiescseq.arg[0], 1); - tclearregion(term.c.x, term.c.y, term.c.x + csiescseq.arg[0], - term.c.y, 0); + tclearregion(term.c.x, term.c.y, + term.c.x + csiescseq.arg[0] - 1, term.c.y, 1); break; case 'P': /* DCH -- Delete char */ DEFAULT(csiescseq.arg[0], 1); @@ -2190,9 +2208,11 @@ tresize(int col, int row) { /* free unneeded rows */ i = 0; if(slide > 0) { - /* slide screen to keep cursor where we expect it - + /* + * slide screen to keep cursor where we expect it - * tscrollup would work here, but we can optimize to - * memmove because we're freeing the earlier lines */ + * memmove because we're freeing the earlier lines + */ for(/* i = 0 */; i < slide; i++) { free(term.line[i]); free(term.alt[i]); @@ -2440,8 +2460,7 @@ xloadfonts(char *fontstr, int fontsize) { } void -xunloadfonts(void) -{ +xunloadfonts(void) { int i, ip; /* @@ -2471,8 +2490,7 @@ xunloadfonts(void) } void -xzoom(const Arg *arg) -{ +xzoom(const Arg *arg) { xunloadfonts(); xloadfonts(usedfont, usedfontsize + arg->i); cresize(0, 0); @@ -3093,8 +3111,10 @@ kpress(XEvent *ev) { void cmessage(XEvent *e) { - /* See xembed specs - http://standards.freedesktop.org/xembed-spec/xembed-spec-latest.html */ + /* + * See xembed specs + * http://standards.freedesktop.org/xembed-spec/xembed-spec-latest.html + */ if(e->xclient.message_type == xw.xembed && e->xclient.format == 32) { if(e->xclient.data.l[1] == XEMBED_FOCUS_IN) { xw.state |= WIN_FOCUSED; @@ -3110,8 +3130,7 @@ cmessage(XEvent *e) { } void -cresize(int width, int height) -{ +cresize(int width, int height) { int col, row; if(width != 0) @@ -3175,7 +3194,6 @@ run(void) { XNextEvent(xw.dpy, &ev); if(XFilterEvent(&ev, None)) continue; - fprintf(stderr, "ev.type = %d\n", ev.type); if(handler[ev.type]) (handler[ev.type])(&ev); }