Skip to content

Changelog

RadiatorTwo edited this page May 31, 2026 · 4 revisions

Changelog

Release notes for LoupixDeck.PluginSdk. The version surfaced at runtime is SdkInfo.Version; the host enforces a major-version match against the value declared in plugin.json (sdkVersion).

1.6.0

Full-device takeover: a plugin can now seize the entire device for a HUD, overlay, screensaver, or video, and pick how the host pushes frames to it. (Version 1.5.0 was skipped — there is no 1.5.0 release.)

New contracts

Type Purpose
IExclusiveModeProvider Plugin-supplied controller for the global exclusive mode. While active, the host suppresses page mappings, freezes folder navigation, and routes every hardware input to the provider. RenderMode and SingleTileSlot are default-implemented, so the contract is forward-compatible.
ExclusiveRenderMode How the host pushes a provider's frames: FullScreen (default — one composited blit + DRAW), Grid, DirtyTiles (only changed tiles), SingleTile. The lever for higher frame rates.

IPluginHost additions

Member Purpose
bool RequestExclusiveMode(IExclusiveModeProvider provider) Hands the active device to provider. Returns false if another provider already owns it (no stealing); on success the host calls provider.OnEnter() before returning true.
void ReleaseExclusiveMode(IExclusiveModeProvider provider) Releases exclusive mode. No-op unless provider is the current owner; on a match the host calls provider.OnExit() and restores the normal page.
bool IsInExclusiveMode { get; } true while any provider currently owns the active device.

1.4.0

Host surface for browser launches and transient touch feedback, plus two forward-compatible command contracts.

IPluginHost additions

Member Purpose
bool OpenBrowser(string url) Opens url in the user's default browser. Host abstracts OS specifics (Windows shell-execute, Linux xdg-open) so OAuth flows don't need per-plugin platform branches.
void OverlayTouchText(int slot, string text, TimeSpan duration) Temporarily paints text on the touch slot at slot and restores the slot's normal content after duration. Fire-and-forget; later calls on the same slot supersede pending restores.
int GetTouchSlotForRotary(int rotaryIndex) Returns the touch slot adjacent to the rotary at rotaryIndex, or -1 when the active device has no such neighbour. Pair with OverlayTouchText for value-flash feedback without hard-coding device geometry.

CommandContext additions

Member Purpose
int? SourceIndex Identifier of the originating control when Target denotes an indexed source (rotary index for RotaryEncoder, touch slot for TouchButton, simple-button index for SimpleButton). null for chained or CLI invocations.

New command contracts (forward-compatible)

Type Purpose
IAdjustmentCommand Rotary-encoder value adjustment — turn invokes ApplyAdjustment, press invokes ApplyReset. Safe to implement now; the host wires it up when available.
IDisplayImageCommand Renders a dynamic PNG on a touch button. Safe to implement now alongside IDisplayCommand for graceful fallback.

1.3.0

Display-only setting headers and persisted-key enumeration.

PluginSettingKind additions

Member Purpose
Heading Display-only section header in dynamically built settings pages. Carries no value; used to group related controls.

IPluginSettings additions

Member Purpose
IEnumerable<string> Keys { get; } Enumerates every key currently present, in undefined order. Use it to discover prefixed entries — e.g. Keys.Where(k => k.StartsWith("alias:")) — without tracking them in a separate index.

Clone this wiki locally