Skip to content

fix(osd/notch/shell): animation fixes, SafeLoader component, Vulkan backend detection#159

Open
git-napkin wants to merge 16 commits intoAxenide:devfrom
git-napkin:dev
Open

fix(osd/notch/shell): animation fixes, SafeLoader component, Vulkan backend detection#159
git-napkin wants to merge 16 commits intoAxenide:devfrom
git-napkin:dev

Conversation

@git-napkin
Copy link
Copy Markdown

// 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

  • OSD: Fixed a bug where the fade-out animation would get cut dead by binding PanelWindow.visible to osdVisible || 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%.
  • Notch animations: Improved entrance/exit with a subtle vertical translate (drop-in from slightly above) alongside the existing scale+opacity behavior. Scale start point tightened from 0.8 → 0.85 for a less dramatic pop.
  • SafeLoader: New modules/components/SafeLoader.qml component — a drop-in Loader wrapper with error handling, fallback UI, and a retry function using the standard null-cycle pattern.
  • cli.sh: Added automatic Vulkan/OpenGL backend detection using vulkaninfo --summary (more reliable than glxinfo), plus QML_USE_TYPED_ARRAYS and QT_THREADED_RENDERER env vars for rendering performance.
  • install.sh: Added vulkan-loader / vulkan-icd-loader to dependency lists for Fedora and Arch respectively.
  • Typo fix: desciriptiondescription in both StyledToolTip.qml and SysTrayItem.qml.
  • Font sizing: Migrated hardcoded font.pixelSize values in OSD and tooltip to use Styling.fontSize() for consistency.
  • Avatar/image rendering: Added sourceSize hints to avatar images in MetricsTab, LockScreen, and UserInfo to avoid loading full-res images into GPU memory unnecessarily.
  • Misc: Fixed PanelTitlebar custom content visibility binding, made some container backgrounds transparent where a colored background was leaking through, cleaned up a few redundant implicitWidth !== undefined checks in BarContent.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:

  • The OSD hover interaction is inverted from before — hovering now pauses auto-hide rather than triggering immediate dismissal.
  • OSD auto-hide timer extended from 2500ms → 3000ms.
  • Tooltip delay shortened from 1000ms → 700ms.
  • StyledToolTip's desciription property is renamed to description — any callers using the old misspelled name will need to update.

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.
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment on lines +44 to +47
StyledRect {
id: placeholder
anchors.fill: parent
visible: root.showPlaceholder && (root.isLoading || root.hasError) && !root.fallbackItem
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

Comment on lines +76 to +77
internalLoader.sourceComponent = null;
internalLoader.sourceComponent = current;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant