WoWInterface

WoWInterface (https://www.wowinterface.com/forums/index.php)
-   General Authoring Discussion (https://www.wowinterface.com/forums/forumdisplay.php?f=20)
-   -   4.3 taint issues and solutions (https://www.wowinterface.com/forums/showthread.php?t=41974)

zork 12-02-11 09:00 AM

4.3 taint issues and solutions
 
Is it just me or have others gotten taint issues aswell since 4.3?

I would like to start a thread that gathers issues and possible solutions.

The most visual problem I'm having is that sometimes when entering a raid the default Blizzard raidframe will show up. I have not nailed it down yet because it does not happen all the time. Inconsistence is bad. :)

Getting the taint:
Quote:

1) /console taintlog 1
2) /reloadui
3) Copy the blocking message from log/taint.log

Dridzt 12-02-11 09:11 AM

Just a little note that /console taintLog 1 sets a cvar that persists logins,
so you only need to set it once, then /reloadui whenever you see a taint message popping up.

(realize you probably know this already but just putting it here for any that stumble on the thread).

Aftermathhqt 12-02-11 09:25 AM

Quote:

Originally Posted by zork (Post 248413)
Is it just me or have others gotten taint issues aswell since 4.3?

I would like to start a thread that gathers issues and possible solutions.

The most visual problem I'm having is that sometimes when entering a raid the default Blizzard raidframe will show up. I have not nailed it down yet because it does not happen all the time. Inconsistence is bad. :)

Getting the taint:

No taints since 4.3

try this script for blizz raid frames

LUA Code:
  1. local BlizzRaidFrames = CreateFrame("Frame", nil, UIParent)
  2.  
  3. local function OnEvent(self, event, AddOn)
  4.     if AddOn == "Blizzard_CompactRaidFrames" then
  5.         _G["CompactRaidFrameManagerToggleButton"]:EnableMouse(false)
  6.         _G["CompactRaidFrameManager"]:SetAlpha(0)
  7.         _G["CompactRaidFrameManager"].container:SetParent(UIParent)
  8.         _G["CompactRaidFrameManager"]:SetScript("OnMouseUp", CompactRaidFrameManager_Toggle)
  9.         _G["CompactRaidFrameManager"]:SetScript("OnEnter", function(self)
  10.             if(self.collapsed) then
  11.                 UIFrameFadeIn(_G["CompactRaidFrameManager"], 1.2, self:GetAlpha(), 1)
  12.             end
  13.         end)
  14.         _G["CompactRaidFrameManager"]:SetScript("OnLeave", function(self)
  15.             if(self.collapsed) then
  16.                 UIFrameFadeOut(_G["CompactRaidFrameManager"], 0.8, self:GetAlpha(), 0)
  17.             end
  18.         end)
  19.         self:UnregisterEvent(event)
  20.         self:SetScript("OnEvent", nil)
  21.     end
  22. end
  23.  
  24. if (IsAddOnLoaded"Blizzard_CompactRaidFrames") then
  25.     OnEvent(BlizzRaidFrames, "ADDON_LOADED", "Blizzard_CompactRaidFrames")
  26. else
  27.     BlizzRaidFrames:RegisterEvent("ADDON_LOADED")
  28.     BlizzRaidFrames:SetScript("OnEvent", OnEvent)
  29. end
  30.  
  31. for _, bahs in pairs({
  32.     CompactUnitFrame_UpdateVisible,
  33.     CompactUnitFrame_UpdateAll,
  34.     PetFrame_Update,
  35. }) do
  36.     bahs = AftermathhUI.Func
  37. end
  38.  
  39. for _, bah in pairs({
  40.     _G["TutorialFrame"],
  41.     _G["CompactRaidFrameContainer"],
  42. }) do
  43.     bah:UnregisterAllEvents()
  44.     bah.Show = AftermathhUI.Func
  45.     bah:Hide()
  46. end

Haleth 12-02-11 09:26 AM

Yeah, been getting quite a few from pretty simple things like entering combat. I'll try to find out what's wrong.

zork 12-02-11 09:48 AM

AftermathUI.func is
lua Code:
  1. function () return end
Just for notice. Thus I'm going to try
lua Code:
  1. for _, v in pairs({
  2.     CompactUnitFrame_UpdateVisible, CompactUnitFrame_UpdateAll, --PetFrame_Update,
  3. }) do
  4.     v = function() return end
  5. end
  6.  
  7. for _, v in pairs({
  8.     _G["CompactRaidFrameContainer"], --_G["TutorialFrame"],
  9. }) do
  10.     v:UnregisterAllEvents()
  11.     v.Show = function() return end
  12.     v:Hide()
  13. end
But it is hard to believe that rewriting Blizzard functions and not hooking them secures does not give you taints.
The best solution I found so far for secure hiding is:
lua Code:
  1. local hideMe = function(self)
  2.   self:Hide()
  3. end
  4. hooksecurefunc(obj, "Show", hideMe)

SDPhantom 12-02-11 11:16 AM

Quote:

Originally Posted by zork (Post 248426)
It is hard to believe that rewriting Blizzard functions and not hooking them secures does not give you taints.

Taint happens all the time. The only time it becomes a problem is when Blizzard code tries to run a protected function when the taint still exists.

Haleth 12-02-11 05:22 PM

Hi zork. I use rActionBarStyler embedded in my UI:

Code:

12/3 00:17:23.259  Global variable WORLDMAP_WINDOWED_SIZE tainted by FreeUI - Interface\AddOns\FreeUI\scripts\map.lua:3
12/3 00:17:23.259  Execution tainted by FreeUI while reading WORLDMAP_WINDOWED_SIZE - Interface\FrameXML\WorldMapFrame.lua:1653 WorldMapQuestShowObjectives_AdjustPosition()
12/3 00:17:23.259      Interface\FrameXML\WorldMapFrame.lua:1625
12/3 00:17:23.259      WorldMap_ToggleSizeDown()
12/3 00:17:23.259      Interface\AddOns\FreeUI\scripts\map.lua:75
12/3 00:17:23.259  An action was blocked in combat because of taint from FreeUI - MultiBarBottomLeftButton10:Show()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:246
12/3 00:17:23.259      ActionButton_Update()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:484 ActionButton_OnEvent()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:105
12/3 00:17:23.259  Global variable INTERFACE_ACTION_BLOCKED_SHOWN tainted by FreeUI - Interface\FrameXML\UIParent.lua:843
12/3 00:17:23.259      MultiBarBottomLeftButton10:Show()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:246
12/3 00:17:23.259      ActionButton_Update()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:484 ActionButton_OnEvent()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:105
12/3 00:17:23.259  Execution tainted by FreeUI while reading INTERFACE_ACTION_BLOCKED_SHOWN - Interface\FrameXML\UIParent.lua:840
12/3 00:17:23.259      MultiBarBottomLeftButton11:Show()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:246
12/3 00:17:23.259      ActionButton_Update()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:484 ActionButton_OnEvent()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:105
12/3 00:17:23.259  An action was blocked in combat because of taint from FreeUI - MultiBarBottomLeftButton11:Show()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:246
12/3 00:17:23.259      ActionButton_Update()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:484 ActionButton_OnEvent()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:105
12/3 00:17:23.259  Global variable INTERFACE_ACTION_BLOCKED_SHOWN tainted by FreeUI - Interface\FrameXML\UIParent.lua:843
12/3 00:17:23.259      MultiBarBottomLeftButton10:MultiBarBottomLeftButton10:()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:246
12/3 00:17:23.259      ActionButton_Update()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:484 ActionButton_OnEvent()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:105
12/3 00:17:23.259  Execution tainted by FreeUI while reading INTERFACE_ACTION_BLOCKED_SHOWN - Interface\FrameXML\UIParent.lua:840
12/3 00:17:23.259      MultiBarBottomLeftButton12:Show()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:246
12/3 00:17:23.259      ActionButton_Update()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:484 ActionButton_OnEvent()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:105
12/3 00:17:23.259  An action was blocked in combat because of taint from FreeUI - MultiBarBottomLeftButton12:Show()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:246
12/3 00:17:23.259      ActionButton_Update()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:484 ActionButton_OnEvent()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:105
12/3 00:17:23.259  Global variable INTERFACE_ACTION_BLOCKED_SHOWN tainted by FreeUI - Interface\FrameXML\UIParent.lua:843
12/3 00:17:23.259      MultiBarBottomLeftButton10:MultiBarBottomLeftButton10:()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:246
12/3 00:17:23.259      ActionButton_Update()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:484 ActionButton_OnEvent()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:105
12/3 00:17:23.259  Execution tainted by FreeUI while reading INTERFACE_ACTION_BLOCKED_SHOWN - Interface\FrameXML\UIParent.lua:840
12/3 00:17:23.259      MultiBarBottomRightButton1:Hide()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:259
12/3 00:17:23.259      ActionButton_Update()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:484 ActionButton_OnEvent()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:105
12/3 00:17:23.259  An action was blocked in combat because of taint from FreeUI - MultiBarBottomRightButton1:Hide()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:259
12/3 00:17:23.259      ActionButton_Update()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:484 ActionButton_OnEvent()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:105
12/3 00:17:23.259  Global variable INTERFACE_ACTION_BLOCKED_SHOWN tainted by FreeUI - Interface\FrameXML\UIParent.lua:843
12/3 00:17:23.259      MultiBarBottomLeftButton10:MultiBarBottomLeftButton10:()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:246
12/3 00:17:23.259      ActionButton_Update()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:484 ActionButton_OnEvent()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:105
12/3 00:17:23.259  Execution tainted by FreeUI while reading INTERFACE_ACTION_BLOCKED_SHOWN - Interface\FrameXML\UIParent.lua:840
12/3 00:17:23.259      MultiBarBottomRightButton2:Hide()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:259
12/3 00:17:23.259      ActionButton_Update()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:484 ActionButton_OnEvent()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:105
12/3 00:17:23.259  An action was blocked in combat because of taint from FreeUI - MultiBarBottomRightButton2:Hide()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:259
12/3 00:17:23.259      ActionButton_Update()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:484 ActionButton_OnEvent()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:105
12/3 00:17:23.259  Global variable INTERFACE_ACTION_BLOCKED_SHOWN tainted by FreeUI - Interface\FrameXML\UIParent.lua:843
12/3 00:17:23.259      MultiBarBottomLeftButton10:MultiBarBottomLeftButton10:()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:246
12/3 00:17:23.259      ActionButton_Update()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:484 ActionButton_OnEvent()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:105
12/3 00:17:23.259  Execution tainted by FreeUI while reading INTERFACE_ACTION_BLOCKED_SHOWN - Interface\FrameXML\UIParent.lua:840
12/3 00:17:23.259      MultiBarBottomRightButton3:Hide()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:259
12/3 00:17:23.259      ActionButton_Update()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:484 ActionButton_OnEvent()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:105
12/3 00:17:23.259  An action was blocked in combat because of taint from FreeUI - MultiBarBottomRightButton3:Hide()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:259
12/3 00:17:23.259      ActionButton_Update()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:484 ActionButton_OnEvent()
12/3 00:17:23.259      Interface\FrameXML\ActionButton.lua:105
12/3 00:17:23.259  Global variable INTERFACE_ACTION_BLOCKED_SHOWN tainted by FreeUI - Interface\FrameXML\UIParent.lua:843

Etc.

This is pretty much as soon as I enter combat, since 4.3 only. I know it says WORLDMAP_WINDOWED_SIZE but I never get taint from that unless something else taints it.

zork 12-02-11 06:26 PM

I'm aware of that and ignore it. The buttonstyler hooks a Blizzard function via hooksecurefunc and only by doing so you get that taint. But there is no other secure way of doing so. The show/hide even happens in the hooked Blizzard function. (ActionButton_Update)
That is the reason why everything is working. Blizzard is telling me they block me for calling Show/Hide in combat (which I don't). And because I don't everything works normally...if that makes sense.

What I find pretty wierd is that it only happens once. (Not every combat)

Haleth 12-02-11 07:06 PM

As far as I'm aware, as soon as a certain function or variable has been tainted, the UI doesn't report that taint anymore.

Grimsin 12-03-11 11:23 AM

you guys... sheesh... that hooksecurefunction stuff does not make what you have put in the function capable of functioning in the secure environment. In other words just because you use hooksecure does not make it secure.

This is a chunk of secure code that runs the GrimUI context menu. It makes it so the context menu(a tray of buttons) can be shown/hidden in combat without taint.

Code:

local hotSpot = CreateFrame('Button', nil, UIParent, 'SecureHandlerClickTemplate')

hotSpot:SetHeight(16)
hotSpot:SetWidth(16)
hotSpot:RegisterForClicks('LeftButtonUp', 'RightButtonUp')
hotSpot:SetFrameRef("contextMenu", contextMenu)
hotSpot:SetAttribute('_onclick', [[
        local frame = self:GetFrameRef("contextMenu")
        if button == 'LeftButton' then
                if IsControlKeyDown() then
                        control:CallMethod("ToggleMiniMap")
                else
                        if frame:IsVisible() then
                                frame:Hide(true)
                        else
                                frame:Show(true)
                        end
                end
        elseif button == 'RightButton' then
                if IsControlKeyDown() then
                        control:CallMethod("ToggleInfoLog")
                else
                control:CallMethod("ToggleCombatLog")
                end
        end
]])

In order to get around taint issues you need to use code like this for any kind of show/hide or reposition of secured frames. A secured frame is any frame bliz has decided you could use an addon to move around during combat in a method that would allow you to "cheat" action bars fall into this catagory, the bosstargetframes, the focus frame, item buttons, the mounted control frame, some others to including the worldmap frame in a strange way... having to do with the questblobframe.

here is another example, this is the GrimUI config button. made secure so it could toggle the micro bar and options windows while in combat, note however that even though the options can be opened in combat 90% of them will not function. You pretty much can not move around any secure frame during combat no mater how you code it.
Code:

local configButton = CreateFrame('Button', configButton, UIParent, 'SecureHandlerClickTemplate')

configButton:SetHeight(30)
configButton:SetWidth(62)
configButton:RegisterForClicks('AnyUp')
configButton:SetNormalTexture([[Interface\AddOns\]] .. addonName .. [[\Media\ConfigButton]])
configButton:SetHighlightTexture([[Interface\AddOns\]] .. addonName .. [[\Media\ConfigButton]])
configButton:SetPoint('BOTTOMRIGHT', addon.skin, 'TOPRIGHT', -2, 0)
       
configButton:SetAttribute('_onclick', [[
        if button == 'LeftButton' and not IsControlKeyDown() then
                local microBar = self:GetFrameRef("microBar")
                if microBar:IsVisible() then
                        microBar:Hide()
                else
                        microBar:Show()
                end
        elseif button == 'RightButton' and not IsControlKeyDown() then
                control:CallMethod("OpenConfig")
        end
       
]])


function configButton:OpenConfig()
        if addon.configPanel then
                if addon.configPanel:IsVisible() then
                        InterfaceOptionsFrame:Hide()
                else
                        addon.configPanel()
                end
        end
end

Also here is some good functions for show/hide/lock frames to prevent the reappearance of pesky frames.
Code:

--[[-----------------------------------------------------------------------------
DoNothing - A simple dummie/do nothing function
-------------------------------------------------------------------------------]]
local function DoNothing()
end
addon.DoNothing = DoNothing

--[[-----------------------------------------------------------------------------
HideTooltip - Hide GameTooltip (several frames use this)
-------------------------------------------------------------------------------]]
function addon:HideTooltip()
        GameTooltip:Hide()
        self.tooltip = nil
end

--[[-----------------------------------------------------------------------------
HideFrame - Hide a frame, prevents it from being reshown
-------------------------------------------------------------------------------]]
function addon:HideFrame(reference)
        local frame = type(reference) == 'string' and _G[reference] or reference
        if type(frame) ~= 'table' then return end
        frame.Show = DoNothing
        frame:Hide()
end

--[[-----------------------------------------------------------------------------
ShowFrame - Show a frame, undoing :HideFrame behavior
-------------------------------------------------------------------------------]]
function addon:ShowFrame(reference)
        local frame = type(reference) == 'string' and _G[reference] or reference
        if type(frame) ~= 'table' then return end
        frame.Show = nil
        frame:Show()
end

--[[-----------------------------------------------------------------------------
LockFrame - Lock a frame, prevents SetPoint and ClearAllPoints from working
-------------------------------------------------------------------------------]]
function addon:LockFrame(reference)
        local frame = type(reference) == 'string' and _G[reference] or reference
        if type(frame) ~= 'table' then return end
        frame.SetPoint = DoNothing
        frame.ClearAllPoints = DoNothing
end

--[[-----------------------------------------------------------------------------
UnlockFrame - Undo :LockFrame
-------------------------------------------------------------------------------]]
function addon:UnlockFrame(reference)
        local frame = type(reference) == 'string' and _G[reference] or reference
        if type(frame) ~= 'table' then return end
        frame.SetPoint = nil
        frame.ClearAllPoints = nil
end


Grimsin 12-03-11 11:30 AM

and oh yea... for a lot of stuff involving buttons and frames being repositioned especially if your repositioning bliz frames... you need to disable the bliz position manager or every time your moved frame passes through the position management it will taint.
Code:

UIPARENT_MANAGED_FRAME_POSITIONS['MultiBarBottomLeft'] = nil
UIPARENT_MANAGED_FRAME_POSITIONS['MultiBarBottomRight'] = nil
UIPARENT_MANAGED_FRAME_POSITIONS['MultiBarLeft'] = nil
UIPARENT_MANAGED_FRAME_POSITIONS['MultiBarRight'] = nil
UIPARENT_MANAGED_FRAME_POSITIONS['MultiCastActionBarFrame'] = nil
UIPARENT_MANAGED_FRAME_POSITIONS['MULTICASTACTIONBAR_YPOS'] = nil
UIPARENT_MANAGED_FRAME_POSITIONS['PetActionBarFrame'] = nil
UIPARENT_MANAGED_FRAME_POSITIONS['PETACTIONBAR_YPOS'] = nil
UIPARENT_MANAGED_FRAME_POSITIONS['PossessBarFrame'] = nil
UIPARENT_MANAGED_FRAME_POSITIONS['ShapeshiftBarFrame'] = nil
UIPARENT_MANAGED_FRAME_POSITIONS['SHAPESHIFTBAR_YPOS'] = nil
UIPARENT_MANAGED_FRAME_POSITIONS['VehicleMenuBar'] = nil
UIPARENT_MANAGED_FRAME_POSITIONS['ContainerFrame1'] = nil
UIPARENT_MANAGED_FRAME_POSITIONS['ContainerFrame2'] = nil
UIPARENT_MANAGED_FRAME_POSITIONS['ContainerFrame3'] = nil
UIPARENT_MANAGED_FRAME_POSITIONS['ContainerFrame4'] = nil
UIPARENT_MANAGED_FRAME_POSITIONS['ContainerFrame5'] = nil
UIPARENT_MANAGED_FRAME_POSITIONS["CONTAINER_OFFSET_X"] = nil
UIPARENT_MANAGED_FRAME_POSITIONS["CONTAINER_OFFSET_Y"] = nil
UIPARENT_MANAGED_FRAME_POSITIONS['BonusActionBarFrame'] = nil
UIPARENT_MANAGED_FRAME_POSITIONS['BONUSACTIONBAR_YPOS'] = nil
UIPARENT_MANAGED_FRAME_POSITIONS['VEHICLEMENUBAR_YPOS'] = nil
UIPARENT_MANAGED_FRAME_POSITIONS['TargetFrame'] = nil
UIPARENT_MANAGED_FRAME_POSITIONS['MainMenuBar'] = nil
UIPARENT_MANAGED_FRAME_POSITIONS['Boss1TargetFrame'] = nil
UIPARENT_MANAGED_FRAME_POSITIONS["PlayerPowerBarAlt"] = nil
--UIPARENT_MANAGED_FRAME_POSITIONS['UIParent'] = nil
--table.wipe(UIPARENT_MANAGED_FRAME_POSITIONS);


zork 12-04-11 10:48 AM

What I find most disturbing is the following. I'm hooking (hooksecurefunc) the Blizzard function "ActionButton_Update" because I'm using that function to check for new actionbuttons to be styled. If the button is already styled I return. All I do is to change some button textures.

The Blizzard function itself does Show/Hide on condition.

Now the crazy part is that I get a taint for Showing/Hiding. But I'm not doing that in my code. That is part of the Blizzard function. So by just hooking a Blizzard function that does Show/Hide you get a taint.

That wasn't the case with 4.2. I'm pretty sure about that because the functionality is unchanged. But not sure if the Show/Hide inside the Blizzard function is new...

That is pretty annoying because you may not hook any Blizzard functions with a Show/Hide/SetPoint anymore without tainting stuff.

Dridzt 12-04-11 01:05 PM

Protected frames make their parent protected as well.
Do you perhaps SetParent secure frames to yours?

zork 12-04-11 04:56 PM

Update. Ok my bad I fixed it. The secure hook is actually working. What I did and what brought errors since 4.3 was preventing specific Show/Hide on hotkey and such. :)

So basically the taint was misleading.

Now there is only the damn extraActionBarFrame that needs to be workin. :)

DIFF: http://code.google.com/p/rothui/sour.../functions.lua

tukz 12-05-11 10:47 AM

I was having taint aswell on 4.3 with raid frame, this is what i use atm for hiding raid frames, no bug/taint report on raid frame since using it:

https://github.com/tukz/Tukui/blob/m...d/kill.lua#L14

note: Kill() function is just one of my own function to UnregisterAllEvents() and Hide() on a specific frame.

zork 12-06-11 04:51 PM

I'm having problems with the raid aswell.

Using stuff like...
lua Code:
  1. for _, v in pairs({
  2.         CompactUnitFrame_UpdateVisible, CompactUnitFrame_UpdateAll,
  3.     }) do
  4.         v = function() return end
  5.     end
  6.  
  7.     for _, v in pairs({
  8.         _G["CompactRaidFrameContainer"],
  9.         _G["CompactRaidFrameManagerContainerResizeFrame"],
  10.     }) do
  11.         v:UnregisterAllEvents()
  12.         v.Show = function() return end
  13.         v:Hide()
  14.     end

is just bad gives you a taint in combat right away if your raid gets changed infight.

The thing is...I like the CombatRaidFrameManger and I want to keep it.

Using this will make the manager fade in on mouseover.
lua Code:
  1. --add fading to the raidframe manager (code by Alza)
  2.       local listener = CreateFrame("Frame")
  3.       listener.check = function(self, event, addon)
  4.         if(addon~="Blizzard_CompactRaidFrames") then return end
  5.         CompactRaidFrameManagerToggleButton:EnableMouse(false)
  6.         local man = CompactRaidFrameManager
  7.         man:SetAlpha(0)
  8.         man.container:SetParent(UIParent)
  9.         man:SetScript("OnMouseUp", CompactRaidFrameManager_Toggle)
  10.         man:SetScript("OnEnter", function(self)
  11.           if(self.collapsed) then
  12.             UIFrameFadeIn(man, .2, 0, 1)
  13.           end
  14.         end)
  15.         man:SetScript("OnLeave", function(self)
  16.           if(self.collapsed) then
  17.             UIFrameFadeOut(man, .2, 1, 0)
  18.           end
  19.         end)
  20.         self:UnregisterEvent(event)
  21.         self:SetScript("OnEvent", nil)
  22.       end
  23.       if(IsAddOnLoaded("Blizzard_CompactRaidFrames")) then
  24.         listener.check(listener, "ADDON_LOADED", "Blizzard_CompactRaidFrames")
  25.       else
  26.         listener:RegisterEvent("ADDON_LOADED")
  27.         listener:SetScript("OnEvent", listener.check)
  28.       end

Currently the best idea I'm having is to resize the CompactRaidFrame to a tiny little thing and to hide it once we get out of combat.

Basically Hide it by default. Secure hook the Show and if that is called we try to hide it and if we are in combat we just add register the REGEN_ENABLED event and disable the frame once we get out of combat again.

That is the only secure method I can think of.

I'm currently testing this
lua Code:
  1. --check the default raid and make it fade
  2.     local checkRaid = CreateFrame("Frame")
  3.  
  4.     local killRaid = function(self)
  5.       self:Hide()
  6.       self:UnregisterAllEvents()
  7.     end
  8.  
  9.     local hideRaid = function(self)
  10.       if not InCombatLockdown() then
  11.         killRaid(self)
  12.         print("crfc show got called, hide it again")--debug
  13.       else
  14.         print("crfc show got called but cannot hide raid atm, in combat")--debug
  15.         checkRaid:RegisterEvent("PLAYER_REGEN_ENABLED")
  16.       end
  17.     end
  18.  
  19.     checkRaid:RegisterEvent("PLAYER_LOGIN")
  20.     checkRaid:SetScript("OnEvent", function(self,event,...)
  21.       local crfc = _G["CompactRaidFrameContainer"]
  22.       if event == "PLAYER_LOGIN" then
  23.         if crfc then
  24.           crfc:SetScale(0.0001)
  25.           crfc:SetAlpha(0)
  26.           killRaid(crfc)
  27.           hooksecurefunc(crfc, "Show", hideRaid)
  28.         end
  29.       end
  30.       if event == "PLAYER_REGEN_ENABLED" then
  31.         if crfc and crfc:IsShown() then
  32.           killRaid(crfc)
  33.           self:UnregisterEvent("PLAYER_REGEN_ENABLED") --kill the event again
  34.           print("ooc now, hide raid")--debug
  35.         end
  36.       end
  37.     end)

*Edit*
It worked on first try (check chat outputs):

Works in combat aswell. No taint. A big plus is the raid manager which I actually like.

Test:
Code:

/run print(_G["CompactRaidFrameContainer"]:IsShown())
Not sure if I can actually call self:Hide() in the hooksecurefunc while being in combat without tainting.

Haleth 12-06-11 05:04 PM

This is what I use to completely kill the raid frame and the manager. Worked in 4.2, still seems to work without taint. Disabling PetFrame_Update is necessary.

Code:

F.dummy = function() end
Code:

CompactRaidFrameManager:UnregisterAllEvents()
CompactRaidFrameManager.Show = F.dummy
CompactRaidFrameManager:Hide()
PetFrame_Update = F.dummy

By the way, zork, your updates to rABS made tremendous improvements to the taint I've been getting. This is all I get now:

Code:

12/6 22:14:30.154  Execution tainted by FreeUI while reading GameTooltipMoneyFrame1SuffixText - Interface\FrameXML\MoneyFrame.lua:486 MoneyFrame_Update()
12/6 22:14:30.154      Interface\FrameXML\MoneyFrame.lua:296 MoneyFrame_UpdateMoney()
12/6 22:14:30.154      GameTooltipMoneyFrame1:OnShow()
12/6 22:14:30.154      GameTooltip:SetAction()
12/6 22:14:30.154      Interface\FrameXML\ActionButton.lua:579 ActionButton_SetTooltip()
12/6 22:14:30.154      Interface\FrameXML\ActionButton.lua:311
12/6 22:14:30.154      ActionButton_Update()
12/6 22:14:30.154      Interface\FrameXML\ActionButton.lua:478 ActionButton_OnEvent()
12/6 22:14:30.154      Interface\FrameXML\ActionButton.lua:105
12/6 22:14:30.154  An action was blocked in combat because of taint from FreeUI - BonusActionButton9:Show()
12/6 22:14:30.154      Interface\FrameXML\ActionButton.lua:246
12/6 22:14:30.154      ActionButton_Update()
12/6 22:14:30.154      Interface\FrameXML\ActionButton.lua:478 ActionButton_OnEvent()
12/6 22:14:30.154      Interface\FrameXML\ActionButton.lua:105
12/6 22:26:53.362  Global variable INTERFACE_ACTION_BLOCKED_SHOWN tainted by FreeUI - Interface\FrameXML\UIParent.lua:843
12/6 22:26:53.362      BonusActionButton9:Show()
12/6 22:26:53.362      Interface\FrameXML\ActionButton.lua:246
12/6 22:26:53.362      ActionButton_Update()
12/6 22:26:53.362      Interface\FrameXML\ActionButton.lua:478 ActionButton_OnEvent()
12/6 22:26:53.362      Interface\FrameXML\ActionButton.lua:105
12/6 22:26:53.362  Execution tainted by FreeUI while reading INTERFACE_ACTION_BLOCKED_SHOWN - Interface\FrameXML\UIParent.lua:840
12/6 22:26:53.362      BonusActionButton9:Show()
12/6 22:26:53.362      Interface\FrameXML\ActionButton.lua:246
12/6 22:26:53.362      ActionButton_Update()
12/6 22:26:53.362      Interface\FrameXML\ActionButton.lua:478 ActionButton_OnEvent()
12/6 22:26:53.362      Interface\FrameXML\ActionButton.lua:105
12/6 22:26:53.362  An action was blocked in combat because of taint from FreeUI - BonusActionButton9:Show()
12/6 22:26:53.362      Interface\FrameXML\ActionButton.lua:246
12/6 22:26:53.362      ActionButton_Update()
12/6 22:26:53.362      Interface\FrameXML\ActionButton.lua:478 ActionButton_OnEvent()
12/6 22:26:53.362      Interface\FrameXML\ActionButton.lua:105


zork 12-06-11 06:00 PM

Check the updated rActionButtonStyler aswell. I fixed all the taints. Basically the solution is to remove all dummy functions. Check the DIFF: http://code.google.com/p/rothui/sour...ns.lua&old=788

Your raid function does NOT work. I had this aswell. You grab a taint if raid changes size in combat. The raid may not show up but you get a taint.

Using dummy functions to prevent a Blizzard function from being called will net you a taint in combat. You have to work around that by using hooksecurefunc, SetAlpha/SetScale and hide the frame once you are OOC.

Currently I'm taint free. Be it actionbars or raid frames. I'm happy now.

Haleth 12-06-11 06:44 PM

Yes, that was while using the updated button styler too. Might be something on my part then, I'll search on. :p

I never get taint from the raid frames anymore, so it works for me, I think.

While we're on the subject - does anyone know how I can -properly- rescale the mini world map (including all its sub frames, POI frame, etc) without overwriting WORLDMAP_WINDOWED_SIZE? I tried but I ended up nearly rewriting the whole Blizzard map code :/

zork 12-13-11 05:24 AM

Hmmm...Here is a problem I'm having.

In the Looking For Raid people will join and leave a read quite often, even while in combat. This will bring up the default raidframe all the time.

This is a problem because there is no way of securely hiding it. Thus when using any other unitframe in raids you have 2 raidframes active at the same time.

I just asked myself: What would be if we parent the raidframe to another frame that we create and that we Hide().

Basically:
lua Code:
  1. local hideRaid = CreateFrame("Frame")  
  2.   local crfc = _G["CompactRaidFrameContainer"]
  3.   crfc:SetParent(hideRaid)
  4.   hideRaid:Hide()

If the raidframe container does not reparent itself in any way there should be no way it ever gets shown because of the hidden state of the parented frame.

The question that stands, does this provide any benefit in CPU usage? Aka will the events/functions of the raidframe be disabled if the parent frame is hidden? I guess so.

Either that or I have no choice and need to get rid of the RaidFrameManager aswell.


All times are GMT -6. The time now is 03:27 PM.

vBulletin © 2024, Jelsoft Enterprises Ltd
© 2004 - 2022 MMOUI