1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-08-02 03:28:28 -04:00
Files
DankMaterialShell/quickshell
Ron Harel dc75f1f01d feat(network): initial WiFi hotspot support (#2825)
* Add hotspot contract layer with capability-gated dispatch.

Establish the interface and manager plumbing for hotspot support so backends can opt in without expanding the core Backend contract.
Only backends that implement HotspotBackend get hotspot state propagated; others are forced to unsupported regardless of what they self-report.

* Add IPC handlers and API docs for hotspot actions.

Wire up configure/ start/ stop hotspot through the request router so the QML service layer can drive hotspot operations.
Bump API version to 27 and document the capability-gating contract clients should follow.

* Implement NetworkManager hotspot backend.

Implement HotspotBackend on NetworkManagerBackend with DMS-owned profile management, AP capability detection, and band validation.
Device resolution is deferred to StartHotspot when no device is specified, so profiles survive hardware changes.

* Isolate client Wi-Fi state from AP-mode connections.

Filter AP-mode profiles and access points out of all client Wi-Fi paths so the DMS hotspot (and user-created APs) never appear as saved networks, visible networks, or connected state.
This protects existing client behavior before hotspot controls are exposed in the UI.

* Prefer idle radios for automatic hotspot device selection.

* Add hotspot properties and methods to QML service layer.

Expose hotspot state and actions through DMSNetworkService, NetworkService, and LegacyNetworkService.
Capability is gated on API version and backend-reported support, not backend name checks, and stays stable when Wi-Fi radio is disabled.

* Add hotspot controls to Settings and Control Center.

Settings shows a hotspot setup card as a sibling in the Wi-Fi tab with SSID, password, device, band, save, and start/ stop controls.
Control Center shows a compact row that toggles a configured hotspot or routes to Settings for initial setup.
Both stay visible when Wi-Fi is disabled, explaining the requirement instead of hiding.

* Add translator context to hotspot strings.
2026-07-20 09:29:54 -04:00
..
2026-07-18 10:44:31 -04:00
2026-07-18 10:44:31 -04:00
2026-07-18 10:44:31 -04:00
2026-07-18 10:44:31 -04:00
2026-07-18 10:44:31 -04:00
2026-07-08 13:10:39 -04:00
2026-07-18 10:44:31 -04:00
2026-07-16 12:15:20 -04:00
2026-07-08 13:10:39 -04: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

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.