diff options
author | Aurélien Aptel <aurelien.aptel@gmail.com> | 2011-06-08 19:32:10 +0200 |
---|---|---|
committer | Aurélien Aptel <aurelien.aptel@gmail.com> | 2011-06-08 19:32:10 +0200 |
commit | 6eaec4732fdf2ffbd92de8ad90c9954ae0838888 (patch) | |
tree | 95944d1cde81048d1586a068da738584d7e46347 | |
parent | 2edb412b6bb482de554e490fd2839da551b4f310 (diff) | |
download | st-patched-6eaec4732fdf2ffbd92de8ad90c9954ae0838888.tar.bz2 st-patched-6eaec4732fdf2ffbd92de8ad90c9954ae0838888.tar.xz st-patched-6eaec4732fdf2ffbd92de8ad90c9954ae0838888.zip |
disable mouse highlight when mouse report enabled. (thx Bert Münnich)
-rw-r--r-- | st.c | 82 |
1 files changed, 51 insertions, 31 deletions
@@ -64,7 +64,7 @@ enum { CURSOR_UP, CURSOR_DOWN, CURSOR_LEFT, CURSOR_RIGHT, | |||
64 | enum { CURSOR_DEFAULT = 0, CURSOR_HIDE = 1, CURSOR_WRAPNEXT = 2 }; | 64 | enum { CURSOR_DEFAULT = 0, CURSOR_HIDE = 1, CURSOR_WRAPNEXT = 2 }; |
65 | enum { GLYPH_SET=1, GLYPH_DIRTY=2 }; | 65 | enum { GLYPH_SET=1, GLYPH_DIRTY=2 }; |
66 | enum { MODE_WRAP=1, MODE_INSERT=2, MODE_APPKEYPAD=4, MODE_ALTSCREEN=8, | 66 | enum { MODE_WRAP=1, MODE_INSERT=2, MODE_APPKEYPAD=4, MODE_ALTSCREEN=8, |
67 | MODE_CRLF=16, MODE_MOUSE=32, MODE_REVERSE=64 }; | 67 | MODE_CRLF=16, MODE_MOUSEBTN=32, MODE_MOUSEMOTION=64, MODE_MOUSE=32|64, MODE_REVERSE=128 }; |
68 | enum { ESC_START=1, ESC_CSI=2, ESC_OSC=4, ESC_TITLE=8, ESC_ALTCHARSET=16 }; | 68 | enum { ESC_START=1, ESC_CSI=2, ESC_OSC=4, ESC_TITLE=8, ESC_ALTCHARSET=16 }; |
69 | enum { WIN_VISIBLE=1, WIN_REDRAW=2, WIN_FOCUSED=4 }; | 69 | enum { WIN_VISIBLE=1, WIN_REDRAW=2, WIN_FOCUSED=4 }; |
70 | 70 | ||
@@ -418,17 +418,24 @@ mousereport(XEvent *e) { | |||
418 | int button = e->xbutton.button; | 418 | int button = e->xbutton.button; |
419 | int state = e->xbutton.state; | 419 | int state = e->xbutton.state; |
420 | char buf[] = { '\033', '[', 'M', 0, 32+x+1, 32+y+1 }; | 420 | char buf[] = { '\033', '[', 'M', 0, 32+x+1, 32+y+1 }; |
421 | 421 | static int ob, ox, oy; | |
422 | if(!IS_SET(MODE_MOUSE)) | ||
423 | return; | ||
424 | 422 | ||
425 | /* from urxvt */ | 423 | /* from urxvt */ |
426 | if(e->xbutton.type == ButtonRelease || button == AnyButton) | 424 | if(e->xbutton.type == MotionNotify) { |
425 | if(!IS_SET(MODE_MOUSEMOTION) || (x == ox && y == oy)) | ||
426 | return; | ||
427 | button = ob + 32; | ||
428 | ox = x, oy = y; | ||
429 | } else if(e->xbutton.type == ButtonRelease || button == AnyButton) { | ||
427 | button = 3; | 430 | button = 3; |
428 | else { | 431 | } else { |
429 | button -= Button1; | 432 | button -= Button1; |
430 | if(button >= 3) | 433 | if(button >= 3) |
431 | button += 64 - 3; | 434 | button += 64 - 3; |
435 | if(e->xbutton.type == ButtonPress) { | ||
436 | ob = button; | ||
437 | ox = x, oy = y; | ||
438 | } | ||
432 | } | 439 | } |
433 | 440 | ||
434 | buf[3] = 32 + button + (state & ShiftMask ? 4 : 0) | 441 | buf[3] = 32 + button + (state & ShiftMask ? 4 : 0) |
@@ -440,10 +447,13 @@ mousereport(XEvent *e) { | |||
440 | 447 | ||
441 | void | 448 | void |
442 | bpress(XEvent *e) { | 449 | bpress(XEvent *e) { |
443 | mousereport(e); | 450 | if(IS_SET(MODE_MOUSE)) |
444 | sel.mode = 1; | 451 | mousereport(e); |
445 | sel.ex = sel.bx = X2COL(e->xbutton.x); | 452 | else if(e->xbutton.button == Button1) { |
446 | sel.ey = sel.by = Y2ROW(e->xbutton.y); | 453 | sel.mode = 1; |
454 | sel.ex = sel.bx = X2COL(e->xbutton.x); | ||
455 | sel.ey = sel.by = Y2ROW(e->xbutton.y); | ||
456 | } | ||
447 | } | 457 | } |
448 | 458 | ||
449 | void | 459 | void |
@@ -552,17 +562,18 @@ xsetsel(char *str) { | |||
552 | 562 | ||
553 | void | 563 | void |
554 | brelease(XEvent *e) { | 564 | brelease(XEvent *e) { |
555 | int b; | 565 | if(IS_SET(MODE_MOUSE)) { |
556 | 566 | mousereport(e); | |
557 | sel.mode = 0; | 567 | return; |
558 | getbuttoninfo(e, &b, &sel.ex, &sel.ey); | 568 | } |
559 | mousereport(e); | 569 | if(e->xbutton.button == Button2) |
560 | if(sel.bx == sel.ex && sel.by == sel.ey) { | 570 | selpaste(); |
561 | sel.bx = -1; | 571 | else if(e->xbutton.button == Button1) { |
562 | if(b == 2) | 572 | sel.mode = 0; |
563 | selpaste(); | 573 | getbuttoninfo(e, NULL, &sel.ex, &sel.ey); |
564 | else if(b == 1) { | 574 | if(sel.bx == sel.ex && sel.by == sel.ey) { |
565 | struct timeval now; | 575 | struct timeval now; |
576 | sel.bx = -1; | ||
566 | gettimeofday(&now, NULL); | 577 | gettimeofday(&now, NULL); |
567 | 578 | ||
568 | if(TIMEDIFF(now, sel.tclick2) <= TRIPLECLICK_TIMEOUT) { | 579 | if(TIMEDIFF(now, sel.tclick2) <= TRIPLECLICK_TIMEOUT) { |
@@ -574,18 +585,18 @@ brelease(XEvent *e) { | |||
574 | } else if(TIMEDIFF(now, sel.tclick1) <= DOUBLECLICK_TIMEOUT) { | 585 | } else if(TIMEDIFF(now, sel.tclick1) <= DOUBLECLICK_TIMEOUT) { |
575 | /* double click to select word */ | 586 | /* double click to select word */ |
576 | sel.bx = sel.ex; | 587 | sel.bx = sel.ex; |
577 | while(term.line[sel.ey][sel.bx-1].state & GLYPH_SET && | 588 | while(sel.bx > 0 && term.line[sel.ey][sel.bx-1].state & GLYPH_SET && |
578 | term.line[sel.ey][sel.bx-1].c[0] != ' ') sel.bx--; | 589 | term.line[sel.ey][sel.bx-1].c[0] != ' ') sel.bx--; |
579 | sel.b.x = sel.bx; | 590 | sel.b.x = sel.bx; |
580 | while(term.line[sel.ey][sel.ex+1].state & GLYPH_SET && | 591 | while(sel.ex < term.col-1 && term.line[sel.ey][sel.ex+1].state & GLYPH_SET && |
581 | term.line[sel.ey][sel.ex+1].c[0] != ' ') sel.ex++; | 592 | term.line[sel.ey][sel.ex+1].c[0] != ' ') sel.ex++; |
582 | sel.e.x = sel.ex; | 593 | sel.e.x = sel.ex; |
583 | sel.b.y = sel.e.y = sel.ey; | 594 | sel.b.y = sel.e.y = sel.ey; |
584 | selcopy(); | 595 | selcopy(); |
585 | } | 596 | } |
586 | } | 597 | } else |
587 | } else if(b == 1) | 598 | selcopy(); |
588 | selcopy(); | 599 | } |
589 | memcpy(&sel.tclick2, &sel.tclick1, sizeof(struct timeval)); | 600 | memcpy(&sel.tclick2, &sel.tclick1, sizeof(struct timeval)); |
590 | gettimeofday(&sel.tclick1, NULL); | 601 | gettimeofday(&sel.tclick1, NULL); |
591 | draw(); | 602 | draw(); |
@@ -593,9 +604,12 @@ brelease(XEvent *e) { | |||
593 | 604 | ||
594 | void | 605 | void |
595 | bmotion(XEvent *e) { | 606 | bmotion(XEvent *e) { |
607 | if(IS_SET(MODE_MOUSE)) { | ||
608 | mousereport(e); | ||
609 | return; | ||
610 | } | ||
596 | if(sel.mode) { | 611 | if(sel.mode) { |
597 | int oldey = sel.ey, | 612 | int oldey = sel.ey, oldex = sel.ex; |
598 | oldex = sel.ex; | ||
599 | getbuttoninfo(e, NULL, &sel.ex, &sel.ey); | 613 | getbuttoninfo(e, NULL, &sel.ex, &sel.ey); |
600 | 614 | ||
601 | if(oldey != sel.ey || oldex != sel.ex) { | 615 | if(oldey != sel.ey || oldex != sel.ex) { |
@@ -1121,7 +1135,10 @@ csihandle(void) { | |||
1121 | term.c.state |= CURSOR_HIDE; | 1135 | term.c.state |= CURSOR_HIDE; |
1122 | break; | 1136 | break; |
1123 | case 1000: /* disable X11 xterm mouse reporting */ | 1137 | case 1000: /* disable X11 xterm mouse reporting */ |
1124 | term.mode &= ~MODE_MOUSE; | 1138 | term.mode &= ~MODE_MOUSEBTN; |
1139 | break; | ||
1140 | case 1002: | ||
1141 | term.mode &= ~MODE_MOUSEMOTION; | ||
1125 | break; | 1142 | break; |
1126 | case 1049: /* = 1047 and 1048 */ | 1143 | case 1049: /* = 1047 and 1048 */ |
1127 | case 1047: | 1144 | case 1047: |
@@ -1189,8 +1206,11 @@ csihandle(void) { | |||
1189 | case 25: | 1206 | case 25: |
1190 | term.c.state &= ~CURSOR_HIDE; | 1207 | term.c.state &= ~CURSOR_HIDE; |
1191 | break; | 1208 | break; |
1192 | case 1000: /* enable X11 xterm mouse reporting */ | 1209 | case 1000: /* 1000,1002: enable xterm mouse report */ |
1193 | term.mode |= MODE_MOUSE; | 1210 | term.mode |= MODE_MOUSEBTN; |
1211 | break; | ||
1212 | case 1002: | ||
1213 | term.mode |= MODE_MOUSEMOTION; | ||
1194 | break; | 1214 | break; |
1195 | case 1049: /* = 1047 and 1048 */ | 1215 | case 1049: /* = 1047 and 1048 */ |
1196 | case 1047: | 1216 | case 1047: |
@@ -1612,7 +1632,7 @@ xinit(void) { | |||
1612 | attrs.bit_gravity = NorthWestGravity; | 1632 | attrs.bit_gravity = NorthWestGravity; |
1613 | attrs.event_mask = FocusChangeMask | KeyPressMask | 1633 | attrs.event_mask = FocusChangeMask | KeyPressMask |
1614 | | ExposureMask | VisibilityChangeMask | StructureNotifyMask | 1634 | | ExposureMask | VisibilityChangeMask | StructureNotifyMask |
1615 | | PointerMotionMask | ButtonPressMask | ButtonReleaseMask; | 1635 | | ButtonMotionMask | ButtonPressMask | ButtonReleaseMask; |
1616 | attrs.colormap = xw.cmap; | 1636 | attrs.colormap = xw.cmap; |
1617 | 1637 | ||
1618 | xw.win = XCreateWindow(xw.dpy, XRootWindow(xw.dpy, xw.scr), 0, 0, | 1638 | xw.win = XCreateWindow(xw.dpy, XRootWindow(xw.dpy, xw.scr), 0, 0, |