diff --git a/src/popupwin.c b/src/popupwin.c index 3461313ec02fd202b81467d73d72814f0b6e656f..0af6d52de9f39e5950b6adf26e5eb8481615beb0 100644 --- 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 diff --git a/src/testdir/dumps/Test_popupwin_term_01.dump b/src/testdir/dumps/Test_popupwin_term_01.dump new file mode 100644 index 0000000000000000000000000000000000000000..edc0b001b415019cc816fc74fd5905c0def61227 --- /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 diff --git a/src/testdir/dumps/Test_popupwin_term_02.dump b/src/testdir/dumps/Test_popupwin_term_02.dump new file mode 100644 index 0000000000000000000000000000000000000000..d5636c9838d31a25e25d570b6e9676e337032d5a --- /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 diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim index 8631c71e7f4acdbe8a8163bc2c4823e671f14553..140f6825b0760208d3cd08b3a0e85cf1b485bbf9 100644 --- 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 diff --git a/src/version.c b/src/version.c index d165232881647593de6413d49701a19242888d18..96f29fa3780467374cf2e12098c5e5bfdbbae867 100644 --- a/src/version.c +++ b/src/version.c @@ -754,6 +754,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1193, /**/ 1192, /**/