Skip to content

Commit 539c974

Browse files
committed
wip
1 parent 0c6cca9 commit 539c974

File tree

2 files changed

+81
-4
lines changed

2 files changed

+81
-4
lines changed

lua/lualine.lua

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@ local timers = {
1717
stl_timer = vim.loop.new_timer(),
1818
tal_timer = vim.loop.new_timer(),
1919
wb_timer = vim.loop.new_timer(),
20+
refresh_check_timer = vim.loop.new_timer(),
2021
halt_stl_refresh = false, -- mutex ?
2122
halt_tal_refresh = false,
2223
halt_wb_refresh = false,
2324
}
2425

26+
2527
local last_focus = {}
2628
local refresh_real_curwin
2729

@@ -333,6 +335,13 @@ local function should_ignore_focus(user_config, win)
333335
end
334336
end
335337

338+
local refresh_event_queue = {
339+
has_events = false,
340+
statusline = {},
341+
tabline = {},
342+
winbar = {},
343+
}
344+
336345
---@alias LualineRefreshOptsKind
337346
---| 'all'
338347
---| 'tabpage'
@@ -344,7 +353,8 @@ end
344353
---@class LualineRefreshOpts
345354
---@field scope LualineRefreshOptsKind
346355
---@field place LualineRefreshOptsPlace[]
347-
---@field trigger 'timer' | 'init' |'unknown'
356+
---@field trigger 'timer' | 'init' | 'autocmd' |'unknown'
357+
---@field queued boolean
348358
--- Refresh contents of lualine
349359
---@param opts LualineRefreshOpts
350360
local function refresh(opts)
@@ -357,6 +367,15 @@ local function refresh(opts)
357367
trigger = 'unknown',
358368
})
359369

370+
371+
if not opts.queued then
372+
for _, place in ipairs(opts.place) do
373+
refresh_event_queue['has_events'] = true
374+
refresh_event_queue[place] = vim.tbl_extend('force', opts, {place = {place}, queued = true})
375+
end
376+
return
377+
end
378+
360379
local wins = {}
361380
local old_actual_curwin = vim.g.actual_curwin
362381

@@ -449,6 +468,7 @@ end
449468
local function set_tabline(hide)
450469
vim.loop.timer_stop(timers.tal_timer)
451470
timers.halt_tal_refresh = true
471+
vim.cmd([[augroup lualine_tal_refresh | exe "autocmd!" | augroup END]])
452472
if not hide and next(config.tabline) ~= nil then
453473
vim.loop.timer_start(
454474
timers.tal_timer,
@@ -458,6 +478,13 @@ local function set_tabline(hide)
458478
refresh { scope = 'tabpage', place = { 'tabline' }, trigger = 'timer' }
459479
end, 3, 'lualine: Failed to refresh tabline')
460480
)
481+
modules.utils.define_autocmd(
482+
table.concat(config.options.refresh.events, ','),
483+
'*',
484+
"call v:lua.require'lualine'.refresh({'kind': 'tabpage', 'place': ['tabline'], 'trigger': 'autocmd'})",
485+
'lualine_tal_refresh'
486+
)
487+
461488
modules.nvim_opts.set('showtabline', config.options.always_show_tabline and 2 or 1, { global = true })
462489
timers.halt_tal_refresh = false
463490
vim.schedule(function()
@@ -471,12 +498,37 @@ local function set_tabline(hide)
471498
end
472499
end
473500

501+
502+
local function check_refresh()
503+
if not refresh_event_queue.has_events then return end
504+
refresh_event_queue.has_events = nil
505+
506+
for place, refresh_cmd in pairs(refresh_event_queue) do
507+
if type(refresh_cmd) == "table" and refresh_cmd.queued == true then
508+
refresh(refresh_cmd)
509+
refresh_event_queue[place] = {}
510+
end
511+
end
512+
end
513+
514+
local function set_refresh_checker()
515+
vim.loop.timer_stop(timers.refresh_check_timer)
516+
vim.loop.timer_start(
517+
timers.refresh_check_timer,
518+
0,
519+
config.options.refresh.check,
520+
modules.utils.timer_call(timers.refresh_check_timer, 'lualine_refresh_check', check_refresh,
521+
3, 'lualine: Failed to refresh statusline')
522+
)
523+
end
524+
474525
--- Sets &statusline option to lualine
475526
--- adds auto command to redraw lualine on VimResized event
476527
---@param hide boolean|nil if should hide statusline
477528
local function set_statusline(hide)
478529
vim.loop.timer_stop(timers.stl_timer)
479530
timers.halt_stl_refresh = true
531+
vim.cmd([[augroup lualine_stl_refresh | exe "autocmd!" | augroup END]])
480532
if not hide and (next(config.sections) ~= nil or next(config.inactive_sections) ~= nil) then
481533
modules.nvim_opts.set('statusline', '%#lualine_transparent#', { global = true })
482534
if config.options.globalstatus then
@@ -489,6 +541,12 @@ local function set_statusline(hide)
489541
refresh { scope = 'window', place = { 'statusline' }, trigger = 'timer' }
490542
end, 3, 'lualine: Failed to refresh statusline')
491543
)
544+
modules.utils.define_autocmd(
545+
table.concat(config.options.refresh.events, ','),
546+
'*',
547+
"call v:lua.require'lualine'.refresh({'kind': 'window', 'place': ['statusline'], 'trigger': 'autocmd'})",
548+
'lualine_stl_refresh'
549+
)
492550
else
493551
modules.nvim_opts.set('laststatus', 2, { global = true })
494552
vim.loop.timer_start(
@@ -499,6 +557,13 @@ local function set_statusline(hide)
499557
refresh { scope = 'tabpage', place = { 'statusline' }, trigger = 'timer' }
500558
end, 3, 'lualine: Failed to refresh statusline')
501559
)
560+
561+
modules.utils.define_autocmd(
562+
table.concat(config.options.refresh.events, ','),
563+
'*',
564+
"call v:lua.require'lualine'.refresh({'kind': 'tabpage', 'place': ['statusline'], 'trigger': 'autocmd'})",
565+
'lualine_stl_refresh'
566+
)
502567
end
503568
timers.halt_stl_refresh = false
504569
vim.schedule(function()
@@ -524,6 +589,7 @@ end
524589
local function set_winbar(hide)
525590
vim.loop.timer_stop(timers.wb_timer)
526591
timers.halt_wb_refresh = true
592+
vim.cmd([[augroup lualine_wb_refresh | exe "autocmd!" | augroup END]])
527593
if not hide and (next(config.winbar) ~= nil or next(config.inactive_winbar) ~= nil) then
528594
vim.loop.timer_start(
529595
timers.wb_timer,
@@ -533,6 +599,13 @@ local function set_winbar(hide)
533599
refresh { scope = 'tabpage', place = { 'winbar' }, trigger = 'timer' }
534600
end, 3, 'lualine: Failed to refresh winbar')
535601
)
602+
modules.utils.define_autocmd(
603+
table.concat(config.options.refresh.events, ','),
604+
'*',
605+
"call v:lua.require'lualine'.refresh({'kind': 'tabpage', 'place': ['winbar'], 'trigger': 'autocmd'})",
606+
'lualine_wb_refresh'
607+
)
608+
536609
timers.halt_wb_refresh = false
537610
vim.schedule(function()
538611
-- imediately refresh upon load.
@@ -590,6 +663,7 @@ can use older compatible versions of lualine using compat tags like
590663
return false
591664
end
592665

666+
593667
-- lualine.setup function
594668
--- sets new user config
595669
--- This function doesn't load components/theme etc... They are done before
@@ -613,6 +687,7 @@ local function setup(user_config)
613687
set_statusline()
614688
set_tabline()
615689
set_winbar()
690+
set_refresh_checker()
616691
end
617692
if package.loaded['lualine.utils.notices'] then
618693
modules.utils_notices.notice_message_startup()

lua/lualine/config.lua

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@ local config = {
2121
always_show_tabline = true,
2222
globalstatus = vim.go.laststatus == 3,
2323
refresh = {
24-
statusline = 100,
25-
tabline = 100,
26-
winbar = 100,
24+
statusline = 1000,
25+
tabline = 1000,
26+
winbar = 1000,
27+
check = 16, -- ~60fps
28+
events = { 'WinEnter','BufEnter','BufWritePost','SessionLoadPost','FileChangedShellPost','VimResized','Filetype','CursorMoved','CursorMovedI','ModeChanged' }
2729
},
2830
},
2931
sections = {

0 commit comments

Comments
 (0)