Quantcast

Attempt to fix the dangling bindings issue

James Whitehead II [04-12-11 - 16:38]
Attempt to fix the dangling bindings issue

If the player is over a frame that has key bindings active and that
frame is hidden or obscured then those bindings will remain active until
another Clique-enabled frame is moused over. This fix uses the attribute
driver template to clear this dangling button when the player no longer
has a 'mouseover' unit.

This change could potentially cause problems for small corner cases
where non-unit-frames are enabled for Clique casting, but I do not
currently know of any uses where this is the case.
Filename
Clique.lua
diff --git a/Clique.lua b/Clique.lua
index 3599f67..d994f70 100755
--- a/Clique.lua
+++ b/Clique.lua
@@ -53,9 +53,19 @@ function addon:Initialize()
     self.hccframes = {}

     -- Registration for group headers (in-combat safe)
-    self.header = CreateFrame("Frame", addonName .. "HeaderFrame", UIParent, "SecureHandlerBaseTemplate")
+    self.header = CreateFrame("Frame", addonName .. "HeaderFrame", UIParent, "SecureHandlerBaseTemplate,SecureHandlerAttributeTemplate")
     ClickCastHeader = addon.header

+    self.header:SetAttribute("_onattributechanged", [[
+        if name == "hasunit" then
+            if value == "false" and danglingButton then
+                self:RunFor(danglingButton, self:GetAttribute("setup_onleave"))
+                danglingButton = nil
+            end
+        end
+    ]])
+    RegisterAttributeDriver(self.header, "hasunit", "[@mouseover, exists] true; false")
+
     -- Create a secure action button that can be used for 'hovercast' and 'global'
     self.globutton = CreateFrame("Button", addonName .. "SABButton", UIParent, "SecureActionButtonTemplate, SecureHandlerBaseTemplate")

@@ -128,7 +138,7 @@ function addon:Initialize()
     -- We need to track frame registrations so we can display secure frames in
     -- the frame blacklist editor. This is done via the 'export_register' and
     -- 'export_unregister' attributes.
-    self.header:SetScript("OnAttributeChanged", function(frame, name, value)
+    self.header:HookScript("OnAttributeChanged", function(frame, name, value)
         if name == "export_register" and type(value) ~= nil then
             -- Convert the userdata object to the global object so we have access
             -- to all of the correct methods, such as 'RegisterForClicks''