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
0 commit comments