diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2012-04-25 07:25:00 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2012-04-25 07:25:00 +0000 |
commit | 8ee7527dc2c29a58d083c958e6db766db451a09a (patch) | |
tree | 0bde62762d9e4ae2914afc13fc111ba851b51216 /winsup/cygwin/fhandler_console.cc | |
parent | f1ce77295ddb6bcb71b17cf9383d78f86298adc0 (diff) | |
download | cygnal-8ee7527dc2c29a58d083c958e6db766db451a09a.tar.gz cygnal-8ee7527dc2c29a58d083c958e6db766db451a09a.tar.bz2 cygnal-8ee7527dc2c29a58d083c958e6db766db451a09a.zip |
* 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.
Diffstat (limited to 'winsup/cygwin/fhandler_console.cc')
-rw-r--r-- | winsup/cygwin/fhandler_console.cc | 39 |
1 files changed, 29 insertions, 10 deletions
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 */ |