terminology: rewrite mouse handling

Fix mouse in vim. Should also fix it in mc.

SVN revision: 78412
This commit is contained in:
Boris Faure 2012-10-24 21:34:36 +00:00
parent db90244654
commit 480c5506b7
3 changed files with 156 additions and 89 deletions

View File

@ -1247,26 +1247,46 @@ _rep_mouse_down(Termio *sd, Evas_Event_Mouse_Down *ev, int cx, int cy)
{ {
char buf[64]; char buf[64];
Eina_Bool ret = EINA_FALSE; 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) if (!sd->mouse.button)
{ {
/* Need to remember the first button pressed for terminal handling */ /* Need to remember the first button pressed for terminal handling */
sd->mouse.button = ev->button; 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 - ' '))) if ((cx < (0xff - ' ')) && (cy < (0xff - ' ')))
{ {
int btn = ev->button - 1; 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[0] = 0x1b;
buf[1] = '['; buf[1] = '[';
buf[2] = 'M'; buf[2] = 'M';
buf[3] = btn + ' '; buf[3] = (btn | shift | meta | ctrl) + ' ';
buf[4] = cx + 1 + ' '; buf[4] = cx + 1 + ' ';
buf[5] = cy + 1 + ' '; buf[5] = cy + 1 + ' ';
buf[6] = 0; buf[6] = 0;
@ -1275,14 +1295,14 @@ _rep_mouse_down(Termio *sd, Evas_Event_Mouse_Down *ev, int cx, int cy)
} }
} }
break; 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 btn = ev->button - 1;
int shift = evas_key_modifier_is_set(ev->modifiers, "Shift") ? 4 : 0; 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 meta = evas_key_modifier_is_set(ev->modifiers, "Alt") ? 8 : 0;
int ctrl = evas_key_modifier_is_set(ev->modifiers, "Control") ? 16 : 0; int ctrl = evas_key_modifier_is_set(ev->modifiers, "Control") ? 16 : 0;
int v, i; int v, i;
if (btn > 2) btn = 0; if (btn > 2) btn = 0;
buf[0] = 0x1b; buf[0] = 0x1b;
buf[1] = '['; buf[1] = '[';
@ -1308,37 +1328,30 @@ _rep_mouse_down(Termio *sd, Evas_Event_Mouse_Down *ev, int cx, int cy)
ret = EINA_TRUE; ret = EINA_TRUE;
} }
break; break;
case MOUSE_SGR: // ESC.[.<.NUM.;.NUM.;.NUM.M case MOUSE_EXT_SGR: // ESC.[.<.NUM.;.NUM.;.NUM.M
{ {
int btn = ev->button - 1; int btn = ev->button - 1;
int shift = evas_key_modifier_is_set(ev->modifiers, "Shift") ? 4 : 0; 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 meta = evas_key_modifier_is_set(ev->modifiers, "Alt") ? 8 : 0;
int ctrl = evas_key_modifier_is_set(ev->modifiers, "Control") ? 16 : 0; int ctrl = evas_key_modifier_is_set(ev->modifiers, "Control") ? 16 : 0;
snprintf(buf, sizeof(buf), "%c[<%i;%i;%iM", 0x1b, snprintf(buf, sizeof(buf), "%c[<%i;%i;%iM", 0x1b,
(btn | shift | meta | ctrl), cx + 1, cy + 1); (btn | shift | meta | ctrl), cx + 1, cy + 1);
termpty_write(sd->pty, buf, strlen(buf)); termpty_write(sd->pty, buf, strlen(buf));
ret = EINA_TRUE; ret = EINA_TRUE;
} }
break; break;
case MOUSE_NORMAL: case MOUSE_EXT_URXVT: // ESC.[.NUM.;.NUM.;.NUM.M
case MOUSE_NORMAL_BTN_MOVE:
case MOUSE_URXVT: // ESC.[.M.BTN/FLGS.X.Y
if ((cx < (0xff - ' ')) && (cy < (0xff - ' ')))
{ {
int btn = ev->button - 1; int btn = ev->button - 1;
int shift = evas_key_modifier_is_set(ev->modifiers, "Shift") ? 4 : 0; 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 meta = evas_key_modifier_is_set(ev->modifiers, "Alt") ? 8 : 0;
int ctrl = evas_key_modifier_is_set(ev->modifiers, "Control") ? 16 : 0; int ctrl = evas_key_modifier_is_set(ev->modifiers, "Control") ? 16 : 0;
if (btn > 2) btn = 0; if (btn > 2) btn = 0;
buf[0] = 0x1b; snprintf(buf, sizeof(buf), "%c[%i;%i;%iM", 0x1b,
buf[1] = '['; (btn | shift | meta | ctrl) + ' ',
buf[2] = 'M'; cx + 1 + ' ', cy + 1 + ' ');
buf[3] = (btn | shift | meta | ctrl) + ' ';
buf[4] = cx + 1 + ' ';
buf[5] = cy + 1 + ' ';
buf[6] = 0;
termpty_write(sd->pty, buf, strlen(buf)); termpty_write(sd->pty, buf, strlen(buf));
ret = EINA_TRUE; ret = EINA_TRUE;
} }
@ -1354,21 +1367,41 @@ _rep_mouse_up(Termio *sd, Evas_Event_Mouse_Up *ev, int cx, int cy)
{ {
char buf[64]; char buf[64];
Eina_Bool ret = EINA_FALSE; Eina_Bool ret = EINA_FALSE;
int btn, shift, meta, ctrl;
if (sd->pty->mouse_rep == MOUSE_OFF) return EINA_FALSE;
if ((sd->pty->mouse_mode == MOUSE_OFF) ||
(sd->pty->mouse_mode == MOUSE_X10))
return EINA_FALSE;
if (sd->mouse.button == ev->button) if (sd->mouse.button == ev->button)
sd->mouse.button = 0; 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; int v, i;
btn = 3; if (btn > 2) btn = 0;
buf[0] = 0x1b; buf[0] = 0x1b;
buf[1] = '['; buf[1] = '[';
buf[2] = 'M'; buf[2] = 'M';
@ -1393,36 +1426,20 @@ _rep_mouse_up(Termio *sd, Evas_Event_Mouse_Up *ev, int cx, int cy)
ret = EINA_TRUE; ret = EINA_TRUE;
} }
break; 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, snprintf(buf, sizeof(buf), "%c[<%i;%i;%im", 0x1b,
(btn | shift | meta | ctrl), cx + 1, cy + 1); (btn | shift | meta | ctrl), cx + 1, cy + 1);
termpty_write(sd->pty, buf, strlen(buf)); termpty_write(sd->pty, buf, strlen(buf));
ret = EINA_TRUE; ret = EINA_TRUE;
} }
break; break;
case MOUSE_NORMAL: case MOUSE_EXT_URXVT: // ESC.[.NUM.;.NUM.;.NUM.M
case MOUSE_NORMAL_BTN_MOVE:
case MOUSE_URXVT: // ESC.[.M.BTN/FLGS.X.Y
if ((cx < (0xff - ' ')) && (cy < (0xff - ' ')))
{ {
int btn = 3; if (btn > 2) btn = 0;
int shift = evas_key_modifier_is_set(ev->modifiers, "Shift") ? 4 : 0; snprintf(buf, sizeof(buf), "%c[%i;%i;%iM", 0x1b,
int meta = evas_key_modifier_is_set(ev->modifiers, "Alt") ? 8 : 0; (btn | shift | meta | ctrl) + ' ',
int ctrl = evas_key_modifier_is_set(ev->modifiers, "Control") ? 16 : 0; cx + 1 + ' ', cy + 1 + ' ');
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)); termpty_write(sd->pty, buf, strlen(buf));
ret = EINA_TRUE; 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]; char buf[64];
Eina_Bool ret = EINA_FALSE; Eina_Bool ret = EINA_FALSE;
int btn, shift, meta, ctrl;
if (sd->pty->mouse_rep == MOUSE_OFF) return EINA_FALSE;
switch (sd->pty->mouse_rep) 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 case MOUSE_EXT_NONE:
if (change) 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; if (btn > 2) btn = 0;
buf[0] = 0x1b; buf[0] = 0x1b;
buf[1] = '['; buf[1] = '[';
buf[2] = 'M'; 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; i = 4;
v = cx + 1 + ' '; v = cx + 1 + ' ';
if (v <= 127) buf[i++] = v; 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; buf[i] = 0;
termpty_write(sd->pty, buf, strlen(buf)); 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; break;
default: default:
break; break;

View File

@ -19,14 +19,17 @@ typedef struct _Termsave Termsave;
#define COL_INVERSEBG 11 #define COL_INVERSEBG 11
#define MOUSE_OFF 0 #define MOUSE_OFF 0
#define MOUSE_X10 1 #define MOUSE_X10 1 // Press only
#define MOUSE_NORMAL 2 #define MOUSE_NORMAL 2 // Press+release only
#define MOUSE_UTF8 3 #define MOUSE_NORMAL_BTN_MOVE 3 // Press+release+motion while pressed
#define MOUSE_SGR 4 #define MOUSE_NORMAL_ALL_MOVE 4 // Press+release+all motion
#define MOUSE_URXVT 5
#define MOUSE_NORMAL_BTN_MOVE 6
// 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_ITALIC 1
#define SUPPORT_DBLWIDTH 1 #define SUPPORT_DBLWIDTH 1
@ -109,7 +112,8 @@ struct _Termpty
Termstate state, save, swap; Termstate state, save, swap;
int exit_code; int exit_code;
unsigned int altbuf : 1; unsigned int altbuf : 1;
unsigned int mouse_rep : 3; unsigned int mouse_mode : 3;
unsigned int mouse_ext : 2;
}; };
struct _Termcell struct _Termcell

View File

@ -566,8 +566,9 @@ _handle_esc_csi(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce)
break; break;
case 9: case 9:
handled = 1; handled = 1;
if (mode) ty->mouse_rep = MOUSE_X10; INF("XXX: set mouse (X10) %i", mode);
else ty->mouse_rep = MOUSE_OFF; if (mode) ty->mouse_mode = MOUSE_X10;
else ty->mouse_mode = MOUSE_OFF;
break; break;
case 12: // ignore case 12: // ignore
handled = 1; handled = 1;
@ -620,8 +621,8 @@ _handle_esc_csi(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce)
break; break;
case 1000: case 1000:
handled = 1; handled = 1;
if (mode) ty->mouse_rep = MOUSE_NORMAL; if (mode) ty->mouse_mode = MOUSE_NORMAL;
else ty->mouse_rep = MOUSE_OFF; else ty->mouse_mode = MOUSE_OFF;
INF("XXX: set mouse (press+release only) to %i", mode); INF("XXX: set mouse (press+release only) to %i", mode);
break; break;
case 1001: case 1001:
@ -630,12 +631,14 @@ _handle_esc_csi(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce)
break; break;
case 1002: case 1002:
handled = 1; handled = 1;
if (mode) ty->mouse_rep = MOUSE_NORMAL_BTN_MOVE; if (mode) ty->mouse_mode = MOUSE_NORMAL_BTN_MOVE;
else ty->mouse_rep = MOUSE_OFF; else ty->mouse_mode = MOUSE_OFF;
INF("XXX: set mouse (press+release+motion while pressed) %i", mode); INF("XXX: set mouse (press+release+motion while pressed) %i", mode);
break; break;
case 1003: case 1003:
handled = 1; 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); ERR("XXX: set mouse (press+release+all motion) %i", mode);
break; break;
case 1004: // i dont know what focus repporting is? 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; break;
case 1005: case 1005:
handled = 1; handled = 1;
if (mode) ty->mouse_rep = MOUSE_UTF8; if (mode) ty->mouse_ext = MOUSE_EXT_UTF8;
else ty->mouse_rep = MOUSE_OFF; else ty->mouse_ext = MOUSE_EXT_NONE;
INF("XXX: set mouse (xterm utf8 style) %i", mode); INF("XXX: set mouse (xterm utf8 style) %i", mode);
break; break;
case 1006: case 1006:
handled = 1; handled = 1;
if (mode) ty->mouse_rep = MOUSE_SGR; if (mode) ty->mouse_ext = MOUSE_EXT_SGR;
else ty->mouse_rep = MOUSE_OFF; else ty->mouse_ext = MOUSE_EXT_NONE;
INF("XXX: set mouse (xterm sgr style) %i", mode); INF("XXX: set mouse (xterm sgr style) %i", mode);
break; break;
case 1010: // ignore case 1010: // ignore
@ -664,8 +667,8 @@ _handle_esc_csi(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce)
break; break;
case 1015: case 1015:
handled = 1; handled = 1;
if (mode) ty->mouse_rep = MOUSE_URXVT; if (mode) ty->mouse_ext = MOUSE_EXT_URXVT;
else ty->mouse_rep = MOUSE_OFF; else ty->mouse_ext = MOUSE_EXT_NONE;
INF("XXX: set mouse (rxvt-unicode style) %i", mode); INF("XXX: set mouse (rxvt-unicode style) %i", mode);
break; break;
case 1034: // ignore case 1034: // ignore