Modified copies of DMS built-in widgets. The code is copied from DankMaterialShell's default widgets with specific customizations applied.
Last synced: 2026-08-01
Base commit: ef191bab (tailscale: add missing ID) — upstream/master tip
Repository: https://github.com/AvengeMedia/DankMaterialShell
Local clone lives at
~/code/_forks/DankMaterialShell(branchfeature/ddc-controls, HEAD21dc24de=upstream/master+ fork DDC commits, which is the running build).
Only one upstream commit touched our six widgets: c67b1850 "qs: large sweep of dead code removals".
- CustomWorkspaceSwitcher —
c67b1850: localescapeSwayWorkspaceName()/dispatchSwayWorkspace()(15 lines) deleted in favour ofCompositorService.dispatchSwayWorkspace(); 3 call sites redirected. Body is byte-identical to the service's, which is present in the running build (CompositorService.qml:1094). Sway/scroll/miracle paths only — inert on niri, taken for diff-parity.I3import still needed elsewhere in the file. - CustomNetworkMonitor —
c67b1850not applicable. Upstream swappedformatNetworkSpeed()forFormat.formatRate(), but (a) our formatter is the customization (figure spaces\u2007,"0 KB/s"/"<1 KB/s", 3-char right-aligned rounding), and (b) the newimport "../../../Common/Format.js"is relative toquickshell/Modules/DankBar/Widgets/and cannot resolve from the plugins directory. - Plugins setting components —
c67b1850also refactoredquickshell/Modules/Plugins/*Setting.qml(findSettings()→QmlUtils.findSettings()). No public API change, and all 11 local slider forks (SteppedSliderSetting/RealSliderSetting/LabeledSliderSetting) carry their ownfindSettings()— unaffected. Same relative-import blocker applies, so not ported. - No changes to CustomFocusedApp, CustomMedia, CustomRunningApps, CustomSystemTrayBar.
- CustomMedia —
fe1a783e/dc924618stable-metadata centralisation: the local_stableTitle/_stableArtist/_syncMeta()block (26 lines) deleted in favour ofMprisController.stableTitle/.stableArtist; all fouractivePlayer.next()call sites routed throughMprisController.next(). OurcanGoNext/canGoPreviousscroll guards are unaffected.2986e354/cdaedad9/c3fa7b2etitle-scroll rewrite (#2863): the infiniteSequentialAnimationreplaced byTimer-drivenstepScroll()that ridesCavaService.valuesChangedticks when the visualizer is live. A runningNumberAnimationcommits a frame every vsync, so two unsynchronized tick sources nearly doubled the surface commit rate. Also gated on window visibility +_isPlaying, andxrounded to whole pixels.- AudioVisualization — adapted, not ported. Our copy predates upstream's shader rewrite (
bandsA/bandsBvectors), so only the two ideas carry over: alivegate (visible && Window.window?.visible && isPlaying) on theRefloader, fallback timer andCavaServiceconnection; and levels quantized to 1/32 with identical frames dropped before assigningbarHeights.
- CustomSystemTrayBar —
fb2dbcedmenu overflow:rawHeightcapped atmaskHeight - 20andmenuColumnwrapped in aDankFlickable(interactive: contentHeight > height), so long tray menus scroll instead of running off-screen. OurTheme.primaryHoverhover colours andSessionData.isHiddenTrayIdvisibility logic preserved; upstream's auto-overflow / "Keep in Bar" branch is absent from our copy and was not introduced.1402d231vbar menu positioning: vertical-orientation branches clamp against windowwidth/heightinstead ofmaskX/maskYbounds (4 blocks — overflow menu x/y, tray menu x/y).- Icon-size token sweep: hardcoded
16/14/10→Theme.iconSizeSmalland derivations; checkboxradius: … ? 8 : 2→width / 2.
- CustomWorkspaceSwitcher —
4fb69957Hyprland re-focus fix (#2830):ConnectionsonHyprlandrawEventcallingupdateAllData()foractivewindow/activewindowv2. Inert on niri (enabled: CompositorService.isHyprland) — taken for diff-parity with upstream.296b3a3d(mango dispatch socket) not applicable — our copy has nommsg/overview-toggle button.
- CustomMedia —
52ed7194fix: missinganchors.verticalCenteron themediaInfoRow. - CustomNetworkMonitor —
093acdbfspacing-token sweep: hardcoded2/4→Theme.spacingXXS/Theme.spacingXS. - CustomRunningApps — close-button simplification:
BlurService.borderWidth/.borderColorused directly (enabled-check moved inside the service);"transparent"→Theme.withAlpha(..., 0)for smoother hover animation. - CustomSystemTrayBar —
- Cosmetic sweep:
Theme.outlineHeavyreplacing hardcodedQt.rgba(Theme.outline, 0.2),Theme.spacingXXS,closeWithAction()indirection removed, hover"transparent"→Theme.withAlpha(Theme.primaryHover, 0). fefc0afamenu boundary clamping: overflow/context menus now clamp againstmaskX/Y/Width/Heightinstead of raw screen bounds, plusRegionmasks so menu content areas are included in the popup hit region.HyprlandFocusGrab→DankFocusGrabmigration (fixes Hyprland focus-stealing bug #2577), wired through theKeyboardFocussingleton (KeyboardFocus.keyboardFocus()/.wantsGrab()/.barWindows) — this also closes a pre-existing gap where the file had hand-rolled focus logic bypassing that singleton entirely.6bee1b2cHoverMode hook functions added (hoverTriggerAtGlobalPoint,openHoverAtGlobalPoint) — purely additive.
- Cosmetic sweep:
- CustomWorkspaceSwitcher —
effectiveScreenNamesimplified toBarWidgetService.getFocusedScreenName(), replacing the manual per-compositor switch (incidentally fixes focus-follow for Mango, which the old switch never had a case for).- Sway/Hyprland named-workspace correctness: stripped
<num>:<name>prefix, stable ordering (numbered first, named after by name), safe dispatch for named workspaces (workspace "name"/workspace name:x), Hyprland special-workspace filtering. - Stable placeholder/slot pooling (
_placeholderPool,_hyprSlotPool) so ScriptModel reuses delegate identity across workspace churn instead of recreating pills (reduces animation jitter);onCompositorChangedresets both pools. DankColorAnimationswap for the pill's background-color transition (premultiplied-alpha tween instead of plainColorAnimation), applied on top of our own PluginService-based color system —SettingsData.workspace*ColorModeis unrelated to us and was not touched.
- Per-monitor "unfocused monitor appearance" color refactor (
effectiveColorMode/effectiveCustomColor/workspaceUnfocusedMonitor*) — CustomWorkspaceSwitcher has its own PluginService-based color system;SettingsData.workspace*ColorModeisn't used here at all. - CustomFocusedApp's new
showIconsetting + horizontal-icon width recalculation — superseded by our existing "icon + title, unlimited width" customization, which predates and already covers this. - CustomMedia's prev/next hover-color fix — doesn't apply; we already use a different color scheme (
Theme.primaryHover) there.
- CustomWorkspaceSwitcher: dwl/mango dead code.
CompositorService.isDwland theDwlServicesingleton no longer exist upstream (renamed toisMango/MangoServicesome time before this sync's base commit). EveryCompositorService.isDwlbranch andcase "dwl"in this file is therefore dead — Mango users get no workspace switching from this widget except the one path (effectiveScreenName) fixed incidentally above. Needs a dedicated dwl→mango rename pass. - CustomWorkspaceSwitcher: named sway workspaces + app icons.
getWorkspaceIconsstill keys off.num, so a purely-named sway workspace (num === -1) won't show its per-app icons. This is a DMS-only custom feature with no upstream equivalent to port, so it wasn't touched.
Shows icon + window title instead of app name + separator + title.
Changes:
- App name text hidden (
visible: false) - Separator dot hidden
- Icon displayed alongside title only
- Settings panel with:
- "Strip App Name from Title" - Smart removal of app name, version numbers, instance markers, and brand words from titles
Configurable media widget with settings panel.
Changes:
- Configurable text width (none/small/medium/unlimited)
- Reverse layout order option
- Hide icon option
- Mouse wheel volume control (when player supports it)
- Mouse wheel: 5% volume increments
- Touchpad: smooth 1% increments with accumulator
- Per-widget or global settings via
PluginService.loadPluginData
Network speed monitor with fixed-width formatting.
Changes:
- Uses figure spaces (
\u2007) for consistent width alignment - Shows
0 KB/sor<1 KB/sfor low values - Color-coded: download (Theme.info/blue), upload (Theme.error/red)
- Padded numbers to 3 digits for stable layout
Enhanced running apps taskbar.
Changes:
- Scroll wheel switches between windows
- Middle-click closes window
- Right-click context menu with "Close" option
- Grouped windows show badge with count
- Click cycles through grouped windows
- Hover tooltips active via
tooltipLoader(an earlier revision had them commented out) - Smart dynamic title width - Non-linear algorithm shrinks longer titles proportionally more when space is constrained
- Niri column indicators - Visual frame around windows in the same Niri column
- Detects stacked vs tabbed columns (different colors)
- Frame opacity increases when group has focused window
- Niri floating indicator - Line indicator on floating windows
- Custom background colors - Separate settings for focused and unfocused pills
- Color selection from Theme palette (Primary, Secondary, Surface variants, etc.)
- Individual opacity sliders (0-100%) for each state
- Custom text colors - Auto-contrast or manual selection for focused/unfocused states
- Flat outer edge - Option to remove rounded corners on the edge facing screen border
- Settings panel with:
- "Strip App Name from Title" - Removes app name, version numbers, instance markers from window titles
- "Title Compression" - Configurable ratio for how aggressively longer titles shrink (1=equal, 2=normal, up to 10=extreme)
System tray with custom icon sizes, spacing, and hover colors. Uses upstream drag-and-drop reordering.
Changes:
- Custom icon size: Configurable via
PluginService.loadPluginData("SortedSystemTray", "iconSize", 18) - Custom icon spacing: Configurable via
PluginService.loadPluginData("SortedSystemTray", "iconSpacing", "M")(presets: 0, XS, S, M, L, XL) - Custom hover color:
Theme.primaryHoverinstead of defaultTheme.widgetBaseHoverColor - Drag-and-drop reordering: Uses upstream's drag-and-drop with spacing-aware slot calculations
Enhanced workspace indicator with app icons.
Changes:
- Shows individual app icons per workspace (no grouping)
- Patched:
const key = \${keyBase}_${i}`` (unique key per window)
- Patched:
- Active window icons enlarged (36px vs 24px)
- Click on app icon focuses that window
- Workspace index always shown alongside icons
- Steam games show gamepad icon, Quickshell shows themed icon
-
Custom background colors - Settings for all 4 states (active, unfocused, occupied, urgent)
- Color selection from Theme palette
- Individual opacity sliders (0-100%) for each state
- Custom text/icon colors - Auto-contrast or manual selection for each state
- Flat outer edge - Option to remove rounded corners on the screen-edge side
OLED burn-in protection daemon using DDC/I2C hardware brightness control.
Changes:
- Multi-stage dimming: active → dimming → holding → blacking → black → DPMS
- DDC hardware brightness: Uses I2C/DDC (independent of gamma/night light)
- Smooth fades: Ease-out cubic transitions at ~2.5 FPS (within DDC limits)
- Auto-detect DDC device: Falls back gracefully if no DDC device found
- Configurable stages: All timeouts, brightness levels, and fade durations adjustable
- Settings panel with:
- Enable/disable toggle
- Dim timeout (1-10 min)
- Dim brightness level (5-80%)
- Hold duration at dim (1-10 min)
- DPMS delay after black (1-30 min)
- Fade speed (3-20 sec)
Third-party plugin for Docker/Podman container management. See dockerManager/README.md.