Quantcast WoWInterface - View Single Post - StanceButton1 taint in nMainbar
View Single Post
07-19-12, 04:59 AM   #1
A Fallenroot Satyr
ballagarba's Avatar
Join Date: Mar 2009
Posts: 22
StanceButton1 taint in nMainbar

So, Blizzard was kind enough introduce StanceButton1:SetPoint(...) inside StanceBar.lua:StanceBar_Update()

function StanceBar_Update ()
    local numForms = GetNumShapeshiftForms();
    if ( numForms > 0 and not IsPossessBarVisible()) then
        --Setup the Stance bar to display the appropriate number of slots
        if ( numForms == 1 ) then
                        StanceBarRight:SetPoint("LEFT", "StanceBarLeft", "LEFT", 12, 0);
                        StanceButton1:SetPoint("BOTTOMLEFT", "StanceBarFrame", "BOTTOMLEFT", 12, 3);
        elseif ( numForms == 2 ) then
                        StanceBarRight:SetPoint("LEFT", "StanceBarLeft", "RIGHT", 0, 0);
            StanceBarMiddle:SetPoint("LEFT", "StanceBarLeft", "RIGHT", 0, 0);
            StanceBarMiddle:SetWidth(37 * (numForms-2));
            StanceBarMiddle:SetTexCoord(0, numForms-2, 0, 1);
            StanceBarRight:SetPoint("LEFT", "StanceBarMiddle", "RIGHT", 0, 0);

The problem I'm having is that I set StanceButton1:SetMovable(true) and StanceButton1:SetUserPlaced(true). However, StanceBar_Update() gets executed after whatever code that does user placement rendering it useless.

So I tried a couple of hacks to prevent StanceBar_Update() from moving StanceButton1:

1. I just override Blizzard's function, however this obviously caused taint issues.

lua Code:
  1. function StanceBar_Update()
  2.     local numForms = GetNumShapeshiftForms()
  3.     if (numForms > 0 and not IsPossessBarVisible()) then
  4.         StanceBarFrame:Show()
  5.         securecall('StanceBar_UpdateState')
  6.     else
  7.         StanceBarFrame:Hide()
  8.     end
  9.     securecall('UIParent_ManageFramePositions')
  10. end

2. I figured I could force the statement numForms == 1 to always be false, because that's the only time they re-position. I figured this was a golden solution, however, it also caused taint

lua Code:
  1. StanceBarFrame.numForms = GetNumShapeshiftForms()

3. Now I tried to save the position of StanceButton1 before StanceBar_Update() moves it, and do a hooksecurefunc('StanceBar_Update', ...) and move it after that. Also taint, apparently, you can't do StanceButton1:ClearAllPoints() from inside that hook (WTF?):

lua Code:
  1. local point, relativeTo, relativePoint, xOffset, yOffset = StanceButton1:GetPoint()
  2. hooksecurefunc('StanceBar_Update', function()
  3.     if (GetNumShapeshiftForms() == 1) then
  4.         StanceButton1:ClearAllPoints()
  5.         StanceButton1:SetPoint(point, relativeTo, relativePoint, xOffset, yOffset)
  6.     end
  7. end

4. Next, I came up with the idea of just calling StanceBar_Update() immediately in my code to have it execute before the user position got set. This oddly enough also caused taint

lua Code:
  1. securecall('StanceBar_Update')

5. This works, but is ugly as hell and some quirks appear from time to time:

lua Code:
  1. local point, relativeTo, relativePoint, xOffset, yOffset
  3. local f = CreateFrame('Frame')
  4. f:RegisterEvent('VARIABLES_LOADED')
  5. f:RegisterEvent('PLAYER_ALIVE')
  6. f:SetScript('OnEvent', function(self, event, ...)
  7.     if (event == 'VARIABLES_LOADED') then
  8.         point, relativeTo, relativePoint, xOffset, yOffset = StanceButton1:GetPoint()
  9.         self:UnregisterEvent('VARIABLES_LOADED')
  10.     end
  12.     if (event == 'PLAYER_ALIVE') then
  13.         if (point) then
  14.             StanceButton1:ClearAllPoints()
  15.             StanceButton1:SetPoint(point, relativeTo, relativePoint, xOffset, yOffset)
  16.         end
  17.         self:UnregisterEvent('PLAYER_ALIVE')
  18.     end
  19. end)

The taint causes a interface blocked action thingie when trying to do action bar switching when in combat, and blocked it from switching. Anyone have any thoughts? I find it weird that StanceButton1:ClearAllPoints() sometimes causes taint, and sometimes it doesn't.

Oh yeah, the addon is nMainbar and here's the MoP source: