JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
Making st not activate the cursor in case of Mod + k in dwm.
[st.git] / st.c
diff --git a/st.c b/st.c
index 1a40765..2c803fa 100644 (file)
--- 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
@@ -793,7 +807,6 @@ void selclear(XEvent *e) {
 
 void
 selrequest(XEvent *e) {
-       fprintf(stderr, "selrequest\n");
        XSelectionRequestEvent *xsre;
        XSelectionEvent xev;
        Atom xa_targets, string;
@@ -829,7 +842,6 @@ 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;
 
@@ -844,7 +856,6 @@ xsetsel(char *str) {
 
 void
 brelease(XEvent *e) {
-       fprintf(stderr, "brelease\n");
        struct timeval now;
 
        if(IS_SET(MODE_MOUSE)) {
@@ -1408,7 +1419,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 +1437,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 +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: {
@@ -1727,8 +1743,8 @@ csihandle(void) {
                break;
        case 'X': /* ECH -- Erase <n> 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 <n> char */
                DEFAULT(csiescseq.arg[0], 1);
@@ -2190,9 +2206,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]);
@@ -2257,7 +2275,7 @@ xresize(int col, int row) {
                XFreePixmap(xw.dpy, xw.buf);
                xw.buf = XCreatePixmap(xw.dpy, xw.win, xw.w, xw.h,
                                DefaultDepth(xw.dpy, xw.scr));
-               XSetForeground(xw.dpy, dc.gc, 0);
+               XSetForeground(xw.dpy, dc.gc, dc.col[IS_SET(MODE_REVERSE) ? defaultfg : defaultbg].pixel);
                XFillRectangle(xw.dpy, xw.buf, dc.gc, 0, 0, xw.w, xw.h);
        }
 
@@ -2440,8 +2458,7 @@ xloadfonts(char *fontstr, int fontsize) {
 }
 
 void
-xunloadfonts(void)
-{
+xunloadfonts(void) {
        int i, ip;
 
        /*
@@ -2471,8 +2488,7 @@ xunloadfonts(void)
 }
 
 void
-xzoom(const Arg *arg)
-{
+xzoom(const Arg *arg) {
        xunloadfonts();
        xloadfonts(usedfont, usedfontsize + arg->i);
        cresize(0, 0);
@@ -2554,7 +2570,7 @@ xinit(void) {
                                &gcvalues);
                xw.buf = XCreatePixmap(xw.dpy, xw.win, xw.w, xw.h,
                                DefaultDepth(xw.dpy, xw.scr));
-               XSetForeground(xw.dpy, dc.gc, 0);
+               XSetForeground(xw.dpy, dc.gc, dc.col[defaultbg].pixel);
                XFillRectangle(xw.dpy, xw.buf, dc.gc, 0, 0, xw.w, xw.h);
                //xw.buf = xw.win;
        /*
@@ -2878,7 +2894,7 @@ draw(void) {
        } else {
                XCopyArea(xw.dpy, xw.buf, xw.win, dc.gc, 0, 0, xw.w,
                                xw.h, 0, 0);
-               XSetForeground(xw.dpy, dc.gc, 0);
+               XSetForeground(xw.dpy, dc.gc, dc.col[IS_SET(MODE_REVERSE) ? defaultfg : defaultbg].pixel);
        }
 }
 
@@ -2970,6 +2986,11 @@ xseturgency(int add) {
 
 void
 focus(XEvent *ev) {
+       XFocusChangeEvent *e = &ev->xfocus;
+
+       if(e->mode == NotifyGrab)
+               return;
+
        if(ev->type == FocusIn) {
                XSetICFocus(xw.xic);
                xw.state |= WIN_FOCUSED;
@@ -3093,8 +3114,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 +3133,7 @@ cmessage(XEvent *e) {
 }
 
 void
-cresize(int width, int height)
-{
+cresize(int width, int height) {
        int col, row;
 
        if(width != 0)
@@ -3175,7 +3197,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);
                }