Mercurial > vim
changeset 21285:35a7cab0bdfd v8.2.1193
patch 8.2.1193: terminal window not redrawn when dragging a popup window
Commit: https://github.com/vim/vim/commit/35910f2d54bd670a0d83b3474b4c23faa94252d3
Author: Bram Moolenaar <Bram@vim.org>
Date: Sun Jul 12 19:24:10 2020 +0200
patch 8.2.1193: terminal window not redrawn when dragging a popup window
Problem: Terminal window not redrawn when dragging a popup window over it.
Solution: Redraw terminal window. (fixes https://github.com/vim/vim/issues/6438)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sun, 12 Jul 2020 19:30:04 +0200 |
parents | 745c5950f083 |
children | a3e94fc0cba5 |
files | src/popupwin.c src/testdir/dumps/Test_popupwin_term_01.dump src/testdir/dumps/Test_popupwin_term_02.dump src/testdir/test_popupwin.vim src/version.c |
diffstat | 5 files changed, 76 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/src/popupwin.c +++ b/src/popupwin.c @@ -3504,22 +3504,29 @@ may_update_popup_mask(int type) wp = mouse_find_win(&line_cp, &col_cp, IGNORE_POPUP); if (wp != NULL) { - if (wp != prev_wp) - { - vim_memset(plines_cache, 0, sizeof(int) * Rows); - prev_wp = wp; - } - - if (line_cp >= wp->w_height) - // In (or below) status line - wp->w_redr_status = TRUE; + // A terminal window needs to be redrawn. + if (bt_terminal(wp->w_buffer)) + redraw_win_later(wp, NOT_VALID); else { - // compute the position in the buffer line from - // the position in the window - mouse_comp_pos(wp, &line_cp, &col_cp, + if (wp != prev_wp) + { + vim_memset(plines_cache, 0, + sizeof(int) * Rows); + prev_wp = wp; + } + + if (line_cp >= wp->w_height) + // In (or below) status line + wp->w_redr_status = TRUE; + else + { + // compute the position in the buffer line + // from the position in the window + mouse_comp_pos(wp, &line_cp, &col_cp, &lnum, plines_cache); - redrawWinline(wp, lnum); + redrawWinline(wp, lnum); + } } // This line is going to be redrawn, no need to
new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_popupwin_term_01.dump @@ -0,0 +1,10 @@ +|$+0&#ffffff0| @73 +@75 +@34|╔+0#0000001#ffd7ff255|═@3|╗| +0#0000000#ffffff0@34 +@34|║+0#0000001#ffd7ff255|1@3|║| +0#0000000#ffffff0@34 +|!+0#ffffff16#00e0003|/|b|i|n|/|s|h| |[|r|u|n@1|i|n|g|]| @15|║+0#0000001#ffd7ff255|2@3|║| +0#ffffff16#00e0003@34 +> +0#0000000#ffffff0@33|╚+0#0000001#ffd7ff255|═@3|⇲| +0#0000000#ffffff0@34 +|~+0#4040ff13&| @73 +|~| @73 +|[+3#0000000&|N|o| |N|a|m|e|]| @65 +| +0&&@74
new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_popupwin_term_02.dump @@ -0,0 +1,10 @@ +|$+0&#ffffff0| @73 +@75 +@14|╔+0#0000001#ffd7ff255|═@3|╗| +0#0000000#ffffff0@54 +@14|║+0#0000001#ffd7ff255|1@3|║| +0#0000000#ffffff0@54 +|!+0#ffffff16#00e0003|/|b|i|n|/|s|h| |[|r|u|n@1|║+0#0000001#ffd7ff255|2@3|║| +0#ffffff16#00e0003@54 +> +0#0000000#ffffff0@13|╚+0#0000001#ffd7ff255|═@3|⇲| +0#0000000#ffffff0@54 +|~+0#4040ff13&| @73 +|~| @73 +|[+3#0000000&|N|o| |N|a|m|e|]| @65 +|:+0&&|c|a|l@1| |D|r|a|g|i|t|(|)| @60
--- a/src/testdir/test_popupwin.vim +++ b/src/testdir/test_popupwin.vim @@ -577,6 +577,40 @@ func Test_popup_drag() call delete('XtestPopupDrag') endfunc +func Test_popup_drag_termwin() + CheckUnix + CheckScreendump + CheckFeature terminal + + " create a popup that covers the terminal window + let lines =<< trim END + set shell=/bin/sh noruler + terminal + $wincmd w + let winid = popup_create(['1111', '2222'], #{ + \ drag: 1, + \ resize: 1, + \ border: [], + \ line: 3, + \ }) + func Dragit() + call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt") + endfunc + map <silent> <F3> :call test_setmouse(3, &columns / 2)<CR> + map <silent> <F4> :call test_setmouse(3, &columns / 2 - 20)<CR> + END + call writefile(lines, 'XtestPopupTerm') + let buf = RunVimInTerminal('-S XtestPopupTerm', #{rows: 10}) + call VerifyScreenDump(buf, 'Test_popupwin_term_01', {}) + + call term_sendkeys(buf, ":call Dragit()\<CR>") + call VerifyScreenDump(buf, 'Test_popupwin_term_02', {}) + + " clean up + call StopVimInTerminal(buf) + call delete('XtestPopupTerm') +endfunc + func Test_popup_close_with_mouse() CheckScreendump