3.17.6-69-ge482f41

Details

  • Filename
    WIM-3.17.6-69-ge482f41.zip
  • Uploaded by
  • Uploaded
    Sep 8, 2026
  • Size
    832.26 KB
  • Downloads
    110
  • MD5
    b9ab82206a6d4082f678dc9c40882ece

Supported WoW Retail Versions

  • 12.1.0
  • 12.0.7

Supported WoW Mists of Pandaria Classic Versions

  • 5.5.4

Supported WoW Wrath Titan Reforged Versions

  • 3.80.2

Supported WoW Classic Versions

  • 1.15.9

Supported WoW Burning Crusade Classic Versions

  • 2.5.6

Changelog

WIM

3.17.6-69-ge482f41 (2026-09-08)

Full Changelog Previous Releases

  • CI: Fix typo
  • CI: Revert back to default alpha names.
  • CI: include project revision in file name
  • CI: Change file names for alphas to use the date instead of last tag version.
  • CI: Gate alpha builds from the alpha branch. Tags will publish betas and releases.
  • Build and lint the alpha branch in CI
    Pushes to alpha now package as alpha builds and pull requests against
    it get the luacheck run.
  • Round the Edit Mode size sliders and drop the Default prefix from their labels
    The History Viewer and filter editor panels measured the live frame
    until a slider was first moved, and a scaled frame measures as a
    fraction, so the value label printed 700.0000. The measurement is now
    rounded at the source and every slider row rounds its value label by
    default; the scale slider keeps its percent formatter. The message
    window sliders reuse the Width and Height strings, since they resize
    open windows immediately rather than only setting a default, and the
    two orphaned keys leave all ten locale files. The Placement & Size
    fallback sliders for clients without Edit Mode follow suit.
    Copied over from the machine-local testing branch.
  • Key the suppression filter like the window store and predict the pop-up
    The chat-frame filter looked the sender up under a realm-qualified key
    while the whisper handler stored the window under the ambiguated name,
    because realm stripping compared the event's spaceless realm against
    the client's spaced one. On any multi-word realm the lookup missed and
    Show Only in WIM never hid a same-realm whisper. Realm comparison now
    ignores spaces and hyphens, which also repairs the AFK, DND, system and
    toast lookups. The shown-once gate becomes a prediction: suppress when
    the window has been shown or the state's Pop Up on Receive rule (minus
    the per-type Never Pop Up) would show it, so the first message of a
    conversation no longer leaks into the chat frame. Same change across
    the chat types, channels and communities; tooltip and locales re-keyed.
    Copied over from the machine-local testing branch.
  • Restore the packager version keyword in WIM.lua
    The modernization merge pinned version to a 3.18.0 literal where
    master reads @project-version@, so every alpha built from this branch
    would have announced 3.18.0. The TOC already carries the keyword; the
    Lua side matches it again.
  • Simplify two negated comparisons that fail luacheck
    The community slash toggles wrote their flags as not (x ~= false) and
    not (x == true), which luacheck 1.2 reports as warning 581 and the CI
    step treats as a failure. Both become the direct comparison with the
    same result.
  • Merge pull request #278 from Mojo-OG/modernization
    Modernization: history storage fix (#251), 12.x fixes, native options UI, Modern skin
  • Skip the history archive notice on a fresh install
    The notice keyed off the schema stamp being absent, which is also true
    of a brand-new profile with nothing to convert. It now prints only when
    legacy history was actually queued for conversion.
    Copied over from the machine-local testing branch.
  • Add locale entries for the new settings and Edit Mode strings
    Every new page, section, row and tooltip has an enUS entry, and the
    strings the classic window owned but nothing reads any more are
    removed. The nine other locales carry machine translations, each marked
    on its line as a placeholder until a native speaker can confirm or
    correct it.
    Copied over from the machine-local testing branch.
  • Rebuild the settings pages on the native panel and migrate settings once
    The category is reorganised into fifteen pages under Conversations,
    Windows, Appearance, Notifications, Privacy and History, with lists and
    grids drawn the way the panel draws its own, one-row sound controls, a
    WIM Modern Skin page, folder mirrors so search reaches nested pages, and
    a type-to-confirm dialog for the account-wide history wipe. The
    defaults are re-baselined (Modern skin, multi-line input, native input
    colors) and Migrate.lua runs a one-time schema 1 pass over profiles
    written by earlier releases.
    Copied over from the machine-local testing branch.
  • Retire the classic options window
    The native settings panel is now the only options UI, so the classic
    window, its toolkit, the style toggle and the chat modules' classic
    pages go away, along with the alias stub that was never wired up and
    its unused WIM3_Alias saved variable. Pop-up rules resolve through one
    shared GetPopRuleSet helper, and chat windows remember whether they
    were ever shown so a suppressed window does not swallow its first line.
    Copied over from the machine-local testing branch.
  • Move message window placement and sizing into Edit Mode
    Message windows, the History Viewer and the filter editor register with
    the client's Edit Mode as a WIM group in the advanced options, each with
    its own ghost, size sliders and saved position. Windows now move and
    size by cursor delta instead of StartMoving, which fixes the jump on a
    still click and keeps the grip through focus loss. The filter editor
    becomes sizable, and User Level filters are purged with a notice.
    Copied over from the machine-local testing branch.
  • Add /wim forcelockdown to exercise the chat lockdown anywhere
    Flips the addonChatRestrictionsForced CVar so deferral and replay can
    be tested in the open world instead of inside a rated match. The CVar
    does not persist across sessions.
  • Clear a reported player's window on PLAYER_REPORT_SUBMITTED
    Matches what the default chat frames do after a report. Saved history
    is left alone. The event does not exist on classic clients so the
    registration goes through pcall.
  • Scrub |K protected strings before persisting history
    |K tokens are session scoped and read back as garbage in later
    sessions, so they are replaced with a placeholder before the record is
    saved.
  • Existence gate retail chat APIs so classic clients load clean
    Community channel colors and names fall back through the legacy
    ChatFrame globals to a plain gold default, CLUB_MESSAGE_ADDED registers
    through pcall on clients without Communities, and the two legacy slash
    hooks are gated individually since a client can have one without the
    other.
  • Guard the remaining secret value edges
    debugstack itself returns a secret when secure code is on the stack, so
    the escape handler and skin registration check before matching on it.
    GetColoredNameByChatEvent can be handed secret args by addons that
    replace it, the SendChatMessage hook member-checks C_ChatInfo before
    attaching, and CanAccessValue plus ScrubSecretValues wrap the new
    client predicates with safe fallbacks.
  • Tell the user when the chat lockdown blocks a send and keep their text
    Every refusal site now raises a throttled notice instead of failing
    silently. The command splitter no longer clears the edit box when the
    send was refused, the split sender re-checks the lockdown inside its
    timer paced closure so chunks stop cleanly mid run, and the handoff to
    the native edit box is refused during the lockdown instead of eating
    the typed line.
  • Wake the replay drain from ADDON_RESTRICTION_STATE_CHANGED
    The event fires after the chat restriction deactivates, so deferred
    messages replay the moment a lockdown ends instead of on the next poll.
    The 1 Hz ticker stays as a fallback but only exists on clients that
    have secret values at all.
  • Harden the deferred chat queue and its replay drain
    Rehydration now goes through pcall and drops a line whose text or sender
    cannot be recovered instead of replaying blank strings, counting each
    drop and telling the user once when the drain finishes. Channel events
    whose channel name was secret are dropped since they cannot be routed.
    The queue dedupes by line id so a message re-injected by another addon
    does not replay twice, caps at 500 entries, and replayed events keep the
    original argument shape with nils preserved. The write-only
    ChatLineHasSecrets table is gone.
  • Let the default UI build its own reply headers
    When WIM does not intercept a reply there is no need to assemble the
    header by hand. Writing attributes on the native edit box from addon
    code is another taint path, and the default UI already does this itself.
  • Insert links through a secure post-hook and drop the tainting chat overrides
    Replacing ChatFrameUtil.GetActiveWindow and SetLastTellTarget taints the
    chat edit box slots permanently. The InsertLink post-hook only feeds a WIM
    edit box when no native box claimed the link, skips secret text, and the
    tab advance no longer writes Blizzard's last tell target.
  • Merge branch 'master' of upstream into modernization
    Upstream's SetWidgetFont fix resolves the font from the skin for
    both calls; this branch already carries the same change from the
    skin engine port, so the merge keeps the existing lines.
  • Localization for the new strings
    Every locale covers the new say toggle, chat color, and filter
    editor strings. The translations are Google Translate placeholders,
    marked as such in the files, pending review by native speakers.
    Copied over from the machine-local testing branch.
  • The filter editor wears the Modern skin
    The dialog takes the chat window frame with its title band, modern
    dropdowns and checkboxes, the search-band name field, an inset
    pattern well with the slim scrollbar, and its own background and
    cut-out settings; it re-dresses live on skin swaps. Copied over
    from the machine-local testing branch after in-game testing on
    retail and classic era.
  • Modern options: chat colors, filter editor settings, dialog fixes
    Adds the Chat Colors toggles that color the message being typed by
    its chat type, the filter editor's background settings, a gate on
    the In-line whisper button once the setting is already set, and a
    bug-report url box that fits the classic dialog. Copied over from
    the machine-local testing branch after in-game testing on retail
    and classic era.
  • Message splitting fixes and a say output toggle
    Chat-type slash commands split like plain sends, chunks fill to the
    length cap exactly, long bursts pace past the server throttle, and
    the say window gains a shortcut-bar toggle for say, yell, or emote
    that also consumes typed prefixes. Copied over from the machine-local
    testing branch after in-game testing on retail and classic era.
  • Menu styling and Modern skin paint fixes
    Modern menus style every level through the menu-acquired callback
    and take retail's bottom inset; the minimap menu draws one plate
    across both sections; cut-out strips and the classic era portraits
    paint correctly on first show. Copied over from the machine-local
    testing branch after in-game testing on retail and classic era.
  • Use the game api when the dropdown library is not packaged
    On classic flavors the compat shim now registers a stub whose
    lookups fall back to the WoW globals when LibDropDownMenu is not
    packaged, so a plain source checkout still gets working dropdowns.
    Copied over from the machine-local testing branch after in-game
    testing on retail and classic era.
    Co-authored-by: anon1231823 [email protected]
  • Restore the search bar anchors in a safe order
    In the native search style the clear button anchors to the box,
    while the box's saved anchor targets the clear button. Restoring the
    box first therefore created an anchor cycle and a SetPoint error
    when switching back to a classic skin. The clear button's anchors
    now restore first.
  • Style submenus as they spawn
    Submenus open as sibling frames after the client's hover-intent
    delay, so the open-time walk never saw them. Each row hover now
    schedules staggered re-walks of the menus' shared parent, catching a
    submenu at any depth when it appears; the walk is idempotent so the
    repeats cost nothing. The portrait paints also write debug-log
    traces, to pin a transient sizing issue.
  • Use the retail menu and dropdown art on classic flavors
    Classic clients paint classic-styled variants of the menu atlas
    members, so the character selector, filter dropdown, and context
    menus looked out of place next to the Modern skin. A per-texture
    rename hook remaps them to the retail members, normalizing every
    observed state name convention. The pieces whose classic pixels
    differ from retail's (the dropdown holder, all six arrow states, and
    the menu plate) paint from shipped copies of the retail art, at the
    retail size and anchor. Menus get a measured bottom margin, and
    /wim snapmenu can capture dropdown menus.
  • Fix a client crash restoring the search box font
    A box whose font was set by file path reports its own anonymous font object, and restoring through that object creates an inheritance cycle the client resolves by infinite recursion. The saved state now records the font file properties and restores through SetFont.
  • Ship the 2x corner-button art for classic flavors
    Classic flavors resolve the RedButton names to the 1x sheet, so the
    corner buttons upscaled blurry; clients without the portrait panel
    art now paint shipped copies of the retail 2x pieces. The classic
    pass resets the state textures' coordinates, since setting a texture
    file does not clear the shipped art's coordinate window.
  • Cut-out strips show pictures as one continuous image
    Non-tiling backgrounds painted the whole image into each cut-out strip, squashed four times. Each strip now windows to the part of the image under it. This affected retail and classic alike.
  • Slim scrollbars and button gating in the options lists on classic flavors
    Options lists hide whatever scrollbar the scroll template attached
    and drive a slim slider built from the minimal scrollbar art, on any
    client without the portrait panel art. The Classic Options button's
    modern-only lock is also enforced as the row initializes, since some
    clients ignore the modify predicate on button rows.
  • Snapshots: client capability probes and delayed capture
    Dumps record a client block (atlas, file, layout, and API probes),
    skin state, and per-window paint state, so flavor issues can be
    isolated from data instead of screenshots. Probes run isolated and
    record their errors, and GetAtlasInfo is called outside the addon
    environment so it resolves its mixins. /wim snap delay <seconds>
    arms a capture that fires on its own, for states that appear while
    the hands are busy reproducing them.
  • Build the Modern frame from shipped retail art on classic era
    Classic era lacks the portrait nine-slice layouts, so the frame is
    built from the addon's copies of the retail metal pieces, drawn at
    the geometry retail uses. Message windows use the portrait corner
    and the History Viewer the plain one. The portrait paint stays era
    specific: era samples masks through the masked texture's own
    coordinates, so the class icon repaints from the per-class icon file
    at full coordinates. Switching back to a classic skin restores the
    icon's texture, coordinates, and size, with the chrome hidden before
    the teardown so the repaint cannot route through the themed path.
  • Keep the bug-report URL box inside narrow dialogs
    The edit box is clamped to the dialog width on show.
  • Fail with a message when the packaged libraries are missing
    A source checkout without the Libs folder now prints one chat line and stops loading instead of erroring on every event.
  • Offer only background art that exists on this client
    Background pickers skip entries whose files are missing on this client. A saved key whose art is gone falls back to Rock, then to the clear fill.
  • Size dialog text rows to their text; guard the alert icon
    Bug report and credits rows measure their wrapped text instead of using fixed heights, so long locales are not clipped. Clients without the retail alert icon keep the standard dialog icon.
  • Localize the slash command feedback
    The community focus and channel repair confirmations, the /wim style
    usage line, and the queued-options notice were hardcoded English, so
    translators could never reach them. They now go through the locale
    table, with draft translations for all ten locales in each file's
    existing style; corrections from native speakers are welcome.
    The debug-level feedback and the /wim snap help stay English on
    purpose: their output feeds bug reports and DEBUGGING.md, which are
    English.
    Also fixed while in the files: the frFR string for a blocked message
    said "Afficher une alerte", and the esES strata list showed the
    English word Tooltip.
  • Key class colors by the client's localized class names
    The class table was keyed by addon translations, so any locale without
    them lost class colors in windows and user lists. The keys now come
    from LOCALIZED_CLASS_NAMES_MALE and FEMALE, which hold the same strings
    the friends, guild, who, and Battle.net APIs return, so every locale
    resolves with no translation work. Hand-translated keys are kept as
    extra entries so older saved data still matches.
    Fixed along the way: Evoker joins the class list and the filter menu,
    female entries carry the talent table, and untranslated locales no
    longer create junk WarriorF-style keys.
  • Fixes from classic testing
    Three fixes reported against the PR branch on classic clients. The
    bug-report popup now finds the edit box under its new capitalized key
    on GameDialog clients, with the old key as a fallback. The classic
    dropdown polyfill had a trailing space in its template name, so list
    frames failed to create on older clients; the space is upstream's, but
    it is removed here. The options-style chat messages now go through the
    locale table instead of hardcoded English.
    Co-authored-by: Mojo-OG [email protected]
  • Localization: cover every locale for the new strings
    Full translation pass over the strings this branch adds: the modern
    options panel, the Modern skin settings, roleplay profiles, the History
    Viewer filters, and the diagnostics text. enUS lists the new keys and
    the other ten locales carry translations in each file's existing style.
    Co-authored-by: Mojo-OG [email protected]
  • Localization
  • Docs, credits, and a cleanup pass
    DEBUGGING.md covers the snapshot tool next to the debug log and which
    fits which kind of problem; the bug-report template walks through
    both. The build stamp uses the packager keyword, so releases carry it
    without extra tooling. Removes a development-only input probe, some
    leftover troubleshooting comments, and a dead caret workaround. The
    skin settings page is titled Modern Skin to match the engine's terms.
    Credits Avraelore (Moon Guard) for the modern skin and options work.
  • Options: use the native color and preview constructions
    Color swatches are rebuilt the way the Accessibility colors page
    builds them: a grouped panel of ColorOverrideTemplate rows with
    ColorSwatchTemplate swatches. Preview areas sit on the
    options_frame_child plate the nameplate preview uses. Also fixes
    pooled rows occasionally blanking a panel: a stale holder pointer
    could hide one still on screen.
  • Fix the invisible caret and dead scrolling in wrap mode
    This took several rounds; the churn theories all failed first. The
    cause: extra vertical text insets make a multi-line box recalculate
    its layout every frame. OnCursorChanged then fires continuously, and
    the cursor-follow undoes every wheel scroll one frame later. Keep the
    box at zero vertical insets, carry the spacing in the viewport
    margins, and follow only real cursor moves. Switching live back to a
    classic skin also restores cleanly now: input box draw order, header
    geometry, the menu backdrop, and the roleplay identity comes off
    classic frames.
  • Merge remote-tracking branch 'upstream/master' into modernization
  • Input row: character counter and an optional wrap mode
    The counter shows the message length against the send caps (255, 800
    for Battle.net) and how many messages the splitter will really send.
    The splitter now also breaks words longer than the limit instead of
    sending them oversized. Wrap mode turns the box multi-line inside a
    scrolling viewport and grows the row downward; the window takes on
    the extra height, so the message area never moves. Getting the growth
    stable took several passes.
  • Diagnostics: /wim snap dumps live widget state
    Writes the rectangles, anchors, atlases, texture coordinates, and
    fonts of everything WIM styles into a per-character SavedVariable,
    with a screenshot of the same moment. Skin problems can then be
    compared number by number against the native frames they copy,
    instead of being judged from screenshots. Every capture records which
    build produced it; the packager stamps BuildInfo.lua.
  • Roleplay profiles on whisper windows; native HV loader
    Whisper windows can show the partner's roleplay identity from Total
    RP 3 or any Mary Sue Protocol addon: names, titles, race, class,
    color, and portrait. Each field is opted into through a multiselect,
    and every field falls back to the default when it has no data. A
    shortcut opens the partner's profile in the installed viewer. Reads
    go through public APIs on WIM's own timer; hooking the addons'
    callback registries taints their dispatch (found out the hard way).
    The History Viewer's loading bar becomes the standard cast bar under
    the modern skin, and the themed header now fits and wraps instead of
    overflowing.
  • Add the Modern skin
    Message windows use the standard metal nine-slice: a gold title band,
    a recessed message well (cut-out mode leaves the well clear to the
    world), a circled class portrait, the native search-box border on the
    input row, and the standard red corner X. Menus use the chamfered
    context-menu panel, and right-click opens a real player menu. The
    classic options lock while a modern-only skin is active, because that
    page cannot offer the skin and could lose the selection.
  • Skin engine: modernOnly skins, tab text, reskin on LoadSkin
    Skins can declare themselves modernOnly: the classic dropdown never
    offers them, but still shows an active selection honestly. Tab strips
    restyle on every LoadSkin, tab_strip.text stops being dead data, and
    the saved skin name repairs itself across 3.17.2's title
    localization.
  • Rebuild the options inside the native Settings panel
    WIM registers under Options > AddOns with every page redone on native
    rows. Content without a native control (the formatting preview, the
    font browser, color swatches, the filter and channel lists) sits in
    custom element rows the list pools. Both UIs bind the same keys and
    notify each other, so they stay in step while both are open.
    db.modernOptions picks which UI the entry points open; the classic
    window stays available.
  • Port the #80 skin engine changes onto this branch
    Upstream merged #80 after this branch split off, so it is applied by
    hand here. Fonts resolve from an object, an SML name, or a path.
    LoadSkin takes an immutable flag and fires OnSkinLoaded. The menu and
    the chat user list restyle live. A missing saved skin falls back to
    the default.
  • Fix the shortcut bar location tooltip (#271)
    The file-scope buttons table is the type-keyed registry, not a button
    list. Indexing it with a number returned nil and the SendWho callback
    errored.
  • History Viewer: filter on conversation size and activity
    Relative dates now always prune the list. Closing the viewer from one
    of its own confirmations no longer reopens it.
  • History Viewer: clickable sections, sorting, date filters
    The Battle.net Friends header and the letter buckets now toggle their
    sections like user rows do. Names sort case-insensitively. The date
    menu gets relative filters (today, this week) that also narrow the
    list. Also stops the Window Behavior label overflowing the options
    page.
  • Fix refused community sends; fix more 12.1 breakage
    The client refuses to send to a community channel until its stream has
    been focused. Finding this took several debug captures. WIM now
    focuses each stream when its subscription arrives and stops once the
    client takes over. /wim focusstreams turns the pass off for
    comparison. /wim channelrepair (off by default) re-adds channels when
    the focus arrives too late.
    Also for 12.1: MouseIsOver is gone (the widget method replaces it),
    channel restore now verifies membership instead of trusting the add
    call (the ids form registers a junk channel named after the club id),
    and community windows resurrect under their proper names.
  • Persist a leveled debug log to disk
    /wim debug 1 records WIM's diagnostics. /wim debug 2 adds a raw trace
    of every chat event with its arguments. The log needs to survive
    logout, because that is where the interesting failures happen: lines
    get millisecond timestamps and land in a bounded per-character
    SavedVariable. Also carries the archive conversion glue.
  • Move history into a serialized account archive
    The account-wide history table causes the corruption in #251: when the
    saved file reloads, Lua's per-chunk constant limit fails on large
    tables. Store each conversation as one serialized string instead, and
    decode it in a sandbox when needed. Old data converts on first login.
    This replaces an earlier attempt that split history into a companion
    addon. Clearing history also removes the archive and the legacy
    tables.
  • Guard focus and interception during combat lockdown
    Focusing the edit box or updating the intercepted chat header touches
    Blizzard's secure frames, which throws in combat on current clients.
    Stand down until combat ends.