X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=st.c;h=38cec50781ea53c47b4284df87845e16a577d94a;hb=384fabdb5b2ac6c700a974a7fac539c8c14107f6;hp=5f75c392c47d2ceda4bbd2ee980be21d4e6c8830;hpb=b78c5085f72d66de26468e2c07fb3c72d0afe63b;p=st.git diff --git a/st.c b/st.c index 5f75c39..38cec50 100644 --- a/st.c +++ b/st.c @@ -44,7 +44,7 @@ #endif #define USAGE \ - "st " VERSION " (c) 2010-2012 st engineers\n" \ + "st " VERSION " (c) 2010-2013 st engineers\n" \ "usage: st [-v] [-c class] [-f font] [-g geometry] [-o file]" \ " [-t title] [-w windowid] [-e command ...]\n" @@ -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 @@ -793,6 +807,7 @@ void selclear(XEvent *e) { void selrequest(XEvent *e) { + fprintf(stderr, "selrequest\n"); XSelectionRequestEvent *xsre; XSelectionEvent xev; Atom xa_targets, string; @@ -828,6 +843,7 @@ selrequest(XEvent *e) { void xsetsel(char *str) { + fprintf(stderr, "xsetsel: %s\n", str); /* register the selection for both the clipboard and the primary */ Atom clipboard; @@ -1545,6 +1561,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: { @@ -2479,6 +2498,7 @@ xzoom(const Arg *arg) void xinit(void) { XSetWindowAttributes attrs; + XGCValues gcvalues; Cursor cursor; Window parent; int sw, sh, major, minor; @@ -2544,7 +2564,10 @@ xinit(void) { usedbe = True; } else { */ - dc.gc = XCreateGC(xw.dpy, parent, 0, 0); + memset(&gcvalues, 0, sizeof(gcvalues)); + gcvalues.graphics_exposures = False; + dc.gc = XCreateGC(xw.dpy, parent, GCGraphicsExposures, + &gcvalues); xw.buf = XCreatePixmap(xw.dpy, xw.win, xw.w, xw.h, DefaultDepth(xw.dpy, xw.scr)); XSetForeground(xw.dpy, dc.gc, 0); @@ -2872,7 +2895,6 @@ draw(void) { XCopyArea(xw.dpy, xw.buf, xw.win, dc.gc, 0, 0, xw.w, xw.h, 0, 0); XSetForeground(xw.dpy, dc.gc, 0); - XSync(xw.dpy, False); } }