diff --git a/src/bin/termio.c b/src/bin/termio.c index d992f7ae..6b9495a0 100644 --- a/src/bin/termio.c +++ b/src/bin/termio.c @@ -1247,26 +1247,46 @@ _rep_mouse_down(Termio *sd, Evas_Event_Mouse_Down *ev, int cx, int cy) { char buf[64]; Eina_Bool ret = EINA_FALSE; - - if (sd->pty->mouse_rep == MOUSE_OFF) return EINA_FALSE; + + if (sd->pty->mouse_mode == MOUSE_OFF) return EINA_FALSE; if (!sd->mouse.button) { /* Need to remember the first button pressed for terminal handling */ sd->mouse.button = ev->button; } - switch (sd->pty->mouse_rep) + switch (sd->pty->mouse_ext) { - case MOUSE_X10: + case MOUSE_EXT_NONE: if ((cx < (0xff - ' ')) && (cy < (0xff - ' '))) { int btn = ev->button - 1; - - if (btn <= 2) + + if (sd->pty->mouse_mode == MOUSE_X10) { + if (btn <= 2) + { + buf[0] = 0x1b; + buf[1] = '['; + buf[2] = 'M'; + buf[3] = btn + ' '; + buf[4] = cx + 1 + ' '; + buf[5] = cy + 1 + ' '; + buf[6] = 0; + termpty_write(sd->pty, buf, strlen(buf)); + ret = EINA_TRUE; + } + } + else + { + int shift = evas_key_modifier_is_set(ev->modifiers, "Shift") ? 4 : 0; + int meta = evas_key_modifier_is_set(ev->modifiers, "Alt") ? 8 : 0; + int ctrl = evas_key_modifier_is_set(ev->modifiers, "Control") ? 16 : 0; + + if (btn > 2) btn = 0; buf[0] = 0x1b; buf[1] = '['; buf[2] = 'M'; - buf[3] = btn + ' '; + buf[3] = (btn | shift | meta | ctrl) + ' '; buf[4] = cx + 1 + ' '; buf[5] = cy + 1 + ' '; buf[6] = 0; @@ -1275,14 +1295,14 @@ _rep_mouse_down(Termio *sd, Evas_Event_Mouse_Down *ev, int cx, int cy) } } break; - case MOUSE_UTF8: // ESC.[.M.BTN/FLGS.UTF8.YUTF8 + case MOUSE_EXT_UTF8: // ESC.[.M.BTN/FLGS.XUTF8.YUTF8 { int btn = ev->button - 1; int shift = evas_key_modifier_is_set(ev->modifiers, "Shift") ? 4 : 0; int meta = evas_key_modifier_is_set(ev->modifiers, "Alt") ? 8 : 0; int ctrl = evas_key_modifier_is_set(ev->modifiers, "Control") ? 16 : 0; int v, i; - + if (btn > 2) btn = 0; buf[0] = 0x1b; buf[1] = '['; @@ -1308,37 +1328,30 @@ _rep_mouse_down(Termio *sd, Evas_Event_Mouse_Down *ev, int cx, int cy) ret = EINA_TRUE; } break; - case MOUSE_SGR: // ESC.[.<.NUM.;.NUM.;.NUM.M + case MOUSE_EXT_SGR: // ESC.[.<.NUM.;.NUM.;.NUM.M { int btn = ev->button - 1; int shift = evas_key_modifier_is_set(ev->modifiers, "Shift") ? 4 : 0; int meta = evas_key_modifier_is_set(ev->modifiers, "Alt") ? 8 : 0; int ctrl = evas_key_modifier_is_set(ev->modifiers, "Control") ? 16 : 0; - + snprintf(buf, sizeof(buf), "%c[<%i;%i;%iM", 0x1b, (btn | shift | meta | ctrl), cx + 1, cy + 1); termpty_write(sd->pty, buf, strlen(buf)); ret = EINA_TRUE; } break; - case MOUSE_NORMAL: - case MOUSE_NORMAL_BTN_MOVE: - case MOUSE_URXVT: // ESC.[.M.BTN/FLGS.X.Y - if ((cx < (0xff - ' ')) && (cy < (0xff - ' '))) + case MOUSE_EXT_URXVT: // ESC.[.NUM.;.NUM.;.NUM.M { int btn = ev->button - 1; int shift = evas_key_modifier_is_set(ev->modifiers, "Shift") ? 4 : 0; int meta = evas_key_modifier_is_set(ev->modifiers, "Alt") ? 8 : 0; int ctrl = evas_key_modifier_is_set(ev->modifiers, "Control") ? 16 : 0; - + if (btn > 2) btn = 0; - buf[0] = 0x1b; - buf[1] = '['; - buf[2] = 'M'; - buf[3] = (btn | shift | meta | ctrl) + ' '; - buf[4] = cx + 1 + ' '; - buf[5] = cy + 1 + ' '; - buf[6] = 0; + snprintf(buf, sizeof(buf), "%c[%i;%i;%iM", 0x1b, + (btn | shift | meta | ctrl) + ' ', + cx + 1 + ' ', cy + 1 + ' '); termpty_write(sd->pty, buf, strlen(buf)); ret = EINA_TRUE; } @@ -1354,21 +1367,41 @@ _rep_mouse_up(Termio *sd, Evas_Event_Mouse_Up *ev, int cx, int cy) { char buf[64]; Eina_Bool ret = EINA_FALSE; - - if (sd->pty->mouse_rep == MOUSE_OFF) return EINA_FALSE; + int btn, shift, meta, ctrl; + + if ((sd->pty->mouse_mode == MOUSE_OFF) || + (sd->pty->mouse_mode == MOUSE_X10)) + return EINA_FALSE; if (sd->mouse.button == ev->button) sd->mouse.button = 0; - switch (sd->pty->mouse_rep) + + btn = ev->button - 1; + shift = evas_key_modifier_is_set(ev->modifiers, "Shift") ? 4 : 0; + meta = evas_key_modifier_is_set(ev->modifiers, "Alt") ? 8 : 0; + ctrl = evas_key_modifier_is_set(ev->modifiers, "Control") ? 16 : 0; + + switch (sd->pty->mouse_ext) { - case MOUSE_UTF8: // ESC.[.M.BTN/FLGS.UTF8.YUTF8 + case MOUSE_EXT_NONE: + if ((cx < (0xff - ' ')) && (cy < (0xff - ' '))) + { + if (btn > 2) btn = 0; + buf[0] = 0x1b; + buf[1] = '['; + buf[2] = 'M'; + buf[3] = (btn | shift | meta | ctrl) + ' '; + buf[4] = cx + 1 + ' '; + buf[5] = cy + 1 + ' '; + buf[6] = 0; + termpty_write(sd->pty, buf, strlen(buf)); + ret = EINA_TRUE; + } + break; + case MOUSE_EXT_UTF8: // ESC.[.M.BTN/FLGS.XUTF8.YUTF8 { - int btn = 3; - int shift = evas_key_modifier_is_set(ev->modifiers, "Shift") ? 4 : 0; - int meta = evas_key_modifier_is_set(ev->modifiers, "Alt") ? 8 : 0; - int ctrl = evas_key_modifier_is_set(ev->modifiers, "Control") ? 16 : 0; int v, i; - - btn = 3; + + if (btn > 2) btn = 0; buf[0] = 0x1b; buf[1] = '['; buf[2] = 'M'; @@ -1393,36 +1426,20 @@ _rep_mouse_up(Termio *sd, Evas_Event_Mouse_Up *ev, int cx, int cy) ret = EINA_TRUE; } break; - case MOUSE_SGR: // ESC.[.<.NUM.;.NUM.;.NUM.M + case MOUSE_EXT_SGR: // ESC.[.<.NUM.;.NUM.;.NUM.m { - int btn = 3; - int shift = evas_key_modifier_is_set(ev->modifiers, "Shift") ? 4 : 0; - int meta = evas_key_modifier_is_set(ev->modifiers, "Alt") ? 8 : 0; - int ctrl = evas_key_modifier_is_set(ev->modifiers, "Control") ? 16 : 0; - snprintf(buf, sizeof(buf), "%c[<%i;%i;%im", 0x1b, (btn | shift | meta | ctrl), cx + 1, cy + 1); termpty_write(sd->pty, buf, strlen(buf)); ret = EINA_TRUE; } break; - case MOUSE_NORMAL: - case MOUSE_NORMAL_BTN_MOVE: - case MOUSE_URXVT: // ESC.[.M.BTN/FLGS.X.Y - if ((cx < (0xff - ' ')) && (cy < (0xff - ' '))) + case MOUSE_EXT_URXVT: // ESC.[.NUM.;.NUM.;.NUM.M { - int btn = 3; - int shift = evas_key_modifier_is_set(ev->modifiers, "Shift") ? 4 : 0; - int meta = evas_key_modifier_is_set(ev->modifiers, "Alt") ? 8 : 0; - int ctrl = evas_key_modifier_is_set(ev->modifiers, "Control") ? 16 : 0; - - buf[0] = 0x1b; - buf[1] = '['; - buf[2] = 'M'; - buf[3] = (btn | shift | meta | ctrl) + ' '; - buf[4] = cx + 1 + ' '; - buf[5] = cy + 1 + ' '; - buf[6] = 0; + if (btn > 2) btn = 0; + snprintf(buf, sizeof(buf), "%c[%i;%i;%iM", 0x1b, + (btn | shift | meta | ctrl) + ' ', + cx + 1 + ' ', cy + 1 + ' '); termpty_write(sd->pty, buf, strlen(buf)); ret = EINA_TRUE; } @@ -1438,24 +1455,50 @@ _rep_mouse_move(Termio *sd, Evas_Event_Mouse_Move *ev, int cx __UNUSED__, int cy { char buf[64]; Eina_Bool ret = EINA_FALSE; - - if (sd->pty->mouse_rep == MOUSE_OFF) return EINA_FALSE; - switch (sd->pty->mouse_rep) + int btn, shift, meta, ctrl; + + if ((sd->pty->mouse_mode == MOUSE_OFF) || + (sd->pty->mouse_mode == MOUSE_X10) || + (sd->pty->mouse_mode == MOUSE_NORMAL)) + return EINA_FALSE; + + if ((!sd->mouse.button) && (sd->pty->mouse_mode == MOUSE_NORMAL_BTN_MOVE)) + return EINA_FALSE; + + if (!change) return EINA_TRUE; + + btn = sd->mouse.button - 1; + shift = evas_key_modifier_is_set(ev->modifiers, "Shift") ? 4 : 0; + meta = evas_key_modifier_is_set(ev->modifiers, "Alt") ? 8 : 0; + ctrl = evas_key_modifier_is_set(ev->modifiers, "Control") ? 16 : 0; + + switch (sd->pty->mouse_ext) { - case MOUSE_NORMAL_BTN_MOVE: // ESC.[.M.BTN/FLGS.X.Y - if (change) + case MOUSE_EXT_NONE: + if ((cx < (0xff - ' ')) && (cy < (0xff - ' '))) { - int btn = sd->mouse.button - 1; - int shift = evas_key_modifier_is_set(ev->modifiers, "Shift") ? 4 : 0; - int meta = evas_key_modifier_is_set(ev->modifiers, "Alt") ? 8 : 0; - int ctrl = evas_key_modifier_is_set(ev->modifiers, "Control") ? 16 : 0; - int v, i; - + if (btn > 2) btn = 0; buf[0] = 0x1b; buf[1] = '['; buf[2] = 'M'; - buf[3] = (btn | shift | meta | ctrl) + ' ' + 32; + buf[3] = (btn | shift | meta | ctrl) + ' '; + buf[4] = cx + 1 + ' '; + buf[5] = cy + 1 + ' '; + buf[6] = 0; + termpty_write(sd->pty, buf, strlen(buf)); + ret = EINA_TRUE; + } + break; + case MOUSE_EXT_UTF8: // ESC.[.M.BTN/FLGS.XUTF8.YUTF8 + { + int v, i; + + if (btn > 2) btn = 0; + buf[0] = 0x1b; + buf[1] = '['; + buf[2] = 'M'; + buf[3] = (btn | shift | meta | ctrl) + ' '; i = 4; v = cx + 1 + ' '; if (v <= 127) buf[i++] = v; @@ -1473,9 +1516,26 @@ _rep_mouse_move(Termio *sd, Evas_Event_Mouse_Move *ev, int cx __UNUSED__, int cy } buf[i] = 0; termpty_write(sd->pty, buf, strlen(buf)); + ret = EINA_TRUE; + } + break; + case MOUSE_EXT_SGR: // ESC.[.<.NUM.;.NUM.;.NUM.M + { + snprintf(buf, sizeof(buf), "%c[<%i;%i;%iM", 0x1b, + (btn | shift | meta | ctrl), cx + 1, cy + 1); + termpty_write(sd->pty, buf, strlen(buf)); + ret = EINA_TRUE; + } + break; + case MOUSE_EXT_URXVT: // ESC.[.NUM.;.NUM.;.NUM.M + { + if (btn > 2) btn = 0; + snprintf(buf, sizeof(buf), "%c[%i;%i;%iM", 0x1b, + (btn | shift | meta | ctrl) + ' ', + cx + 1 + ' ', cy + 1 + ' '); + termpty_write(sd->pty, buf, strlen(buf)); + ret = EINA_TRUE; } - /* Always handle this, even if we don't send position update */ - ret = EINA_TRUE; break; default: break; diff --git a/src/bin/termpty.h b/src/bin/termpty.h index 93d87a9e..08dad371 100644 --- a/src/bin/termpty.h +++ b/src/bin/termpty.h @@ -19,14 +19,17 @@ typedef struct _Termsave Termsave; #define COL_INVERSEBG 11 #define MOUSE_OFF 0 -#define MOUSE_X10 1 -#define MOUSE_NORMAL 2 -#define MOUSE_UTF8 3 -#define MOUSE_SGR 4 -#define MOUSE_URXVT 5 -#define MOUSE_NORMAL_BTN_MOVE 6 +#define MOUSE_X10 1 // Press only +#define MOUSE_NORMAL 2 // Press+release only +#define MOUSE_NORMAL_BTN_MOVE 3 // Press+release+motion while pressed +#define MOUSE_NORMAL_ALL_MOVE 4 // Press+release+all motion -// choose - italic OR double-width support +#define MOUSE_EXT_NONE 0 +#define MOUSE_EXT_UTF8 1 +#define MOUSE_EXT_SGR 2 +#define MOUSE_EXT_URXVT 3 + +// choose - italic OR double-width support //#define SUPPORT_ITALIC 1 #define SUPPORT_DBLWIDTH 1 @@ -109,7 +112,8 @@ struct _Termpty Termstate state, save, swap; int exit_code; unsigned int altbuf : 1; - unsigned int mouse_rep : 3; + unsigned int mouse_mode : 3; + unsigned int mouse_ext : 2; }; struct _Termcell diff --git a/src/bin/termptyesc.c b/src/bin/termptyesc.c index 400752d2..6dc993c2 100644 --- a/src/bin/termptyesc.c +++ b/src/bin/termptyesc.c @@ -566,8 +566,9 @@ _handle_esc_csi(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce) break; case 9: handled = 1; - if (mode) ty->mouse_rep = MOUSE_X10; - else ty->mouse_rep = MOUSE_OFF; + INF("XXX: set mouse (X10) %i", mode); + if (mode) ty->mouse_mode = MOUSE_X10; + else ty->mouse_mode = MOUSE_OFF; break; case 12: // ignore handled = 1; @@ -620,8 +621,8 @@ _handle_esc_csi(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce) break; case 1000: handled = 1; - if (mode) ty->mouse_rep = MOUSE_NORMAL; - else ty->mouse_rep = MOUSE_OFF; + if (mode) ty->mouse_mode = MOUSE_NORMAL; + else ty->mouse_mode = MOUSE_OFF; INF("XXX: set mouse (press+release only) to %i", mode); break; case 1001: @@ -630,12 +631,14 @@ _handle_esc_csi(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce) break; case 1002: handled = 1; - if (mode) ty->mouse_rep = MOUSE_NORMAL_BTN_MOVE; - else ty->mouse_rep = MOUSE_OFF; + if (mode) ty->mouse_mode = MOUSE_NORMAL_BTN_MOVE; + else ty->mouse_mode = MOUSE_OFF; INF("XXX: set mouse (press+release+motion while pressed) %i", mode); break; case 1003: handled = 1; + if (mode) ty->mouse_mode = MOUSE_NORMAL_ALL_MOVE; + else ty->mouse_mode = MOUSE_OFF; ERR("XXX: set mouse (press+release+all motion) %i", mode); break; case 1004: // i dont know what focus repporting is? @@ -644,14 +647,14 @@ _handle_esc_csi(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce) break; case 1005: handled = 1; - if (mode) ty->mouse_rep = MOUSE_UTF8; - else ty->mouse_rep = MOUSE_OFF; + if (mode) ty->mouse_ext = MOUSE_EXT_UTF8; + else ty->mouse_ext = MOUSE_EXT_NONE; INF("XXX: set mouse (xterm utf8 style) %i", mode); break; case 1006: handled = 1; - if (mode) ty->mouse_rep = MOUSE_SGR; - else ty->mouse_rep = MOUSE_OFF; + if (mode) ty->mouse_ext = MOUSE_EXT_SGR; + else ty->mouse_ext = MOUSE_EXT_NONE; INF("XXX: set mouse (xterm sgr style) %i", mode); break; case 1010: // ignore @@ -664,8 +667,8 @@ _handle_esc_csi(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce) break; case 1015: handled = 1; - if (mode) ty->mouse_rep = MOUSE_URXVT; - else ty->mouse_rep = MOUSE_OFF; + if (mode) ty->mouse_ext = MOUSE_EXT_URXVT; + else ty->mouse_ext = MOUSE_EXT_NONE; INF("XXX: set mouse (rxvt-unicode style) %i", mode); break; case 1034: // ignore