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);
       }

*)

--- Mystic BBS v1.12 A46 2020/05/17 (Windows/64)
* Origin: Sector 7 | Mystic WHQ (1:129/215)