@@ -14,7 +14,7 @@ state.shade_nsid = nil
1414state .notification_timer = nil
1515state .notification_window = nil
1616
17- -- TODO: log to file
17+ -- TODO: log to file and/or nvim_echo
1818local function log (event , msg )
1919 if state .debug == false then
2020 return
@@ -147,28 +147,44 @@ local function map_key(mode, key, action)
147147 vim .api .nvim_set_keymap (mode , key , req_module , {noremap = true , silent = true })
148148end
149149
150- local function hide_overlay (winid )
150+
151+
152+ local function shade_window (winid )
151153 local overlay = state .active_overlays [winid ]
152154 if overlay then
153- api .nvim_win_set_option (overlay .winid , " winblend" , 100 )
154- log (" hide_overlay " ,
155- (" [%d] : overlay %d OFF (winblend: 100 [disabled] )" ):format (winid , overlay .winid ))
155+ api .nvim_win_set_option (overlay .winid , " winblend" , state . overlay_opacity )
156+ log (" shade_window " ,
157+ (" [%d] : overlay %d ON (winblend: %d )" ):format (winid , overlay .winid , state . overlay_opacity ))
156158 else
157- log (" hide_overlay " , " overlay not found for " .. winid )
159+ log (" shade_window " , " overlay not found for " .. winid )
158160 end
159161end
160162
161- local function show_overlay (winid )
163+ local function unshade_window (winid )
162164 local overlay = state .active_overlays [winid ]
163165 if overlay then
164- api .nvim_win_set_option (overlay .winid , " winblend" , state . overlay_opacity )
165- log (" show_overlay " ,
166- (" [%d] : overlay %d ON (winblend: %d )" ):format (winid , overlay .winid , state . overlay_opacity ))
166+ api .nvim_win_set_option (overlay .winid , " winblend" , 100 )
167+ log (" unshade_window " ,
168+ (" [%d] : overlay %d OFF (winblend: 100 [disabled] )" ):format (winid , overlay .winid ))
167169 else
168- log (" show_overlay " , " overlay not found for " .. winid )
170+ log (" unshade_window " , " overlay not found for " .. winid )
169171 end
170172end
171173
174+ -- shade everything on a tabpage except current window
175+ local function shade_tabpage (winid )
176+ winid = winid or api .nvim_get_current_win ()
177+ for overlay_winid , _ in pairs (state .active_overlays ) do
178+ local diff_enabled = api .nvim_win_get_option (overlay_winid , ' diff' )
179+ if overlay_winid ~= winid and diff_enabled == false then
180+ log (" deactivating window" , overlay_winid )
181+ shade_window (overlay_winid )
182+ end
183+ end
184+ end
185+
186+ --
187+
172188local function remove_all_overlays ()
173189 for _ , overlay in pairs (state .active_overlays ) do
174190 api .nvim_win_close (overlay .winid , true )
@@ -195,7 +211,7 @@ local function create_tabpage_overlays(tabid)
195211 wincfg = api .nvim_call_function (" getwininfo" , {winid })[1 ]
196212 create_overlay_window (winid , filter_wininfo (wincfg ))
197213 end
198- hide_overlay (api .nvim_get_current_win ())
214+ unshade_window (api .nvim_get_current_win ())
199215end
200216
201217local shade = {}
@@ -236,12 +252,15 @@ shade.init = function(opts)
236252 api .nvim_set_decoration_provider (state .shade_nsid , {on_win = shade .event_listener })
237253
238254 -- setup autocommands
239- api .nvim_command [[ augroup shade ]]
240- api .nvim_command [[ au! ]]
241- api .nvim_command [[ au WinEnter,VimEnter * call v:lua.require'shade'.autocmd('WinEnter', win_getid()) ]]
242- api .nvim_command [[ au WinClosed * call v:lua.require'shade'.autocmd('WinClosed', expand('<afile>')) ]]
243- api .nvim_command [[ au TabEnter * call v:lua.require'shade'.autocmd('TabEnter', win_getid()) ]]
244- api .nvim_command [[ augroup END ]]
255+ api .nvim_exec ([[
256+ augroup shade
257+ au!
258+ au WinEnter,VimEnter * call v:lua.require'shade'.autocmd('WinEnter', win_getid())
259+ au WinClosed * call v:lua.require'shade'.autocmd('WinClosed', expand('<afile>'))
260+ au TabEnter * call v:lua.require'shade'.autocmd('TabEnter', win_getid())
261+ au OptionSet diff call v:lua.require'shade'.autocmd('OptionSet', win_getid())
262+ augroup END
263+ ]] , false )
245264
246265 log (" Init" , " -- Shade.nvim started --" )
247266
@@ -266,15 +285,10 @@ shade.on_win_enter = function(event, winid)
266285 end
267286
268287 -- hide the overlay on entered window
269- hide_overlay (winid )
288+ unshade_window (winid )
270289
271290 -- place overlays on all other windows
272- for id , _ in pairs (state .active_overlays ) do
273- if id ~= winid then
274- log (" deactivating window" , id )
275- show_overlay (id )
276- end
277- end
291+ shade_tabpage (winid )
278292end
279293
280294shade .event_listener = function (_ , winid , _ , _ , _ )
@@ -424,6 +438,13 @@ M.autocmd = function(event, winid)
424438 remove_all_overlays ()
425439 create_tabpage_overlays (0 )
426440 end ,
441+ [" OptionSet" ] = function ()
442+ local diff_enabled = api .nvim_get_vvar (' option_new' )
443+ if diff_enabled then
444+ unshade_window (winid )
445+ shade_tabpage (winid )
446+ end
447+ end
427448 }
428449
429450 local fn = event_fn [event ]
0 commit comments