Skip to content

Commit 6e1ef28

Browse files
committed
patch 8.0.0807: terminal window can't handle mouse buttons
Problem: Terminal window can't handle mouse buttons. (Hirohito Higashi) Solution: Implement mouse buttons and many other keys. Ignore the ones that are not implemented.
1 parent f98246d commit 6e1ef28

2 files changed

Lines changed: 90 additions & 27 deletions

File tree

src/terminal.c

Lines changed: 88 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
* that buffer, attributes come from the scrollback buffer tl_scrollback.
3737
*
3838
* TODO:
39-
* - Patch for functions: Yasuhiro Matsumoto, #1871
4039
* - For the scrollback buffer store lines in the buffer, only attributes in
4140
* tl_scrollback.
4241
* - When the job ends:
@@ -372,6 +371,20 @@ write_to_term(buf_T *buffer, char_u *msg, channel_T *channel)
372371
update_cursor(term, TRUE);
373372
}
374373

374+
/*
375+
* Send a mouse position and click to the vterm
376+
*/
377+
static int
378+
term_send_mouse(VTerm *vterm, int button, int pressed)
379+
{
380+
VTermModifier mod = VTERM_MOD_NONE;
381+
382+
vterm_mouse_move(vterm, mouse_row - W_WINROW(curwin),
383+
mouse_col - W_WINCOL(curwin), mod);
384+
vterm_mouse_button(vterm, button, pressed, mod);
385+
return TRUE;
386+
}
387+
375388
/*
376389
* Convert typed key "c" into bytes to send to the job.
377390
* Return the number of bytes in "buf".
@@ -382,6 +395,7 @@ term_convert_key(term_T *term, int c, char *buf)
382395
VTerm *vterm = term->tl_vterm;
383396
VTermKey key = VTERM_KEY_NONE;
384397
VTermModifier mod = VTERM_MOD_NONE;
398+
int mouse = FALSE;
385399

386400
switch (c)
387401
{
@@ -391,7 +405,13 @@ term_convert_key(term_T *term, int c, char *buf)
391405
case K_BS: c = BS; break;
392406
case K_DEL: key = VTERM_KEY_DEL; break;
393407
case K_DOWN: key = VTERM_KEY_DOWN; break;
408+
case K_S_DOWN: mod = VTERM_MOD_SHIFT;
409+
key = VTERM_KEY_DOWN; break;
394410
case K_END: key = VTERM_KEY_END; break;
411+
case K_S_END: mod = VTERM_MOD_SHIFT;
412+
key = VTERM_KEY_END; break;
413+
case K_C_END: mod = VTERM_MOD_CTRL;
414+
key = VTERM_KEY_END; break;
395415
case K_F10: key = VTERM_KEY_FUNCTION(10); break;
396416
case K_F11: key = VTERM_KEY_FUNCTION(11); break;
397417
case K_F12: key = VTERM_KEY_FUNCTION(12); break;
@@ -405,6 +425,10 @@ term_convert_key(term_T *term, int c, char *buf)
405425
case K_F8: key = VTERM_KEY_FUNCTION(8); break;
406426
case K_F9: key = VTERM_KEY_FUNCTION(9); break;
407427
case K_HOME: key = VTERM_KEY_HOME; break;
428+
case K_S_HOME: mod = VTERM_MOD_SHIFT;
429+
key = VTERM_KEY_HOME; break;
430+
case K_C_HOME: mod = VTERM_MOD_CTRL;
431+
key = VTERM_KEY_HOME; break;
408432
case K_INS: key = VTERM_KEY_INS; break;
409433
case K_K0: key = VTERM_KEY_KP_0; break;
410434
case K_K1: key = VTERM_KEY_KP_1; break;
@@ -429,48 +453,85 @@ term_convert_key(term_T *term, int c, char *buf)
429453
case K_KPLUS: key = VTERM_KEY_KP_PLUS; break;
430454
case K_KPOINT: key = VTERM_KEY_KP_PERIOD; break;
431455
case K_LEFT: key = VTERM_KEY_LEFT; break;
456+
case K_S_LEFT: mod = VTERM_MOD_SHIFT;
457+
key = VTERM_KEY_LEFT; break;
458+
case K_C_LEFT: mod = VTERM_MOD_CTRL;
459+
key = VTERM_KEY_LEFT; break;
432460
case K_PAGEDOWN: key = VTERM_KEY_PAGEDOWN; break;
433461
case K_PAGEUP: key = VTERM_KEY_PAGEUP; break;
434462
case K_RIGHT: key = VTERM_KEY_RIGHT; break;
463+
case K_S_RIGHT: mod = VTERM_MOD_SHIFT;
464+
key = VTERM_KEY_RIGHT; break;
465+
case K_C_RIGHT: mod = VTERM_MOD_CTRL;
466+
key = VTERM_KEY_RIGHT; break;
435467
case K_UP: key = VTERM_KEY_UP; break;
468+
case K_S_UP: mod = VTERM_MOD_SHIFT;
469+
key = VTERM_KEY_UP; break;
436470
case TAB: key = VTERM_KEY_TAB; break;
437471

438-
case K_MOUSEUP: /* TODO */ break;
439-
case K_MOUSEDOWN: /* TODO */ break;
440-
case K_MOUSELEFT: /* TODO */ break;
441-
case K_MOUSERIGHT: /* TODO */ break;
442-
443-
case K_LEFTMOUSE: /* TODO */ break;
444-
case K_LEFTMOUSE_NM: /* TODO */ break;
445-
case K_LEFTDRAG: /* TODO */ break;
446-
case K_LEFTRELEASE: /* TODO */ break;
447-
case K_LEFTRELEASE_NM: /* TODO */ break;
448-
case K_MIDDLEMOUSE: /* TODO */ break;
449-
case K_MIDDLEDRAG: /* TODO */ break;
450-
case K_MIDDLERELEASE: /* TODO */ break;
451-
case K_RIGHTMOUSE: /* TODO */ break;
452-
case K_RIGHTDRAG: /* TODO */ break;
453-
case K_RIGHTRELEASE: /* TODO */ break;
454-
case K_X1MOUSE: /* TODO */ break;
455-
case K_X1DRAG: /* TODO */ break;
456-
case K_X1RELEASE: /* TODO */ break;
457-
case K_X2MOUSE: /* TODO */ break;
458-
case K_X2DRAG: /* TODO */ break;
459-
case K_X2RELEASE: /* TODO */ break;
460-
461-
/* TODO: handle all special keys and modifiers that terminal_loop()
462-
* does not handle. */
472+
case K_MOUSEUP: mouse = term_send_mouse(vterm, 5, 1); break;
473+
case K_MOUSEDOWN: mouse = term_send_mouse(vterm, 4, 1); break;
474+
case K_MOUSELEFT: /* TODO */ return 0;
475+
case K_MOUSERIGHT: /* TODO */ return 0;
476+
477+
case K_LEFTMOUSE:
478+
case K_LEFTMOUSE_NM: mouse = term_send_mouse(vterm, 1, 1); break;
479+
case K_LEFTDRAG: mouse = term_send_mouse(vterm, 1, 1); break;
480+
case K_LEFTRELEASE:
481+
case K_LEFTRELEASE_NM: mouse = term_send_mouse(vterm, 1, 0); break;
482+
case K_MIDDLEMOUSE: mouse = term_send_mouse(vterm, 2, 1); break;
483+
case K_MIDDLEDRAG: mouse = term_send_mouse(vterm, 2, 1); break;
484+
case K_MIDDLERELEASE: mouse = term_send_mouse(vterm, 2, 0); break;
485+
case K_RIGHTMOUSE: mouse = term_send_mouse(vterm, 3, 1); break;
486+
case K_RIGHTDRAG: mouse = term_send_mouse(vterm, 3, 1); break;
487+
case K_RIGHTRELEASE: mouse = term_send_mouse(vterm, 3, 0); break;
488+
case K_X1MOUSE: /* TODO */ return 0;
489+
case K_X1DRAG: /* TODO */ return 0;
490+
case K_X1RELEASE: /* TODO */ return 0;
491+
case K_X2MOUSE: /* TODO */ return 0;
492+
case K_X2DRAG: /* TODO */ return 0;
493+
case K_X2RELEASE: /* TODO */ return 0;
494+
495+
case K_IGNORE: return 0;
496+
case K_NOP: return 0;
497+
case K_UNDO: return 0;
498+
case K_HELP: return 0;
499+
case K_XF1: key = VTERM_KEY_FUNCTION(1); break;
500+
case K_XF2: key = VTERM_KEY_FUNCTION(2); break;
501+
case K_XF3: key = VTERM_KEY_FUNCTION(3); break;
502+
case K_XF4: key = VTERM_KEY_FUNCTION(4); break;
503+
case K_SELECT: return 0;
504+
#ifdef FEAT_GUI
505+
case K_VER_SCROLLBAR: return 0;
506+
case K_HOR_SCROLLBAR: return 0;
507+
#endif
508+
#ifdef FEAT_GUI_TABLINE
509+
case K_TABLINE: return 0;
510+
case K_TABMENU: return 0;
511+
#endif
512+
#ifdef FEAT_NETBEANS_INTG
513+
case K_F21: key = VTERM_KEY_FUNCTION(21); break;
514+
#endif
515+
#ifdef FEAT_DND
516+
case K_DROP: return 0;
517+
#endif
518+
#ifdef FEAT_AUTOCMD
519+
case K_CURSORHOLD: return 0;
520+
#endif
521+
case K_PS: vterm_keyboard_start_paste(vterm); return 0;
522+
case K_PE: vterm_keyboard_end_paste(vterm); return 0;
463523
}
464524

465525
/*
466526
* Convert special keys to vterm keys:
467527
* - Write keys to vterm: vterm_keyboard_key()
468528
* - Write output to channel.
529+
* TODO: use mod_mask
469530
*/
470531
if (key != VTERM_KEY_NONE)
471532
/* Special key, let vterm convert it. */
472533
vterm_keyboard_key(vterm, key, mod);
473-
else
534+
else if (!mouse)
474535
/* Normal character, let vterm convert it. */
475536
vterm_keyboard_unichar(vterm, c, mod);
476537

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -769,6 +769,8 @@ static char *(features[]) =
769769

770770
static int included_patches[] =
771771
{ /* Add new patch number below this line */
772+
/**/
773+
807,
772774
/**/
773775
806,
774776
/**/

0 commit comments

Comments
 (0)