diff --git a/dotfiles/.config/quickshell/assets/bitwarden.png b/dotfiles/.config/quickshell/assets/bitwarden.png new file mode 100644 index 0000000..0a616d9 Binary files /dev/null and b/dotfiles/.config/quickshell/assets/bitwarden.png differ diff --git a/dotfiles/.config/quickshell/modules/bar/PinnedTray.qml b/dotfiles/.config/quickshell/modules/bar/PinnedTray.qml index 14814d3..f3ea551 100644 --- a/dotfiles/.config/quickshell/modules/bar/PinnedTray.qml +++ b/dotfiles/.config/quickshell/modules/bar/PinnedTray.qml @@ -14,7 +14,7 @@ import "../../config" // and a click launches it instead of doing nothing. RowLayout { id: root - spacing: Appearance.spacing * 1 + spacing: Appearance.spacing * 1. // name: matched case-insensitively against a tray item's id/title to // find this app's live icon, once it's running. @@ -27,8 +27,15 @@ RowLayout { readonly property var pinned: [ { name: "Bitwarden", - icon: "bitwarden", - launch: ["bitwarden-desktop", "--ozone-platform-hint=auto", "--silent"], + // The system "bitwarden" icon (any size) bakes in a ~10% safe + // margin around the shield, like most launcher icons do — fine + // on a desktop grid, but next to Bitwarden's own edge-to-edge + // tray icon it reads as noticeably smaller in the same box. This + // is that same icon (the 1024x1024 source, for a clean + // downscale) with that transparent margin trimmed off, so it + // fills its slot exactly like the live tray icon does. + icon: Qt.resolvedUrl("../../assets/bitwarden.png"), + launch: ["bitwarden"], }, { name: "Sunshine", @@ -63,10 +70,15 @@ RowLayout { IconImage { anchors.fill: parent - source: slot.running ? slot.trayItem.icon : Quickshell.iconPath(slot.modelData.icon) - // Not-running is the only cue we give beyond the click - // behavior itself — dimmed rather than hidden or badged, so - // the icon stays put and clickable either way. + // icon may be a plain theme name (looked up via + // Quickshell.iconPath) or a file:// URL straight to a + // specific asset (Bitwarden, above) — Quickshell.iconPath() + // only understands theme names, so a URL is used as-is. + source: slot.running + ? slot.trayItem.icon + : (slot.modelData.icon.includes("://") + ? slot.modelData.icon + : Quickshell.iconPath(slot.modelData.icon)) opacity: slot.running ? 1.0 : 0.5 }