termiointernals: be able to mock mouse wheel

This commit is contained in:
Boris Faure 2019-02-19 20:03:14 +01:00
parent 1a0b6f1b86
commit 4bc04c5421
4 changed files with 168 additions and 102 deletions

View File

@ -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;
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");
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);
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);
}
/* }}} */

View File

@ -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)

View File

@ -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);

View File

@ -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;
}