billiob pushed a commit to branch master. http://git.enlightenment.org/apps/terminology.git/commit/?id=4bc04c5421612cd00cda79bcabdfde29d73c2570
commit 4bc04c5421612cd00cda79bcabdfde29d73c2570 Author: Boris Faure <[email protected]> Date: Tue Feb 19 20:03:14 2019 +0100 termiointernals: be able to mock mouse wheel --- src/bin/termio.c | 112 ++++---------------------------------------- src/bin/termiointernals.c | 116 ++++++++++++++++++++++++++++++++++++++++++++++ src/bin/termiointernals.h | 4 ++ src/bin/termptyext.c | 38 +++++++++++++++ 4 files changed, 168 insertions(+), 102 deletions(-) diff --git a/src/bin/termio.c b/src/bin/termio.c index 9ebe5e0..251a7e4 100644 --- a/src/bin/termio.c +++ b/src/bin/termio.c @@ -2688,112 +2688,20 @@ _smart_cb_mouse_wheel(void *data, { Evas_Event_Mouse_Wheel *ev = event; Termio *sd = evas_object_smart_data_get(data); - char buf[64]; + Termio_Modifiers modifiers = {}; EINA_SAFETY_ON_NULL_RETURN(sd); - /* do not handle horizontal scrolling */ - if (ev->direction) return; - - if (evas_key_modifier_is_set(ev->modifiers, "Control")) return; - if (evas_key_modifier_is_set(ev->modifiers, "Alt")) return; - if (evas_key_modifier_is_set(ev->modifiers, "Shift")) return; - - if (sd->pty->mouse_mode == MOUSE_OFF) - { - if (sd->pty->altbuf) - { - /* Emulate cursors */ - buf[0] = 0x1b; - buf[1] = 'O'; - buf[2] = (ev->z < 0) ? 'A' : 'B'; - buf[3] = 0; - termpty_write(sd->pty, buf, strlen(buf)); - } - else - { - sd->scroll -= (ev->z * 4); - if (sd->scroll < 0) - sd->scroll = 0; - termio_smart_update_queue(sd); - miniview_position_offset(term_miniview_get(sd->term), - ev->z * 4, EINA_TRUE); + modifiers.alt = evas_key_modifier_is_set(ev->modifiers, "Alt"); + modifiers.shift = evas_key_modifier_is_set(ev->modifiers, "Shift"); + modifiers.ctrl = evas_key_modifier_is_set(ev->modifiers, "Control"); + modifiers.super = evas_key_modifier_is_set(ev->modifiers, "Super"); + modifiers.meta = evas_key_modifier_is_set(ev->modifiers, "Meta"); + modifiers.hyper = evas_key_modifier_is_set(ev->modifiers, "Hyper"); + modifiers.iso_level3_shift = evas_key_modifier_is_set(ev->modifiers, "ISO_Level3_Shift"); + modifiers.altgr= evas_key_modifier_is_set(ev->modifiers, "AltGr"); - termio_smart_cb_mouse_move_job(sd); - } - } - else - { - int cx = 0, cy = 0; - - termio_cursor_to_xy(sd, ev->canvas.x, ev->canvas.y, &cx, &cy); - - switch (sd->pty->mouse_ext) - { - case MOUSE_EXT_NONE: - if ((cx < (0xff - ' ')) && (cy < (0xff - ' '))) - { - int btn = (ev->z >= 0) ? 1 + 64 : 64; - - 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)); - } - break; - case MOUSE_EXT_UTF8: // ESC.[.M.BTN/FLGS.XUTF8.YUTF8 - { - int v, i; - int btn = (ev->z >= 0) ? 'a' : '`'; - - buf[0] = 0x1b; - buf[1] = '['; - buf[2] = 'M'; - buf[3] = btn; - i = 4; - v = cx + 1 + ' '; - if (v <= 127) buf[i++] = v; - else - { // 14 bits for cx/cy - enough i think - buf[i++] = 0xc0 + (v >> 6); - buf[i++] = 0x80 + (v & 0x3f); - } - v = cy + 1 + ' '; - if (v <= 127) buf[i++] = v; - else - { // 14 bits for cx/cy - enough i think - buf[i++] = 0xc0 + (v >> 6); - buf[i++] = 0x80 + (v & 0x3f); - } - buf[i] = 0; - termpty_write(sd->pty, buf, strlen(buf)); - } - break; - case MOUSE_EXT_SGR: // ESC.[.<.NUM.;.NUM.;.NUM.M - { - int btn = (ev->z >= 0) ? 1 + 64 : 64; - snprintf(buf, sizeof(buf), "%c[<%i;%i;%iM", 0x1b, - btn, cx + 1, cy + 1); - termpty_write(sd->pty, buf, strlen(buf)); - } - break; - case MOUSE_EXT_URXVT: // ESC.[.NUM.;.NUM.;.NUM.M - { - int btn = (ev->z >= 0) ? 1 + 64 : 64; - snprintf(buf, sizeof(buf), "%c[%i;%i;%iM", 0x1b, - btn + ' ', - cx + 1, cy + 1); - termpty_write(sd->pty, buf, strlen(buf)); - } - break; - default: - break; - } - } + termio_internal_mouse_wheel(sd, ev, modifiers); } /* }}} */ diff --git a/src/bin/termiointernals.c b/src/bin/termiointernals.c index 6c3aef5..52da0b4 100644 --- a/src/bin/termiointernals.c +++ b/src/bin/termiointernals.c @@ -2113,6 +2113,122 @@ termio_internal_mouse_move(Termio *sd, #endif } +void +termio_internal_mouse_wheel(Termio *sd, + Evas_Event_Mouse_Wheel *ev, + Termio_Modifiers modifiers) +{ + char buf[64]; + + /* do not handle horizontal scrolling */ + if (ev->direction) + { + return; + } + + if (modifiers.ctrl || modifiers.alt || modifiers.shift) + { + return; + } + + if (sd->pty->mouse_mode == MOUSE_OFF) + { + if (sd->pty->altbuf) + { + /* Emulate cursors */ + buf[0] = 0x1b; + buf[1] = 'O'; + buf[2] = (ev->z < 0) ? 'A' : 'B'; + buf[3] = 0; + termpty_write(sd->pty, buf, strlen(buf)); + } + else + { + sd->scroll -= (ev->z * 4); + if (sd->scroll < 0) + sd->scroll = 0; + termio_smart_update_queue(sd); + miniview_position_offset(term_miniview_get(sd->term), + ev->z * 4, EINA_TRUE); + + termio_smart_cb_mouse_move_job(sd); + } + } + else + { + int cx = 0, cy = 0; + + termio_cursor_to_xy(sd, ev->canvas.x, ev->canvas.y, &cx, &cy); + + switch (sd->pty->mouse_ext) + { + case MOUSE_EXT_NONE: + if ((cx < (0xff - ' ')) && (cy < (0xff - ' '))) + { + int btn = (ev->z >= 0) ? 1 + 64 : 64; + + 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)); + } + break; + case MOUSE_EXT_UTF8: // ESC.[.M.BTN/FLGS.XUTF8.YUTF8 + { + int v, i; + int btn = (ev->z >= 0) ? 'a' : '`'; + + buf[0] = 0x1b; + buf[1] = '['; + buf[2] = 'M'; + buf[3] = btn; + i = 4; + v = cx + 1 + ' '; + if (v <= 127) buf[i++] = v; + else + { // 14 bits for cx/cy - enough i think + buf[i++] = 0xc0 + (v >> 6); + buf[i++] = 0x80 + (v & 0x3f); + } + v = cy + 1 + ' '; + if (v <= 127) buf[i++] = v; + else + { // 14 bits for cx/cy - enough i think + buf[i++] = 0xc0 + (v >> 6); + buf[i++] = 0x80 + (v & 0x3f); + } + buf[i] = 0; + termpty_write(sd->pty, buf, strlen(buf)); + } + break; + case MOUSE_EXT_SGR: // ESC.[.<.NUM.;.NUM.;.NUM.M + { + int btn = (ev->z >= 0) ? 1 + 64 : 64; + snprintf(buf, sizeof(buf), "%c[<%i;%i;%iM", 0x1b, + btn, cx + 1, cy + 1); + termpty_write(sd->pty, buf, strlen(buf)); + } + break; + case MOUSE_EXT_URXVT: // ESC.[.NUM.;.NUM.;.NUM.M + { + int btn = (ev->z >= 0) ? 1 + 64 : 64; + snprintf(buf, sizeof(buf), "%c[%i;%i;%iM", 0x1b, + btn + ' ', + cx + 1, cy + 1); + termpty_write(sd->pty, buf, strlen(buf)); + } + break; + default: + break; + } + } +} + + static void _termio_scroll_selection(Termio *sd, Termpty *ty, int direction, int start_y, int end_y) diff --git a/src/bin/termiointernals.h b/src/bin/termiointernals.h index 787898b..ecba0b6 100644 --- a/src/bin/termiointernals.h +++ b/src/bin/termiointernals.h @@ -119,6 +119,10 @@ void termio_internal_mouse_move(Termio *sd, Evas_Event_Mouse_Move *ev, Termio_Modifiers modifiers); +void +termio_internal_mouse_wheel(Termio *sd, + Evas_Event_Mouse_Wheel *ev, + Termio_Modifiers modifiers); void termio_selection_dbl_fix(Termio *sd); diff --git a/src/bin/termptyext.c b/src/bin/termptyext.c index 5d70fa2..e2f8acf 100644 --- a/src/bin/termptyext.c +++ b/src/bin/termptyext.c @@ -214,6 +214,41 @@ _handle_mouse_move(Termpty *ty, termio_internal_mouse_move(sd, &ev, modifiers); } +/* + * Format is tw;X;Y;DIRECTION;VALUE;MODIFIERS + * DIRECTION: 1 to go up, 0 to go down + */ +static void +_handle_mouse_wheel(Termpty *ty, + const Eina_Unicode *buf) +{ + Evas_Event_Mouse_Wheel ev = {}; + Termio *sd = termio_get_from_obj(ty->obj); + Termio_Modifiers modifiers = {}; + int value; + + /* X */ + value = 0; + buf += _tytest_arg_get(buf, &value); + ev.canvas.x = value; + /* Y */ + value = 0; + buf += _tytest_arg_get(buf, &value); + ev.canvas.y = value; + /* DIRECTION */ + value = 0; + buf += _tytest_arg_get(buf, &value); + ev.z = (value == 0)? 1 : -1; + /* VALUE */ + value = 0; + buf += _tytest_arg_get(buf, &value); + ev.z *= value; + /* MODIFIERS */ + buf += _tytest_modifiers_get(buf, &modifiers); + + termio_internal_mouse_wheel(sd, &ev, modifiers); +} + static void _handle_selection_is(Termpty *ty, const Eina_Unicode *buf) @@ -321,6 +356,9 @@ tytest_handle_escape_codes(Termpty *ty, case 'u': _handle_mouse_up(ty, buf + 1); break; + case 'w': + _handle_mouse_wheel(ty, buf + 1); + break; default: break; } --
