This patch replaces my previous proposal (http://cygwin.com/ml/cygwin-patches/2012-q2/msg00005.html) with two modifications:

 * Fixed a bug that suppressed mouse reporting at large coordinates (in
   all modes actually:-\ )
 * Added mouse mode 1005 (total of 3 three new modes, so all reporting
   modes run by current terminal emulators would be implemented)

I would appreciate the patch to be applied this time, planned to be my last mouse patch :)

Kind regards,
Thomas
2012-04-03  Thomas Wolff  <[email protected]>

        * fhandler.h (class dev_console): Two flags for extended mouse modes.
        * fhandler_console.cc (fhandler_console::read): Implemented 
        extended mouse modes 1015 (urxvt, mintty, xterm) and 1006 (xterm).
        Not implemented extended mouse mode 1005 (xterm, mintty).
        Supporting mouse coordinates greater than 222 (each axis).
        Also: two { wrap formatting consistency fixes.
        (fhandler_console::char_command) Initialization of enhanced 
        mouse reporting modes.

diff -rup sav/fhandler.h ./fhandler.h
--- sav/fhandler.h      2012-04-01 19:46:04.000000000 +0200
+++ ./fhandler.h        2012-04-03 15:52:07.893561600 +0200
@@ -1282,6 +1282,8 @@ class dev_console
 
   bool insert_mode;
   int use_mouse;
+  bool ext_mouse_mode6;
+  bool ext_mouse_mode15;
   bool use_focus;
   bool raw_win32_keyboard_mode;
 
diff -rup sav/fhandler_console.cc ./fhandler_console.cc
--- sav/fhandler_console.cc     2012-04-02 00:28:55.000000000 +0200
+++ ./fhandler_console.cc       2012-04-03 15:56:13.993152400 +0200
@@ -452,12 +452,13 @@ fhandler_console::read (void *pv, size_t
            {
              char c = dev_state.backspace_keycode;
              nread = 0;
-             if (control_key_state & ALT_PRESSED) {
-               if (dev_state.metabit)
-                 c |= 0x80;
-               else
-                 tmp[nread++] = '\e';
-             }
+             if (control_key_state & ALT_PRESSED)
+               {
+                 if (dev_state.metabit)
+                   c |= 0x80;
+                 else
+                   tmp[nread++] = '\e';
+               }
              tmp[nread++] = c;
              tmp[nread] = 0;
              toadd = tmp;
@@ -550,6 +551,7 @@ fhandler_console::read (void *pv, size_t
                   events at the same time. */
                int b = 0;
                char sz[32];
+               char mode6_term = 'M';
 
                if (mouse_event.dwEventFlags == MOUSE_WHEELED)
                  {
@@ -573,7 +575,7 @@ fhandler_console::read (void *pv, size_t
                      {
                        b = dev_state.last_button_code;
                      }
-                   else if (mouse_event.dwButtonState < 
dev_state.dwLastButtonState)
+                   else if (mouse_event.dwButtonState < 
dev_state.dwLastButtonState && !dev_state.ext_mouse_mode6)
                      {
                        b = 3;
                        strcpy (sz, "btn up");
@@ -594,6 +596,10 @@ fhandler_console::read (void *pv, size_t
                        strcpy (sz, "btn3 down");
                      }
 
+                   if (dev_state.ext_mouse_mode6)      /* distinguish release 
*/
+                     if (mouse_event.dwButtonState < 
dev_state.dwLastButtonState)
+                       mode6_term = 'm';
+
                    dev_state.last_button_code = b;
 
                    if (mouse_event.dwEventFlags == MOUSE_MOVED)
@@ -625,25 +631,46 @@ fhandler_console::read (void *pv, size_t
                b |= dev_state.nModifiers;
 
                /* We can now create the code. */
-               sprintf (tmp, "\033[M%c%c%c", b + ' ', 
dev_state.dwMousePosition.X + ' ' + 1, dev_state.dwMousePosition.Y + ' ' + 1);
+               if (dev_state.ext_mouse_mode6)
+                 {
+                   sprintf (tmp, "\033[<%d;%d;%d%c", b, 
dev_state.dwMousePosition.X + 1, dev_state.dwMousePosition.Y + 1, mode6_term);
+                   nread = strlen (tmp);
+                 }
+               else if (dev_state.ext_mouse_mode15)
+                 {
+                   sprintf (tmp, "\033[%d;%d;%dM", b + 32, 
dev_state.dwMousePosition.X + 1, dev_state.dwMousePosition.Y + 1);
+                   nread = strlen (tmp);
+                 }
+               /* else if (dev_state.ext_mouse_mode5) not implemented */
+               else
+                 {
+                   unsigned int xcode = dev_state.dwMousePosition.X + ' ' + 1;
+                   unsigned int ycode = dev_state.dwMousePosition.Y + ' ' + 1;
+                   if (xcode >= 256)
+                     xcode = 0;
+                   if (ycode >= 256)
+                     ycode = 0;
+                   sprintf (tmp, "\033[M%c%c%c", b + ' ', xcode, ycode);
+                   nread = 6;  /* tmp may contain NUL bytes */
+                 }
                syscall_printf ("mouse: %s at (%d,%d)", sz, 
dev_state.dwMousePosition.X, dev_state.dwMousePosition.Y);
 
                toadd = tmp;
-               nread = 6;
              }
          }
          break;
 
        case FOCUS_EVENT:
-         if (dev_state.use_focus) {
-           if (input_rec.Event.FocusEvent.bSetFocus)
-             sprintf (tmp, "\033[I");
-           else
-             sprintf (tmp, "\033[O");
+         if (dev_state.use_focus)
+           {
+             if (input_rec.Event.FocusEvent.bSetFocus)
+               sprintf (tmp, "\033[I");
+             else
+               sprintf (tmp, "\033[O");
 
-           toadd = tmp;
-           nread = 3;
-         }
+             toadd = tmp;
+             nread = 3;
+           }
          break;
 
        case WINDOW_BUFFER_SIZE_EVENT:
@@ -1516,22 +1543,30 @@ fhandler_console::char_command (char c)
 
        case 1000: /* Mouse tracking */
          dev_state.use_mouse = (c == 'h') ? 1 : 0;
-         syscall_printf ("mouse support set to mode %d", dev_state.use_mouse);
          break;
 
        case 1002: /* Mouse button event tracking */
          dev_state.use_mouse = (c == 'h') ? 2 : 0;
-         syscall_printf ("mouse support set to mode %d", dev_state.use_mouse);
          break;
 
        case 1003: /* Mouse any event tracking */
          dev_state.use_mouse = (c == 'h') ? 3 : 0;
-         syscall_printf ("mouse support set to mode %d", dev_state.use_mouse);
          break;
 
        case 1004: /* Focus in/out event reporting */
          dev_state.use_focus = (c == 'h') ? true : false;
-         syscall_printf ("focus reporting set to %d", dev_state.use_focus);
+         break;
+
+       case 1005: /* Extended mouse mode */
+         syscall_printf ("ignored h/l command for extended mouse mode");
+         break;
+
+       case 1006: /* SGR extended mouse mode */
+         dev_state.ext_mouse_mode6 = c == 'h';
+         break;
+
+       case 1015: /* Urxvt extended mouse mode */
+         dev_state.ext_mouse_mode15 = c == 'h';
          break;
 
        case 2000: /* Raw keyboard mode */

Reply via email to