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.
local numForms = GetNumShapeshiftForms()
if(numForms >0andnot IsPossessBarVisible())then
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
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?):
local point, relativeTo, relativePoint, xOffset, yOffset = StanceButton1:GetPoint()
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.