diff -ur st-0.3.orig/st.c st-0.3/st.c --- st-0.3.orig/st.c 2012-11-02 20:09:49.000000000 +0100 +++ st-0.3/st.c 2013-01-25 00:19:09.011493964 +0100 @@ -117,7 +117,8 @@ MODE_MOUSEMOTION = 64, MODE_MOUSE = 32|64, MODE_REVERSE = 128, - MODE_KBDLOCK = 256 + MODE_KBDLOCK = 256, + MODE_MOUSESGR = 512 }; enum escape_state { @@ -617,7 +618,8 @@ 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 }; + char buf[40]; + int len = 0; static int ob, ox, oy; /* from urxvt */ @@ -626,7 +628,7 @@ 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; @@ -638,11 +640,17 @@ } } - 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)); + if(IS_SET(MODE_MOUSESGR)) { + len = sprintf(buf, "\033[<%d;%d;%d%c", button, x+1, y+1, e->xbutton.type == ButtonRelease ? 'm' : 'M'); + } else if(x < 223 && y < 223) { + len = sprintf(buf, "\033[M%c%c%c", 32+button, 32+x+1, 32+y+1); + } + + ttywrite(buf, len); } void @@ -1454,6 +1462,9 @@ case 1002: MODBIT(term.mode, set, MODE_MOUSEMOTION); break; + case 1006: /* Allow mouse coordinates above 223 */ + MODBIT(term.mode, set, MODE_MOUSESGR); + break; case 1049: /* = 1047 and 1048 */ case 47: case 1047: