terminology: rewrite mouse handling
Fix mouse in vim. Should also fix it in mc. SVN revision: 78412
This commit is contained in:
parent
db90244654
commit
480c5506b7
198
src/bin/termio.c
198
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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue