1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-10 01:48:00 +00:00

Patch from Egmont Koblinger to implement two extended variants of

xterm mouse tracking, both supported by the current up-to-date xterm
(288). They take the form of two new DEC terminal modes, 1006 and
1015, which do not in themselves _enable_ mouse tracking but they
modify the escape sequences sent if mouse tracking is enabled in the
usual way.

[originally from svn r9752]
This commit is contained in:
Simon Tatham 2013-01-23 22:59:17 +00:00
parent 2ebdd3799d
commit 329087e2da
2 changed files with 31 additions and 11 deletions

View File

@ -1224,6 +1224,8 @@ static void power_on(Terminal *term, int clear)
term->alt_which = 0; term->alt_which = 0;
term_print_finish(term); term_print_finish(term);
term->xterm_mouse = 0; term->xterm_mouse = 0;
term->xterm_extended_mouse = 0;
term->urxvt_extended_mouse = 0;
set_raw_mouse_mode(term->frontend, FALSE); set_raw_mouse_mode(term->frontend, FALSE);
term->bracketed_paste = FALSE; term->bracketed_paste = FALSE;
{ {
@ -2491,6 +2493,12 @@ static void toggle_mode(Terminal *term, int mode, int query, int state)
term->xterm_mouse = state ? 2 : 0; term->xterm_mouse = state ? 2 : 0;
set_raw_mouse_mode(term->frontend, state); set_raw_mouse_mode(term->frontend, state);
break; break;
case 1006: /* xterm extended mouse */
term->xterm_extended_mouse = state ? 1 : 0;
break;
case 1015: /* urxvt extended mouse */
term->urxvt_extended_mouse = state ? 1 : 0;
break;
case 1047: /* alternate screen */ case 1047: /* alternate screen */
compatibility(OTHER); compatibility(OTHER);
deselect(term); deselect(term);
@ -5818,25 +5826,26 @@ void term_mouse(Terminal *term, Mouse_Button braw, Mouse_Button bcooked,
if (raw_mouse && if (raw_mouse &&
(term->selstate != ABOUT_TO) && (term->selstate != DRAGGING)) { (term->selstate != ABOUT_TO) && (term->selstate != DRAGGING)) {
int encstate = 0, r, c; int encstate = 0, r, c;
char abuf[16]; char abuf[32];
int len = 0;
if (term->ldisc) { if (term->ldisc) {
switch (braw) { switch (braw) {
case MBT_LEFT: case MBT_LEFT:
encstate = 0x20; /* left button down */ encstate = 0x00; /* left button down */
break; break;
case MBT_MIDDLE: case MBT_MIDDLE:
encstate = 0x21; encstate = 0x01;
break; break;
case MBT_RIGHT: case MBT_RIGHT:
encstate = 0x22; encstate = 0x02;
break; break;
case MBT_WHEEL_UP: case MBT_WHEEL_UP:
encstate = 0x60; encstate = 0x40;
break; break;
case MBT_WHEEL_DOWN: case MBT_WHEEL_DOWN:
encstate = 0x61; encstate = 0x41;
break; break;
default: break; /* placate gcc warning about enum use */ default: break; /* placate gcc warning about enum use */
} }
@ -5847,7 +5856,9 @@ void term_mouse(Terminal *term, Mouse_Button braw, Mouse_Button bcooked,
encstate += 0x20; encstate += 0x20;
break; break;
case MA_RELEASE: case MA_RELEASE:
encstate = 0x23; /* If multiple extensions are enabled, the xterm 1006 is used, so it's okay to check for only that */
if (!term->xterm_extended_mouse)
encstate = 0x03;
term->mouse_is_down = 0; term->mouse_is_down = 0;
break; break;
case MA_CLICK: case MA_CLICK:
@ -5861,11 +5872,18 @@ void term_mouse(Terminal *term, Mouse_Button braw, Mouse_Button bcooked,
encstate += 0x04; encstate += 0x04;
if (ctrl) if (ctrl)
encstate += 0x10; encstate += 0x10;
r = y + 33; r = y + 1;
c = x + 33; c = x + 1;
sprintf(abuf, "\033[M%c%c%c", encstate, c, r); /* Check the extensions in decreasing order of preference. Encoding the release event above assumes that 1006 comes first. */
ldisc_send(term->ldisc, abuf, 6, 0); if (term->xterm_extended_mouse) {
len = sprintf(abuf, "\033[<%d;%d;%d%c", encstate, c, r, a == MA_RELEASE ? 'm' : 'M');
} else if (term->urxvt_extended_mouse) {
len = sprintf(abuf, "\033[%d;%d;%dM", encstate + 32, c, r);
} else if (c <= 223 && r <= 223) {
len = sprintf(abuf, "\033[M%c%c%c", encstate + 32, c + 32, r + 32);
}
ldisc_send(term->ldisc, abuf, len, 0);
} }
return; return;
} }

View File

@ -152,6 +152,8 @@ struct terminal_tag {
int big_cursor; int big_cursor;
int xterm_mouse; /* send mouse messages to host */ int xterm_mouse; /* send mouse messages to host */
int xterm_extended_mouse;
int urxvt_extended_mouse;
int mouse_is_down; /* used while tracking mouse buttons */ int mouse_is_down; /* used while tracking mouse buttons */
int bracketed_paste; int bracketed_paste;