static int term_echoing; /* Does terminal want local echo? */
static int term_editing; /* Does terminal want local edit? */
+static int xterm_mouse; /* send mouse messages to app */
+
static unsigned long cset_attr[2];
/*
*/
static void toggle_mode (int mode, int query, int state) {
long ticks;
+
if (query) switch (mode) {
case 1: /* application cursor keys */
app_cursor_keys = state;
swap_screen (state);
disptop = 0;
break;
+ case 1000: /* xterm mouse 1 */
+ xterm_mouse = state ? 1 : 0;
+ set_raw_mouse_mode(state);
+ break;
+ case 1002: /* xterm mouse 2 */
+ xterm_mouse = state ? 2: 0;
+ set_raw_mouse_mode(state);
+ break;
} else switch (mode) {
case 4: /* set insert mode */
compatibility(VT102);
break;
case 'a': /* move right N cols */
compatibility(ANSI);
+ case ANSI('c', '>'): /* report xterm version */
+ compatibility(OTHER);
+ /* this reports xterm version 136 so that VIM can
+ use the drag messages from the mouse reporting */
+ ldisc_send("\033[>0;136;0c", 11);
+ break;
case 'C':
move (curs.x + def(esc_args[0], 1), curs.y, 1);
seen_disp_event = TRUE;
incpos(selend);
}
-void term_mouse (Mouse_Button b, Mouse_Action a, int x, int y) {
+void term_mouse (Mouse_Button b, Mouse_Action a, int x, int y,
+ int shift, int ctrl) {
pos selpoint;
unsigned long *ldata;
if ((ldata[cols]&LATTR_MODE) != LATTR_NORM)
selpoint.x /= 2;
- if (b == MB_SELECT && a == MA_CLICK) {
+ if (xterm_mouse) {
+ int encstate = 0, r, c;
+ char abuf[16];
+ static int is_down = 0;
+
+ switch(b) {
+ case MBT_LEFT:
+ encstate = 0x20; /* left button down */
+ break;
+ case MBT_MIDDLE:
+ encstate = 0x21;
+ break;
+ case MBT_RIGHT:
+ encstate = 0x22;
+ break;
+ case MBT_WHEEL_UP:
+ encstate = 0x60;
+ break;
+ case MBT_WHEEL_DOWN:
+ encstate = 0x61;
+ break;
+ }
+ switch(a) {
+ case MA_DRAG:
+ if (xterm_mouse == 1)
+ return;
+ encstate += 0x20;
+ break;
+ case MA_RELEASE:
+ encstate = 0x23;
+ is_down = 0;
+ break;
+ case MA_CLICK:
+ if (is_down == b)
+ return;
+ is_down = b;
+ break;
+ }
+ if (shift)
+ encstate += 0x04;
+ if (ctrl)
+ encstate += 0x10;
+ r = y + 33;
+ c = x + 33;
+
+ sprintf(abuf, "\033[M%c%c%c", encstate, c, r);
+ ldisc_send(abuf, 6);
+ return;
+ }
+
+ b = translate_button(b);
+
+ if (b == MBT_SELECT && a == MA_CLICK) {
deselect();
selstate = ABOUT_TO;
selanchor = selpoint;
selmode = SM_CHAR;
- } else if (b == MB_SELECT && (a == MA_2CLK || a == MA_3CLK)) {
+ } else if (b == MBT_SELECT && (a == MA_2CLK || a == MA_3CLK)) {
deselect();
selmode = (a == MA_2CLK ? SM_WORD : SM_LINE);
selstate = DRAGGING;
selend = selstart;
incpos(selend);
sel_spread();
- } else if ((b == MB_SELECT && a == MA_DRAG) ||
- (b == MB_EXTEND && a != MA_RELEASE)) {
+ } else if ((b == MBT_SELECT && a == MA_DRAG) ||
+ (b == MBT_EXTEND && a != MA_RELEASE)) {
if (selstate == ABOUT_TO && poseq(selanchor, selpoint))
return;
- if (b == MB_EXTEND && a != MA_DRAG && selstate == SELECTED) {
+ if (b == MBT_EXTEND && a != MA_DRAG && selstate == SELECTED) {
if (posdiff(selpoint,selstart) < posdiff(selend,selstart)/2) {
selanchor = selend;
decpos(selanchor);
incpos(selend);
}
sel_spread();
- } else if ((b == MB_SELECT || b == MB_EXTEND) && a == MA_RELEASE) {
+ } else if ((b == MBT_SELECT || b == MBT_EXTEND) && a == MA_RELEASE) {
if (selstate == DRAGGING) {
/*
* We've completed a selection. We now transfer the
selstate = SELECTED;
} else
selstate = NO_SELECTION;
- } else if (b == MB_PASTE && (a==MA_CLICK || a==MA_2CLK || a==MA_3CLK)) {
+ } else if (b == MBT_PASTE && (a==MA_CLICK || a==MA_2CLK || a==MA_3CLK)) {
char *data;
int len;