diff --git a/lua/notify/config/init.lua b/lua/notify/config/init.lua index 253c9a2..483349f 100644 --- a/lua/notify/config/init.lua +++ b/lua/notify/config/init.lua @@ -71,8 +71,8 @@ local function validate_highlight(colour_or_group, needs_opacity) end end return function() - local group = vim.api.nvim_get_hl_by_name(colour_or_group, true) - if not group or not group.background then + local group = vim.api.nvim_get_hl(0, { name = colour_or_group, create = false, link = false }) + if not group or not group.bg then if needs_opacity and not opacity_warned then opacity_warned = true vim.schedule(function() @@ -88,14 +88,14 @@ Defaulting to #000000]], "warn", { title = "nvim-notify", on_open = function(win) local buf = vim.api.nvim_win_get_buf(win) - vim.api.nvim_buf_set_option(buf, "filetype", "markdown") + vim.api.nvim_set_option_value("filetype", "markdown", { buf = buf }) end, }) end) end return "#000000" end - return string.format("#%x", group.background) + return string.format("#%x", group.bg) end end diff --git a/lua/notify/service/buffer/highlights.lua b/lua/notify/service/buffer/highlights.lua index 07824bb..7f74d12 100644 --- a/lua/notify/service/buffer/highlights.lua +++ b/lua/notify/service/buffer/highlights.lua @@ -11,24 +11,6 @@ local util = require("notify.util") ---@field _config table local NotifyBufHighlights = {} -local function manual_get_hl(name) - local synID = vim.fn.synIDtrans(vim.fn.hlID(name)) - local result = { - foreground = tonumber(vim.fn.synIDattr(synID, "fg"):gsub("#", ""), 16), - background = tonumber(vim.fn.synIDattr(synID, "bg"):gsub("#", ""), 16), - } - return result -end - -local function get_hl(name) - local definition = vim.api.nvim_get_hl_by_name(name, true) - if definition[true] then - -- https://github.com/neovim/neovim/issues/18024 - return manual_get_hl(name) - end - return definition -end - function NotifyBufHighlights:new(level, buffer, config) local function linked_group(section) local orig = "Notify" .. level .. section @@ -38,8 +20,11 @@ function NotifyBufHighlights:new(level, buffer, config) local new = orig .. buffer vim.api.nvim_set_hl(0, new, { link = orig }) + local hl = vim.api.nvim_get_hl(0, { name = orig, create = false, link = false }) + -- Removes the unwanted 'default' key, as we will copy the table for updating the highlight later. + hl.default = nil - return new, get_hl(new) + return new, hl end local title, title_def = linked_group("Title") @@ -83,7 +68,7 @@ function NotifyBufHighlights:_redefine_treesitter() return new end vim.api.nvim_set_hl(0, new, { link = orig }) - self.groups[new] = get_hl(new) + self.groups[new] = vim.api.nvim_get_hl(0, { name = new, link = false }) return new end @@ -150,31 +135,30 @@ end function NotifyBufHighlights:set_opacity(alpha) if not self._treesitter_redefined - and vim.api.nvim_buf_get_option(self.buffer, "filetype") ~= "notify" + and vim.api.nvim_get_option_value("filetype", { buf = self.buffer }) ~= "notify" then self:_redefine_treesitter() end self.opacity = alpha local background = self._config.background_colour() + local updated = false for group, fields in pairs(self.groups) do - local updated_fields = {} - vim.api.nvim_set_hl(0, group, updated_fields) - local hl_string = "" - if fields.foreground then - hl_string = "guifg=#" - .. string.format("%06x", util.blend(fields.foreground, background, alpha / 100)) + local fg = fields.fg + if fg then + fg = util.blend(fg, background, alpha / 100) end - if fields.background then - hl_string = hl_string - .. " guibg=#" - .. string.format("%06x", util.blend(fields.background, background, alpha / 100)) + local bg = fields.bg + if bg then + bg = util.blend(bg, background, alpha / 100) end - if hl_string ~= "" then - -- Can't use nvim_set_hl https://github.com/neovim/neovim/issues/18160 - vim.cmd("hi " .. group .. " " .. hl_string) + if fg ~= fields.fg or bg ~= fields.bg then + local hl = vim.tbl_extend('force', fields, { fg = fg, bg = bg }) + vim.api.nvim_set_hl(0, group, hl) + updated = true end end + return updated end function NotifyBufHighlights:get_opacity() diff --git a/lua/notify/service/init.lua b/lua/notify/service/init.lua index 9a90909..9a158a7 100644 --- a/lua/notify/service/init.lua +++ b/lua/notify/service/init.lua @@ -55,12 +55,7 @@ function NotificationService:push(notif) self._pending:push(notif_buf) if not self._running then self:_run() - else - -- Forces a render during blocking events - -- https://github.com/rcarriga/nvim-notify/issues/5 - pcall(self._animator.render, self._animator, self._pending, 1 / self._fps) end - vim.cmd("redraw") return buf end diff --git a/lua/notify/windows/init.lua b/lua/notify/windows/init.lua index 83c2add..61a6068 100644 --- a/lua/notify/windows/init.lua +++ b/lua/notify/windows/init.lua @@ -273,12 +273,11 @@ function WindowAnimator:_get_dimensions(notif_buf) end function WindowAnimator:_apply_win_state(win, win_state) - local win_updated = false + local hl_updated = false if win_state.opacity then - win_updated = true local notif_buf = self.notif_bufs[win] if notif_buf:is_valid() then - notif_buf.highlights:set_opacity(win_state.opacity.position) + hl_updated = notif_buf.highlights:set_opacity(win_state.opacity.position) vim.fn.setwinvar( win, "&winhl", @@ -288,6 +287,7 @@ function WindowAnimator:_apply_win_state(win, win_state) end local exists, conf = util.get_win_config(win) local new_conf = {} + local win_updated = false if not exists then self:_remove_win(win) else @@ -317,7 +317,9 @@ function WindowAnimator:_apply_win_state(win, win_state) api.nvim_win_set_config(win, new_conf) end end - return win_updated + -- The 'flush' key is set to enforce redrawing during blocking event. + vim.api.nvim__redraw({ win = win, valid = false, flush = true }) + return hl_updated or win_updated end ---@return WindowAnimator