fix(ui): startup intro message should be visible with ext_multigrid

As this message is literally drawn on top of the EOB area of the first
window, the simple solution is to just draw the message on top of the
grid of the first window.

We still want #24764 (msg_intro event) but now only for ext_messages.
This commit is contained in:
bfredl 2024-03-15 09:23:18 +01:00
parent 062c0245e3
commit a8522f02e9
2 changed files with 87 additions and 5 deletions

View File

@ -32,6 +32,7 @@
#include "nvim/option_vars.h"
#include "nvim/os/os.h"
#include "nvim/strings.h"
#include "nvim/ui.h"
#include "nvim/version.h"
// for ":version", ":intro", and "nvim --version"
@ -2724,7 +2725,7 @@ bool may_show_intro(void)
/// Or with the ":intro" command (for Sven :-).
///
/// @param colon true for ":intro"
void intro_message(int colon)
void intro_message(bool colon)
{
static char *(lines[]) = {
N_(NVIM_VERSION_LONG),
@ -2801,7 +2802,7 @@ void intro_message(int colon)
}
if (*mesg != NUL) {
do_intro_line(row, mesg, 0);
do_intro_line(row, mesg, colon);
}
row++;
@ -2812,7 +2813,7 @@ void intro_message(int colon)
}
}
static void do_intro_line(int row, char *mesg, int attr)
static void do_intro_line(int row, char *mesg, bool colon)
{
int l;
@ -2825,7 +2826,12 @@ static void do_intro_line(int row, char *mesg, int attr)
col = 0;
}
grid_line_start(&default_grid, row);
ScreenGrid *grid = &default_grid;
if (!colon && ui_has(kUIMultigrid)) {
grid = &firstwin->w_grid;
}
grid_line_start(grid, row);
// Split up in parts to highlight <> items differently.
for (char *p = mesg; *p != NUL; p += l) {
for (l = 0;
@ -2834,7 +2840,7 @@ static void do_intro_line(int row, char *mesg, int attr)
l += utfc_ptr2len(p + l) - 1;
}
assert(row <= INT_MAX && col <= INT_MAX);
col += grid_line_puts(col, p, l, *p == '<' ? HL_ATTR(HLF_8) : attr);
col += grid_line_puts(col, p, l, *p == '<' ? HL_ATTR(HLF_8) : 0);
}
grid_line_flush();
}

View File

@ -1751,6 +1751,82 @@ describe('ui/ext_messages', function()
end)
end)
it('ui/ext_multigrid supports intro screen', function()
clear { args_rm = { '--headless' }, args = { '--cmd', 'set shortmess-=I' } }
local screen = Screen.new(80, 24)
screen:attach({ rgb = true, ext_multigrid = true })
screen:set_default_attr_ids {
[1] = { bold = true, foreground = Screen.colors.Blue1 },
[2] = { foreground = Screen.colors.Grey100, background = Screen.colors.Red },
[3] = { bold = true },
[4] = { bold = true, foreground = Screen.colors.SeaGreen4 },
[5] = { foreground = Screen.colors.Blue1 },
}
screen:expect {
grid = [[
## grid 1
[2:--------------------------------------------------------------------------------]|*23
[3:--------------------------------------------------------------------------------]|
## grid 2
^ |
{1:~ }|*4
{MATCH:.*}|
{1:~ }|
{1:~ }Nvim is open source and freely distributable{1: }|
{1:~ }https://neovim.io/#chat{1: }|
{1:~ }|
{1:~ }type :help nvim{5:<Enter>} if you are new! {1: }|
{1:~ }type :checkhealth{5:<Enter>} to optimize Nvim{1: }|
{1:~ }type :q{5:<Enter>} to exit {1: }|
{1:~ }type :help{5:<Enter>} for help {1: }|
{1:~ }|
{1:~{MATCH: +}}type :help news{5:<Enter>} to see changes in v{MATCH:%d+%.%d+}{1:{MATCH: +}}|
{1:~ }|
{MATCH:.*}|*2
{1:~ }|*4
## grid 3
|
]],
win_viewport = {
[2] = {
win = 1000,
topline = 0,
botline = 2,
curline = 0,
curcol = 0,
linecount = 1,
sum_scroll_delta = 0,
},
},
}
feed 'ix'
screen:expect {
grid = [[
## grid 1
[2:--------------------------------------------------------------------------------]|*23
[3:--------------------------------------------------------------------------------]|
## grid 2
x^ |
{1:~ }|*22
## grid 3
{3:-- INSERT --} |
]],
win_viewport = {
[2] = {
win = 1000,
topline = 0,
botline = 2,
curline = 0,
curcol = 1,
linecount = 1,
sum_scroll_delta = 0,
},
},
}
end)
describe('ui/msg_puts_printf', function()
it('output multibyte characters correctly', function()
local screen