Skip to content

Commit d02c639

Browse files
committed
fix: don't shade diff windows
1 parent 0ef9819 commit d02c639

File tree

1 file changed

+46
-25
lines changed

1 file changed

+46
-25
lines changed

lua/shade.lua

Lines changed: 46 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ state.shade_nsid = nil
1414
state.notification_timer = nil
1515
state.notification_window = nil
1616

17-
-- TODO: log to file
17+
-- TODO: log to file and/or nvim_echo
1818
local 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})
148148
end
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
159161
end
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
170172
end
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+
172188
local 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())
199215
end
200216

201217
local 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)
278292
end
279293

280294
shade.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

Comments
 (0)