Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Press and Hold Casting Not Working #835

Open
F-Lambda opened this issue Feb 17, 2024 · 3 comments
Open

Press and Hold Casting Not Working #835

F-Lambda opened this issue Feb 17, 2024 · 3 comments
Assignees
Labels
bug Something don't work dragonflight Dragonflight (10.x.y)

Comments

@F-Lambda
Copy link

F-Lambda commented Feb 17, 2024

Press and hold casting does not function with Dominos active. Deactivating Dominos causes it to work again.

Addon Version
10.2.18-retail

World of Warcraft Version
Retail 10.2.5 (53262) (Release x64)
Feb 7 2024

@Tuller Tuller added bug Something don't work dragonflight Dragonflight (10.x.y) labels Feb 17, 2024
@Tuller
Copy link
Member

Tuller commented Feb 17, 2024

Dominos can only ever implement this for a subset of action buttons (specifically Dominos action bars 1, 3, 4, 5 6, 12, 13, and 14). I've currently disabled this behavior, as it was one of the culprits of action buttons suddenly not working after switching zones/etc. I'll try re-implementing it to see if the other taint mitigations I have in place allow it to function properly now, and we need to hope that Blizzard fixes the issue preventing it from working for all action buttons in the next expansion.

How the Standard Interface Implements Support

Blizzard action buttons don't use the same execution path for keybindings as addons need to. One part of that path sets a flag that is required for press and hold casting to function.

-- ActionButton.lua
function TryUseActionButton(self, checkingFromDown)
	local isKeyPress = true;
	local isSecureAction = true;
	local usedActionButton = SecureActionButton_OnClick(self, "LeftButton", checkingFromDown, isKeyPress, isSecureAction);
	if usedActionButton then
		if GetNewActionHighlightMark(self.action) then
			ClearNewActionHighlight(self.action);
			self:UpdateHighlightMark();
		end
	end
	self:UpdateState();
end

-- SecureTemplates.lua
function SecureActionButton_OnClick(self, inputButton, down, isKeyPress, isSecureAction)
	-- Why are we adding extra arguments, 'isKeyPress' and 'isSecureAction', to an _OnClick handler?
	-- We want to prevent mouse actions from triggering press-and-hold behavior for now, but we do want to allow AddOns
	-- to function as they did before. This is a problem since there's no difference between an AddOn's key press behavior
	-- and mouse click behavior. So if we don't know where this is coming from, it's from an AddOn and should be treated as
	-- a key press not a mouse press for 'useOnKeyDown' purposes.
	local isSecureMousePress = not isKeyPress and isSecureAction;
	local pressAndHoldAction = SecureButton_GetAttribute(self, "pressAndHoldAction");
	local useOnKeyDown = not isSecureMousePress and (GetCVarBool("ActionButtonUseKeyDown") or pressAndHoldAction);
	local clickAction = (down and useOnKeyDown) or (not down and not useOnKeyDown);
	local releasePressAndHoldAction = (not down) and (pressAndHoldAction or GetCVarBool("ActionButtonUseKeyHeldSpell"));

	if clickAction then
		-- Only treat a key down action as a key press. Treating key up actions as a key press will result in the held
		-- spell being cast indefinitely since there's no release to stop it.
		local treatAsKeyPress = down and isKeyPress;
		OnActionButtonClick(self, inputButton, down, treatAsKeyPress);
		return true;
	elseif releasePressAndHoldAction then
		OnActionButtonPressAndHoldRelease(self, inputButton);
		return true;
	end

	return false;
end

SecureActionButton_OnClick only ever triggers press and hold casting if it thinks it is being called by a key press action, and the only way to make that be the case is to use TryUseActionButton. Addons currently cannot do this (as documented by Blizzard in SecureActionButton_OnClick.

Workarounds

Knowing this, I was able to still trigger this behavior by essentially letting the stock UI handle key press logic for any of the standard action buttons (Dominos action bars 1, 3, 4, 5 6, 12, 13, and 14) and making it simply appear as if the Dominos action button was pressed.

There's a major drawback to this approach, however. The Blizzard UI in dragon flight is particularly fragile with respect to tainting issues. This was the leading culprit that lead to the persistent "action buttons no longer working when switching into a new zone/dungeon" issue that Dominos had in the past. This is why I removed press and hold casting support starting with 10.2.5.

@Sythr4l
Copy link

Sythr4l commented Feb 18, 2024

I think this is related, apologize if it's not. I received this error despite having press and hold turned off.

1x [ADDON_ACTION_BLOCKED] AddOn 'Dominos' tried to call the protected function 'MultiBarBottomRightActionButton1:SetAttribute()'.
[string "@!BugGrabber/BugGrabber.lua"]:485: in function <!BugGrabber/BugGrabber.lua:485>
[string "=[C]"]: in function SetAttribute' [string "@FrameXML/ActionButton.lua"]:485: in function UpdatePressAndHoldAction'
[string "@FrameXML/ActionButton.lua"]:551: in function Update' [string "@FrameXML/ActionButton.lua"]:503: in function UpdateAction'
[string "@FrameXML/ActionButton.lua"]:981: in function `OnEvent'
[string "@FrameXML/ActionButton.lua"]:207: in function <FrameXML/ActionButton.lua:204>

Locals:
_ = Frame {
RegisterEvent = defined @!BugGrabber/BugGrabber.lua:491
0 =
UnregisterEvent = defined @!BugGrabber/BugGrabber.lua:491
SetScript = defined @!BugGrabber/BugGrabber.lua:491
}
event = "ADDON_ACTION_BLOCKED"
events =

{
ADDON_ACTION_BLOCKED = defined @!BugGrabber/BugGrabber.lua:557
ADDON_ACTION_FORBIDDEN = defined @!BugGrabber/BugGrabber.lua:557
PLAYER_LOGIN = defined @!BugGrabber/BugGrabber.lua:551
LUA_WARNING = defined @!BugGrabber/BugGrabber.lua:566
ADDON_LOADED = defined @!BugGrabber/BugGrabber.lua:511
}

@Tuller
Copy link
Member

Tuller commented Feb 18, 2024

That's a different issue, and an indicator that something could be tainting the execution path

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something don't work dragonflight Dragonflight (10.x.y)
Projects
None yet
Development

No branches or pull requests

3 participants