dev -> master: config-owned widgets, notification stack fixes, media dedupe, and css-check polish#14
Conversation
Move the widget config surface out of the oversized config_widgets file and into focused modules. Toggle, slider, stat, card, plugin, runtime sanitize, and layout logic now live in files that match the behavior they own. The runtime cleanup also removes the hardcoded Night toggle backend path so generated config remains the source of truth.
Add config-local helper scripts for the default Night toggle and have the installer provision them with executable permissions. The helper keeps backend selection in editable files, prefers a currently running Night backend before choosing an installed one, and clears stale runtime state when turning the effect off. Template tests cover script paths, executable writes, and generated config output.
Move panel setup into smaller sections and keep hook class generation out of large module roots. This keeps UiState initialization focused on wiring, gives panel sections clearer ownership, and adds CSS hook coverage so themes can target the new panel and widget states without relying on fragile selectors.
Preserve user-defined toggle and widget commands instead of treating stock controls as special runtime behavior. Toggle cards now prefer toggle_cmd when it is configured, fall back to on/off commands for binary controls, and refresh state without pretending a command succeeded when no state command exists. Icon fallback handling and widget comments were cleaned up around that behavior.
Make grouped notifications update their collapsed stack shape as soon as another notification joins the same app group. Incremental list updates now keep rebuilt group ranges recorded, and the in-place row update path refuses to run when the visible span does not match the desired stacked shape. That prevents the header count from updating while the iOS-style ghost cards remain missing until a manual expand and collapse.
Improve css-check coverage for stock widget sizing and generated selectors. The checker now models fixed widget size rules more directly, catches panel width pressure from stock rows, and keeps preset command rewriting aware of the newer command-bearing config fields.
- fixed an issue where grouped notification stacks could appear delayed or inconsistent after a matching notification was received - moved collapsed stack depth into the notification row so GTK updates the visible card and stack shadows in the same bind pass - fixed the list factory setup so cached row widgets always attach their real GTK root instead of leaving an empty placeholder child - added a stable notification row wrapper hook so the real card keeps a valid layout container after the old ghost rows were removed - kept active and critical card styling from hiding stacked shadows - removed the old standalone ghost-row path now that stack depth is owned by the notification row
- fixed an issue where Brave and Plasma browser integration could both show the same browser-backed playback as separate media cards - browser media entries now prefer the source PID exposed by bridge metadata before falling back to the bus owner PID - duplicate browser bridges now collapse when they mirror the same browser process even if their title metadata differs - kept metadata-based browser dedupe for cases where no source PID is available - added direct coverage for KDE PID metadata and mismatched browser bridge metadata
- fixed an issue where the built-in Night toggle could point at missing helper scripts when center started before the installer created them - moved default script provisioning into core config startup so center and installer share the same guarantee - preserved user-edited helper scripts while restoring execute permissions needed by relative script commands - kept installer reset behavior able to rewrite shipped helper scripts through the shared core path - moved sidecar config media and media widget tests into organized tests directories
- moved center tests into focused module test folders so implementation files stay easier to read - kept media, dbus, ui, and widget coverage attached to the code paths they exercise - preserved existing behavior while making edge case tests easier to extend
- moved core tests into module-owned test folders instead of leaving large inline test blocks in implementation files - moved media effective behavior and runtime sanitization pipeline out of mod.rs so facades stay small - added stronger config coverage for media defaults, custom toggle commands, default script references, and runtime sanitization edge cases - kept control, css, model, and util tests close to the code they validate without adding empty facade test modules
- fixed the executable preset review test so terminal color detection cannot hide the expected command text - tightened collapsed notification stack ghosts so depth renders as tucked shadows instead of empty cards - removed default Quick Actions and System Status headings while keeping those labels configurable - added a Python panel regression probe for stack CSS, default labels, and exec review stability
- fixed an issue where relative widget script commands used the default config directory instead of the active config path - captured the active config directory before widget construction so custom config launches resolve scripts from the same root that startup provisions - kept the existing guard that blocks path-like commands from escaping the UnixNotis config directory - added regression coverage for resolving relative helper scripts from a custom config root
- renamed config module files and directories to remove repeated config prefixes - updated module declarations and internal use paths to match the new names - kept widget_config as the facade name because widgets is already the real widget config module directory - made no behavior changes beyond the mechanical module path updates
- renamed model implementation files to remove repeated model prefixes - updated the model facade and internal imports to point at image, notification, and types - kept the public unixnotis_core::model re-exports unchanged - made no behavior changes beyond the mechanical module path updates
- renamed media implementation files to remove repeated media prefixes - updated media module declarations and sibling imports to use the shorter names - used event_loop for the runtime loop module instead of a Rust keyword filename - made no behavior changes beyond the mechanical module path updates
- renamed daemon control and notification module files to remove repeated daemon prefixes - renamed their submodule directories to control and notifications - updated path attributes and daemon re-exports to match the new names - made no behavior changes beyond the mechanical module path updates
- documented config sanitization boundaries for panel labels, widget order, column counts, theme alpha values, and history limits - clarified why media defaults, player filtering, and cache transitions behave the way they do - added notes around notification burst throttling so the direct, snapshot, and suppressed paths are easier to review - documented the stock-only volume migration and notification urgency fallback behavior
locainin
added a commit
that referenced
this pull request
May 14, 2026
see pull request #14 for details
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This PR brings
devintomasterwith focused panel, widget config, media, and tooling improvements.Key outcomes:
Main Changes
1) Config-owned widgets and helper scripts
2) Notification stack rendering
3) Media behavior
4) css-check and preset tooling
5) Code organization and maintainability