1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-08-02 03:28:28 -04:00
Files
DankMaterialShell/quickshell
Thomas Kroll 25c12a14a9 fix(lock): hold sleep inhibitor until compositor confirms lock (#2907)
lock-before-suspend released the logind sleep delay inhibitor as soon as Qt
reported the lock rendered (afterAnimating/afterRendering). That signal fires
before the compositor has committed/presented the ext-session-lock surface, so
the machine could freeze ~1 frame later with the desktop still the last
presented frame. On resume the desktop was briefly visible before the lock
appeared (both suspend and hibernate).

Gate lockerReady on WlSessionLock.secure (the ext-session-lock `locked` event),
so the inhibitor is held until the compositor confirms the session is locked and
the desktop is hidden. LockSurface passes the WlSessionLock down as sessionLock;
the readiness check returns early until secure, and re-fires on secureChanged.
The Go-side fallback timer in loginctl monitor remains as the backstop.

Reproduced on niri / s2idle with 3 outputs: debug log showed lockerReady sent
18 ms before `PM: suspend entry`; with this change the desktop no longer flashes
on resume.

Signed-off-by: Thomas Kroll <99196436+tkroll-ionos@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
(cherry picked from commit 237fb57d5e)
2026-07-24 09:31:23 -04:00
..
2026-07-23 18:10:19 +00:00
2026-07-13 12:38:27 -04:00
2026-07-23 18:10:19 +00:00
2026-07-18 02:18:37 +00:00

DMS Quickshell Interface

QML-based desktop shell interface for DankMaterialShell providing panels, widgets, and overlays.

See root README for project overview and installation.

Architecture

Modular QML Structure

  • Modules/ - UI components (panels, widgets, overlays)
  • Services/ - System integration singletons (audio, network, bluetooth)
  • Widgets/ - Reusable UI controls
  • Common/ - Shared resources and themes

Technology Stack

  • Quickshell - QML-based shell framework
  • Qt/QtQuick - UI rendering and controls
  • Material Design 3 - Design system and theming

Development

Run the shell:

quickshell -p quickshell/

Code formatting:

qmlfmt -t 4 -i 4 -b 250 -w path/to/file.qml
make lint-qml  # Run from repo root; requires quickshell/.qmlls.ini (generated by `qs -p quickshell/`)
               # Uses Qt 6 qmllint. Override path with QMLLINT=/path/to/qmllint if needed.
               # Auto-detects `qmllint6`, Fedora's `qmllint-qt6`, `/usr/lib/qt6/bin/qmllint`, then `qmllint`.

Components

Panels & Bars

  • Modules/TopBar/ - Multi-monitor status bars with workspace switching
  • Modules/DankBar/ - Customizable widget bar with plugin support
  • Modules/Dock/ - Application dock with window management

System Controls

  • Modules/ControlCenter/ - WiFi, Bluetooth, audio, display settings
  • Modules/Notifications/ - Notification center with popups
  • Modules/Greetd/ - Login greeter interface

Overlays

  • Modules/Spotlight/ - Application and file launcher
  • Modules/Overview/ - Workspace overview
  • Modules/Lock/ - Screen lock system

Utilities

  • Modules/ProcessList/ - System monitoring and process management
  • Modules/Calendar/ - Calendar widget with event sync
  • Modules/Weather/ - Weather display

Services

Singletons providing system integration:

Media & Audio

  • AudioService - PipeWire/PulseAudio volume and device control
  • MprisController - Media player integration

Network

  • NetworkService - NetworkManager WiFi control
  • BluetoothService - BlueZ Bluetooth management

Display

  • DisplayService - Brightness control and night mode
  • WallpaperService - Wallpaper management and effects

System

  • BatteryService - Battery status and power profiles
  • IdleService - Idle detection and inhibit locks
  • ClipboardService - Clipboard history with images
  • DgopService - System metrics (CPU, RAM, GPU)

Integration

  • NiriService - Niri workspace integration
  • HyprlandService - Hyprland workspace integration
  • PluginService - Plugin discovery and lifecycle

Widgets

Reusable Material Design 3 components in Widgets/:

  • DankIcon - Icon component with Material font
  • DankSlider - Enhanced slider with animations
  • DankToggle - Toggle switch component
  • DankTabBar - Tab bar implementation
  • DankGridView - Grid layout with adaptive columns
  • DankListView - Scrollable list view
  • DankTextField - Text input with validation
  • DankDropdown - Dropdown selection
  • DankPopout - Base for overlay components
  • StateLayer - Material interaction states

Theming

Dynamic Color Schemes

Wallpaper-based theming using matugen:

import qs.Common

Rectangle {
    color: Theme.container
    border.color: Theme.outline
}

Theme singleton provides Material Design 3 color system, spacing, fonts, and elevation.

Application Themes

Templates in scripts/templates/ generate themes for:

  • GTK 3/4
  • Qt5/Qt6
  • Alacritty, Kitty, Ghostty, Foot, Wezterm terminals
  • Neovim
  • VSCode/VSCodium
  • Firefox

Multi-Monitor Support

Per-monitor panel instances using Quickshell Variants:

Variants {
    model: Quickshell.screens
    PanelWindow {
        screen: modelData
        // Per-screen configuration
    }
}

Workspace switchers adapt to compositor (Niri/Hyprland).

Plugin System

External plugins in ~/.config/DankMaterialShell/plugins/:

Widget plugins - UI components in DankBar Daemon plugins - Background processes without UI

Plugin manifest (plugin.json):

{
    "id": "pluginId",
    "name": "Plugin Name",
    "version": "1.0.0",
    "type": "widget",
    "component": "./Widget.qml",
    "settings": "./Settings.qml",
    "permissions": ["settings_read", "settings_write"]
}

Plugins access pluginService for persistent data:

pluginService.savePluginData("pluginId", "key", value)
pluginService.loadPluginData("pluginId", "key", defaultValue)

IPC Integration

Backend IPC socket communication:

import Quickshell.Io

Process {
    command: ["dms", "ipc", "call", "spotlight", "toggle"]
    running: true
}

Common IPC commands exposed through services for reactive property bindings.

Code Conventions

Component Structure:

import QtQuick
import Quickshell
import qs.Common
import qs.Services

Item {
    id: root

    property type name: value

    signal customSignal(type param)

    Component { /* children */ }
}

Services (Singletons):

import QtQuick
import Quickshell
pragma Singleton
pragma ComponentBehavior: Bound

Singleton {
    id: root

    property bool featureAvailable: false
    property type currentValue: defaultValue

    function performAction(param) { /* implementation */ }
}

Guidelines:

  • Use Theme.propertyName for consistent styling
  • Bind directly to service properties for reactivity
  • Use DankIcon for all icons
  • Implement feature detection and graceful degradation
  • 4-space indentation, no unnecessary comments

Translation

Internationalization using POEditor:

export POEDITOR_API_TOKEN="token"
export POEDITOR_PROJECT_ID="id"
python3 scripts/i18nsync.py sync

Pre-commit hook checks translation sync status.

License

MIT License - See LICENSE for details.