mirror of
https://github.com/brues-code/pfUI.git
synced 2026-11-07 02:58:57 +00:00
HookAddonOrVariable: drain pending variable hooks from one pfUI.events listener
This commit is contained in:
+32
-9
@@ -586,19 +586,42 @@ end
|
|||||||
-- Compatibility shim for pfUI plugins (e.g. pfUI-addonskinner) that still
|
-- Compatibility shim for pfUI plugins (e.g. pfUI-addonskinner) that still
|
||||||
-- call the pre-rewrite API. Routes addon names through HookAddon, and keeps
|
-- call the pre-rewrite API. Routes addon names through HookAddon, and keeps
|
||||||
-- the legacy "or variable" fallback for callers that pass a global name.
|
-- the legacy "or variable" fallback for callers that pass a global name.
|
||||||
|
-- Pending variable hooks share one ADDON_LOADED/PLAYER_LOGIN listener on
|
||||||
|
-- pfUI.events, which unregisters once every hook has run.
|
||||||
|
local variableHooks, variableHandles = {}, nil
|
||||||
|
|
||||||
|
local function DrainVariableHooks()
|
||||||
|
local ready = {}
|
||||||
|
for name in pairs(variableHooks) do
|
||||||
|
if _G[name] then table.insert(ready, name) end
|
||||||
|
end
|
||||||
|
-- run after the scan: a hook may queue another and grow the table
|
||||||
|
for _, name in ipairs(ready) do
|
||||||
|
local funcs = variableHooks[name]
|
||||||
|
variableHooks[name] = nil
|
||||||
|
for _, func in ipairs(funcs) do func() end
|
||||||
|
end
|
||||||
|
if variableHandles and not next(variableHooks) then
|
||||||
|
for _, handle in ipairs(variableHandles) do handle:Unregister() end
|
||||||
|
variableHandles = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function pfUI.api.HookAddonOrVariable(addon, func)
|
function pfUI.api.HookAddonOrVariable(addon, func)
|
||||||
if C_AddOns.DoesAddOnExist(addon) then
|
if C_AddOns.DoesAddOnExist(addon) then
|
||||||
return pfUI.api.HookAddon(addon, func)
|
return pfUI.api.HookAddon(addon, func)
|
||||||
end
|
end
|
||||||
local lurker = CreateFrame("Frame")
|
if IsLoggedIn() and _G[addon] then return func() end
|
||||||
lurker:RegisterEvent("ADDON_LOADED")
|
|
||||||
lurker:RegisterEvent("PLAYER_LOGIN")
|
variableHooks[addon] = variableHooks[addon] or {}
|
||||||
lurker:SetScript("OnEvent", function()
|
table.insert(variableHooks[addon], func)
|
||||||
if _G[addon] then
|
|
||||||
func()
|
if not variableHandles then
|
||||||
lurker:UnregisterAllEvents()
|
variableHandles = {
|
||||||
end
|
pfUI.events:RegisterFrameEventAndCallbackWithHandle("ADDON_LOADED", DrainVariableHooks),
|
||||||
end)
|
pfUI.events:RegisterFrameEventAndCallbackWithHandle("PLAYER_LOGIN", DrainVariableHooks),
|
||||||
|
}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
_G.HookAddonOrVariable = pfUI.api.HookAddonOrVariable
|
_G.HookAddonOrVariable = pfUI.api.HookAddonOrVariable
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user