diff --git a/config.h.in b/config.h.in index 914d606..b869bfb 100644 --- a/config.h.in +++ b/config.h.in @@ -9,6 +9,9 @@ /* Define if you want handling for rarely used but handy features */ #undef ENABLE_FRILLS +/* Define if you want support for SGR mouse mode 1006 */ +#undef ENABLE_SGRMOUSE + /* Define if you can embed a perl interpreter */ #undef ENABLE_PERL diff --git a/configure.ac b/configure.ac index 0da3b59..c8b9c80 100644 --- a/configure.ac +++ b/configure.ac @@ -76,6 +76,7 @@ AC_SEARCH_LIBS(gethostbyname, nsl) AC_SEARCH_LIBS(socket, socket) support_frills=yes +support_sgrmouse=yes support_inheritpixmap=yes support_fading=yes support_keepscrolling=yes @@ -109,6 +110,7 @@ AC_ARG_ENABLE(everything, [ if test x$enableval = xno; then support_frills=no + support_sgrmouse=no support_inheritpixmap=no support_fading=no support_keepscrolling=no @@ -137,6 +139,7 @@ AC_ARG_ENABLE(everything, fi if test x$enableval = xyes; then support_frills=yes + support_sgrmouse=yes support_inheritpixmap=yes support_fading=yes support_keepscrolling=yes @@ -359,6 +362,12 @@ AC_ARG_ENABLE(frills, support_frills=$enableval fi]) +AC_ARG_ENABLE(sgrmouse, + [ --enable-sgrmouse enable support for SGR mouse mode 1006], + [if test x$enableval = xyes -o x$enableval = xno; then + support_sgrmouse=$enableval + fi]) + AC_ARG_ENABLE(keepscrolling, [ --enable-keepscrolling enable continual scrolling on scrollbar arrow press], [if test x$enableval = xyes -o x$enableval = xno; then @@ -666,6 +675,9 @@ fi if test x$support_frills = xyes; then AC_DEFINE(ENABLE_FRILLS, 1, Define if you want handling for rarely used but handy features) fi +if test x$support_sgrmouse = xyes; then + AC_DEFINE(ENABLE_SGRMOUSE, 1, Define if you want support for SGR mouse mode 1006) +fi if test x$support_mousewheel = xyes; then AC_DEFINE(MOUSE_WHEEL, 1, Define to use wheel events (button4 and button5) to scroll) fi diff --git a/src/command.C b/src/command.C index 7b79f51..a62ef87 100644 --- a/src/command.C +++ b/src/command.C @@ -1282,6 +1282,13 @@ rxvt_term::mouse_report (XButtonEvent &ev) int button_number, key_state = 0; int x, y; int code = 32; + bool mode_sgr = false; + +#if ENABLE_SGRMOUSE + if (priv_modes & PrivMode_ExtMouseSgr) mode_sgr = true; +#endif + + if (mode_sgr) code = 0; x = Pixel2Col (ev.x) + 1; y = Pixel2Row (ev.y) + 1; @@ -1296,11 +1303,18 @@ rxvt_term::mouse_report (XButtonEvent &ev) code += 32; } - if (MEvent.button == AnyButton) + if (!(mode_sgr) && 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; @@ -1361,6 +1375,15 @@ rxvt_term::mouse_report (XButtonEvent &ev) wint_t (32 + x), wint_t (32 + y)); else +#endif +#if ENABLE_SGRMOUSE + if (mode_sgr) + tt_printf ("\033[<%d;%d;%d%c", + code + button_number + key_state, + x, + y, + (ev.type == ButtonRelease ? 'm' : 'M')); + else #endif tt_printf ("\033[M%c%c%c", code + button_number + key_state, @@ -2904,7 +2927,7 @@ rxvt_term::process_csi_seq () 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); @@ -3710,6 +3733,9 @@ rxvt_term::process_terminal_mode (int mode, int priv ecb_unused, unsigned int na { 1003, PrivMode_MouseAnyEvent }, #if ENABLE_FRILLS { 1005, PrivMode_ExtModeMouse }, +#endif +#if ENABLE_SGRMOUSE + { 1006, PrivMode_ExtMouseSgr }, #endif { 1010, PrivMode_TtyOutputInh }, // rxvt extension { 1011, PrivMode_Keypress }, // rxvt extension diff --git a/src/rxvt.h b/src/rxvt.h index 5c7cf66..2ffd3fb 100644 --- a/src/rxvt.h +++ b/src/rxvt.h @@ -645,6 +645,7 @@ enum { #define PrivMode_ExtModeMouse (1UL<<23) // xterm pseudo-utf-8 hack #define PrivMode_ExtMouseRight (1UL<<24) // xterm pseudo-utf-8, but works in non-utf-8-locales #define PrivMode_BlinkingCursor (1UL<<25) +#define PrivMode_ExtMouseSgr (1UL<<27) // sgr mouse extension #define PrivMode_mouse_report (PrivMode_MouseX10|PrivMode_MouseX11|PrivMode_MouseBtnEvent|PrivMode_MouseAnyEvent) diff --git a/src/xdefaults.C b/src/xdefaults.C index 894aa8d..e5952b7 100644 --- a/src/xdefaults.C +++ b/src/xdefaults.C @@ -359,6 +359,9 @@ static const char optionsstring[] = "options: " #if defined(ENABLE_FRILLS) "frills," #endif +#if defined(ENABLE_SGRMOUSE) + "sgrmouse," +#endif #if defined(SELECTION_SCROLLING) "selectionscrolling," #endif