Subj : Re: Mouse support in Netrunner2 (or Mystic?)
To : Rob Swindell
From : g00r00
Date : Sun May 17 2020 09:35 pm
RS> However, when testing with Netrunner2, an upper-left left-button click
RS> sends this:
RS> 27 1b
RS> 91 5b '['
RS> 77 4d 'M'
RS> 48 30 '0'
RS> 41 29 ')'
RS> 41 29 ')'
RS>
RS> What mouse protocol is this and do you have a reference document?
Hey Rob,
I'd be happy to (try to) help!
The latest NetRunner is beta 19 which uses either XTERM(?) or maybe VT200(?)
mouse support. I used whatever the default was in PUTTY at the time so that
it'd be compatible with Mystic "out of the box".
I used to have a bookmark that had a reference but I can't seem to find it at
the moment. I read through my code and I did have some source code notes
that I can pass along, and a chunk of code from PUTTY that can be used as a
reference to its various mouse modes.
(Some observations that I just made by looking at my code:)
(It looks like the X/Y coordinates are just the ascii character corresponding
to the X/Y coordinate with with +32 added to it to avoid conflict with low
ascii control characters. So coordinates 1, 1 would be represented as
Ascii#33;Ascii#33. This means its limited to a terminal size of 223x223 though
which is something I overlooked at the time. It also looks like Mystic sends
esc[?1000h to the Unix terminal when running in Unix to enable mouse reporting,
so that seems like a clue we can Google to find out officially what it is.
NetRunner also translates a wheel spin to either the up or down arrow ANSI
escape sequence for max usefulness with non-mouse-aware BBSes)
Notes:
(* PUTTY
ESC[Ma;b;c
// low two bits of "a" encode button: 0=MB1 pressed, 1=2 pressed, 2=3
// pressed, 3=release
// next 3 bits encode modifiers (4=shift,8=meta,16=control)
// b,c are x and y coordinates of cursor
int encstate = 0, r, c, wheel;
char abuf[32];
int len = 0;
if (term->ldisc) {
switch (braw) {
case MBT_LEFT:
encstate = 0x00; /* left button down */
wheel = FALSE;
break;
case MBT_MIDDLE:
encstate = 0x01;
wheel = FALSE;
break;
case MBT_RIGHT:
encstate = 0x02;
wheel = FALSE;
break;
case MBT_WHEEL_UP:
encstate = 0x40;
wheel = TRUE;
break;
case MBT_WHEEL_DOWN:
encstate = 0x41;
wheel = TRUE;
break;
default:
return;
}
if (wheel) {
if (a != MA_CLICK)
return;
} else switch (a) {
case MA_DRAG:
if (term->xterm_mouse == 1)
return;
encstate += 0x20;
break;
case MA_RELEASE:
if (!term->xterm_extended_mouse)
encstate = 0x03;
term->mouse_is_down = 0;
break;
case MA_CLICK:
if (term->mouse_is_down == braw)
return;
term->mouse_is_down = braw;
break;
default:
return;
}
if (shift)
encstate += 0x04;
if (ctrl)
encstate += 0x10;
r = y + 1;
c = x + 1;
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);
}