Am 24.04.2012 21:47, schrieb Corinna Vinschen:
On Apr 24 21:45, Corinna Vinschen wrote:
On Apr 24 21:35, Thomas Wolff wrote:
Am 24.04.2012 16:44, schrieb Corinna Vinschen:
On Apr 22 21:07, Thomas Wolff wrote:
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.
Patch applied with changes. Please use __small_sprintf rather than
sprintf. I also changed the CHangeLog entry slightly. Keep it short
and in present tense.
Thanks,
Corinna
Hmm, thanks but I'm afraid this went wrong. You quote (and probably
applied) my first patch which is missing mouse mode 1005 and
unfortunately also has a bug which effectively makes the extended
coordinates unusable (because the reports are suppressed in that
case as they were before :( ).
The mail you responded to contained an updated patch.
That was exactly the patch I applied. I only chnaged the formatting
and changed sprintf to __small_sprintf.
...and as far as quoting goes, the above is the ChangeLog you provided
with your updated patch.
Sh.. I see. My deep apologies, I must have been confused. Here is the
actual updated patch which should be used instead.
Sorry for the trouble.
Thomas
2012-04-20 Thomas Wolff <[email protected]>
* fhandler.h (class dev_console): Flags for extended mouse modes.
* fhandler_console.cc: Supporting mouse coordinates greater than 222.
(fhandler_console::read) Implemented extended mouse modes
1015 (urxvt, mintty, xterm), 1006 (xterm), and 1005 (xterm, mintty).
Also: two { wrap formatting consistency fixes.
(fhandler_console::mouse_aware) Removed limitation of not sending
anything at exceeded coordinates; sending 0 byte instead (xterm).
(fhandler_console::char_command) Initialization of enhanced
mouse reporting modes.
diff -rup sav/fhandler.h ./fhandler.h
--- sav/fhandler.h 2012-04-18 07:58:04.000000000 +0200
+++ ./fhandler.h 2012-04-20 13:59:02.265328800 +0200
@@ -1288,6 +1288,9 @@ class dev_console
bool insert_mode;
int use_mouse;
+ bool ext_mouse_mode5;
+ 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-15 19:51:49.000000000 +0200
+++ ./fhandler_console.cc 2012-04-20 13:59:02.296579200 +0200
@@ -304,14 +304,6 @@ fhandler_console::mouse_aware (MOUSE_EVE
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
@@ -453,12 +445,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;
@@ -551,6 +544,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)
{
@@ -574,7 +568,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");
@@ -595,6 +589,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)
@@ -626,25 +624,73 @@ 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)
+ {
+ unsigned int xcode = dev_state.dwMousePosition.X + ' ' + 1;
+ unsigned int ycode = dev_state.dwMousePosition.Y + ' ' + 1;
+
+ 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;
+ 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:
@@ -1517,22 +1563,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 */
+ dev_state.ext_mouse_mode5 = c == 'h';
+ 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 */