release: bump to v1.4.10

This commit is contained in:
2026-05-16 13:25:53 +02:00
parent 51f18e46a0
commit 3e91177833
7 changed files with 119 additions and 77 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
<Project Sdk="Dalamud.NET.Sdk/15.0.0"> <Project Sdk="Dalamud.NET.Sdk/15.0.0">
<PropertyGroup> <PropertyGroup>
<!-- Independent versioning; see yaml changelog for upstream Chat 2 base --> <!-- Independent versioning; see yaml changelog for upstream Chat 2 base -->
<Version>1.4.9</Version> <Version>1.4.10</Version>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<!-- Use lock file to pin exact versions --> <!-- Use lock file to pin exact versions -->
+44 -39
View File
@@ -35,6 +35,50 @@ tags:
- Replacement - Replacement
- Privacy - Privacy
changelog: |- changelog: |-
**v1.4.10 — Symbol-Picker and Tell-History Fix (2026-05-16)**
Eleventh and final sub-patch of the v1.4.x polish-sweep series.
Symbol picker for the chat input, a tell-history reload fix for
users with many active partners, and a closing cleanup sweep
before v1.5.0 picks up the DI-container adoption.
- Symbol picker: a small smile-icon button left of the channel
indicator opens a popup with two tabs. The first lists all 161
FFXIV PUA glyphs (Dalamud's SeIconChar enum); the second
carries 97 server-verified BMP symbols (latin marks, currency,
the full Greek alphabet, geometric shapes, suits, notes) —
every one of them round-tripped through /echo and /say in a
four-round probe so the in-channel render matches what the
picker shows. Click drops the glyph at the caret, multi-insert
keeps the popup open, and a recent-used strip floats the last
sixteen picks across both tabs. Toggle in Settings → Chat →
Message behaviour, default on.
- Pinned auto-tell tabs reload their full history again: a
hidden 500-row scan cap in PreloadHistory used to override the
user-configurable AutoTellTabsHistoryPreload setting, so
less-frequent pinned partners (rare /tell sessions in an
otherwise busy week) lost their backlog. The cap is removed;
the (Receiver, Date) index keeps SQL fast, the client-side
loop still respects your setting as the upper bound.
- Slash-command teardown: /hellion, /hellionView,
/hellionDebugger (and #if DEBUG /hellionSeString) wrappers are
now cached as private fields. Plugin teardown detaches the
live registration instead of re-Register'ing with identical
args — closes a latent maintenance hazard from v1.4.9.
- v1.4.x polish-sweep wraps up here. The ImGuiListClipper render
refactor that was on the v1.4.10 reserve list got dropped
after cross-platform smoke showed the scroll rubber-band is a
Wine / Linux render-pipeline quirk, not universal — Windows
users never saw it. It will get its own platform-targeted
spike in a later patch. Next major cycle is v1.5.0 with the
DI-container adoption (Microsoft.Extensions.Hosting +
ILogger<T>) modelled on Lightless.
- Migration v17 stays (no schema bump).
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
---
**v1.4.9 — Plugin-Load Render Polish (2026-05-15)** **v1.4.9 — Plugin-Load Render Polish (2026-05-15)**
Tenth sub-patch of the v1.4.x polish-sweep series. First-frame Tenth sub-patch of the v1.4.x polish-sweep series. First-frame
@@ -150,43 +194,4 @@ changelog: |-
--- ---
**v1.4.6 — Code Hygiene and Refactor (2026-05-12)**
Maintenance patch. No user-visible behaviour changes; tightens the
development feedback loop, fixes two upstream-inherited bugs, and
prepares the code for the v1.4.7 backlog cleanup.
- preflight.sh gains a csharpier reflow check and a markdownlint
pass so style drift and markdown violations are caught at the
pre-push gate
- FontManager fallback catches the full set of atlas-toolkit
throws (IO, InvalidOperation, ArgumentException) — a corrupt
font config no longer takes down the whole atlas build
- BrandingLinks and IntegrationLinks URLs validated on plugin
load — a typo in a future URL rotation now throws at startup
- Cherry-picked from ChatTwo upstream f35b7d3: Chat.SetChannel
no longer leaks the native Utf8String when the linkshell check
rejects the channel
- Cherry-picked from ChatTwo upstream f35b7d3: Tab.Clone now
deep-clones UsedChannel and TellTarget — PopOut and Temp tabs
no longer mutate each other's channel state
- Active-tab underline scales with DPI and rounds to physical
pixels for crisp rendering above 100% scaling
- IconButton width parameter no longer subtracts HUD-scaled
padding from a raw int (measured width passes through verbatim)
- Internal: HellionStyle ChildBgAlpha extracted to a testable
helper; Plugin.SaveConfig clones only the temp tabs;
SettingsOverview caches the draw-list per frame;
Dalamud.Utility.Util surface routed through an IPlatformUtil
indirection (MessageStore IsWine probe is now testable in
isolation)
- Built-in themes: Crystal Nocturne (sapphire and electric
magenta over obsidian, by CRYSTALLITE) replaces Moonlit Bloom.
Users with Moonlit Bloom selected fall back to Hellion Arctic
on first load
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
---
Full history: https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases Full history: https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases
+2 -2
View File
@@ -198,8 +198,8 @@ public sealed class Plugin : IAsyncDalamudPlugin
if (Config.Version < 16) if (Config.Version < 16)
{ {
throw new InvalidOperationException( throw new InvalidOperationException(
$"HellionChat v1.4.9 requires config schema v16, got v{Config.Version}. " $"HellionChat v1.4.10 requires config schema v16, got v{Config.Version}. "
+ "Please install v1.4.2 first to migrate the configuration, then upgrade to v1.4.9." + "Please install v1.4.2 first to migrate the configuration, then upgrade to v1.4.10."
); );
} }
Config.Version = 17; Config.Version = 17;
+19 -20
View File
@@ -2,7 +2,7 @@
[![Build](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/actions/workflows/build.yml/badge.svg?branch=main)](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/actions/workflows/build.yml) [![Build](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/actions/workflows/build.yml/badge.svg?branch=main)](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/actions/workflows/build.yml)
[![License: EUPL-1.2](https://img.shields.io/badge/License-EUPL--1.2-blue.svg)](LICENSE) [![License: EUPL-1.2](https://img.shields.io/badge/License-EUPL--1.2-blue.svg)](LICENSE)
[![Latest release](https://img.shields.io/badge/release-v1.4.9-brightgreen)](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/latest) [![Latest release](https://img.shields.io/badge/release-v1.4.10-brightgreen)](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/latest)
[![Dalamud API](https://img.shields.io/badge/Dalamud-API_15-purple)](https://github.com/goatcorp/Dalamud) [![Dalamud API](https://img.shields.io/badge/Dalamud-API_15-purple)](https://github.com/goatcorp/Dalamud)
[![.NET](https://img.shields.io/badge/.NET-10.0-512BD4)](https://dotnet.microsoft.com/) [![.NET](https://img.shields.io/badge/.NET-10.0-512BD4)](https://dotnet.microsoft.com/)
[![FFXIV](https://img.shields.io/badge/FFXIV-Dawntrail-c3a37f)](https://www.finalfantasyxiv.com/) [![FFXIV](https://img.shields.io/badge/FFXIV-Dawntrail-c3a37f)](https://www.finalfantasyxiv.com/)
@@ -11,7 +11,7 @@
<img src="docs/images/hellion-forge.png" alt="Hellion Forge" width="180" /> <img src="docs/images/hellion-forge.png" alt="Hellion Forge" width="180" />
</p> </p>
**Version 1.4.9** — Privacy-first chat plugin for FINAL FANTASY XIV / Dalamud, built on **Version 1.4.10** — Privacy-first chat plugin for FINAL FANTASY XIV / Dalamud, built on
[Chat 2](https://github.com/Infiziert90/ChatTwo) (EUPL-1.2). [Chat 2](https://github.com/Infiziert90/ChatTwo) (EUPL-1.2).
Hellion Chat is a privacy-first plugin built on the Chat 2 foundation. The majority of the engine comes from Chat 2 Hellion Chat is a privacy-first plugin built on the Chat 2 foundation. The majority of the engine comes from Chat 2
@@ -286,24 +286,23 @@ An optional submission to the Dalamud main plugin repo (in addition to the custo
## Project Status ## Project Status
**Version 1.4.9**Plugin-Load Render Polish. First-frame render cost is now well under Dalamud's 100 ms HITCH **Version 1.4.10**Symbol-Picker and Tell-History Fix. Eleventh and final sub-patch of the v1.4.x polish sweep
warning threshold (~76 ms median, down from ~127 ms). The gain comes from deferring six non-essential rendering series. A new symbol-picker popup hangs off a smile-icon button left of the channel indicator: tab one lists all
sections on the very first Draw — bottom status bar, channel-name SeString chunks, window bounds check, hint 161 FFXIV PUA glyphs (Dalamud's `SeIconChar` enum); tab two carries 97 server-verified BMP symbols (latin marks,
banner, autocomplete and input-preview calculation — so the initial ImGui layout cost is spread between frame 0 currency, the full Greek alphabet, geometric shapes, suits, notes) — each one round-tripped through `/echo` and
and frame 1 instead of all hitting at once. At 60 fps the user sees those sections one frame (~17 ms) later, which `/say` in a four-round whitelist probe so the in-channel render matches what the picker shows. Click drops the
is invisible inside the post-reload font-atlas build window. Slash commands `/hellion`, `/hellionView`, glyph at the caret, multi-insert keeps the popup open, recent-used strip floats the last sixteen picks across
`/hellionSeString` and `/hellionDebugger` are now registered centrally during plugin load so they work before both tabs. Toggle in Settings → Chat → Message behaviour, default on. Mid-cycle hotfix for pinned auto-tell tabs:
their target window is opened the first time. The configuration-button entry in Dalamud's plugin manager hangs on PreloadHistory had a hidden 500-row SQL scan cap that overrode the user-configurable `AutoTellTabsHistoryPreload`
the same path. Three plugin-load profiling logs (auto-translate warm-up, message-store connect, tab filter) stay setting — active users with many tell partners lost the backlog of less-frequent pinned partners. The cap is
on at Information level as a regression tripwire — if a future change pushes the load past 100 ms again, the cost removed; the `(Receiver, Date)` index keeps SQL fast, the client-side loop respects the user setting as the upper
is right there in `/xllog`. The release also ships a ChatTwo IPC compatibility layer: HellionChat now mirrors bound. Slash-command teardown cleanup: `/hellion`, `/hellionView`, `/hellionDebugger` (and `#if DEBUG /hellionSeString`)
ChatTwo's full IPC surface (`GetChatInputState`, `ChatInputStateChanged`, `Register`, `Unregister`, `Available`, wrappers are cached as private fields so plugin teardown detaches the live registration instead of re-Register'ing
`Invoke`) under the `ChatTwo.*` namespace in addition to our existing `HellionChat.*` provider gates, so with identical args. The original Reserve-A `ImGuiListClipper` refactor for `DrawMessages` was cancelled after
third-party integrations that historically only subscribe to ChatTwo's IPC (Artisan's and AllaganTools' context- cross-platform smoke showed the scroll rubber-band is a Wine/Linux render-pipeline quirk, not universal — Windows
menu hooks are the practical examples) keep working without requiring a code change on their side. Conflict users on v1.4.9 never saw it; the spike that targets the Wine path lives in a later patch. Migration v17 stays
detection prevents ChatTwo from loading in parallel with HellionChat, so there is no slot-collision risk at (no schema bump). v1.4.x polish sweep wraps up here; next major cycle is v1.5.0 with the DI-container adoption
runtime. Migration v17 stays (no schema bump). Tenth sub-patch of the v1.4.x polish sweep series (as of (`Microsoft.Extensions.Hosting` + `ILogger<T>`) modelled on Lightless (as of 2026-05-16).
2026-05-15).
Hellion Chat is a standalone plugin, no longer a fork in the repository sense. Fully completed: Hellion Chat is a standalone plugin, no longer a fork in the repository sense. Fully completed:
+25
View File
@@ -10,6 +10,31 @@ to the release pages for details.
--- ---
## Hellion Chat 1.4.10 — Symbol-Picker and Tell-History Fix (2026-05-16)
Eleventh and final sub-patch of the v1.4.x Polish-Sweep series. Symbol picker for the chat input, a tell-history reload fix
for users with many active partners, and a closing cleanup sweep before v1.5.0 picks up the DI-container adoption.
- Symbol picker for the chat input: smile-icon button left of the channel indicator opens a popup with two tabs —
161 FFXIV PUA glyphs (Dalamud's SeIconChar enum) and 97 server-verified BMP symbols round-tripped through `/echo` and
`/say` in a four-round probe. Cursor-aware splice, multi-insert keeps the popup open, recent-used strip floats the last
sixteen picks across both tabs. Toggle in Settings → Chat → Message behaviour, default on.
- Pinned auto-tell tabs reload their full history again. PreloadHistory had a hidden 500-row scan cap that overrode the
user-configurable `AutoTellTabsHistoryPreload` setting whenever you chatted with many partners; less-frequent pinned
partners lost their backlog. The cap is removed.
- Slash-command teardown cleanup: `/hellion`, `/hellionView`, `/hellionDebugger` (and `#if DEBUG /hellionSeString`) wrappers
are now cached as private fields so plugin teardown detaches the live registration instead of re-Register'ing with
identical args (latent maintenance hazard from v1.4.9).
- v1.4.x Polish-Sweep wraps up here. The ImGuiListClipper render refactor that was on the v1.4.10 reserve list got dropped
after cross-platform smoke showed the scroll rubber-band is a Wine/Linux render-pipeline quirk, not universal — Windows
users never saw it. It will get its own platform-targeted spike in a later patch. Next major cycle is v1.5.0 with the
DI-container adoption (Microsoft.Extensions.Hosting + ILogger<T>) modelled on Lightless.
- Migration v17 stays (no schema bump).
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
---
## Hellion Chat 1.4.9 — Plugin-Load Render Polish (2026-05-15) ## Hellion Chat 1.4.9 — Plugin-Load Render Polish (2026-05-15)
Tenth sub-patch of the v1.4.x polish-sweep series. First-frame render cost drops from ~127 ms median down to Tenth sub-patch of the v1.4.x polish-sweep series. First-frame render cost drops from ~127 ms median down to
+22 -9
View File
@@ -10,16 +10,29 @@ the plugin's privacy-first scope during brainstorming.
--- ---
## Next Cycle (v1.4.10) ## Next Cycle (v1.5.0)
**Render Clipper, Symbol-Picker and Final-Cleanup.** Reserve items inherited from the v1.4.9 plan that did not need to **DI-container adoption.** Microsoft.Extensions.Hosting plus `ILogger<T>` modelled on Lightless's `PluginHostFactory`
land in the HITCH-cut: an `ImGuiListClipper` for variable-height messages in `DrawMessages` (the OtterGui `ImGuiClip.cs` pattern. The v1.4.x Polish-Sweep series is closed; v1.5.0 starts the structural cycle that the smaller F12.x indirection
wrapper is the idiom anchor), a Symbol Picker popup for the chat input (`imgui_demo.cpp` Popups & Modal Windows section shims (`IPluginLogProxy`, `IPlatformUtil`) were paving the way for. After that, the Wine/Linux scroll-rubber-band spike
is the pattern reference), plus the carry-over from v1.4.9: structural First-Frame-Layout rewrite if the v1.4.9 selective deferred from v1.4.10 (Reserve-A cancelled — Windows users never saw it) plus the First-Run-Wizard rework that lets users
defers turn out to be too narrow once user-side regressions surface. Lazy-Window-Init naive is **not** in scope — the opt into the curated defaults instead of just picking a privacy profile.
v1.4.9 Stage-2 diagnose falsified that path (`WindowSystem.windows` is non-thread-safe, Game-Freeze under reload stress,
no measurable HITCH delta). A clean DI-container adoption (Lightless `PluginHostFactory` pattern) belongs in v1.5.x and ---
will revisit the question with the right threading model.
## v1.4.10 — Symbol-Picker and Tell-History Fix (released 2026-05-16)
Eleventh and final sub-patch of the v1.4.x Polish Sweep series. Symbol picker for the chat input — popup with two tabs
(161 FFXIV PUA glyphs via Dalamud's SeIconChar plus 97 server-verified BMP symbols probed through `/echo` and `/say` in
a four-round whitelist build) — cursor-aware splice, multi-insert, recent-used strip across both tabs, Settings toggle
in Chat → Message behaviour. Mid-cycle hotfix for pinned auto-tell tabs: PreloadHistory used to cap the SQL scan at
500 rows regardless of the user's `AutoTellTabsHistoryPreload` setting, so active users with many partners lost the
backlog of less-frequent pinned partners; the cap is gone, the `(Receiver, Date)` index keeps SQL fast, the client-side
loop respects the user setting as the upper bound. Slash-command teardown cleanup wires the v1.4.9 wrappers through
private fields so dispose detaches the live registration instead of re-registering with identical args. The original
Reserve-A `ImGuiListClipper` refactor for `DrawMessages` was cancelled after cross-platform smoke showed the scroll
rubber-band is a Wine/Linux render-pipeline quirk, not universal — Windows-side testing on v1.4.9 confirmed no lag.
Migration v17 stays.
--- ---
+6 -6
View File
File diff suppressed because one or more lines are too long