To: vim_dev@googlegroups.com Subject: Patch 8.0.0807 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.0.0807 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. Files: src/terminal.c *** ../vim-8.0.0806/src/terminal.c 2017-07-29 20:07:00.764940487 +0200 --- src/terminal.c 2017-07-29 22:01:45.251949226 +0200 *************** *** 36,42 **** * that buffer, attributes come from the scrollback buffer tl_scrollback. * * TODO: - * - Patch for functions: Yasuhiro Matsumoto, #1871 * - For the scrollback buffer store lines in the buffer, only attributes in * tl_scrollback. * - When the job ends: --- 36,41 ---- *************** *** 373,378 **** --- 372,391 ---- } /* + * Send a mouse position and click to the vterm + */ + static int + term_send_mouse(VTerm *vterm, int button, int pressed) + { + VTermModifier mod = VTERM_MOD_NONE; + + vterm_mouse_move(vterm, mouse_row - W_WINROW(curwin), + mouse_col - W_WINCOL(curwin), mod); + vterm_mouse_button(vterm, button, pressed, mod); + return TRUE; + } + + /* * Convert typed key "c" into bytes to send to the job. * Return the number of bytes in "buf". */ *************** *** 382,387 **** --- 395,401 ---- VTerm *vterm = term->tl_vterm; VTermKey key = VTERM_KEY_NONE; VTermModifier mod = VTERM_MOD_NONE; + int mouse = FALSE; switch (c) { *************** *** 391,397 **** --- 405,417 ---- case K_BS: c = BS; break; case K_DEL: key = VTERM_KEY_DEL; break; case K_DOWN: key = VTERM_KEY_DOWN; break; + case K_S_DOWN: mod = VTERM_MOD_SHIFT; + key = VTERM_KEY_DOWN; break; case K_END: key = VTERM_KEY_END; break; + case K_S_END: mod = VTERM_MOD_SHIFT; + key = VTERM_KEY_END; break; + case K_C_END: mod = VTERM_MOD_CTRL; + key = VTERM_KEY_END; break; case K_F10: key = VTERM_KEY_FUNCTION(10); break; case K_F11: key = VTERM_KEY_FUNCTION(11); break; case K_F12: key = VTERM_KEY_FUNCTION(12); break; *************** *** 405,410 **** --- 425,434 ---- case K_F8: key = VTERM_KEY_FUNCTION(8); break; case K_F9: key = VTERM_KEY_FUNCTION(9); break; case K_HOME: key = VTERM_KEY_HOME; break; + case K_S_HOME: mod = VTERM_MOD_SHIFT; + key = VTERM_KEY_HOME; break; + case K_C_HOME: mod = VTERM_MOD_CTRL; + key = VTERM_KEY_HOME; break; case K_INS: key = VTERM_KEY_INS; break; case K_K0: key = VTERM_KEY_KP_0; break; case K_K1: key = VTERM_KEY_KP_1; break; *************** *** 429,476 **** case K_KPLUS: key = VTERM_KEY_KP_PLUS; break; case K_KPOINT: key = VTERM_KEY_KP_PERIOD; break; case K_LEFT: key = VTERM_KEY_LEFT; break; case K_PAGEDOWN: key = VTERM_KEY_PAGEDOWN; break; case K_PAGEUP: key = VTERM_KEY_PAGEUP; break; case K_RIGHT: key = VTERM_KEY_RIGHT; break; case K_UP: key = VTERM_KEY_UP; break; case TAB: key = VTERM_KEY_TAB; break; ! case K_MOUSEUP: /* TODO */ break; ! case K_MOUSEDOWN: /* TODO */ break; ! case K_MOUSELEFT: /* TODO */ break; ! case K_MOUSERIGHT: /* TODO */ break; ! ! case K_LEFTMOUSE: /* TODO */ break; ! case K_LEFTMOUSE_NM: /* TODO */ break; ! case K_LEFTDRAG: /* TODO */ break; ! case K_LEFTRELEASE: /* TODO */ break; ! case K_LEFTRELEASE_NM: /* TODO */ break; ! case K_MIDDLEMOUSE: /* TODO */ break; ! case K_MIDDLEDRAG: /* TODO */ break; ! case K_MIDDLERELEASE: /* TODO */ break; ! case K_RIGHTMOUSE: /* TODO */ break; ! case K_RIGHTDRAG: /* TODO */ break; ! case K_RIGHTRELEASE: /* TODO */ break; ! case K_X1MOUSE: /* TODO */ break; ! case K_X1DRAG: /* TODO */ break; ! case K_X1RELEASE: /* TODO */ break; ! case K_X2MOUSE: /* TODO */ break; ! case K_X2DRAG: /* TODO */ break; ! case K_X2RELEASE: /* TODO */ break; ! ! /* TODO: handle all special keys and modifiers that terminal_loop() ! * does not handle. */ } /* * Convert special keys to vterm keys: * - Write keys to vterm: vterm_keyboard_key() * - Write output to channel. */ if (key != VTERM_KEY_NONE) /* Special key, let vterm convert it. */ vterm_keyboard_key(vterm, key, mod); ! else /* Normal character, let vterm convert it. */ vterm_keyboard_unichar(vterm, c, mod); --- 453,537 ---- case K_KPLUS: key = VTERM_KEY_KP_PLUS; break; case K_KPOINT: key = VTERM_KEY_KP_PERIOD; break; case K_LEFT: key = VTERM_KEY_LEFT; break; + case K_S_LEFT: mod = VTERM_MOD_SHIFT; + key = VTERM_KEY_LEFT; break; + case K_C_LEFT: mod = VTERM_MOD_CTRL; + key = VTERM_KEY_LEFT; break; case K_PAGEDOWN: key = VTERM_KEY_PAGEDOWN; break; case K_PAGEUP: key = VTERM_KEY_PAGEUP; break; case K_RIGHT: key = VTERM_KEY_RIGHT; break; + case K_S_RIGHT: mod = VTERM_MOD_SHIFT; + key = VTERM_KEY_RIGHT; break; + case K_C_RIGHT: mod = VTERM_MOD_CTRL; + key = VTERM_KEY_RIGHT; break; case K_UP: key = VTERM_KEY_UP; break; + case K_S_UP: mod = VTERM_MOD_SHIFT; + key = VTERM_KEY_UP; break; case TAB: key = VTERM_KEY_TAB; break; ! case K_MOUSEUP: mouse = term_send_mouse(vterm, 5, 1); break; ! case K_MOUSEDOWN: mouse = term_send_mouse(vterm, 4, 1); break; ! case K_MOUSELEFT: /* TODO */ return 0; ! case K_MOUSERIGHT: /* TODO */ return 0; ! ! case K_LEFTMOUSE: ! case K_LEFTMOUSE_NM: mouse = term_send_mouse(vterm, 1, 1); break; ! case K_LEFTDRAG: mouse = term_send_mouse(vterm, 1, 1); break; ! case K_LEFTRELEASE: ! case K_LEFTRELEASE_NM: mouse = term_send_mouse(vterm, 1, 0); break; ! case K_MIDDLEMOUSE: mouse = term_send_mouse(vterm, 2, 1); break; ! case K_MIDDLEDRAG: mouse = term_send_mouse(vterm, 2, 1); break; ! case K_MIDDLERELEASE: mouse = term_send_mouse(vterm, 2, 0); break; ! case K_RIGHTMOUSE: mouse = term_send_mouse(vterm, 3, 1); break; ! case K_RIGHTDRAG: mouse = term_send_mouse(vterm, 3, 1); break; ! case K_RIGHTRELEASE: mouse = term_send_mouse(vterm, 3, 0); break; ! case K_X1MOUSE: /* TODO */ return 0; ! case K_X1DRAG: /* TODO */ return 0; ! case K_X1RELEASE: /* TODO */ return 0; ! case K_X2MOUSE: /* TODO */ return 0; ! case K_X2DRAG: /* TODO */ return 0; ! case K_X2RELEASE: /* TODO */ return 0; ! ! case K_IGNORE: return 0; ! case K_NOP: return 0; ! case K_UNDO: return 0; ! case K_HELP: return 0; ! case K_XF1: key = VTERM_KEY_FUNCTION(1); break; ! case K_XF2: key = VTERM_KEY_FUNCTION(2); break; ! case K_XF3: key = VTERM_KEY_FUNCTION(3); break; ! case K_XF4: key = VTERM_KEY_FUNCTION(4); break; ! case K_SELECT: return 0; ! #ifdef FEAT_GUI ! case K_VER_SCROLLBAR: return 0; ! case K_HOR_SCROLLBAR: return 0; ! #endif ! #ifdef FEAT_GUI_TABLINE ! case K_TABLINE: return 0; ! case K_TABMENU: return 0; ! #endif ! #ifdef FEAT_NETBEANS_INTG ! case K_F21: key = VTERM_KEY_FUNCTION(21); break; ! #endif ! #ifdef FEAT_DND ! case K_DROP: return 0; ! #endif ! #ifdef FEAT_AUTOCMD ! case K_CURSORHOLD: return 0; ! #endif ! case K_PS: vterm_keyboard_start_paste(vterm); return 0; ! case K_PE: vterm_keyboard_end_paste(vterm); return 0; } /* * Convert special keys to vterm keys: * - Write keys to vterm: vterm_keyboard_key() * - Write output to channel. + * TODO: use mod_mask */ if (key != VTERM_KEY_NONE) /* Special key, let vterm convert it. */ vterm_keyboard_key(vterm, key, mod); ! else if (!mouse) /* Normal character, let vterm convert it. */ vterm_keyboard_unichar(vterm, c, mod); *** ../vim-8.0.0806/src/version.c 2017-07-29 22:21:14.203653289 +0200 --- src/version.c 2017-07-29 22:22:23.575167305 +0200 *************** *** 771,772 **** --- 771,774 ---- { /* Add new patch number below this line */ + /**/ + 807, /**/ -- DINGO: And after the spanking ... the oral sex. GALAHAD: Oh, dear! Well, I... GIRLS: The oral sex ... The oral sex. GALAHAD: Well, I suppose I could stay a BIT longer. "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///