diff options
Diffstat (limited to 'data/vim/patches/8.1.1125')
-rw-r--r-- | data/vim/patches/8.1.1125 | 355 |
1 files changed, 355 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.1125 b/data/vim/patches/8.1.1125 new file mode 100644 index 000000000..a8bcd610b --- /dev/null +++ b/data/vim/patches/8.1.1125 @@ -0,0 +1,355 @@ +To: vim_dev@googlegroups.com +Subject: Patch 8.1.1125 +Fcc: outbox +From: Bram Moolenaar <Bram@moolenaar.net> +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 8.1.1125 +Problem: Libvterm does not handle the window position report. +Solution: Let libvterm call the fallback CSI handler when not handling CSI + sequence. Handle the window position report in Vim. +Files: src/libvterm/src/state.c, src/terminal.c, src/ui.c, + src/proto/ui.pro, src/evalfunc.c, src/testdir/test_terminal.vim + + +*** ../vim-8.1.1124/src/libvterm/src/state.c 2018-12-24 21:38:40.814173687 +0100 +--- src/libvterm/src/state.c 2019-04-06 14:44:25.847900874 +0200 +*************** +*** 905,910 **** +--- 905,911 ---- + int leader_byte = 0; + int intermed_byte = 0; + VTermPos oldpos = state->pos; ++ int handled = 1; + + /* Some temporaries for later code */ + int count, val; +*************** +*** 1416,1421 **** +--- 1417,1426 ---- + case 8: /* CSI 8 ; rows ; cols t set size */ + if (argcount == 3) + on_resize(CSI_ARG(args[1]), CSI_ARG(args[2]), state); ++ break; ++ default: ++ handled = 0; ++ break; + } + break; + +*************** +*** 1450,1455 **** +--- 1455,1465 ---- + break; + + default: ++ handled = 0; ++ break; ++ } ++ ++ if (!handled) { + if(state->fallbacks && state->fallbacks->csi) + if((*state->fallbacks->csi)(leader, args, argcount, intermed, command, state->fbdata)) + return 1; +*** ../vim-8.1.1124/src/terminal.c 2019-03-30 18:46:57.360077328 +0100 +--- src/terminal.c 2019-04-06 15:25:12.799197577 +0200 +*************** +*** 3842,3855 **** + return 1; + } + + static VTermParserCallbacks parser_fallbacks = { +! NULL, /* text */ +! NULL, /* control */ +! NULL, /* escape */ +! NULL, /* csi */ +! parse_osc, /* osc */ +! NULL, /* dcs */ +! NULL /* resize */ + }; + + /* +--- 3842,3909 ---- + return 1; + } + ++ /* ++ * Called by libvterm when it cannot recognize a CSI sequence. ++ * We recognize the window position report. ++ */ ++ static int ++ parse_csi( ++ const char *leader UNUSED, ++ const long args[], ++ int argcount, ++ const char *intermed UNUSED, ++ char command, ++ void *user) ++ { ++ term_T *term = (term_T *)user; ++ char buf[100]; ++ int len; ++ int x = 0; ++ int y = 0; ++ win_T *wp; ++ ++ // We recognize only CSI 13 t ++ if (command != 't' || argcount != 1 || args[0] != 13) ++ return 0; // not handled ++ ++ // When getting the window position fails it results in zero/zero. ++ (void)ui_get_winpos(&x, &y, (varnumber_T)100); ++ ++ FOR_ALL_WINDOWS(wp) ++ if (wp->w_buffer == term->tl_buffer) ++ break; ++ if (wp != NULL) ++ { ++ #ifdef FEAT_GUI ++ if (gui.in_use) ++ { ++ x += wp->w_wincol * gui.char_width; ++ y += W_WINROW(wp) * gui.char_height; ++ } ++ else ++ #endif ++ { ++ // We roughly estimate the position of the terminal window inside ++ // the Vim window by assuing a 10 x 7 character cell. ++ x += wp->w_wincol * 7; ++ y += W_WINROW(wp) * 10; ++ } ++ } ++ ++ len = vim_snprintf(buf, 100, "\x1b[3;%d;%dt", x, y); ++ channel_send(term->tl_job->jv_channel, get_tty_part(term), ++ (char_u *)buf, len, NULL); ++ return 1; ++ } ++ + static VTermParserCallbacks parser_fallbacks = { +! NULL, // text +! NULL, // control +! NULL, // escape +! parse_csi, // csi +! parse_osc, // osc +! NULL, // dcs +! NULL // resize + }; + + /* +*** ../vim-8.1.1124/src/ui.c 2019-03-02 10:13:36.800974804 +0100 +--- src/ui.c 2019-04-06 16:18:21.290945446 +0200 +*************** +*** 627,632 **** +--- 627,653 ---- + } + } + ++ #if (defined(FEAT_EVAL) \ ++ && (defined(FEAT_GUI) \ ++ || (defined(HAVE_TGETENT) && defined(FEAT_TERMRESPONSE)))) \ ++ || defined(PROTO) ++ /* ++ * Get the window position in pixels, if possible. ++ * Return FAIL when not possible. ++ */ ++ int ++ ui_get_winpos(int *x, int *y, varnumber_T timeout) ++ { ++ # ifdef FEAT_GUI ++ if (gui.in_use) ++ return gui_mch_get_winpos(x, y); ++ # endif ++ # if defined(HAVE_TGETENT) && defined(FEAT_TERMRESPONSE) ++ return term_get_winpos(x, y, timeout); ++ # endif ++ } ++ #endif ++ + void + ui_breakcheck(void) + { +*** ../vim-8.1.1124/src/proto/ui.pro 2019-01-27 16:55:44.276707556 +0100 +--- src/proto/ui.pro 2019-04-06 15:15:57.453489712 +0200 +*************** +*** 11,16 **** +--- 11,17 ---- + int ui_get_shellsize(void); + void ui_set_shellsize(int mustset); + void ui_new_shellsize(void); ++ int ui_get_winpos(int *x, int *y, varnumber_T timeout); + void ui_breakcheck(void); + void ui_breakcheck_force(int force); + void clip_init(int can_use); +*** ../vim-8.1.1124/src/evalfunc.c 2019-04-06 13:18:06.737335067 +0200 +--- src/evalfunc.c 2019-04-06 16:18:24.146930813 +0200 +*************** +*** 5985,6004 **** + + if (rettv_list_alloc(rettv) == FAIL) + return; +! #ifdef FEAT_GUI +! if (gui.in_use) +! (void)gui_mch_get_winpos(&x, &y); +! # if defined(HAVE_TGETENT) && defined(FEAT_TERMRESPONSE) +! else +! # endif +! #endif +! #if defined(HAVE_TGETENT) && defined(FEAT_TERMRESPONSE) + { + varnumber_T timeout = 100; + + if (argvars[0].v_type != VAR_UNKNOWN) + timeout = tv_get_number(&argvars[0]); +! term_get_winpos(&x, &y, timeout); + } + #endif + list_append_number(rettv->vval.v_list, (varnumber_T)x); +--- 5985,5998 ---- + + if (rettv_list_alloc(rettv) == FAIL) + return; +! #if defined(FEAT_GUI) || (defined(HAVE_TGETENT) && defined(FEAT_TERMRESPONSE)) + { + varnumber_T timeout = 100; + + if (argvars[0].v_type != VAR_UNKNOWN) + timeout = tv_get_number(&argvars[0]); +! +! (void)ui_get_winpos(&x, &y, timeout); + } + #endif + list_append_number(rettv->vval.v_list, (varnumber_T)x); +*************** +*** 6013,6033 **** + f_getwinposx(typval_T *argvars UNUSED, typval_T *rettv) + { + rettv->vval.v_number = -1; +! #ifdef FEAT_GUI +! if (gui.in_use) +! { +! int x, y; +! +! if (gui_mch_get_winpos(&x, &y) == OK) +! rettv->vval.v_number = x; +! return; +! } +! #endif +! #if defined(HAVE_TGETENT) && defined(FEAT_TERMRESPONSE) + { + int x, y; + +! if (term_get_winpos(&x, &y, (varnumber_T)100) == OK) + rettv->vval.v_number = x; + } + #endif +--- 6007,6017 ---- + f_getwinposx(typval_T *argvars UNUSED, typval_T *rettv) + { + rettv->vval.v_number = -1; +! #if defined(FEAT_GUI) || (defined(HAVE_TGETENT) && defined(FEAT_TERMRESPONSE)) + { + int x, y; + +! if (ui_get_winpos(&x, &y, 100) == OK) + rettv->vval.v_number = x; + } + #endif +*************** +*** 6040,6060 **** + f_getwinposy(typval_T *argvars UNUSED, typval_T *rettv) + { + rettv->vval.v_number = -1; +! #ifdef FEAT_GUI +! if (gui.in_use) +! { +! int x, y; +! +! if (gui_mch_get_winpos(&x, &y) == OK) +! rettv->vval.v_number = y; +! return; +! } +! #endif +! #if defined(HAVE_TGETENT) && defined(FEAT_TERMRESPONSE) + { + int x, y; + +! if (term_get_winpos(&x, &y, (varnumber_T)100) == OK) + rettv->vval.v_number = y; + } + #endif +--- 6024,6034 ---- + f_getwinposy(typval_T *argvars UNUSED, typval_T *rettv) + { + rettv->vval.v_number = -1; +! #if defined(FEAT_GUI) || (defined(HAVE_TGETENT) && defined(FEAT_TERMRESPONSE)) + { + int x, y; + +! if (ui_get_winpos(&x, &y, 100) == OK) + rettv->vval.v_number = y; + } + #endif +*** ../vim-8.1.1125/src/testdir/test_terminal.vim 2019-04-06 12:39:47.439967638 +0200 +--- src/testdir/test_terminal.vim 2019-04-06 17:22:33.203006052 +0200 +*************** +*** 1887,1889 **** +--- 1887,1922 ---- + au! BufLeave + set statusline= + endfunc ++ ++ func Test_terminal_getwinpos() ++ " split, go to the bottom-right window ++ split ++ wincmd j ++ set splitright ++ ++ call writefile([ ++ \ 'echo getwinpos()', ++ \ ], 'XTest_getwinpos') ++ let buf = RunVimInTerminal('-S XTest_getwinpos', {'cols': 60}) ++ call term_wait(buf) ++ ++ " Find the output of getwinpos() in the bottom line. ++ let rows = term_getsize(buf)[0] ++ call WaitForAssert({-> assert_match('\[\d\+, \d\+\]', term_getline(buf, rows))}) ++ let line = term_getline(buf, rows) ++ let xpos = str2nr(substitute(line, '\[\(\d\+\), \d\+\]', '\1', '')) ++ let ypos = str2nr(substitute(line, '\[\d\+, \(\d\+\)\]', '\1', '')) ++ ++ " Position must be bigger than the getwinpos() result of Vim itself. ++ let [xroot, yroot] = getwinpos() ++ call assert_inrange(xroot + 2, xroot + 1000, xpos) ++ call assert_inrange(yroot + 2, yroot + 1000, ypos) ++ ++ call term_wait(buf) ++ call term_sendkeys(buf, ":q\<CR>") ++ call StopVimInTerminal(buf) ++ call delete('XTest_getwinpos') ++ exe buf . 'bwipe!' ++ set splitright& ++ only! ++ endfunc +*** ../vim-8.1.1124/src/version.c 2019-04-06 14:22:17.758642630 +0200 +--- src/version.c 2019-04-06 17:24:10.354521046 +0200 +*************** +*** 773,774 **** +--- 773,776 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 1125, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +214. Your MCI "Circle of Friends" are all Hayes-compatible. + + /// 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 /// |