Releases: TimothyLuke/GSE-Advanced-Macro-Compiler
Releases · TimothyLuke/GSE-Advanced-Macro-Compiler
3.3.23
GSE
3.3.23 (2026-06-20)
Full Changelog Previous Releases
- Merge pull request #1964 from LarryThiessen/fix-abo-icon-not-clearing
FIX: ABO icon not clearing until mouseover (#1963) - FIX: clear ABO icon immediately on removal (no mouseover needed)
#1963
Removing an Action Button Override cleared the GSE watermark but left the
GSE-painted icon on the button until the next ActionButton update (e.g. a
mouseover). LoadOverrides reverted the button and removed the watermark but
never repainted the real action-slot icon.
LoadOverrides now snapshots the overridden buttons and, after the re-arm pass,
forces a real-icon repaint on any button that was cleared and not re-armed
(button:Update() / ActionButton_Update / direct slot-texture fallback; all
guarded for cross-version safety).
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com - #1975 Normalise Skin variances
- #1957 move Skyriding to part of tools and diagnostics. its only relevant to people who use keybinds (< 20% of GSE Users)
- Merge pull request #1959 from LarryThiessen/enhancements-1957-editor
ENH: Editor toolbar/layout, live tree updates, options ordering - #1893 Handle Macros via import strings
- #1893 Import cleanup
- Fix #1960 Frames that dont render correctly
- Merge pull request #1958 from LarryThiessen/fixes-1956-editor-options
FIX: MacroBlock editor editing bugs + blank Options History panel - ENH: Editor toolbar/layout + live tree updates + options ordering
#1957- Editor: swap Pause/If toolbar order; vertically center the Version Name box;
top-button block creation inserts a sibling immediately after the focused
block (focusing a Loop/If adds below it, not inside). - Tree: new versions appear instantly and deleted versions clear instantly,
before saving (mirrored into the in-memory Library cache). - Options: move Skyriding / Vehicle Keybinds above Tools & Diagnostics.
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
- Editor: swap Pause/If toolbar order; vertically center the Version Name box;
- FIX: MacroBlock editor live-colour editing bugs + blank Options History panel
#1956- Editor: live syntax-colouring no longer eats the blank row opened with Enter,
stops backspace at a comma, or throws the caret to the end. The live re-colour
is now idempotent (repaints only when no visible characters change) and
debounced, so it can't rewrite in-progress text or fight the caret. - Options: the GSE History/About page no longer comes up blank - its content is
built eagerly instead of only in OnShow (a canvas parent with subcategories
does not reliably fire OnShow).
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
- Editor: live syntax-colouring no longer eats the blank row opened with Enter,
- #1914 TOC Updates
3.3.22
GSE
3.3.22 (2026-06-16)
Full Changelog Previous Releases
- #1920 Fix Actionbar Overrides in Dominos.
Note: The user needs to show hidden buttons to set an Actionbar Override via a right click for a Dominos button but once set the button will no longer hide. - #1931 Change LAB detection to capability based
- #1931 change LAB detection to capability based
- #1914 Add empty statics to public proxy for old plugin compatability
- #1931 Fix Override regression
- Fixe #1954 - Mouse Button 4 and 5 mappings
#1954 FIX: Mouse buttons 4/5 keybinds do nothing in game - FIX #1931 ABO combat taint block on Bartender4 State Config bars
FIX #1931: ABO combat taint block on Bartender4 State Config bars - Merge pull request #1952 from LarryThiessen/master
FIX: ABO works in all forms incl. Prowl on Bartender4 and stock bars - #1954 FIX: Mouse buttons 4/5 keybinds do nothing in game
The keybind capture widget stored mouse buttons 4/5 using the WoW
frame-script names ("Button4"/"Button5") instead of valid binding names
("BUTTON4"/"BUTTON5"). SetBindingClick rejected those keys and returned
nil, so the bind saved in GSE but never fired in game. Only the middle
button worked because it had an explicit MiddleButton -> BUTTON3 map.- NativeUI: normalize Button4/Button5 to BUTTON4/BUTTON5 on capture,
matching the existing MiddleButton -> BUTTON3 handling. - Events: add normalizeBindKey() applied at both SetBindingClick call
sites so already-saved btn4/5 binds (incl. modifier combos like
SHIFT-Button4) are migrated on load and fire without re-binding.
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
- NativeUI: normalize Button4/Button5 to BUTTON4/BUTTON5 on capture,
- FIX: #1931 ABO combat taint block on Bartender4 State Config bars
GSE armed native action-bar overrides by writing the secure attributes
gse-button/type/clickbutton onto the Blizzard button from insecure Lua,
which taints those values. The secure BAR_SWAP snippets then read the
tainted gse-button flag; on a bar that Bartender4 "State Configuration"
pages (it drives actionpage via a secure state driver), that taint rides
into Blizzard's ActionButton:UpdatePressAndHoldAction and its protected
SetAttribute("pressAndHoldAction") is blocked in combat -- the
"MultiBarBottomLeftButton12 ... SetAttribute" error blamed on Bartender4.
Fix: a secure snippet must never read an insecurely-written value.- Add a secure boolean gate
gse-secure, set ONLY from inside the
SecureHandler (SHBT:Execute) via new secureArmGSEButton /
secureYieldGSEButton / secureDisarmGSEButton helpers. - BAR_SWAP_OAC / BAR_SWAP_ONCLICK and the third-party OnEnter wrap now
gate ongse-secureinstead of the insecuregse-buttonstring. - Arm type/clickbutton through the secure handler too; the
gse-button
string stays (set insecurely) but is read only by non-secure icon/
tooltip/yield hooks, so its taint is inert. - LAB bars (BT4Button/ElvUI/NDui/CPB) are untouched -- they use SetState.
Verified in-game (MoP Classic 5.5, Bartender4 State Config on, override
on MultiBarBottomLeftButton12, spammed in combat): taintLog 2 shows zero
GSE-sourced taint and no pressAndHoldAction block; the button still fires
the sequence normally.
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
- Add a secure boolean gate
- Merge remote-tracking branch 'upstream/master'
- FIX: ABO works in all forms incl. Prowl on Bartender4 and stock bars
- getButtonEffectiveSlot: read the resolved .action field so the yield check
evaluates the bonus-bar slot the button actually fires (Cat/Prowl/Bear), not
base slot 1 -- stops the Single-Button Assistant on slot 1 from hijacking the
override. - ActionBarSlotHasForeignAction: keep the override only for confirmed GSE
sequence macros; yield to any other macro/spell/item on the slot. - LAB bars (BT4/ElvUI/NDui/CPB): register the override on every LAB state so the
bar's stance/form paging (Prowl = its own state) can't strand it.
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
- getButtonEffectiveSlot: read the resolved .action field so the yield check
- Merge pull request #1949 from LarryThiessen/fixes-batch-1935-1948
Tracker / skin / debugger / options fixes & enhancements (#1935-#1948) - #1951 Only perform LINT tests on Pull Requests and dont include debug code in production builds
- #1948 FIX: Actionbar Overrides icon missing
Statics.Icons.Button pointed at a misspelled path (actionoride.png) with no asset; add the actionoverride.png asset and correct the path.
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com - #1947 FIX: Settings dropdowns render behind the options panel
Stop forcing SettingsPanel to FULLSCREEN_DIALOG strata; rely on the stock Settings.OpenToCategory to open and layer the panel so its dropdown popouts appear in front. Remove the dead BringSettingsPanelForward helper.
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com - #1946 FIX: Pause-toggle reload prompts did nothing
Shift/Alt/Ctrl pause toggles called the retired StaticPopup_Show(GSE_ConfirmReloadUIDialog) which is no longer registered; switch to the migrated GSE.GUICall(GUIConfirmReloadUI).
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com - #1945 EHN: Skin swap prompts reload and defers all changes until reload
Selecting a skin only saves the choice and prompts a reload; nothing swaps live, so the whole skin changes together on reload. Declining keeps the session on the current skin.
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com - #1944 FIX: Remove obsolete tracker icon options
Remove the Single Icon checkbox and Preview Icon Count slider from Tools & Diagnostic; the tracker is locked to a single icon.
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com - #1943 EHN: GSE windows follow the active global font (skin-aware)
GSE text adopts the active font by skin mode: Native = stock Blizzard default (forced even when ElvUI/EUI replaced the globals), Modern = STANDARD_TEXT_FONT, Addon = ElvUI normFont / EllesmereUI font. Face-only (size/flags preserved), applied across all GSE windows, the tree, debugger rows and the tracker.
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com - #1942 EHN: Remove class-colour outline on Native-skin windows
Remove the 4-side class-colour band around Native-skin windows; the accent still applies to button/checkbox text and the slim scrollbar. Modern borders unaffected.
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com - #1941 EHN: Live-resize throttling (Editor + Debugger)
Throttled ~50fps OnUpdate resize pump with a whole-pixel coalesce and a settle on mouse-up, on the Editor and the Debugger main and side windows.
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com - #1940 EHN: ElvUI skin parity
Add GSE.Skin.HostAccentColor and union the external-provider gating so GSE widgets (scrollbar, close button, dropdown chrome/list/chevron, icons) fully skin under ElvUI/EllesmereUI.
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com - #1939 EHN: Dropdown max-visible cap
Cap visible rows (default 20) so a long uncapped list scrolls in a bounded popup instead of growing off-screen; explicit SetMaxVisibleItems still wins.
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com - #1938 EHN: Debugger chrome, side-window strata and re-snap
Side windows ride with the main window's strata, re-snap to the main on drag, the stray side close button is removed, and GSE.RefreshDebuggerSkin repaints on a live skin change.
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com - #1937 FIX: Import window transparent under Modern skin
Mix in BackdropTemplateMixin and paint a GSEImportBodyFill texture so the import window renders solid under the modern skin.
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com - #1936 EHN: Tracker font follows the active skin
Tracker text uses GameFontHighlightSmall + a subtle drop shadow from the live font global instead of GameTooltipText + heavy OUTLINE, so it adopts skin fonts.
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com - #1935 EHN: Player Status tracker line
Toggleable Combat/No-Combat status line in the tracker text panel (default on) with an Options checkbox. Initialises safely from saved vars on fresh install and upgrade.
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
3.3.21
GSE
3.3.21 (2026-06-13)
Full Changelog Previous Releases
- #1930 Fix localisation strings
- #1930 Fix missing Localisation string
- Merge pull request #1933 - #1930 Skin selection dropdown (Native/Modern/addon)
#1930 Skin selection dropdown (Native/Modern/addon) + relocate GUI helpers to GSE_Utils - #1930 Skin selection dropdown (Native/Modern/addon) + relocate GUI helpers to GSE_Utils
Replaces the two mutually-exclusive Native/Modern skin checkboxes in the options
panel with a single Skin dropdown offering Native, Modern, and a dynamic
addon-specific entry (labelled "ElvUI" or "EllesmereUI", shown only when that
addon is installed).- New saved variable GSEOptions.SkinMode ("NATIVE"/"MODERN"/"ADDON"; unset =
AUTO). AUTO uses the installed addon skin when present, otherwise Native; an
explicit choice is always honoured. Migrates the old boolean
GSEOptions.UseModernSkin (true -> "MODERN", otherwise AUTO) and keeps it in
sync for downgrade safety. - Provider selection in GSE_GUI/Skin.lua now honours the mode: ElvUI/EllesmereUI
only drives GSE's look when the effective mode is "ADDON", so choosing Native
or Modern is respected even with one installed (previously the external
provider always won). - Moves the front-end-only helpers (skin accessors, UI-scale subsystem,
frame-positioning math) out of core GSE/API/InitialOptions.lua into a new
GSE_Utils/Appearance.lua. The macro engine never calls them; GSE_Utils is the
lowest shared front-end dependency (GSE_Options and GSE_GUI both depend on it),
so they stay available without forcing the LoadOnDemand GSE_GUI to load. Core
keeps only the saved-variable defaults + migration.
No change to the macro engine. luacheck (std=lua51) / busted unaffected: no spec
or core file references the moved functions.
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
- New saved variable GSEOptions.SkinMode ("NATIVE"/"MODERN"/"ADDON"; unset =
- #1914 Fix random spell flash
- #1928 post mnerge update
- Merge remote-tracking branch 'refs/remotes/origin/master'
- #1928 Fix loading of large sequences into the editor
- #1920 SKyriding Keybinds
- #1925 Guard retail api reference and fall back to classic one when not available
- Merge branch 'master' of https://github.com/TimothyLuke/GSE-Advanced-Macro-Compiler
- #1927 NativeUI: rewire reparented slim-scrollbar OnValueChanged
anchorModernSlimScrollBar reparents the stock UIPanelScrollFrameTemplate
scrollbar off its ScrollFrame onto a BackdropTemplate Frame so it can
render outside the ScrollFrame's SetClipsChildren(true) clip region.
After the reparent, Blizzard's UIPanelScrollBar_OnValueChanged still
ran self:GetParent():SetVerticalScroll(value) — but GetParent() was now
the BackdropTemplate frame, which has no SetVerticalScroll. Every
scroll tick threw "attempt to call a nil value" out of
SecureScrollTemplates.lua:24.
Notes was the visible crash because the editor's pixel-scroll path
swaps OnValueChanged after reparenting; the Notes box (and the
Debugger output pane) kept the stock handler. Capture the original
ScrollFrame before SetParent and re-point OnValueChanged at it.
Additive: guarded by GetParent().SetVerticalScroll existence so a
non-ScrollFrame parent silently skips; callers that install their own
handler still win on top; unskinned setups never enter the branch.
Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com - #1914 Fix EllesmereUI Disabled backgrounds
Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com - #1924 variable editor: re-evaluate the preview with arguments
Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com - #1924 adjust variable scoping to ensure they are loaded correctly
Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com - #1914 Minor editor quirks
- #1923 Fix Alt+Rightclick to lock tracker position
- #1897 CHange popup text to match current function.
- #1914 Editor fixes and disable dev mode for non devs
- #1920 fix toggling sequence names
- #1920 Toggle Sequence Name display for Overrides in options
- #1920 remove dependency on state of CVar ActionButtonUseKeyDown
3.3.20
GSE
3.3.20 (2026-06-05)
Full Changelog Previous Releases
- #1914 Add GSE_Companion to the source list
- #1914 EllesmereUI Icon Provider Update
- #1914 Fix Skyriding keybinds
- #1914 Expose legacy GSE proxy with RegisterAddon/GetSequenceNamesFromLibrary/isEmpty
External sequence-pack plugins (not under our control) still parse with
local GSE = GSEand call GSE.RegisterAddon / GSE.GetSequenceNamesFromLibrary
to register their bundled sequences. After the privacy refactor those
plugins would clear their ownif GSE == nil then return endguard and
crash on the first internal helper (GSE.isEmpty).
Expose a sealed proxy at _G.GSE carrying ONLY the registration handshake
surface — the two methods plus the isEmpty nil-guard the registration
path itself uses. Everything else on the private namespace (L, Static,
Library, AceEvent mixins, internal helpers …) is deliberately absent.
__newindex silently drops writes so a strayGSE.foo = barin a plugin
can't clobber our exposed methods or graft state onto the proxy.
__metatable = false locks the metatable so it can't be re-tabled either.
Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com - #1914 GSE Pause editor corrections
- #1914 Gte depending on version greater than 11
- #1914 Fix Patron update in build
- #1914 Packaging update
- #1914 Pass texture (not Button) to ElvUI Skin.Icon
NativeUI.createIcon was handing the surrounding Button to
GSE.Skin.Icon, but ElvUI's S:HandleIcon calls icon:SetTexCoord
internally — that method only exists on Textures, so the
Button-typed argument errored with "attempt to call a nil
value" the moment a player /reloaded with the GSE menu
auto-restore path engaged and ElvUI enabled. Pass widget.image
(the texture created two lines above) instead so HandleIcon
operates on the right object and ElvUI's icon coords actually
apply to the icon image.
Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com - #1914 Solve memory leak
- #1914 TOC Updates for 12.0.07
- #1914 More Keybind and skyriding fixes
- #1914 Internal Tracker.
- #1914 Scroll Speed Fix, help-spell casting variants
- #1918 FIx sorting DebugWindow and only showing spell assist column when on a client that has that.
- #1918 #1914 Icon Flicker, Macro Count, and ABO Highlight
- #1918 Removal of CTRL+Z, Fix Arrow Keys, Fix MultiEditor launch and fix Toolbar toggling.
- #1914 Remove AceConsole Reference
- #1914 Restore Skyriding Keybinds
- #1914 Fix Clearing Keybinds wiping all of GSE_C
- #1914 Update menu graphic
- #1914 EllesmereUI Look and Feel
- #1914 More code cleanup
- #1914 Post luacheck build errors
- Merge pull request #1916 from TimothyLuke/dependabot/npm_and_yarn/ws-8.21.0
Bump ws from 8.18.3 to 8.21.0 - #1914 code cleanup
- #1914 Luacheck
- #1914 Luacheck update
- #1914 Second Cut removing AceGUI Dependency
- Bump ws from 8.18.3 to 8.21.0
Bumps ws from 8.18.3 to 8.21.0.
updated-dependencies:- dependency-name: ws
dependency-version: 8.21.0
dependency-type: indirect
...
Signed-off-by: dependabot[bot] support@github.com
- dependency-name: ws
- patron publish: point embed at GSE_Menu_Logo.png (the wide finish)
The Discord build notification was still resolving to GSE_Logo_Dark_512.png
— that's the square crop now used for the in-game app icon + the
Companion app icon — instead of the wide menu finish. The thumbnail
slot in a Discord embed reads better with the wide artwork; same for
the bot avatar circle (the wider crop centres the wrench head + GSE
letters away from the round crop edge).
GitHub raw URL pattern unchanged so Discord's media proxy stays happy.
Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com - logo: refresh menu + dark icons to the new finishes
GSE_Menu_Logo gets the wide wrench framing (image #10) at 250×250 —
fills the top-bar slot in the in-game menu without cropping. The
dark icon (GSE_Logo_Dark_512.png used by the welcome screen, LDB
minimap, editor min-widget, import-dialog header, and tracker
identity check) gets the square crop (image #12) at 512×512 — the
wrench now wraps the GSE letters fully so the icon reads at small
sizes too. No code paths changed; same filenames, same load
sites.
Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com - Update Icon
- #1915 Allow a modifier to be set to pause a sequence
- patreon publish: use direct PNG URL for embed thumbnail
The previous gse.tools URL 302-redirected to a signed S3 url, which
Discord's media proxy didn't render as an embed thumbnail (though it
accepted it for the webhook avatar). Switch to the GitHub raw URL of
the committed PNG — direct image/png response, no redirects — same
shape forgecdn used for the original logo. Rolls back the attachment
plumbing; setThumbnail(url) is the right tool, the URL was wrong.
Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com - patreon publish: attach logo file so the embed thumbnail renders
The previous attempt set the embed thumbnail to a gse.tools URL that
302-redirects to a signed S3 URL. Discord's media proxy accepts the
redirect for the webhook avatar (visible bot pic = new wrench, ✓) but
refuses it for embed thumbnails (right-side thumbnail = missing).
Author icon was ambiguous.
Switch the embed author icon + thumbnail to attachment://gse-logo.png
and attach GSE_GUI/Assets/GSE_Logo_Dark_512.png alongside the zip.
Discord renders attached images directly with no proxy fetch, so the
thumbnail comes back. Bot avatarURL keeps the gse.tools URL since the
webhook avatar fetch works fine through that path.
Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com - patreon publish: new GSE wrench logo in Discord embed + bot avatar
Swap the embed author iconURL + thumbnail away from the stale forgecdn
gse2-logo-dark-2x.png onto a single LOGO_URL constant pointing at the
new wrench logo hosted via Qik file storage at gse.tools (file id
6a17c04d699ec384f2773a97). Same id serves the website's header/hero,
so future re-brands swap the file behind the id and propagate across
both surfaces.
Also override the webhook send with username + avatarURL so the bot's
own profile picture matches the embed, instead of inheriting whatever
avatar the webhook was originally created with in the Discord server
settings (still the old hex logo there).
Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com - logo: new GSE wrench logo across in-game surfaces
Replaces the old GSE2 wordmark with the new GSE wrench logo wherever
the addon shows its brand at runtime: the welcome screen background,
the LDB minimap icon, the editor min-widget icon, the import-dialog
header, and the tracker-button identity check.
GSE_Logo_Dark_512.blp → GSE_Logo_Dark_512.png. WoW reads PNG fine
from addon assets, so swapping the file extension + updating the
Statics path in GSE/API/Statics.lua is sufficient. Deleted the old
BLP so the TOC IconTexture base-name lookup picks the new PNG
unambiguously. GSE_Menu_Logo.png overwritten at the same 250×250
the runtime already expected.
Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com - publish: surface server-side cleanup summary
The /publish/mod endpoint now applies the retention rule (latest release- previous release + alphas on top of latest) on every publish — see the
GSE-Tools-API commit. Print the cleanup summary line including the
latest/previous baseVersion the server picked, so CI logs show what was
archived.
Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
- previous release + alphas on top of latest) on every publish — see the
- #1913 gate sequecne recompilation behind checking for isEncounter
3.3.19
GSE
3.3.19 (2026-05-21)
3.3.18
GSE
3.3.18 (2026-05-18)
3.3.17
GSE
3.3.17 (2026-05-16)
Full Changelog Previous Releases
- #1893 update build script
- #1890 Statics: register specId 1480 (DH Devourer/Aldrachi) in SpecIDClassList
- #1890 Colour code corrections — don't rewrite MacroBlock text mid-typing
The previous patch's macroEditBox OnTextChanged handler called
sel:SetText(value) to rewrite the visible text when decoded value
differed from raw input. AceGUI fires OnTextSet after SetText, which
resets the caret to position 0 and strips editor colour markup —
producing a visible cursor-jump and lost colouring whenever the user
typed into a MacroBlock.
Drop the sel:SetText branch. The handler still decodes value and
stores the clean form via StoreMacroEditorText(value); we just no
longer overwrite the live edit box while the user is interacting
with it. The same change applies to GSE_QoL's CreateSpellEditBox
override since it mirrors the base GUI implementation.
Patch from external contributor (Larry, 2026-05-10). - #1890 Colour code corrections — UI editor decode/disable-coloring wiring
Editor.lua:
- GetCompiledMacroBodyLength — decode before measuring length.
- Raw editor compile/cancel — decode input before loadstring; disable
IndentationLib on widget release/cancel so stale colouring doesn't leak.
- Per-action save (cfg.sourceBox) — StoreMacroEditorText for macro fields,
DecodeEditorText for everything else.
- Raw-edit button — sanitize sequence version before opening raw editor.
- Macro action render — repair leaked markup on action.macro before display,
decode spelltext for non-macro types, decode in OnTextChanged callbacks.
- macroEditBox — DisableMultilineEditorColoring on creation/release; decode
text on change with a recursion guard before storing via StoreMacroEditorText.
Editor_Actions.lua:
- Wrap each spellEditBox:GetText() with DecodeEditorText (or
StoreMacroEditorText for macro radio).
- Compiled-side-panel + visible-char count both decoded.
Editor_Macro.lua:
- Macro template / compiled-template / OnTextChanged paths decode through
DecodeMacroEditorText / StoreMacroEditorText.
- Manual macro display SetText decoded.
Editor_Variable.lua:
- OnRelease callback disables IndentationLib on the value editor.
MacroCompare.lua:
- DisableCompareColoring on close, action button, and OnRelease for both
diff columns.
MacroPreview.lua:
- DisablePreviewColoring on PreviewLabel OnRelease.
QoL.lua (GameMode > 10 retail-spell editor):
- Mirrors Editor.lua's macroEditBox pattern: repair-on-display, decode
OnTextChanged with recursion guard, DisableMultilineEditorColoring on
create/release, count + side-panel through decode helpers. - #1890 Colour code corrections — sanitize on storage and import paths
Storage.lua:
- migrateSequenceVersions / ReplaceSequence — call SanitizeSequenceEditorMarkup
so previously-stored sequences with leaked markup get cleaned on next save.
- buildAction / CompileMacroText — decode macro text before slash-command
detection so a leaked colour prefix doesn't hide the leading "/".
Utils.lua:
- OOCAddSequenceToCollection / OOCPerformMergeAction — sanitize before storing.
- processWAGOImport — scrub the imported tree.
- ImportSerialisedSequence — scrub COLLECTION payloads (with defensive
or {}on Sequences/Variables/Macros), MACRO, and VARIABLE imports.
- Adds local helpers scrubImportedEditorMarkup / scrubCollectionPayload that
recurse using the new GSE.Decode* helpers (with inline fallback if absent). - #1890 Colour code corrections — add editor-markup decode helpers
Adds shared helpers used across the editor, storage, and import paths to
strip leaked WoW colour markup (|cff…|r and || escape pairs) without
losing the translator-coloured display text:
GSE.DecodeEditorText — strip colour markup from any string
GSE.DecodeMacroEditorText — same + repair |cmd → /cmd at line starts
GSE.StoreMacroEditorText — decode + recompile-then-decode for storage
GSE.SanitizeSequenceEditorMarkup — recursive walker over sequence tables
This commit lands the helpers only; storage/import/UI call-sites follow. - #1890 Hide the macro compilation unless the cokmpile template window is open
- #1893 manage import queue
3.3.16
GSE
3.3.16 (2026-05-07)
Full Changelog Previous Releases
- #1890 more editor and icon related fixes
- LastUpdated: UTC via GetServerTime + macro tracking + clear PlatformID on rename
Holistic fix for the cross-account multi-write bouncing class. When one
Companion installation has the same sequence/macro/variable on two WoW
accounts and is syncing both, each /reload writes its own slightly-
different copy of the record and the server alternates between them,
firing a Discord toast on every flip (observed at ~9 toasts in 4 min
for one author 2026-05-08).
Resolution: server side picks the newer-stamped copy. That requires
the addon stamp every record with a comparable timestamp.
Changes:
* GSE/API/StringFunctions.lua: GSE.GetTimestamp() now returns UTC via
date('!%Y%m%d%H%M%S', GetServerTime()). Was client-local time which
made cross-timezone comparison nonsensical.
* GSE/API/Storage.lua: UpdateMacro stamps node.LastUpdated. Macros
previously never tracked LastUpdated at all. Plus new function
GSE.BackfillLastUpdated -- idempotent, gated by a SavedVariables
flag, walks GSE.Library / GSEVariables / GSEMacros and stamps any
pre-existing record missing the field.
* GSE/API/Events.lua: PLAYER_ENTERING_WORLD calls
GSE.BackfillLastUpdated so legacy records light up on first login
after the user updates the addon.
* GSE_GUI/Editor.lua: sequence rename (newname-flag path) clears
sequence.MetaData.PlatformID and the GSEPlatformIDs sidecar entry
under the original origin key. Prevents the v4-renamed-to-v5 case
where both sequences inherit the same server _id and bounce.
* GSE_GUI/Editor_Variable.lua: variable rename (OnTextChanged
callback) clears GSEVariablePlatformIDs[oldName].
* GSE_GUI/Editor_Macro.lua: macro rename (OnEnterPressed callback)
clears GSEMacroPlatformIDs[oldName].
Pairs with:
* gse-api commit 9afbc3b -- server-side enrich.js stamps LastUpdated
when the incoming payload doesn't carry one.
* GSE-Companion commit 667ea56 -- preserves top-level LastUpdated on
upload (was being silently stripped during rawData rebuild). - #1908 Fix multiclick button settings
- #1893 sync updates
- #1893 More Sync checks
- #1890 Fix Patreon icon selector