From 8ee7527dc2c29a58d083c958e6db766db451a09a Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Wed, 25 Apr 2012 07:25:00 +0000 Subject: [PATCH] * fhandler.h (class dev_console): Add member ext_mouse_mode5. * fhandler_console.cc (fhandler_console::read): Implement extended mouse mode 1005 (xterm, mintty). Fix actual mouse reporting for large coordinates. --- winsup/cygwin/ChangeLog | 7 ++++++ winsup/cygwin/fhandler.h | 1 + winsup/cygwin/fhandler_console.cc | 39 +++++++++++++++++++++++-------- 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 62e2e0780..1300321f5 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,10 @@ +2012-04-25 Thomas Wolff + + * fhandler.h (class dev_console): Add member ext_mouse_mode5. + * fhandler_console.cc (fhandler_console::read): Implement extended + mouse mode 1005 (xterm, mintty). + Fix actual mouse reporting for large coordinates. + 2012-04-24 Corinna Vinschen * include/cygwin/version.h (CYGWIN_VERSION_DLL_MINOR): Bump to 15. diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index 9868a190a..fcb460e9e 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -1288,6 +1288,7 @@ class dev_console bool insert_mode; int use_mouse; + bool ext_mouse_mode5; bool ext_mouse_mode6; bool ext_mouse_mode15; bool use_focus; diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc index 9a074f056..e54f11f2a 100644 --- a/winsup/cygwin/fhandler_console.cc +++ b/winsup/cygwin/fhandler_console.cc @@ -307,14 +307,6 @@ fhandler_console::mouse_aware (MOUSE_EVENT_RECORD& mouse_event) return 0; } - /* Check whether adjusted mouse position can be reported */ - if (dev_state.dwMousePosition.X > 0xFF - ' ' - 1 - || dev_state.dwMousePosition.Y > 0xFF - ' ' - 1) - { - /* Mouse position out of reporting range */ - return 0; - } - return ((mouse_event.dwEventFlags == 0 || mouse_event.dwEventFlags == DOUBLE_CLICK) && mouse_event.dwButtonState != dev_state.dwLastButtonState) || mouse_event.dwEventFlags == MOUSE_WHEELED @@ -646,7 +638,34 @@ fhandler_console::read (void *pv, size_t& buflen) dev_state.dwMousePosition.Y + 1); nread = strlen (tmp); } - /* else if (dev_state.ext_mouse_mode5) not implemented */ + else if (dev_state.ext_mouse_mode5) + { + unsigned int xcode = dev_state.dwMousePosition.X + ' ' + 1; + unsigned int ycode = dev_state.dwMousePosition.Y + ' ' + 1; + + __small_sprintf (tmp, "\033[M%c", b + ' '); + nread = 4; + /* the neat nested encoding function of mintty + does not compile in g++, so let's unfold it: */ + if (xcode < 0x80) + tmp [nread++] = xcode; + else if (xcode < 0x800) + { + tmp [nread++] = 0xC0 + (xcode >> 6); + tmp [nread++] = 0x80 + (xcode & 0x3F); + } + else + tmp [nread++] = 0; + if (ycode < 0x80) + tmp [nread++] = ycode; + else if (ycode < 0x800) + { + tmp [nread++] = 0xC0 + (ycode >> 6); + tmp [nread++] = 0x80 + (ycode & 0x3F); + } + else + tmp [nread++] = 0; + } else { unsigned int xcode = dev_state.dwMousePosition.X + ' ' + 1; @@ -1566,7 +1585,7 @@ fhandler_console::char_command (char c) break; case 1005: /* Extended mouse mode */ - syscall_printf ("ignored h/l command for extended mouse mode"); + dev_state.ext_mouse_mode5 = c == 'h'; break; case 1006: /* SGR extended mouse mode */