--- src/command.C 2014-12-13 13:22:09.000000000 +0100 +++ src/command.C 2016-01-13 04:50:39.161862513 +0100 @@ -1280,6 +1280,8 @@ int x, y; int code = 32; + if (priv_modes & PrivMode_ExtMouseSgr) code = 0; + x = Pixel2Col (ev.x) + 1; y = Pixel2Row (ev.y) + 1; @@ -1293,11 +1295,18 @@ code += 32; } - if (MEvent.button == AnyButton) + if (!(priv_modes & PrivMode_ExtMouseSgr) && MEvent.button == AnyButton) button_number = 3; else { - button_number = MEvent.button - Button1; + if (ev.type == MotionNotify) { + if (ev.state & Button1Mask) button_number = 0; + else if (ev.state & Button2Mask) button_number = 1; + else if (ev.state & Button3Mask) button_number = 2; + else return; + } else { + button_number = ev.button - Button1; + } /* add 0x3D for wheel events, like xterm does */ if (button_number >= 3) button_number += 64 - 3; @@ -1347,16 +1356,22 @@ #endif #if ENABLE_FRILLS + if (priv_modes & PrivMode_ExtMouseSgr) + tt_printf ("\033[<%d;%d;%d%c", + code + button_number + key_state, + x, + y, + (ev.type == ButtonRelease ? 'm' : 'M')); - if (priv_modes & PrivMode_ExtMouseRight) + else if (priv_modes & PrivMode_ExtMouseRight) tt_printf ("\033[%d;%d;%dM", code + button_number + key_state, x, y); else if (priv_modes & PrivMode_ExtModeMouse) tt_printf ("\033[M%c%lc%lc", code + button_number + key_state, wint_t (32 + x), wint_t (32 + y)); else #endif tt_printf ("\033[M%c%c%c", @@ -2908,7 +2913,7 @@ scr_soft_reset (); static const int pm_h[] = { 7, 25 }; - static const int pm_l[] = { 1, 3, 4, 5, 6, 9, 66, 1000, 1001, 1005, 1015, 1049 }; + static const int pm_l[] = { 1, 3, 4, 5, 6, 9, 66, 1000, 1001, 1002, 1003, 1005, 1006, 1015, 1049 }; process_terminal_mode ('h', 0, ecb_array_length (pm_h), pm_h); process_terminal_mode ('l', 0, ecb_array_length (pm_l), pm_l); @@ -3713,13 +3718,14 @@ { 1003, PrivMode_MouseAnyEvent }, #if ENABLE_FRILLS { 1004, PrivMode_FocusEvent }, { 1005, PrivMode_ExtModeMouse }, + { 1006, PrivMode_ExtMouseSgr }, #endif { 1010, PrivMode_TtyOutputInh }, // rxvt extension { 1011, PrivMode_Keypress }, // rxvt extension #if ENABLE_FRILLS { 1015, PrivMode_ExtMouseRight }, // urxvt extension of 1005 #endif // 1035 enable modifiers for alt, numlock NYI // 1036 send ESC for meta keys NYI // 1037 send DEL for keypad delete NYI --- src/rxvt.h 2014-12-17 16:33:08.000000000 +0100 +++ src/rxvt.h 2016-01-13 03:42:31.508911380 +0100 @@ -644,6 +644,7 @@ #define PrivMode_ExtMouseRight (1UL<<24) // xterm pseudo-utf-8, but works in non-utf-8-locales #define PrivMode_BlinkingCursor (1UL<<25) #define PrivMode_FocusEvent (1UL<<26) +#define PrivMode_ExtMouseSgr (1UL<<27) // sgr mouse extension #define PrivMode_mouse_report (PrivMode_MouseX10|PrivMode_MouseX11|PrivMode_MouseBtnEvent|PrivMode_MouseAnyEvent)