fix(osd/notch/shell): animation fixes, SafeLoader component, Vulkan backend detection#159
fix(osd/notch/shell): animation fixes, SafeLoader component, Vulkan backend detection#159git-napkin wants to merge 16 commits intoAxenide:devfrom
Conversation
Add explicit sourceSize to avatar images in notch, lock screen, and resource monitor to prevent downscaling and use full available pixels.
…p polish - OSD: fix hover bug (was instantly hiding on enter), add slide+fade animation, wider pill (240x56), % suffix on value, 3s timer, font sizes via Styling.fontSize() - NotchAnimationBehavior: add subtle Y-translate drop-in, tighten scale floor from 0.8 to 0.85 - LockScreen: add animated date label below clock digits - StyledToolTip: fix desciription typo, reduce hover delay 1000→700ms, dim description text to 70% opacity, use Styling.fontSize() - SysTrayItem: fix desciription→description to match tooltip fix
- BarContent: remove redundant !== undefined checks - PanelTitlebar: use customContent array instead of children at init
- Add QML unit test suite (ConfigValidator, theme defaults, error patterns) - Create ErrorHandler singleton for centralized error tracking - Add SafeLoader component with error handling and fallback UI - Update AGENTS.md with testing docs and error handling anti-pattern - Integrate ErrorHandler into shell startup
… internal - setFallback() now actually parents the item into fallbackContainer so it renders when hasError is true (was previously orphaned) - Remove public 'loader' property alias — exposes internal Loader as API, allowing callers to bypass root.sourceComponent and write directly to internalLoader.sourceComponent - Make internalLoader fully internal (id only, no alias) - isLoading/hasError/isReady now bind to internalLoader directly - retry() null-cycles internalLoader.sourceComponent, not loader alias - Add newline at EOF lalala
Previously 'visible: GlobalStates.osdVisible' would hide the PanelWindow the moment osdVisible flipped false, killing the fade-out and slide-down animations before they could play. Fix: bind window visibility to 'GlobalStates.osdVisible || osdRect.opacity > 0' so the window stays alive until the opacity Behavior finishes animating to 0, then naturally goes invisible. Both the slide and opacity exit animations now play fully before the window is culled.
The previous check used 'command -v vulkaninfo || command -v glxinfo', meaning any system with glxinfo (OpenGL/GLX) would get QT_QUICK_BACKEND=vulkan even without a Vulkan ICD installed. Qt silently falls back to software rendering in that case, which is worse than just using opengl. Use 'vulkaninfo --summary' instead, which actually enumerates Vulkan ICDs and exits non-zero when none are found.
vulkan-headers is a development package (C headers for writing Vulkan applications). End users only need the runtime loader (vulkan-icd-loader) plus a GPU-specific ICD (vulkan-radeon, vulkan-intel, etc.) which they should already have from their mesa/nvidia installation. The Fedora list correctly uses only vulkan-loader; the Arch list now matches the same intent with vulkan-icd-loader only.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f489476788
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| StyledRect { | ||
| id: placeholder | ||
| anchors.fill: parent | ||
| visible: root.showPlaceholder && (root.isLoading || root.hasError) && !root.fallbackItem |
There was a problem hiding this comment.
Provide a variant for SafeLoader's StyledRect placeholder
StyledRect requires its variant property, but this placeholder instance never sets one. As soon as SafeLoader is instantiated, QML will raise a required-property initialization error for this child and the fallback/loading UI cannot be created reliably. Assign a valid variant (for example "common" or "popup") on this StyledRect instance.
Useful? React with 👍 / 👎.
| internalLoader.sourceComponent = null; | ||
| internalLoader.sourceComponent = current; |
There was a problem hiding this comment.
Keep sourceComponent binding intact in retry()
internalLoader.sourceComponent starts as a binding to root.sourceComponent, but retry() overwrites it imperatively (null then current). In QML, that assignment removes the original binding, so after the first retry later updates to root.sourceComponent no longer propagate to the loader. This can leave SafeLoader showing stale content when callers swap components after a retry.
Useful? React with 👍 / 👎.
// psst, this description was made by ai, theres too many tiny changes for me to bother with looking through the entire diff thingy for things i would probably forget about in a description, since this was written over the span of a couple weeks or so
Describe your changes
PanelWindow.visibletoosdVisible || osdRect.opacity > 0. Added slide-in/out translate animation, tweaked sizing and margins, fixed hover behavior so hovering pauses the hide timer instead of immediately dismissing, and fixed the percentage display to clamp against-0%.modules/components/SafeLoader.qmlcomponent — a drop-inLoaderwrapper with error handling, fallback UI, and a retry function using the standard null-cycle pattern.vulkaninfo --summary(more reliable thanglxinfo), plusQML_USE_TYPED_ARRAYSandQT_THREADED_RENDERERenv vars for rendering performance.vulkan-loader/vulkan-icd-loaderto dependency lists for Fedora and Arch respectively.desciription→descriptionin bothStyledToolTip.qmlandSysTrayItem.qml.font.pixelSizevalues in OSD and tooltip to useStyling.fontSize()for consistency.sourceSizehints to avatar images inMetricsTab,LockScreen, andUserInfoto avoid loading full-res images into GPU memory unnecessarily.PanelTitlebarcustom content visibility binding, made some container backgrounds transparent where a colored background was leaking through, cleaned up a few redundantimplicitWidth !== undefinedchecks inBarContent.qml.Add screenshots
Skipping screenshots, most changes are either invisible infrastructure, minor metric tweaks, or animation timing adjustments that don't photograph well.
Does this change any existing behavior?
Yes, a few things behave differently:
StyledToolTip'sdesciriptionproperty is renamed todescription— any callers using the old misspelled name will need to update.