mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2025-12-05 21:15:38 -05:00
meta: monorepo updates
This commit is contained in:
10
.github/ISSUE_TEMPLATE/bug_report.md
vendored
10
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -9,17 +9,9 @@ assignees: ""
|
|||||||
<!-- If your issue is related to ICONS
|
<!-- If your issue is related to ICONS
|
||||||
- Purple and black checkerboards are QT's way of signalling an icon doesn't exist
|
- Purple and black checkerboards are QT's way of signalling an icon doesn't exist
|
||||||
- FIX: Configure a QT6 or Icon Pack in DMS Settings that has the icon you want
|
- FIX: Configure a QT6 or Icon Pack in DMS Settings that has the icon you want
|
||||||
- Follow the [THEMING](https://github.com/AvengeMedia/DankMaterialShell/tree/master?tab=readme-ov-file#theming) section to ensure your QT environment variable is configured correctl for themes.
|
- Follow the [THEMING](https://danklinux.com/docs/dankmaterialshell/icon-theming) section to ensure your QT environment variable is configured correctly for themes.
|
||||||
- Once done, configure an icon theme - either however you normally do with gtk3 or qt6ct, or through the built-in settings modal. -->
|
- Once done, configure an icon theme - either however you normally do with gtk3 or qt6ct, or through the built-in settings modal. -->
|
||||||
|
|
||||||
<!-- If your issue is related to APP LAUNCHER/DOCK/Running Apps being stale
|
|
||||||
Quickshell does not ever update its DesktopEntires.
|
|
||||||
There is an open PR for it, that has been stuck unmerged over there to fix it.
|
|
||||||
We unfortunately are at the mercy of quickshell to merge it.
|
|
||||||
Until then, newly installed and removed apps will not react until the
|
|
||||||
shell is restarted.
|
|
||||||
-->
|
|
||||||
|
|
||||||
## Compositor
|
## Compositor
|
||||||
|
|
||||||
- [ ] niri
|
- [ ] niri
|
||||||
|
|||||||
16
.github/workflows/copr-release.yml
vendored
16
.github/workflows/copr-release.yml
vendored
@@ -1,10 +1,6 @@
|
|||||||
name: DMS Copr Stable Release
|
name: DMS Copr Stable Release (Manual)
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_run:
|
|
||||||
workflows: ["Create Release from DMS"]
|
|
||||||
types: [completed]
|
|
||||||
branches: [master]
|
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
inputs:
|
inputs:
|
||||||
version:
|
version:
|
||||||
@@ -15,7 +11,6 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
build-and-upload:
|
build-and-upload:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
if: ${{ github.event.workflow_run.conclusion == 'success' || github.event_name == 'workflow_dispatch' }}
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
@@ -27,9 +22,6 @@ jobs:
|
|||||||
if [ -n "${{ github.event.inputs.version }}" ]; then
|
if [ -n "${{ github.event.inputs.version }}" ]; then
|
||||||
VERSION="${{ github.event.inputs.version }}"
|
VERSION="${{ github.event.inputs.version }}"
|
||||||
echo "Using manual version: $VERSION"
|
echo "Using manual version: $VERSION"
|
||||||
elif [ "${{ github.event_name }}" = "workflow_run" ]; then
|
|
||||||
VERSION=$(curl -s https://api.github.com/repos/${{ github.repository }}/releases/latest | jq -r '.tag_name' | sed 's/^v//')
|
|
||||||
echo "Using latest release version from workflow_run: $VERSION"
|
|
||||||
else
|
else
|
||||||
VERSION=$(curl -s https://api.github.com/repos/${{ github.repository }}/releases/latest | jq -r '.tag_name' | sed 's/^v//')
|
VERSION=$(curl -s https://api.github.com/repos/${{ github.repository }}/releases/latest | jq -r '.tag_name' | sed 's/^v//')
|
||||||
echo "Using latest release version: $VERSION"
|
echo "Using latest release version: $VERSION"
|
||||||
@@ -115,7 +107,7 @@ jobs:
|
|||||||
%package -n dms-cli
|
%package -n dms-cli
|
||||||
Summary: DankMaterialShell CLI tool
|
Summary: DankMaterialShell CLI tool
|
||||||
License: MIT
|
License: MIT
|
||||||
URL: https://github.com/AvengeMedia/danklinux
|
URL: https://github.com/AvengeMedia/DankMaterialShell
|
||||||
|
|
||||||
%description -n dms-cli
|
%description -n dms-cli
|
||||||
Command-line interface for DankMaterialShell configuration and management.
|
Command-line interface for DankMaterialShell configuration and management.
|
||||||
@@ -151,7 +143,7 @@ jobs:
|
|||||||
esac
|
esac
|
||||||
|
|
||||||
# Download dms-cli for target architecture
|
# Download dms-cli for target architecture
|
||||||
wget -O %{_builddir}/dms-cli.gz "https://github.com/AvengeMedia/danklinux/releases/latest/download/dms-distropkg-${ARCH_SUFFIX}.gz" || {
|
wget -O %{_builddir}/dms-cli.gz "https://github.com/AvengeMedia/DankMaterialShell/releases/latest/download/dms-distropkg-${ARCH_SUFFIX}.gz" || {
|
||||||
echo "Failed to download dms-cli for architecture %{_arch}"
|
echo "Failed to download dms-cli for architecture %{_arch}"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
@@ -188,7 +180,7 @@ jobs:
|
|||||||
rm -rf %{buildroot}%{_datadir}/quickshell/dms/.git*
|
rm -rf %{buildroot}%{_datadir}/quickshell/dms/.git*
|
||||||
rm -f %{buildroot}%{_datadir}/quickshell/dms/.gitignore
|
rm -f %{buildroot}%{_datadir}/quickshell/dms/.gitignore
|
||||||
rm -rf %{buildroot}%{_datadir}/quickshell/dms/.github
|
rm -rf %{buildroot}%{_datadir}/quickshell/dms/.github
|
||||||
rm -f %{buildroot}%{_datadir}/quickshell/dms/*.spec
|
rm -rf %{buildroot}%{_datadir}/quickshell/dms/distro
|
||||||
|
|
||||||
%posttrans
|
%posttrans
|
||||||
# Clean up old installation path from previous versions (only if empty)
|
# Clean up old installation path from previous versions (only if empty)
|
||||||
|
|||||||
46
.github/workflows/go-ci.yml
vendored
Normal file
46
.github/workflows/go-ci.yml
vendored
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
name: Go CI
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- '**'
|
||||||
|
paths:
|
||||||
|
- 'backend/**'
|
||||||
|
- '.github/workflows/go-ci.yml'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
working-directory: backend
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Go
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version-file: ./backend/go.mod
|
||||||
|
|
||||||
|
- name: Format check
|
||||||
|
run: |
|
||||||
|
if [ "$(gofmt -s -l . | wc -l)" -gt 0 ]; then
|
||||||
|
echo "The following files are not formatted:"
|
||||||
|
gofmt -s -l .
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Test
|
||||||
|
run: go test -v ./...
|
||||||
|
|
||||||
|
- name: Build dms
|
||||||
|
run: |
|
||||||
|
cd cmd/dms
|
||||||
|
go build -v .
|
||||||
|
|
||||||
|
- name: Build dankinstall
|
||||||
|
run: |
|
||||||
|
cd cmd/dankinstall
|
||||||
|
go build -v .
|
||||||
483
.github/workflows/release.yml
vendored
483
.github/workflows/release.yml
vendored
@@ -1,47 +1,177 @@
|
|||||||
# Release from a dispatch event from the danklinux repo
|
name: Release
|
||||||
name: Create Release from DMS
|
|
||||||
|
|
||||||
on:
|
on:
|
||||||
repository_dispatch:
|
push:
|
||||||
types: [dms_release]
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
actions: write
|
actions: write
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: release-${{ github.event.client_payload.tag }}
|
group: release-${{ github.ref_name }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
create_release_from_dms:
|
build-backend:
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-latest
|
||||||
env:
|
strategy:
|
||||||
TAG: ${{ github.event.client_payload.tag }}
|
matrix:
|
||||||
DMS_REPO: ${{ github.event.client_payload.dms_repo }}
|
arch: [amd64, arm64]
|
||||||
|
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
working-directory: backend
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Ensure VERSION and tag
|
- name: Set up Go
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version-file: ./backend/go.mod
|
||||||
|
|
||||||
|
- name: Run tests
|
||||||
|
run: go test -v ./...
|
||||||
|
|
||||||
|
- name: Build dankinstall (${{ matrix.arch }})
|
||||||
|
env:
|
||||||
|
GOOS: linux
|
||||||
|
CGO_ENABLED: 0
|
||||||
|
GOARCH: ${{ matrix.arch }}
|
||||||
run: |
|
run: |
|
||||||
set -euxo pipefail
|
set -eux
|
||||||
git config user.name "github-actions[bot]"
|
cd cmd/dankinstall
|
||||||
|
go build -trimpath -ldflags "-s -w -X main.Version=${GITHUB_REF#refs/tags/}" \
|
||||||
|
-o ../../dankinstall-${{ matrix.arch }}
|
||||||
|
cd ../..
|
||||||
|
gzip -9 -k dankinstall-${{ matrix.arch }}
|
||||||
|
sha256sum dankinstall-${{ matrix.arch }}.gz > dankinstall-${{ matrix.arch }}.gz.sha256
|
||||||
|
|
||||||
|
- name: Build dms (${{ matrix.arch }})
|
||||||
|
env:
|
||||||
|
GOOS: linux
|
||||||
|
CGO_ENABLED: 0
|
||||||
|
GOARCH: ${{ matrix.arch }}
|
||||||
|
run: |
|
||||||
|
set -eux
|
||||||
|
cd cmd/dms
|
||||||
|
go build -trimpath -ldflags "-s -w -X main.Version=${GITHUB_REF#refs/tags/}" \
|
||||||
|
-o ../../dms-${{ matrix.arch }}
|
||||||
|
cd ../..
|
||||||
|
gzip -9 -k dms-${{ matrix.arch }}
|
||||||
|
sha256sum dms-${{ matrix.arch }}.gz > dms-${{ matrix.arch }}.gz.sha256
|
||||||
|
|
||||||
|
- name: Generate shell completions
|
||||||
|
if: matrix.arch == 'amd64'
|
||||||
|
run: |
|
||||||
|
set -eux
|
||||||
|
chmod +x dms-amd64
|
||||||
|
./dms-amd64 completion bash > completion.bash
|
||||||
|
./dms-amd64 completion fish > completion.fish
|
||||||
|
./dms-amd64 completion zsh > completion.zsh
|
||||||
|
|
||||||
|
- name: Build dms-distropkg (${{ matrix.arch }})
|
||||||
|
env:
|
||||||
|
GOOS: linux
|
||||||
|
CGO_ENABLED: 0
|
||||||
|
GOARCH: ${{ matrix.arch }}
|
||||||
|
run: |
|
||||||
|
set -eux
|
||||||
|
cd cmd/dms
|
||||||
|
go build -trimpath -tags distro_binary -ldflags "-s -w -X main.Version=${GITHUB_REF#refs/tags/}" \
|
||||||
|
-o ../../dms-distropkg-${{ matrix.arch }}
|
||||||
|
cd ../..
|
||||||
|
gzip -9 -k dms-distropkg-${{ matrix.arch }}
|
||||||
|
sha256sum dms-distropkg-${{ matrix.arch }}.gz > dms-distropkg-${{ matrix.arch }}.gz.sha256
|
||||||
|
|
||||||
|
- name: Upload artifacts (${{ matrix.arch }})
|
||||||
|
if: matrix.arch == 'arm64'
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: backend-assets-${{ matrix.arch }}
|
||||||
|
path: |
|
||||||
|
backend/dankinstall-${{ matrix.arch }}.gz
|
||||||
|
backend/dankinstall-${{ matrix.arch }}.gz.sha256
|
||||||
|
backend/dms-${{ matrix.arch }}.gz
|
||||||
|
backend/dms-${{ matrix.arch }}.gz.sha256
|
||||||
|
backend/dms-distropkg-${{ matrix.arch }}.gz
|
||||||
|
backend/dms-distropkg-${{ matrix.arch }}.gz.sha256
|
||||||
|
if-no-files-found: error
|
||||||
|
|
||||||
|
- name: Upload artifacts with completions
|
||||||
|
if: matrix.arch == 'amd64'
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: backend-assets-${{ matrix.arch }}
|
||||||
|
path: |
|
||||||
|
backend/dankinstall-${{ matrix.arch }}.gz
|
||||||
|
backend/dankinstall-${{ matrix.arch }}.gz.sha256
|
||||||
|
backend/dms-${{ matrix.arch }}.gz
|
||||||
|
backend/dms-${{ matrix.arch }}.gz.sha256
|
||||||
|
backend/dms-distropkg-${{ matrix.arch }}.gz
|
||||||
|
backend/dms-distropkg-${{ matrix.arch }}.gz.sha256
|
||||||
|
backend/completion.bash
|
||||||
|
backend/completion.fish
|
||||||
|
backend/completion.zsh
|
||||||
|
if-no-files-found: error
|
||||||
|
|
||||||
|
update-versions:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Update VERSION and flake.nix
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
git config user.name "github-actions[bot]"
|
||||||
git config user.email "github-actions[bot]@users.noreply.github.com"
|
git config user.email "github-actions[bot]@users.noreply.github.com"
|
||||||
|
|
||||||
echo "${TAG}" > VERSION
|
version="${GITHUB_REF#refs/tags/}"
|
||||||
|
version_no_v="${version#v}"
|
||||||
|
echo "Updating to version: $version"
|
||||||
|
|
||||||
git add -A VERSION
|
# Update VERSION file in quickshell/
|
||||||
|
echo "${version}" > quickshell/VERSION
|
||||||
|
|
||||||
|
# Update version in backend/flake.nix
|
||||||
|
sed -i "s/version = \"[^\"]*\"/version = \"$version_no_v\"/" backend/flake.nix
|
||||||
|
|
||||||
|
git add quickshell/VERSION backend/flake.nix
|
||||||
|
|
||||||
if ! git diff --cached --quiet; then
|
if ! git diff --cached --quiet; then
|
||||||
git commit -m "Update VERSION to ${TAG} (from DMS)"
|
git commit -m "chore: bump version to $version"
|
||||||
|
git push origin HEAD:master || git push origin HEAD:main
|
||||||
|
echo "Pushed version updates to master"
|
||||||
|
else
|
||||||
|
echo "No version changes needed"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
git tag -f "${TAG}"
|
release:
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
needs: build-backend
|
||||||
|
env:
|
||||||
|
TAG: ${{ github.ref_name }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
git push origin HEAD
|
- name: Download backend artifacts
|
||||||
git push -f origin "${TAG}"
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
pattern: backend-assets-*
|
||||||
|
merge-multiple: true
|
||||||
|
path: ./_backend_assets
|
||||||
|
|
||||||
- name: Generate Changelog
|
- name: Generate Changelog
|
||||||
id: changelog
|
id: changelog
|
||||||
@@ -55,6 +185,12 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
cat > RELEASE_BODY.md << 'EOF'
|
cat > RELEASE_BODY.md << 'EOF'
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -fsSL https://install.danklinux.com | sh
|
||||||
|
```
|
||||||
|
|
||||||
## Assets
|
## Assets
|
||||||
|
|
||||||
### Complete Packages
|
### Complete Packages
|
||||||
@@ -66,6 +202,8 @@ jobs:
|
|||||||
- **`dms-cli-arm64.gz`** - DMS CLI binary for ARM64 systems
|
- **`dms-cli-arm64.gz`** - DMS CLI binary for ARM64 systems
|
||||||
- **`dms-distropkg-amd64.gz`** - DMS CLI binary built with distro_package tag for AMD64 systems
|
- **`dms-distropkg-amd64.gz`** - DMS CLI binary built with distro_package tag for AMD64 systems
|
||||||
- **`dms-distropkg-arm64.gz`** - DMS CLI binary built with distro_package tag for ARM64 systems
|
- **`dms-distropkg-arm64.gz`** - DMS CLI binary built with distro_package tag for ARM64 systems
|
||||||
|
- **`dankinstall-amd64.gz`** - Installer binary for x86_64 systems
|
||||||
|
- **`dankinstall-arm64.gz`** - Installer binary for ARM64 systems
|
||||||
- **`dms-qml.tar.gz`** - QML source code only
|
- **`dms-qml.tar.gz`** - QML source code only
|
||||||
|
|
||||||
### Checksums
|
### Checksums
|
||||||
@@ -89,30 +227,14 @@ jobs:
|
|||||||
cat RELEASE_BODY.md >> $GITHUB_OUTPUT
|
cat RELEASE_BODY.md >> $GITHUB_OUTPUT
|
||||||
echo "EOF" >> $GITHUB_OUTPUT
|
echo "EOF" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Create/Update DankMaterialShell Release
|
- name: Prepare release assets
|
||||||
uses: softprops/action-gh-release@v2
|
|
||||||
with:
|
|
||||||
tag_name: ${{ env.TAG }}
|
|
||||||
name: Release ${{ env.TAG }}
|
|
||||||
body: ${{ steps.changelog.outputs.changelog }}
|
|
||||||
draft: false
|
|
||||||
prerelease: ${{ contains(env.TAG, '-') }}
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Download and prepare release assets
|
|
||||||
env:
|
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
run: |
|
run: |
|
||||||
set -euxo pipefail
|
set -euxo pipefail
|
||||||
|
|
||||||
mkdir -p _release_assets
|
mkdir -p _release_assets
|
||||||
|
|
||||||
# Download DMS CLI binaries from the danklinux repo
|
# Copy backend binaries and rename dms-*.gz to dms-cli-*.gz
|
||||||
gh release download "${TAG}" -R "${DMS_REPO}" --dir ./_dms_assets
|
for file in _backend_assets/dms-*.gz*; do
|
||||||
|
|
||||||
# Rename CLI binaries to dms-cli-* format and copy distropkg binaries
|
|
||||||
for file in _dms_assets/dms-*.gz*; do
|
|
||||||
if [ -f "$file" ]; then
|
if [ -f "$file" ]; then
|
||||||
basename=$(basename "$file")
|
basename=$(basename "$file")
|
||||||
if [[ "$basename" == dms-distropkg-* ]]; then
|
if [[ "$basename" == dms-distropkg-* ]]; then
|
||||||
@@ -124,40 +246,51 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
# Create QML source package (exclude .git, .github, build artifacts)
|
# Copy dankinstall binaries
|
||||||
tar --exclude='.git' \
|
cp _backend_assets/dankinstall-*.gz* _release_assets/
|
||||||
|
|
||||||
|
# Copy completions
|
||||||
|
cp _backend_assets/completion.* _release_assets/ 2>/dev/null || true
|
||||||
|
|
||||||
|
# Create QML source package (exclude build artifacts and git files)
|
||||||
|
# Tar the CONTENTS of quickshell/, not the directory itself
|
||||||
|
(cd quickshell && tar --exclude='.git' \
|
||||||
--exclude='.github' \
|
--exclude='.github' \
|
||||||
--exclude='_dms_assets' \
|
|
||||||
--exclude='_release_assets' \
|
|
||||||
--exclude='*.tar.gz' \
|
--exclude='*.tar.gz' \
|
||||||
-czf _release_assets/dms-qml.tar.gz .
|
-czf ../_release_assets/dms-qml.tar.gz .)
|
||||||
|
|
||||||
# Generate checksum for QML package
|
# Generate checksum for QML package
|
||||||
(cd _release_assets && sha256sum dms-qml.tar.gz > dms-qml.tar.gz.sha256)
|
(cd _release_assets && sha256sum dms-qml.tar.gz > dms-qml.tar.gz.sha256)
|
||||||
|
|
||||||
|
# Create full packages for each architecture
|
||||||
for arch in amd64 arm64; do
|
for arch in amd64 arm64; do
|
||||||
mkdir -p _temp_full/dms
|
mkdir -p _temp_full/dms
|
||||||
mkdir -p _temp_full/bin
|
mkdir -p _temp_full/bin
|
||||||
mkdir -p _temp_full/completions
|
mkdir -p _temp_full/completions
|
||||||
|
|
||||||
|
# Extract QML source
|
||||||
tar -xzf _release_assets/dms-qml.tar.gz -C _temp_full/dms
|
tar -xzf _release_assets/dms-qml.tar.gz -C _temp_full/dms
|
||||||
|
|
||||||
if [ -f "_dms_assets/dms-${arch}.gz" ]; then
|
# Add CLI binaries
|
||||||
gunzip -c "_dms_assets/dms-${arch}.gz" > _temp_full/bin/dms
|
if [ -f "_backend_assets/dms-${arch}.gz" ]; then
|
||||||
|
gunzip -c "_backend_assets/dms-${arch}.gz" > _temp_full/bin/dms
|
||||||
chmod +x _temp_full/bin/dms
|
chmod +x _temp_full/bin/dms
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -f "_dms_assets/dms-distropkg-${arch}.gz" ]; then
|
if [ -f "_backend_assets/dms-distropkg-${arch}.gz" ]; then
|
||||||
gunzip -c "_dms_assets/dms-distropkg-${arch}.gz" > _temp_full/bin/dms-distropkg
|
gunzip -c "_backend_assets/dms-distropkg-${arch}.gz" > _temp_full/bin/dms-distropkg
|
||||||
chmod +x _temp_full/bin/dms-distropkg
|
chmod +x _temp_full/bin/dms-distropkg
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for completion in _dms_assets/completion.*; do
|
# Add shell completions
|
||||||
|
for completion in _backend_assets/completion.*; do
|
||||||
if [ -f "$completion" ]; then
|
if [ -f "$completion" ]; then
|
||||||
cp "$completion" _temp_full/completions/
|
cp "$completion" _temp_full/completions/
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
cat > _temp_full/INSTALL.md << 'EOF'
|
|
||||||
|
# Create installation guide
|
||||||
|
cat > _temp_full/INSTALL.md << 'EOFINSTALL'
|
||||||
# DankMaterialShell Installation
|
# DankMaterialShell Installation
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
@@ -207,7 +340,7 @@ jobs:
|
|||||||
- Run with verbose output: `quickshell -v -p ~/.config/quickshell/dms`
|
- Run with verbose output: `quickshell -v -p ~/.config/quickshell/dms`
|
||||||
- Check logs in `~/.local/state/DankMaterialShell/`
|
- Check logs in `~/.local/state/DankMaterialShell/`
|
||||||
- Ensure all dependencies are installed
|
- Ensure all dependencies are installed
|
||||||
EOF
|
EOFINSTALL
|
||||||
|
|
||||||
# Create the full package
|
# Create the full package
|
||||||
(cd _temp_full && tar -czf "../_release_assets/dms-full-${arch}.tar.gz" .)
|
(cd _temp_full && tar -czf "../_release_assets/dms-full-${arch}.tar.gz" .)
|
||||||
@@ -219,11 +352,257 @@ jobs:
|
|||||||
rm -rf _temp_full
|
rm -rf _temp_full
|
||||||
done
|
done
|
||||||
|
|
||||||
- name: Attach all assets to release
|
- name: Create GitHub Release
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v2
|
||||||
with:
|
with:
|
||||||
tag_name: ${{ env.TAG }}
|
tag_name: ${{ env.TAG }}
|
||||||
|
name: Release ${{ env.TAG }}
|
||||||
|
body: ${{ steps.changelog.outputs.changelog }}
|
||||||
files: _release_assets/**
|
files: _release_assets/**
|
||||||
|
draft: false
|
||||||
|
prerelease: ${{ contains(env.TAG, '-') }}
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
copr-build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: release
|
||||||
|
env:
|
||||||
|
TAG: ${{ github.ref_name }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Determine version
|
||||||
|
id: version
|
||||||
|
run: |
|
||||||
|
VERSION="${TAG#v}"
|
||||||
|
echo "version=$VERSION" >> $GITHUB_OUTPUT
|
||||||
|
echo "Building DMS stable version: $VERSION"
|
||||||
|
|
||||||
|
- name: Setup build environment
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y rpm wget curl jq gzip
|
||||||
|
mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
|
||||||
|
|
||||||
|
- name: Download release assets
|
||||||
|
run: |
|
||||||
|
VERSION="${{ steps.version.outputs.version }}"
|
||||||
|
cd ~/rpmbuild/SOURCES
|
||||||
|
|
||||||
|
wget "https://github.com/AvengeMedia/DankMaterialShell/releases/download/v${VERSION}/dms-qml.tar.gz" || {
|
||||||
|
echo "Failed to download dms-qml.tar.gz for v${VERSION}"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
- name: Generate stable spec file
|
||||||
|
run: |
|
||||||
|
VERSION="${{ steps.version.outputs.version }}"
|
||||||
|
CHANGELOG_DATE="$(date '+%a %b %d %Y')"
|
||||||
|
|
||||||
|
cat > ~/rpmbuild/SPECS/dms.spec <<'SPECEOF'
|
||||||
|
# Spec for DMS stable releases - Generated by GitHub Actions
|
||||||
|
|
||||||
|
%global debug_package %{nil}
|
||||||
|
%global version VERSION_PLACEHOLDER
|
||||||
|
%global pkg_summary DankMaterialShell - Material 3 inspired shell for Wayland compositors
|
||||||
|
|
||||||
|
Name: dms
|
||||||
|
Version: %{version}
|
||||||
|
Release: 1%{?dist}
|
||||||
|
Summary: %{pkg_summary}
|
||||||
|
|
||||||
|
License: MIT
|
||||||
|
URL: https://github.com/AvengeMedia/DankMaterialShell
|
||||||
|
|
||||||
|
Source0: dms-qml.tar.gz
|
||||||
|
|
||||||
|
BuildRequires: gzip
|
||||||
|
BuildRequires: wget
|
||||||
|
BuildRequires: systemd-rpm-macros
|
||||||
|
|
||||||
|
Requires: (quickshell or quickshell-git)
|
||||||
|
Requires: accountsservice
|
||||||
|
Requires: dms-cli
|
||||||
|
Requires: dgop
|
||||||
|
|
||||||
|
Recommends: cava
|
||||||
|
Recommends: cliphist
|
||||||
|
Recommends: danksearch
|
||||||
|
Recommends: hyprpicker
|
||||||
|
Recommends: matugen
|
||||||
|
Recommends: wl-clipboard
|
||||||
|
Recommends: NetworkManager
|
||||||
|
Recommends: qt6-qtmultimedia
|
||||||
|
Suggests: qt6ct
|
||||||
|
|
||||||
|
%description
|
||||||
|
DankMaterialShell (DMS) is a modern Wayland desktop shell built with Quickshell
|
||||||
|
and optimized for the niri and hyprland compositors. Features notifications,
|
||||||
|
app launcher, wallpaper customization, and fully customizable with plugins.
|
||||||
|
|
||||||
|
Includes auto-theming for GTK/Qt apps with matugen, 20+ customizable widgets,
|
||||||
|
process monitoring, notification center, clipboard history, dock, control center,
|
||||||
|
lock screen, and comprehensive plugin system.
|
||||||
|
|
||||||
|
%package -n dms-cli
|
||||||
|
Summary: DankMaterialShell CLI tool
|
||||||
|
License: MIT
|
||||||
|
URL: https://github.com/AvengeMedia/DankMaterialShell
|
||||||
|
|
||||||
|
%description -n dms-cli
|
||||||
|
Command-line interface for DankMaterialShell configuration and management.
|
||||||
|
Provides native DBus bindings, NetworkManager integration, and system utilities.
|
||||||
|
|
||||||
|
%package -n dgop
|
||||||
|
Summary: Stateless CPU/GPU monitor for DankMaterialShell
|
||||||
|
License: MIT
|
||||||
|
URL: https://github.com/AvengeMedia/dgop
|
||||||
|
Provides: dgop
|
||||||
|
|
||||||
|
%description -n dgop
|
||||||
|
DGOP is a stateless system monitoring tool that provides CPU, GPU, memory, and
|
||||||
|
network statistics. Designed for integration with DankMaterialShell but can be
|
||||||
|
used standalone. This package always includes the latest stable dgop release.
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%setup -q -c -n dms-qml
|
||||||
|
|
||||||
|
# Download architecture-specific binaries during build
|
||||||
|
case "%{_arch}" in
|
||||||
|
x86_64)
|
||||||
|
ARCH_SUFFIX="amd64"
|
||||||
|
;;
|
||||||
|
aarch64)
|
||||||
|
ARCH_SUFFIX="arm64"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unsupported architecture: %{_arch}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
wget -O %{_builddir}/dms-cli.gz "https://github.com/AvengeMedia/DankMaterialShell/releases/latest/download/dms-distropkg-${ARCH_SUFFIX}.gz" || {
|
||||||
|
echo "Failed to download dms-cli for architecture %{_arch}"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
gunzip -c %{_builddir}/dms-cli.gz > %{_builddir}/dms-cli
|
||||||
|
chmod +x %{_builddir}/dms-cli
|
||||||
|
|
||||||
|
wget -O %{_builddir}/dgop.gz "https://github.com/AvengeMedia/dgop/releases/latest/download/dgop-linux-${ARCH_SUFFIX}.gz" || {
|
||||||
|
echo "Failed to download dgop for architecture %{_arch}"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
gunzip -c %{_builddir}/dgop.gz > %{_builddir}/dgop
|
||||||
|
chmod +x %{_builddir}/dgop
|
||||||
|
|
||||||
|
%build
|
||||||
|
|
||||||
|
%install
|
||||||
|
install -Dm755 %{_builddir}/dms-cli %{buildroot}%{_bindir}/dms
|
||||||
|
install -Dm755 %{_builddir}/dgop %{buildroot}%{_bindir}/dgop
|
||||||
|
|
||||||
|
install -d %{buildroot}%{_datadir}/bash-completion/completions
|
||||||
|
install -d %{buildroot}%{_datadir}/zsh/site-functions
|
||||||
|
install -d %{buildroot}%{_datadir}/fish/vendor_completions.d
|
||||||
|
%{_builddir}/dms-cli completion bash > %{buildroot}%{_datadir}/bash-completion/completions/dms || :
|
||||||
|
%{_builddir}/dms-cli completion zsh > %{buildroot}%{_datadir}/zsh/site-functions/_dms || :
|
||||||
|
%{_builddir}/dms-cli completion fish > %{buildroot}%{_datadir}/fish/vendor_completions.d/dms.fish || :
|
||||||
|
|
||||||
|
install -Dm644 %{_builddir}/dms-qml/assets/systemd/dms.service %{buildroot}%{_userunitdir}/dms.service
|
||||||
|
|
||||||
|
install -dm755 %{buildroot}%{_datadir}/quickshell/dms
|
||||||
|
cp -r %{_builddir}/dms-qml/* %{buildroot}%{_datadir}/quickshell/dms/
|
||||||
|
|
||||||
|
rm -rf %{buildroot}%{_datadir}/quickshell/dms/.git*
|
||||||
|
rm -f %{buildroot}%{_datadir}/quickshell/dms/.gitignore
|
||||||
|
rm -rf %{buildroot}%{_datadir}/quickshell/dms/.github
|
||||||
|
rm -rf %{buildroot}%{_datadir}/quickshell/dms/distro
|
||||||
|
|
||||||
|
%posttrans
|
||||||
|
if [ -d "%{_sysconfdir}/xdg/quickshell/dms" ]; then
|
||||||
|
rmdir "%{_sysconfdir}/xdg/quickshell/dms" 2>/dev/null || true
|
||||||
|
rmdir "%{_sysconfdir}/xdg/quickshell" 2>/dev/null || true
|
||||||
|
rmdir "%{_sysconfdir}/xdg" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$1" -ge 2 ]; then
|
||||||
|
pkill -USR1 -x dms >/dev/null 2>&1 || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
%files
|
||||||
|
%license LICENSE
|
||||||
|
%doc README.md CONTRIBUTING.md
|
||||||
|
%{_datadir}/quickshell/dms/
|
||||||
|
%{_userunitdir}/dms.service
|
||||||
|
|
||||||
|
%files -n dms-cli
|
||||||
|
%{_bindir}/dms
|
||||||
|
%{_datadir}/bash-completion/completions/dms
|
||||||
|
%{_datadir}/zsh/site-functions/_dms
|
||||||
|
%{_datadir}/fish/vendor_completions.d/dms.fish
|
||||||
|
|
||||||
|
%files -n dgop
|
||||||
|
%{_bindir}/dgop
|
||||||
|
|
||||||
|
%changelog
|
||||||
|
* CHANGELOG_DATE_PLACEHOLDER AvengeMedia <contact@avengemedia.com> - VERSION_PLACEHOLDER-1
|
||||||
|
- Stable release VERSION_PLACEHOLDER
|
||||||
|
- Built from GitHub release
|
||||||
|
- Includes latest dms-cli and dgop binaries
|
||||||
|
SPECEOF
|
||||||
|
|
||||||
|
sed -i "s/VERSION_PLACEHOLDER/${VERSION}/g" ~/rpmbuild/SPECS/dms.spec
|
||||||
|
sed -i "s/CHANGELOG_DATE_PLACEHOLDER/${CHANGELOG_DATE}/g" ~/rpmbuild/SPECS/dms.spec
|
||||||
|
|
||||||
|
- name: Build SRPM
|
||||||
|
id: build
|
||||||
|
run: |
|
||||||
|
cd ~/rpmbuild/SPECS
|
||||||
|
rpmbuild -bs dms.spec
|
||||||
|
|
||||||
|
SRPM=$(ls ~/rpmbuild/SRPMS/*.src.rpm | tail -n 1)
|
||||||
|
SRPM_NAME=$(basename "$SRPM")
|
||||||
|
|
||||||
|
echo "srpm_path=$SRPM" >> $GITHUB_OUTPUT
|
||||||
|
echo "srpm_name=$SRPM_NAME" >> $GITHUB_OUTPUT
|
||||||
|
echo "SRPM built: $SRPM_NAME"
|
||||||
|
|
||||||
|
- name: Upload SRPM artifact
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: dms-stable-srpm-${{ steps.version.outputs.version }}
|
||||||
|
path: ${{ steps.build.outputs.srpm_path }}
|
||||||
|
retention-days: 90
|
||||||
|
|
||||||
|
- name: Install Copr CLI
|
||||||
|
run: |
|
||||||
|
sudo apt-get install -y python3-pip
|
||||||
|
pip3 install copr-cli
|
||||||
|
|
||||||
|
mkdir -p ~/.config
|
||||||
|
cat > ~/.config/copr << EOF
|
||||||
|
[copr-cli]
|
||||||
|
login = ${{ secrets.COPR_LOGIN }}
|
||||||
|
username = avengemedia
|
||||||
|
token = ${{ secrets.COPR_TOKEN }}
|
||||||
|
copr_url = https://copr.fedorainfracloud.org
|
||||||
|
EOF
|
||||||
|
chmod 600 ~/.config/copr
|
||||||
|
|
||||||
|
- name: Upload to Copr
|
||||||
|
run: |
|
||||||
|
SRPM="${{ steps.build.outputs.srpm_path }}"
|
||||||
|
VERSION="${{ steps.version.outputs.version }}"
|
||||||
|
|
||||||
|
echo "Uploading SRPM to avengemedia/dms..."
|
||||||
|
BUILD_OUTPUT=$(copr-cli build avengemedia/dms "$SRPM" --nowait 2>&1)
|
||||||
|
echo "$BUILD_OUTPUT"
|
||||||
|
|
||||||
|
BUILD_ID=$(echo "$BUILD_OUTPUT" | grep -oP 'Build was added to.*\K[0-9]+' || echo "unknown")
|
||||||
|
|
||||||
|
if [ "$BUILD_ID" != "unknown" ]; then
|
||||||
|
echo "Build submitted: https://copr.fedorainfracloud.org/coprs/avengemedia/dms/build/$BUILD_ID/"
|
||||||
|
fi
|
||||||
|
|||||||
90
.github/workflows/update-vendor-hash.yml
vendored
Normal file
90
.github/workflows/update-vendor-hash.yml
vendored
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
name: Update Vendor Hash
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- "backend/go.mod"
|
||||||
|
- "backend/go.sum"
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
update-vendor-hash:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Install Nix
|
||||||
|
uses: cachix/install-nix-action@v31
|
||||||
|
|
||||||
|
- name: Update vendorHash in backend/flake.nix
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Try to build and capture the expected hash from error message
|
||||||
|
echo "Attempting nix build to get new vendorHash..."
|
||||||
|
cd backend
|
||||||
|
if output=$(nix build .#dms-cli 2>&1); then
|
||||||
|
echo "Build succeeded, no hash update needed"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Extract the expected hash from the error message
|
||||||
|
new_hash=$(echo "$output" | grep -oP "got:\s+\K\S+" | head -n1)
|
||||||
|
|
||||||
|
if [ -z "$new_hash" ]; then
|
||||||
|
echo "Could not extract new vendorHash from build output"
|
||||||
|
echo "Build output:"
|
||||||
|
echo "$output"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "New vendorHash: $new_hash"
|
||||||
|
|
||||||
|
# Get current hash from flake.nix
|
||||||
|
current_hash=$(grep -oP 'vendorHash = "\K[^"]+' flake.nix)
|
||||||
|
echo "Current vendorHash: $current_hash"
|
||||||
|
|
||||||
|
if [ "$current_hash" = "$new_hash" ]; then
|
||||||
|
echo "vendorHash is already up to date"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Update the hash in flake.nix
|
||||||
|
sed -i "s|vendorHash = \"$current_hash\"|vendorHash = \"$new_hash\"|" flake.nix
|
||||||
|
|
||||||
|
# Verify the build works with the new hash
|
||||||
|
echo "Verifying build with new vendorHash..."
|
||||||
|
nix build .#dms-cli
|
||||||
|
|
||||||
|
echo "vendorHash updated successfully!"
|
||||||
|
|
||||||
|
- name: Commit and push vendorHash update
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
if ! git diff --quiet backend/flake.nix; then
|
||||||
|
git config user.name "github-actions[bot]"
|
||||||
|
git config user.email "github-actions[bot]@users.noreply.github.com"
|
||||||
|
|
||||||
|
git add backend/flake.nix
|
||||||
|
git commit -m "flake: update vendorHash for go.mod changes"
|
||||||
|
|
||||||
|
for attempt in 1 2 3; do
|
||||||
|
if git push; then
|
||||||
|
echo "Successfully pushed vendorHash update"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
echo "Push attempt $attempt failed, pulling and retrying..."
|
||||||
|
git pull --rebase
|
||||||
|
sleep $((attempt*2))
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Failed to push after retries" >&2
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo "No changes to backend/flake.nix"
|
||||||
|
fi
|
||||||
3
LICENSE
3
LICENSE
@@ -17,4 +17,5 @@ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|||||||
188
README.md
188
README.md
@@ -1 +1,187 @@
|
|||||||
# TODO
|
# DankMaterialShell
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
<a href="https://danklinux.com">
|
||||||
|
<img src="assets/danklogo.svg" alt="DankMaterialShell" width="200">
|
||||||
|
</a>
|
||||||
|
|
||||||
|
### A modern desktop shell for Wayland
|
||||||
|
|
||||||
|
Built with [Quickshell](https://quickshell.org/) and [Go](https://go.dev/)
|
||||||
|
|
||||||
|
[](https://danklinux.com/docs)
|
||||||
|
[](https://github.com/AvengeMedia/DankMaterialShell/stargazers)
|
||||||
|
[](https://github.com/AvengeMedia/DankMaterialShell/blob/master/LICENSE)
|
||||||
|
[](https://github.com/AvengeMedia/DankMaterialShell/releases)
|
||||||
|
[](https://aur.archlinux.org/packages/dms-shell-bin)
|
||||||
|
[)](https://aur.archlinux.org/packages/dms-shell-git)
|
||||||
|
[](https://ko-fi.com/avengemediallc)
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
DankMaterialShell is a complete desktop shell for [niri](https://github.com/YaLTeR/niri), [Hyprland](https://hyprland.org/), [MangoWC](https://github.com/DreamMaoMao/mangowc), [Sway](https://swaywm.org), and other Wayland compositors. It replaces waybar, swaylock, swayidle, mako, fuzzel, polkit, and everything else you'd normally stitch together to make a desktop.
|
||||||
|
|
||||||
|
## Repository Structure
|
||||||
|
|
||||||
|
This is a monorepo containing both the shell interface and backend services:
|
||||||
|
|
||||||
|
```
|
||||||
|
DankMaterialShell/
|
||||||
|
├── quickshell/ # QML-based shell interface
|
||||||
|
│ ├── Modules/ # UI components (panels, widgets, overlays)
|
||||||
|
│ ├── Services/ # System integration (audio, network, bluetooth)
|
||||||
|
│ ├── Widgets/ # Reusable UI controls
|
||||||
|
│ └── Common/ # Shared resources and themes
|
||||||
|
├── backend/ # Go backend and CLI
|
||||||
|
│ ├── cmd/ # dms CLI and dankinstall binaries
|
||||||
|
│ ├── internal/ # System integration, IPC, distro support
|
||||||
|
│ └── pkg/ # Shared packages
|
||||||
|
├── distro/ # Distribution packaging (Fedora RPM specs)
|
||||||
|
├── nix/ # NixOS/home-manager modules
|
||||||
|
└── flake.nix # Nix flake for declarative installation
|
||||||
|
```
|
||||||
|
|
||||||
|
## See it in Action
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
|
||||||
|
https://github.com/user-attachments/assets/1200a739-7770-4601-8b85-695ca527819a
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<details><summary><strong>More Screenshots</strong></summary>
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
|
||||||
|
<img src="https://github.com/user-attachments/assets/203a9678-c3b7-4720-bb97-853a511ac5c8" width="600" alt="Desktop" />
|
||||||
|
|
||||||
|
<img src="https://github.com/user-attachments/assets/a937cf35-a43b-4558-8c39-5694ff5fcac4" width="600" alt="Dashboard" />
|
||||||
|
|
||||||
|
<img src="https://github.com/user-attachments/assets/2da00ea1-8921-4473-a2a9-44a44535a822" width="450" alt="Launcher" />
|
||||||
|
|
||||||
|
<img src="https://github.com/user-attachments/assets/732c30de-5f4a-4a2b-a995-c8ab656cecd5" width="600" alt="Control Center" />
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -fsSL https://install.danklinux.com | sh
|
||||||
|
```
|
||||||
|
|
||||||
|
One command installs DMS and all dependencies on Arch, Fedora, Debian, Ubuntu, openSUSE, or Gentoo.
|
||||||
|
|
||||||
|
**[Manual installation guide](https://danklinux.com/docs/dankmaterialshell/installation)**
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
**Dynamic Theming**
|
||||||
|
Wallpaper-based color schemes that automatically theme GTK, Qt, terminals, editors (vscode, vscodium), and more using [matugen](https://github.com/InioX/matugen) and dank16.
|
||||||
|
|
||||||
|
**System Monitoring**
|
||||||
|
Real-time CPU, RAM, GPU metrics and temperatures with [dgop](https://github.com/AvengeMedia/dgop). Process list with search and management.
|
||||||
|
|
||||||
|
**Powerful Launcher**
|
||||||
|
Spotlight-style search for applications, files ([dsearch](https://github.com/AvengeMedia/danksearch)), emojis, running windows, calculator, and commands. Extensible with plugins.
|
||||||
|
|
||||||
|
**Control Center**
|
||||||
|
Unified interface for network, Bluetooth, audio devices, display settings, and night mode.
|
||||||
|
|
||||||
|
**Smart Notifications**
|
||||||
|
Notification center with grouping, rich text support, and keyboard navigation.
|
||||||
|
|
||||||
|
**Media Integration**
|
||||||
|
MPRIS player controls, calendar sync, weather widgets, and clipboard history with image previews.
|
||||||
|
|
||||||
|
**Session Management**
|
||||||
|
Lock screen, idle detection, auto-lock/suspend with separate AC/battery settings, and greeter support.
|
||||||
|
|
||||||
|
**Plugin System**
|
||||||
|
Extend functionality with the [plugin registry](https://plugins.danklinux.com).
|
||||||
|
|
||||||
|
## Supported Compositors
|
||||||
|
|
||||||
|
Works best with [niri](https://github.com/YaLTeR/niri), [Hyprland](https://hyprland.org/), [Sway](https://swaywm.org/), and [MangoWC](https://github.com/DreamMaoMao/mangowc) with full workspace switching, overview integration, and monitor management. Other Wayland compositors work with reduced features.
|
||||||
|
|
||||||
|
[Compositor configuration guide](https://danklinux.com/docs/dankmaterialshell/compositors)
|
||||||
|
|
||||||
|
## Command Line Interface
|
||||||
|
|
||||||
|
Control the shell from the command line or keybinds:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
dms run # Start the shell
|
||||||
|
dms ipc call spotlight toggle
|
||||||
|
dms ipc call audio setvolume 50
|
||||||
|
dms ipc call wallpaper set /path/to/image.jpg
|
||||||
|
dms brightness list # List available displays
|
||||||
|
dms plugins search # Browse plugin registry
|
||||||
|
```
|
||||||
|
|
||||||
|
[Full CLI and IPC documentation](https://danklinux.com/docs/dankmaterialshell/keybinds-ipc)
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
- **Website:** [danklinux.com](https://danklinux.com)
|
||||||
|
- **Docs:** [danklinux.com/docs](https://danklinux.com/docs)
|
||||||
|
- **Theming:** [Application themes](https://danklinux.com/docs/dankmaterialshell/application-themes) | [Custom themes](https://danklinux.com/docs/dankmaterialshell/custom-themes)
|
||||||
|
- **Plugins:** [Development guide](https://danklinux.com/docs/dankmaterialshell/plugins-overview)
|
||||||
|
- **Support:** [Ko-fi](https://ko-fi.com/avengemediallc)
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
See component-specific documentation:
|
||||||
|
|
||||||
|
- **[quickshell/](quickshell/)** - QML shell development, widgets, and modules
|
||||||
|
- **[backend/](backend/)** - Go backend, CLI tools, and system integration
|
||||||
|
- **[distro/](distro/)** - Distribution packaging
|
||||||
|
- **[nix/](nix/)** - NixOS and home-manager modules
|
||||||
|
|
||||||
|
### Building from Source
|
||||||
|
|
||||||
|
**Backend:**
|
||||||
|
```bash
|
||||||
|
cd backend
|
||||||
|
make # Build dms CLI
|
||||||
|
make dankinstall # Build installer
|
||||||
|
```
|
||||||
|
|
||||||
|
**Shell:**
|
||||||
|
```bash
|
||||||
|
quickshell -p quickshell/
|
||||||
|
```
|
||||||
|
|
||||||
|
**NixOS:**
|
||||||
|
```nix
|
||||||
|
{
|
||||||
|
inputs.dms.url = "github:AvengeMedia/DankMaterialShell";
|
||||||
|
|
||||||
|
# Use in home-manager or NixOS configuration
|
||||||
|
imports = [ inputs.dms.homeModules.dankMaterialShell.default ];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Contributions welcome. Bug fixes, widgets, features, documentation, and plugins all help.
|
||||||
|
|
||||||
|
1. Fork the repository
|
||||||
|
2. Make your changes
|
||||||
|
3. Test thoroughly
|
||||||
|
4. Open a pull request
|
||||||
|
|
||||||
|
For documentation contributions, see [DankLinux-Docs](https://github.com/AvengeMedia/DankLinux-Docs).
|
||||||
|
|
||||||
|
## Credits
|
||||||
|
|
||||||
|
- [quickshell](https://quickshell.org/) - Shell framework
|
||||||
|
- [niri](https://github.com/YaLTeR/niri) - Scrolling window manager
|
||||||
|
- [Ly-sec](http://github.com/ly-sec) - Wallpaper effects from [Noctalia](https://github.com/noctalia-dev/noctalia-shell)
|
||||||
|
- [soramanew](https://github.com/soramanew) - [Caelestia](https://github.com/caelestia-dots/shell) inspiration
|
||||||
|
- [end-4](https://github.com/end-4) - [dots-hyprland](https://github.com/end-4/dots-hyprland) inspiration
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
MIT License - See [LICENSE](LICENSE) for details.
|
||||||
|
|||||||
113
assets/danklogo.svg
Normal file
113
assets/danklogo.svg
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
version="1.1"
|
||||||
|
id="svg1"
|
||||||
|
width="482.90668"
|
||||||
|
height="558.15088"
|
||||||
|
viewBox="0 0 482.90667 558.15088"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
shape-rendering="auto"
|
||||||
|
style="image-rendering: auto; filter: url(#smoothing);">
|
||||||
|
<defs
|
||||||
|
id="defs1">
|
||||||
|
<filter id="smoothing" x="-0.05" y="-0.05" width="1.1" height="1.1">
|
||||||
|
<feGaussianBlur in="SourceGraphic" stdDeviation="0.5" />
|
||||||
|
</filter>
|
||||||
|
<color-profile
|
||||||
|
name="sRGB IEC61966-2.1"
|
||||||
|
xlink:href="data:application/vnd.iccprofile;base64,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"
|
||||||
|
id="color-profile1" />
|
||||||
|
<clipPath
|
||||||
|
clipPathUnits="userSpaceOnUse"
|
||||||
|
id="clipPath21">
|
||||||
|
<path
|
||||||
|
d="M 0,1200 H 2000 V 0 H 0 Z"
|
||||||
|
transform="translate(-673.87432,-704.25842)"
|
||||||
|
id="path21" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
clipPathUnits="userSpaceOnUse"
|
||||||
|
id="clipPath25">
|
||||||
|
<path
|
||||||
|
d="M 0,1200 H 2000 V 0 H 0 Z"
|
||||||
|
transform="translate(-466.30451,-703.59782)"
|
||||||
|
id="path25" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
clipPathUnits="userSpaceOnUse"
|
||||||
|
id="clipPath27">
|
||||||
|
<path
|
||||||
|
d="M 0,1200 H 2000 V 0 H 0 Z"
|
||||||
|
transform="translate(-695.28002,-473.92741)"
|
||||||
|
id="path27" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
clipPathUnits="userSpaceOnUse"
|
||||||
|
id="clipPath29">
|
||||||
|
<path
|
||||||
|
d="M 0,1200 H 2000 V 0 H 0 Z"
|
||||||
|
transform="translate(-457.93881,-632.99062)"
|
||||||
|
id="path29" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
clipPathUnits="userSpaceOnUse"
|
||||||
|
id="clipPath31">
|
||||||
|
<path
|
||||||
|
d="M 0,1200 H 2000 V 0 H 0 Z"
|
||||||
|
transform="translate(-466.30451,-703.59782)"
|
||||||
|
id="path31" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
clipPathUnits="userSpaceOnUse"
|
||||||
|
id="clipPath33">
|
||||||
|
<path
|
||||||
|
d="M 0,1200 H 2000 V 0 H 0 Z"
|
||||||
|
transform="translate(-614.51722,-638.93302)"
|
||||||
|
id="path33" />
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
id="layer-MC0"
|
||||||
|
transform="translate(-486.31024,-515.02722)">
|
||||||
|
<path
|
||||||
|
id="path20"
|
||||||
|
d="M 0,0 C -1.568,1.568 -3.163,3.098 -4.787,4.61 -5.944,3.966 -7.185,3.35 -8.529,2.762 -9.658,2.277 -10.815,1.82 -11.981,1.4 c 1.885,-1.689 3.742,-3.425 5.552,-5.207 0.448,-0.429 0.886,-0.868 1.325,-1.306 2.221,-2.221 4.386,-4.498 6.476,-6.84 27.639,-30.784 44.453,-71.459 44.453,-116.089 0,-29.347 -7.259,-56.977 -20.09,-81.21 -2.192,-4.134 -4.544,-8.174 -7.054,-12.102 -6.83,-10.74 -14.827,-20.669 -23.785,-29.636 -5.944,-5.944 -12.317,-11.459 -19.073,-16.498 -0.56,-0.42 -1.12,-0.83 -1.689,-1.231 -28.675,-20.893 -63.975,-33.201 -102.186,-33.201 -48.018,0 -91.464,19.456 -122.948,50.93 -0.737,0.737 -1.465,1.474 -2.174,2.221 -0.55,0.569 -1.101,1.147 -1.633,1.726 -15.545,16.553 -27.881,36.14 -36.018,57.779 -3.098,8.211 -5.58,16.712 -7.409,25.464 -2.417,11.534 -3.686,23.496 -3.686,35.758 0.01,42.326 15.117,81.097 40.246,111.246 -2.072,1.278 -3.975,2.809 -5.534,4.637 -26.174,-31.399 -41.934,-71.822 -41.934,-115.883 0,-18.187 2.678,-35.748 7.67,-52.311 3.359,-11.142 7.754,-21.835 13.092,-31.95 8.528,-16.208 19.446,-30.961 32.276,-43.801 1.251,-1.25 2.529,-2.491 3.817,-3.685 0.662,-0.644 1.334,-1.26 2.006,-1.876 10.862,-9.938 22.945,-18.578 36,-25.661 25.632,-13.913 55.016,-21.816 86.229,-21.816 2.454,0 4.908,0.047 7.334,0.14 36.056,1.446 69.424,13.427 97.054,32.976 0.569,0.392 1.148,0.793 1.698,1.204 7.82,5.655 15.164,11.925 21.966,18.718 7.904,7.904 15.07,16.526 21.406,25.773 2.556,3.723 4.973,7.558 7.25,11.477 15.499,26.697 24.382,57.723 24.382,90.812 C 53.038,-78.055 32.762,-32.762 0,0"
|
||||||
|
style="fill:#D0BCFF;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
transform="matrix(1.3333333,0,0,-1.3333333,898.49907,660.9888)"
|
||||||
|
clip-path="url(#clipPath21)" />
|
||||||
|
<path
|
||||||
|
id="path24"
|
||||||
|
d="M 0,0 -0.169,-0.292 C 1.43,-0.2 3.091,-0.108 4.798,0 Z"
|
||||||
|
style="fill:#D0BCFF;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
transform="matrix(1.3333333,0,0,-1.3333333,621.73933,661.8696)"
|
||||||
|
clip-path="url(#clipPath25)" />
|
||||||
|
<path
|
||||||
|
id="path26"
|
||||||
|
d="m 0,0 c -6.336,-9.247 -13.502,-17.869 -21.406,-25.773 -6.802,-6.793 -14.146,-13.063 -21.965,-18.718 -0.551,-0.411 -1.129,-0.812 -1.699,-1.204 -27.629,-19.549 -60.998,-31.53 -97.053,-32.976 -33.247,1.129 -64.852,8.762 -93.564,21.676 -13.054,7.082 -25.138,15.723 -36,25.661 -0.672,0.616 -1.343,1.232 -2.006,1.876 -1.288,1.194 -2.566,2.435 -3.816,3.685 -12.831,12.84 -23.748,27.593 -32.277,43.801 -1.092,7.651 -1.941,15.378 -2.445,23.039 -0.102,1.502 -0.186,3.004 -0.261,4.497 0,0 -2.865,29.795 23.944,36.634 26.827,6.84 65.654,19.745 87.722,50.305 0,0 0.327,-8.38 5.506,-15.779 8.034,-11.422 46.674,-100.46 46.674,-100.46 l 6.121,51.135 -13.978,15.079 -4.553,-1.987 15.228,16.544 c 0,0 8.94,4.218 16.554,-0.653 7.605,-4.899 14.146,-16.153 14.146,-16.153 l -5.879,3.892 -4.227,-12.364 c -0.756,-2.184 -0.83,-4.535 -0.233,-6.784 l 16.796,-62.687 c 0,0 -0.243,87.415 -2.781,111.685 0,0 14.221,-10.367 21.621,-14.454 7.381,-4.078 47.215,-20.407 53.738,-22.395 6.504,-1.987 13.222,-5.841 15.882,-11.916 1.026,-2.351 8.594,-26.939 17.486,-56.229 C -1.829,6.028 -0.914,3.023 0,0"
|
||||||
|
style="fill:#D0BCFF;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
transform="matrix(1.3333333,0,0,-1.3333333,927.04,968.0968)"
|
||||||
|
clip-path="url(#clipPath27)" />
|
||||||
|
<path
|
||||||
|
id="path28"
|
||||||
|
d="m 0,0 c 0,0 -3.081,-67.22 -8.64,-90.616 -5.559,-23.397 30.316,0 30.316,0 l 20.9,68.629 z"
|
||||||
|
style="fill:#D0BCFF;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
transform="matrix(1.3333333,0,0,-1.3333333,610.58507,756.01253)"
|
||||||
|
clip-path="url(#clipPath29)" />
|
||||||
|
<path
|
||||||
|
id="path30"
|
||||||
|
d="M 0,0 -0.169,-0.292 C 1.43,-0.2 3.091,-0.108 4.798,0 Z"
|
||||||
|
style="fill:#D0BCFF;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
transform="matrix(1.3333333,0,0,-1.3333333,621.73933,661.8696)"
|
||||||
|
clip-path="url(#clipPath31)" />
|
||||||
|
<path
|
||||||
|
id="path32"
|
||||||
|
d="m 0,0 c 0,0 12.178,7.604 15.029,18.355 0,0 36.913,-9.243 52.904,-26.719 C 66.887,-8.091 29.642,2.031 0,0 m -36.152,-5.643 c -26.791,0.404 -31.781,16.05 -34.086,29.523 -0.511,2.958 -3.148,5.073 -6.13,4.883 l -46.275,-4.764 14.922,7.14 c 3.505,1.687 7.164,3.077 10.895,4.17 3.742,1.093 7.556,1.901 11.429,2.376 4.051,0.499 8.542,1.01 13.46,1.509 0,0 6.19,2.459 7.414,-4.479 1.259,-6.926 0.499,-31.864 28.287,-31.103 27.777,0.76 32.612,19.412 32.612,19.412 0,0 3.458,14.471 9.232,14.257 5.263,-0.202 7.27,-6.142 7.853,-10.479 0.142,-1.045 -0.06,-3.54 0.582,-4.324 -0.939,1.152 -2.162,2.032 -3.564,2.554 C 7.604,26.113 3.065,26.945 2.471,21.658 1.616,13.877 -9.599,-6.059 -36.152,-5.643 m 13.306,48.354 9.528,-2.377 c 0,0 -2.388,-17.5 -11.227,-21.979 -0.25,-0.13 4.194,14.281 1.699,24.356 m 59.022,3.041 3.79,-1.687 c 0,0 2.198,-14.209 -3.79,-20.577 0,0 2.174,12.474 0,22.264 m -187.451,35.63 c 12.225,2.067 24.45,4.229 36.664,6.332 l 36.663,6.392 73.303,12.748 c 2.958,0.522 5.774,-1.462 6.285,-4.408 0.522,-2.947 -1.462,-5.762 -4.42,-6.285 -0.119,-0.024 -0.261,-0.036 -0.38,-0.047 H -3.184 L -114.243,85.029 c -12.344,-1.224 -24.676,-2.495 -37.032,-3.647 M 43.97,16.93 c 3.54,4.693 5.215,23.096 5.215,23.096 l 1.497,2.518 v 8.744 C 29.381,61.327 11.869,50.682 11.869,50.682 l -16.491,0.749 c -3.112,0.142 -7.449,2.637 -10.644,3.433 -4.42,1.093 -8.804,2.068 -13.342,2.566 -16.407,1.735 -32.933,0 -49.091,-2.934 -7.021,-1.271 -13.971,-2.851 -20.957,-4.325 -6.701,-1.425 -12.878,-3.908 -19.151,-6.605 -4.313,-1.842 -8.649,-3.659 -12.641,-6.119 -2.436,-1.496 -4.741,-3.243 -6.737,-5.31 -2.126,-2.21 -3.659,-4.859 -5.476,-7.319 -1.545,-2.091 -4.907,-0.463 -4.147,2.032 0.024,0.059 0.048,0.119 0.06,0.154 0.867,2.044 2.221,4.646 3.659,6.345 3.588,4.241 8.958,8.292 13.686,11.12 10.039,6.071 21.48,9.766 32.767,12.985 24.771,7.057 51.442,8.138 77.009,10.55 14.114,1.331 28.43,2.091 42.473,4.016 12.784,1.734 37.935,4.859 36.176,22.882 -1.71,18.129 -59.355,18.712 -59.355,18.712 0,0 -21.943,45.027 -27.372,50.468 -5.418,5.418 -16.503,18.474 -74.254,4.384 -57.739,-14.078 -55.327,-42.259 -55.327,-42.259 l -2.412,-39.622 c 0,0 -43.198,-11.179 -41.832,-23.321 1.391,-12.142 39.171,-12.819 39.171,-12.819 0,0 8.577,0.439 20.696,1.152 l -5.382,-9.683 c -6.749,-12.13 -6.38,-25.258 -8.851,-38.908 -4.277,-23.631 11.963,-52.702 33.978,-62.147 21.1,-9.053 53.949,-13.782 99.012,6.368 11.085,4.954 20.328,13.282 26.66,23.618 l 0.499,0.796 c 22.728,26.125 80.574,9.386 80.574,9.386 C 81.774,1.699 43.97,16.93 43.97,16.93"
|
||||||
|
style="fill:#D0BCFF;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
transform="matrix(1.3333333,0,0,-1.3333333,819.35627,748.08933)"
|
||||||
|
clip-path="url(#clipPath33)" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 13 KiB |
113
assets/danklogo2.svg
Normal file
113
assets/danklogo2.svg
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
version="1.1"
|
||||||
|
id="svg1"
|
||||||
|
width="482.90668"
|
||||||
|
height="558.15088"
|
||||||
|
viewBox="0 0 482.90667 558.15088"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
shape-rendering="auto"
|
||||||
|
style="image-rendering: auto; filter: url(#smoothing);">
|
||||||
|
<defs
|
||||||
|
id="defs1">
|
||||||
|
<filter id="smoothing" x="-0.05" y="-0.05" width="1.1" height="1.1">
|
||||||
|
<feGaussianBlur in="SourceGraphic" stdDeviation="0.5" />
|
||||||
|
</filter>
|
||||||
|
<color-profile
|
||||||
|
name="sRGB IEC61966-2.1"
|
||||||
|
xlink:href="data:application/vnd.iccprofile;base64,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"
|
||||||
|
id="color-profile1" />
|
||||||
|
<clipPath
|
||||||
|
clipPathUnits="userSpaceOnUse"
|
||||||
|
id="clipPath21">
|
||||||
|
<path
|
||||||
|
d="M 0,1200 H 2000 V 0 H 0 Z"
|
||||||
|
transform="translate(-673.87432,-704.25842)"
|
||||||
|
id="path21" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
clipPathUnits="userSpaceOnUse"
|
||||||
|
id="clipPath25">
|
||||||
|
<path
|
||||||
|
d="M 0,1200 H 2000 V 0 H 0 Z"
|
||||||
|
transform="translate(-466.30451,-703.59782)"
|
||||||
|
id="path25" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
clipPathUnits="userSpaceOnUse"
|
||||||
|
id="clipPath27">
|
||||||
|
<path
|
||||||
|
d="M 0,1200 H 2000 V 0 H 0 Z"
|
||||||
|
transform="translate(-695.28002,-473.92741)"
|
||||||
|
id="path27" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
clipPathUnits="userSpaceOnUse"
|
||||||
|
id="clipPath29">
|
||||||
|
<path
|
||||||
|
d="M 0,1200 H 2000 V 0 H 0 Z"
|
||||||
|
transform="translate(-457.93881,-632.99062)"
|
||||||
|
id="path29" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
clipPathUnits="userSpaceOnUse"
|
||||||
|
id="clipPath31">
|
||||||
|
<path
|
||||||
|
d="M 0,1200 H 2000 V 0 H 0 Z"
|
||||||
|
transform="translate(-466.30451,-703.59782)"
|
||||||
|
id="path31" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
clipPathUnits="userSpaceOnUse"
|
||||||
|
id="clipPath33">
|
||||||
|
<path
|
||||||
|
d="M 0,1200 H 2000 V 0 H 0 Z"
|
||||||
|
transform="translate(-614.51722,-638.93302)"
|
||||||
|
id="path33" />
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
id="layer-MC0"
|
||||||
|
transform="translate(-486.31024,-515.02722)">
|
||||||
|
<path
|
||||||
|
id="path20"
|
||||||
|
d="M 0,0 C -1.568,1.568 -3.163,3.098 -4.787,4.61 -5.944,3.966 -7.185,3.35 -8.529,2.762 -9.658,2.277 -10.815,1.82 -11.981,1.4 c 1.885,-1.689 3.742,-3.425 5.552,-5.207 0.448,-0.429 0.886,-0.868 1.325,-1.306 2.221,-2.221 4.386,-4.498 6.476,-6.84 27.639,-30.784 44.453,-71.459 44.453,-116.089 0,-29.347 -7.259,-56.977 -20.09,-81.21 -2.192,-4.134 -4.544,-8.174 -7.054,-12.102 -6.83,-10.74 -14.827,-20.669 -23.785,-29.636 -5.944,-5.944 -12.317,-11.459 -19.073,-16.498 -0.56,-0.42 -1.12,-0.83 -1.689,-1.231 -28.675,-20.893 -63.975,-33.201 -102.186,-33.201 -48.018,0 -91.464,19.456 -122.948,50.93 -0.737,0.737 -1.465,1.474 -2.174,2.221 -0.55,0.569 -1.101,1.147 -1.633,1.726 -15.545,16.553 -27.881,36.14 -36.018,57.779 -3.098,8.211 -5.58,16.712 -7.409,25.464 -2.417,11.534 -3.686,23.496 -3.686,35.758 0.01,42.326 15.117,81.097 40.246,111.246 -2.072,1.278 -3.975,2.809 -5.534,4.637 -26.174,-31.399 -41.934,-71.822 -41.934,-115.883 0,-18.187 2.678,-35.748 7.67,-52.311 3.359,-11.142 7.754,-21.835 13.092,-31.95 8.528,-16.208 19.446,-30.961 32.276,-43.801 1.251,-1.25 2.529,-2.491 3.817,-3.685 0.662,-0.644 1.334,-1.26 2.006,-1.876 10.862,-9.938 22.945,-18.578 36,-25.661 25.632,-13.913 55.016,-21.816 86.229,-21.816 2.454,0 4.908,0.047 7.334,0.14 36.056,1.446 69.424,13.427 97.054,32.976 0.569,0.392 1.148,0.793 1.698,1.204 7.82,5.655 15.164,11.925 21.966,18.718 7.904,7.904 15.07,16.526 21.406,25.773 2.556,3.723 4.973,7.558 7.25,11.477 15.499,26.697 24.382,57.723 24.382,90.812 C 53.038,-78.055 32.762,-32.762 0,0"
|
||||||
|
style="fill:#D0BCFF;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
transform="matrix(1.3333333,0,0,-1.3333333,898.49907,660.9888)"
|
||||||
|
clip-path="url(#clipPath21)" />
|
||||||
|
<path
|
||||||
|
id="path24"
|
||||||
|
d="M 0,0 -0.169,-0.292 C 1.43,-0.2 3.091,-0.108 4.798,0 Z"
|
||||||
|
style="fill:#D0BCFF;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
transform="matrix(1.3333333,0,0,-1.3333333,621.73933,661.8696)"
|
||||||
|
clip-path="url(#clipPath25)" />
|
||||||
|
<path
|
||||||
|
id="path26"
|
||||||
|
d="m 0,0 c -6.336,-9.247 -13.502,-17.869 -21.406,-25.773 -6.802,-6.793 -14.146,-13.063 -21.965,-18.718 -0.551,-0.411 -1.129,-0.812 -1.699,-1.204 -27.629,-19.549 -60.998,-31.53 -97.053,-32.976 -33.247,1.129 -64.852,8.762 -93.564,21.676 -13.054,7.082 -25.138,15.723 -36,25.661 -0.672,0.616 -1.343,1.232 -2.006,1.876 -1.288,1.194 -2.566,2.435 -3.816,3.685 -12.831,12.84 -23.748,27.593 -32.277,43.801 -1.092,7.651 -1.941,15.378 -2.445,23.039 -0.102,1.502 -0.186,3.004 -0.261,4.497 0,0 -2.865,29.795 23.944,36.634 26.827,6.84 65.654,19.745 87.722,50.305 0,0 0.327,-8.38 5.506,-15.779 8.034,-11.422 46.674,-100.46 46.674,-100.46 l 6.121,51.135 -13.978,15.079 -4.553,-1.987 15.228,16.544 c 0,0 8.94,4.218 16.554,-0.653 7.605,-4.899 14.146,-16.153 14.146,-16.153 l -5.879,3.892 -4.227,-12.364 c -0.756,-2.184 -0.83,-4.535 -0.233,-6.784 l 16.796,-62.687 c 0,0 -0.243,87.415 -2.781,111.685 0,0 14.221,-10.367 21.621,-14.454 7.381,-4.078 47.215,-20.407 53.738,-22.395 6.504,-1.987 13.222,-5.841 15.882,-11.916 1.026,-2.351 8.594,-26.939 17.486,-56.229 C -1.829,6.028 -0.914,3.023 0,0"
|
||||||
|
style="fill:#D0BCFF;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
transform="matrix(1.3333333,0,0,-1.3333333,927.04,968.0968)"
|
||||||
|
clip-path="url(#clipPath27)" />
|
||||||
|
<path
|
||||||
|
id="path28"
|
||||||
|
d="m 0,0 c 0,0 -3.081,-67.22 -8.64,-90.616 -5.559,-23.397 30.316,0 30.316,0 l 20.9,68.629 z"
|
||||||
|
style="fill:#D0BCFF;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
transform="matrix(1.3333333,0,0,-1.3333333,610.58507,756.01253)"
|
||||||
|
clip-path="url(#clipPath29)" />
|
||||||
|
<path
|
||||||
|
id="path30"
|
||||||
|
d="M 0,0 -0.169,-0.292 C 1.43,-0.2 3.091,-0.108 4.798,0 Z"
|
||||||
|
style="fill:#D0BCFF;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
transform="matrix(1.3333333,0,0,-1.3333333,621.73933,661.8696)"
|
||||||
|
clip-path="url(#clipPath31)" />
|
||||||
|
<path
|
||||||
|
id="path32"
|
||||||
|
d="m 0,0 c 0,0 12.178,7.604 15.029,18.355 0,0 36.913,-9.243 52.904,-26.719 C 66.887,-8.091 29.642,2.031 0,0 m -36.152,-5.643 c -26.791,0.404 -31.781,16.05 -34.086,29.523 -0.511,2.958 -3.148,5.073 -6.13,4.883 l -46.275,-4.764 14.922,7.14 c 3.505,1.687 7.164,3.077 10.895,4.17 3.742,1.093 7.556,1.901 11.429,2.376 4.051,0.499 8.542,1.01 13.46,1.509 0,0 6.19,2.459 7.414,-4.479 1.259,-6.926 0.499,-31.864 28.287,-31.103 27.777,0.76 32.612,19.412 32.612,19.412 0,0 3.458,14.471 9.232,14.257 5.263,-0.202 7.27,-6.142 7.853,-10.479 0.142,-1.045 -0.06,-3.54 0.582,-4.324 -0.939,1.152 -2.162,2.032 -3.564,2.554 C 7.604,26.113 3.065,26.945 2.471,21.658 1.616,13.877 -9.599,-6.059 -36.152,-5.643 m 13.306,48.354 9.528,-2.377 c 0,0 -2.388,-17.5 -11.227,-21.979 -0.25,-0.13 4.194,14.281 1.699,24.356 m 59.022,3.041 3.79,-1.687 c 0,0 2.198,-14.209 -3.79,-20.577 0,0 2.174,12.474 0,22.264 m -187.451,35.63 c 12.225,2.067 24.45,4.229 36.664,6.332 l 36.663,6.392 73.303,12.748 c 2.958,0.522 5.774,-1.462 6.285,-4.408 0.522,-2.947 -1.462,-5.762 -4.42,-6.285 -0.119,-0.024 -0.261,-0.036 -0.38,-0.047 H -3.184 L -114.243,85.029 c -12.344,-1.224 -24.676,-2.495 -37.032,-3.647 M 43.97,16.93 c 3.54,4.693 5.215,23.096 5.215,23.096 l 1.497,2.518 v 8.744 C 29.381,61.327 11.869,50.682 11.869,50.682 l -16.491,0.749 c -3.112,0.142 -7.449,2.637 -10.644,3.433 -4.42,1.093 -8.804,2.068 -13.342,2.566 -16.407,1.735 -32.933,0 -49.091,-2.934 -7.021,-1.271 -13.971,-2.851 -20.957,-4.325 -6.701,-1.425 -12.878,-3.908 -19.151,-6.605 -4.313,-1.842 -8.649,-3.659 -12.641,-6.119 -2.436,-1.496 -4.741,-3.243 -6.737,-5.31 -2.126,-2.21 -3.659,-4.859 -5.476,-7.319 -1.545,-2.091 -4.907,-0.463 -4.147,2.032 0.024,0.059 0.048,0.119 0.06,0.154 0.867,2.044 2.221,4.646 3.659,6.345 3.588,4.241 8.958,8.292 13.686,11.12 10.039,6.071 21.48,9.766 32.767,12.985 24.771,7.057 51.442,8.138 77.009,10.55 14.114,1.331 28.43,2.091 42.473,4.016 12.784,1.734 37.935,4.859 36.176,22.882 -1.71,18.129 -59.355,18.712 -59.355,18.712 0,0 -21.943,45.027 -27.372,50.468 -5.418,5.418 -16.503,18.474 -74.254,4.384 -57.739,-14.078 -55.327,-42.259 -55.327,-42.259 l -2.412,-39.622 c 0,0 -43.198,-11.179 -41.832,-23.321 1.391,-12.142 39.171,-12.819 39.171,-12.819 0,0 8.577,0.439 20.696,1.152 l -5.382,-9.683 c -6.749,-12.13 -6.38,-25.258 -8.851,-38.908 -4.277,-23.631 11.963,-52.702 33.978,-62.147 21.1,-9.053 53.949,-13.782 99.012,6.368 11.085,4.954 20.328,13.282 26.66,23.618 l 0.499,0.796 c 22.728,26.125 80.574,9.386 80.574,9.386 C 81.774,1.699 43.97,16.93 43.97,16.93"
|
||||||
|
style="fill:#D0BCFF;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
transform="matrix(1.3333333,0,0,-1.3333333,819.35627,748.08933)"
|
||||||
|
clip-path="url(#clipPath33)" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 13 KiB |
@@ -1,21 +0,0 @@
|
|||||||
MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2025 Avenge Media LLC
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
@@ -1,54 +1,43 @@
|
|||||||
<div align="center">
|
# DMS Backend & CLI
|
||||||
<a href="https://danklinux.com">
|
|
||||||
<img src="assets/danklogo.svg" alt="Dank Linux" width="200">
|
|
||||||
</a>
|
|
||||||
|
|
||||||
### dms CLI & Backend + dankinstall
|
Go-based backend for DankMaterialShell providing system integration, IPC, and installation tools.
|
||||||
|
|
||||||
[](https://danklinux.com/docs)
|
**See [root README](../README.md) for project overview and installation.**
|
||||||
[](https://github.com/AvengeMedia/DankMaterialShell/backend/releases)
|
|
||||||
[](https://github.com/AvengeMedia/DankMaterialShell/backend/blob/master/LICENSE)
|
|
||||||
|
|
||||||
</div>
|
## Components
|
||||||
|
|
||||||
---
|
**dms CLI**
|
||||||
|
Command-line interface and daemon for shell management and system control.
|
||||||
|
|
||||||
A monorepo for dankinstall and dms (cli+go backend), a modern desktop suite for Wayland compositors.
|
**dankinstall**
|
||||||
|
Distribution-aware installer with TUI for deploying DMS and compositor configurations on Arch, Fedora, Debian, Ubuntu, openSUSE, and Gentoo.
|
||||||
|
|
||||||
**[Full documentation →](https://danklinux.com/docs)**
|
## System Integration
|
||||||
|
|
||||||
- **dms** DankMaterialShell (cli + go backend)
|
**Wayland Protocols**
|
||||||
- The backend side of dms, provides APIs for the desktop and a management CLI.
|
- `wlr-gamma-control-unstable-v1` - Night mode and gamma control
|
||||||
- Shared dbus connection for networking (NetworkManager, iwd), loginctl, accountsservice, cups, and other interfaces.
|
- `dwl-ipc-unstable-v2` - dwl/MangoWC workspace integration
|
||||||
- Implements wayland protocols
|
- `ext-workspace-v1` - Workspace protocol support
|
||||||
- wlr-gamma-control-unstable-v1 (for night mode/gamma control)
|
- `wlr-output-management-unstable-v1` - Display configuration
|
||||||
- dwl-ipc-unstable-v2 (for dwl/MangoWC integration)
|
|
||||||
- ext-workspace-v1 (for workspace integrations)
|
|
||||||
- wlr-output-management-unstable-v1
|
|
||||||
- Exposes a json API over unix socket for interaction with these interfaces
|
|
||||||
- Provides plugin management APIs for the shell
|
|
||||||
- CUPS integration for printer management
|
|
||||||
- ddc/ci protocol implementation
|
|
||||||
- Allows controlling brightness of external monitors, like `ddcutil`
|
|
||||||
- backlight + led control integration
|
|
||||||
- Allows controlling backlight of integrated displays, or LED devices
|
|
||||||
- Uses `login1` when available, else falls back to sysfs writes.
|
|
||||||
- Optionally provides `update` interface - depending on build inputs.
|
|
||||||
- This is intended to be disabled when packaged as part of distribution packages.
|
|
||||||
- **dankinstall** Installs the Dank Linux suite for [niri](https://github.com/YaLTeR/niri) and/or [Hyprland](https://hypr.land)
|
|
||||||
- Features the [DankMaterialShell](https://github.com/AvengeMedia/DankMaterialShell)
|
|
||||||
- Which features a complete desktop experience with wallpapers, auto theming, notifications, lock screen, etc.
|
|
||||||
- Offers up solid out of the box configurations as usable, featured starting points.
|
|
||||||
- Can be installed if you already have niri/Hyprland configured
|
|
||||||
- Will allow you to keep your existing config, or replace with Dank ones (existing configs always backed up though)
|
|
||||||
|
|
||||||
# dms cli & backend
|
**DBus Interfaces**
|
||||||
|
- NetworkManager/iwd - Network management
|
||||||
|
- logind - Session control and inhibit locks
|
||||||
|
- accountsservice - User account information
|
||||||
|
- CUPS - Printer management
|
||||||
|
- Custom IPC via unix socket (JSON API)
|
||||||
|
|
||||||
Written in Go, provides a suite of APIs over unix socket via [godbus](https://github.com/godbus/dbus) and Wayland protocols. All features listed above are exposed over the socket API.
|
**Hardware Control**
|
||||||
|
- DDC/CI protocol - External monitor brightness control (like `ddcutil`)
|
||||||
|
- Backlight control - Internal display brightness via `login1` or sysfs
|
||||||
|
- LED control - Keyboard/device LED management
|
||||||
|
|
||||||
*Run `dms debug-srv` to start the socket service in standalone mode and see available APIs*
|
**Plugin System**
|
||||||
|
- Plugin registry integration
|
||||||
|
- Plugin lifecycle management
|
||||||
|
- Settings persistence
|
||||||
|
|
||||||
**CLI Commands:**
|
## CLI Commands
|
||||||
- `dms run [-d]` - Start shell (optionally as daemon)
|
- `dms run [-d]` - Start shell (optionally as daemon)
|
||||||
- `dms restart` / `dms kill` - Manage running processes
|
- `dms restart` / `dms kill` - Manage running processes
|
||||||
- `dms ipc <command>` - Send IPC commands (toggle launcher, notifications, etc.)
|
- `dms ipc <command>` - Send IPC commands (toggle launcher, notifications, etc.)
|
||||||
@@ -57,254 +46,71 @@ Written in Go, provides a suite of APIs over unix socket via [godbus](https://gi
|
|||||||
- `dms update` - Update DMS and dependencies (disabled in distro packages)
|
- `dms update` - Update DMS and dependencies (disabled in distro packages)
|
||||||
- `dms greeter install` - Install greetd greeter (disabled in distro packages)
|
- `dms greeter install` - Install greetd greeter (disabled in distro packages)
|
||||||
|
|
||||||
## Build & Install
|
## Building
|
||||||
|
|
||||||
To build the dms CLI (Requires Go 1.24+):
|
Requires Go 1.24+
|
||||||
|
|
||||||
### For distribution package maintainers
|
|
||||||
|
|
||||||
This produces a build without the `update` or `greeter` functionality, which are intended for manual installation.
|
|
||||||
|
|
||||||
|
**Development build:**
|
||||||
```bash
|
```bash
|
||||||
make dist
|
make # Build dms CLI
|
||||||
|
make dankinstall # Build installer
|
||||||
|
make test # Run tests
|
||||||
```
|
```
|
||||||
|
|
||||||
Produces `bin/dms-linux-amd64` and `bin/dms-linux-arm64`
|
**Distribution build:**
|
||||||
|
|
||||||
### Manual Install
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Installs to /usr/local/bin/dms
|
make dist # Build without update/greeter features
|
||||||
make && sudo make install
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Wayland Protocol Bindings
|
Produces `bin/dms-linux-amd64` and `bin/dms-linux-arm64`
|
||||||
|
|
||||||
The gamma control functionality uses Wayland protocol bindings generated from the protocol XML definition. To regenerate the Go bindings from `internal/proto/xml/wlr-gamma-control-unstable-v1.xml`:
|
**Installation:**
|
||||||
|
```bash
|
||||||
|
sudo make install # Install to /usr/local/bin/dms
|
||||||
|
```
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
**Regenerating Wayland Protocol Bindings:**
|
||||||
```bash
|
```bash
|
||||||
go install github.com/rajveermalviya/go-wayland/cmd/go-wayland-scanner@latest
|
go install github.com/rajveermalviya/go-wayland/cmd/go-wayland-scanner@latest
|
||||||
go-wayland-scanner -i internal/proto/xml/wlr-gamma-control-unstable-v1.xml \
|
go-wayland-scanner -i internal/proto/xml/wlr-gamma-control-unstable-v1.xml \
|
||||||
-pkg wlr_gamma_control -o internal/proto/wlr_gamma_control/gamma_control.go
|
-pkg wlr_gamma_control -o internal/proto/wlr_gamma_control/gamma_control.go
|
||||||
```
|
```
|
||||||
|
|
||||||
This is only needed if modifying the protocol or updating to a newer version.
|
**Module Structure:**
|
||||||
|
- `cmd/` - Binary entrypoints (dms, dankinstall)
|
||||||
|
- `internal/distros/` - Distribution-specific installation logic
|
||||||
|
- `internal/proto/` - Wayland protocol bindings
|
||||||
|
- `pkg/` - Shared packages
|
||||||
|
|
||||||
# Dank Linux/dankinstall
|
## Installation via dankinstall
|
||||||
|
|
||||||
Installs compositor, dms, terminal, and some optional dependencies - along with a default compositor & terminal configuration.
|
|
||||||
|
|
||||||
## Quickstart
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -fsSL https://install.danklinux.com | sh
|
curl -fsSL https://install.danklinux.com | sh
|
||||||
```
|
```
|
||||||
|
|
||||||
*Alternatively, download the latest [release](https://github.com/AvengeMedia/DankMaterialShell/backend/releases)*
|
|
||||||
|
|
||||||
## Supported Distributions
|
## Supported Distributions
|
||||||
|
|
||||||
**Note on Greeter**: dankinstall does not install a greeter automatically.
|
Arch, Fedora, Debian, Ubuntu, openSUSE, Gentoo (and derivatives)
|
||||||
- To install the dms greeter, run `dms greeter install` after installation.
|
|
||||||
- Then you can disable any existing greeter, if present, and run `sudo systemctl enable --now greetd`
|
|
||||||
|
|
||||||
### Arch Linux & Derivatives
|
**Arch Linux**
|
||||||
|
Uses `pacman` for system packages, builds AUR packages via `makepkg`, no AUR helper dependency.
|
||||||
|
|
||||||
**Supported:** Arch, ArchARM, Archcraft, CachyOS, EndeavourOS, Manjaro
|
**Fedora**
|
||||||
|
|
||||||
**Special Notes:**
|
Uses COPR repositories (`avengemedia/danklinux`, `avengemedia/dms`).
|
||||||
- Uses native `pacman` for system packages
|
|
||||||
- AUR packages are built manually using `makepkg` (no AUR helper dependency)
|
|
||||||
- **Recommendations**
|
|
||||||
- Use NetworkManager to manage networking
|
|
||||||
- If using archinstall, you can choose `minimal` for profile, and `NetworkManager` under networking.
|
|
||||||
|
|
||||||
**Package Sources:**
|
**Ubuntu**
|
||||||
| Package | Source | Notes |
|
Requires PPA support. Most packages built from source (slow first install).
|
||||||
|---------|---------|-------|
|
|
||||||
| System packages (git, jq, etc.) | Official repos | Via `pacman` |
|
|
||||||
| quickshell | AUR | Built from source |
|
|
||||||
| matugen | AUR (`matugen-bin`) | Pre-compiled binary |
|
|
||||||
| dgop | Official repos | Available in Extra repository |
|
|
||||||
| niri | Official repos (`niri`) | Latest niri |
|
|
||||||
| hyprland | Official repos | Available in Extra repository |
|
|
||||||
| DankMaterialShell | Manual | Git clone to `~/.config/quickshell/dms` |
|
|
||||||
|
|
||||||
### Fedora & Derivatives
|
**Debian**
|
||||||
|
Debian 13+ (Trixie). niri only, no Hyprland support. Builds from source.
|
||||||
|
|
||||||
**Supported:** Fedora, Nobara, Fedora Asahi Remix
|
**openSUSE**
|
||||||
|
Most packages available in standard repos. Minimal building required.
|
||||||
|
|
||||||
**Special Notes:**
|
**Gentoo**
|
||||||
- Requires `dnf-plugins-core` for COPR repository support
|
Uses Portage with GURU overlay. Automatically configures USE flags. Variable success depending on system configuration.
|
||||||
- Automatically enables required COPR repositories
|
|
||||||
- All COPR repos are enabled with automatic acceptance
|
|
||||||
- **Editions** dankinstall is tested on "Workstation Edition", but probably works fine on any fedora flavor. Report issues if anything doesn't work.
|
|
||||||
- [Fedora Asahi Remix](https://asahilinux.org/fedora/) hasn't been tested, but presumably it should work fine as all of the dependencies should provide arm64 variants.
|
|
||||||
|
|
||||||
**Package Sources:**
|
See installer output for distribution-specific details during installation.
|
||||||
| Package | Source | Notes |
|
|
||||||
|---------|---------|-------|
|
|
||||||
| System packages | Official repos | Via `dnf` |
|
|
||||||
| quickshell | COPR | `avengemedia/danklinux` |
|
|
||||||
| matugen | COPR | `avengemedia/danklinux` |
|
|
||||||
| dgop | Manual | Built from source with Go |
|
|
||||||
| cliphist | COPR | `avengemedia/danklinux` |
|
|
||||||
| ghostty | COPR | `avengemedia/danklinux` |
|
|
||||||
| hyprland | COPR | `solopasha/hyprland` |
|
|
||||||
| niri | COPR | `yalter/niri` |
|
|
||||||
| DankMaterialShell | COPR | `avengemedia/dms` |
|
|
||||||
|
|
||||||
### Ubuntu
|
|
||||||
|
|
||||||
**Supported:** Ubuntu 25.04+
|
|
||||||
|
|
||||||
**Special Notes:**
|
|
||||||
- Requires PPA support via `software-properties-common`
|
|
||||||
- Go installed from PPA for building manual packages
|
|
||||||
- Most packages require manual building due to limited repository availability
|
|
||||||
- This means the install can be quite slow, as many need to be compiled from source.
|
|
||||||
- niri is packages as a `.deb` so it can be managed via `apt`
|
|
||||||
- Automatic PPA repository addition and package list updates
|
|
||||||
|
|
||||||
**Package Sources:**
|
|
||||||
| Package | Source | Notes |
|
|
||||||
|---------|---------|-------|
|
|
||||||
| System packages | Official repos | Via `apt` |
|
|
||||||
| quickshell | Manual | Built from source with cmake |
|
|
||||||
| matugen | Manual | Built from source with Go |
|
|
||||||
| dgop | Manual | Built from source with Go |
|
|
||||||
| hyprland | PPA | `ppa:cppiber/hyprland` |
|
|
||||||
| hyprpicker | PPA | `ppa:cppiber/hyprland` |
|
|
||||||
| niri | Manual | Built from source with Rust |
|
|
||||||
| Go compiler | PPA | `ppa:longsleep/golang-backports` |
|
|
||||||
| DankMaterialShell | Manual | Git clone to `~/.config/quickshell/dms` |
|
|
||||||
|
|
||||||
### Debian
|
|
||||||
|
|
||||||
**Supported:** Debian 13+ (Trixie)
|
|
||||||
|
|
||||||
**Special Notes:**
|
|
||||||
- **niri only** - Debian does not support Hyprland currently, only niri.
|
|
||||||
- Most packages require manual building due to limited repository availability
|
|
||||||
- This means the install can be quite slow, as many need to be compiled from source.
|
|
||||||
- niri is packages as a `.deb` so it can be managed via `apt`
|
|
||||||
|
|
||||||
**Package Sources:**
|
|
||||||
| Package | Source | Notes |
|
|
||||||
|---------|---------|-------|
|
|
||||||
| System packages | Official repos | Via `apt` |
|
|
||||||
| quickshell | Manual | Built from source with cmake |
|
|
||||||
| matugen | Manual | Built from source with Go |
|
|
||||||
| dgop | Manual | Built from source with Go |
|
|
||||||
| niri | Manual | Built from source with Rust |
|
|
||||||
| DankMaterialShell | Manual | Git clone to `~/.config/quickshell/dms` |
|
|
||||||
|
|
||||||
### openSUSE Tumbleweed
|
|
||||||
|
|
||||||
**Special Notes:**
|
|
||||||
- Most packages available in standard repos, minimal manual building required
|
|
||||||
- quickshell and matugen require building from source
|
|
||||||
|
|
||||||
**Package Sources:**
|
|
||||||
| Package | Source | Notes |
|
|
||||||
|---------|---------|-------|
|
|
||||||
| System packages (git, jq, etc.) | Official repos | Via `zypper` |
|
|
||||||
| hyprland | Official repos | Available in standard repos |
|
|
||||||
| niri | Official repos | Available in standard repos |
|
|
||||||
| xwayland-satellite | Official repos | For niri X11 app support |
|
|
||||||
| ghostty | Official repos | Latest terminal emulator |
|
|
||||||
| kitty, alacritty | Official repos | Alternative terminals |
|
|
||||||
| grim, slurp, hyprpicker | Official repos | Wayland screenshot utilities |
|
|
||||||
| wl-clipboard | Official repos | Via `wl-clipboard` package |
|
|
||||||
| cliphist | Official repos | Clipboard manager |
|
|
||||||
| quickshell | Manual | Built from source with cmake + openSUSE flags |
|
|
||||||
| matugen | Manual | Built from source with Rust |
|
|
||||||
| dgop | Manual | Built from source with Go |
|
|
||||||
| DankMaterialShell | Manual | Git clone to `~/.config/quickshell/dms` |
|
|
||||||
|
|
||||||
### Gentoo
|
|
||||||
|
|
||||||
**Special Notes:**
|
|
||||||
- Gentoo installs are **highly variable** and user-specific, success is not guaranteed.
|
|
||||||
- `dankinstall` is most likely to succeed on a fresh stage3/systemd system
|
|
||||||
- Uses Portage package manager with GURU overlay for additional packages
|
|
||||||
- Automatically configures global USE flags in `/etc/portage/make.conf`
|
|
||||||
- Will create or append to your existing USE flags.
|
|
||||||
- Automatically configures package-specific USE flags in `/etc/portage/package.use/danklinux`
|
|
||||||
- Unmasks packages as-needed with architecture keywords in `/etc/portage/package.accept_keywords/danklinux`
|
|
||||||
- Supports both `amd64` and `arm64` architectures dynamically
|
|
||||||
- If not using bin packages, prepare for long compilation times
|
|
||||||
- **Ghostty** is removed from the options, due to extremely long compilation time of its
|
|
||||||
|
|
||||||
**Package Sources:**
|
|
||||||
| Package | Source | Notes |
|
|
||||||
|---------|---------|-------|
|
|
||||||
| System packages (git, etc.) | Official repos | Via `emerge` |
|
|
||||||
| niri | GURU overlay | With dbus and screencast USE flags |
|
|
||||||
| hyprland | Official repos (GURU for -git) | Depends on variant selection, with X USE flag |
|
|
||||||
| quickshell | GURU overlay | Always uses live ebuild (`**` keywords), full feature set |
|
|
||||||
| matugen | GURU overlay | Color generation tool |
|
|
||||||
| cliphist | GURU overlay | Clipboard manager |
|
|
||||||
| hyprpicker | GURU overlay | Color picker for Hyprland |
|
|
||||||
| xdg-desktop-portal-gtk | Official repos | With wayland and X USE flags |
|
|
||||||
| mate-polkit | Official repos | PolicyKit authentication agent |
|
|
||||||
| accountsservice | Official repos | User account management |
|
|
||||||
| dgop | Manual | Built from source with Go |
|
|
||||||
| xwayland-satellite | Manual | For niri X11 app support |
|
|
||||||
| grimblast | Manual | For Hyprland screenshot utility |
|
|
||||||
| DankMaterialShell | Manual | Git clone to `~/.config/quickshell/dms` |
|
|
||||||
|
|
||||||
**Global USE Flags:**
|
|
||||||
`X dbus udev alsa policykit jpeg png webp gif tiff svg brotli gdbm accessibility gtk qt6 egl gbm`
|
|
||||||
|
|
||||||
**Package-Specific USE Flags:**
|
|
||||||
- `sys-apps/xdg-desktop-portal-gtk`: wayland X
|
|
||||||
- `gui-wm/niri`: dbus screencast
|
|
||||||
- `gui-wm/hyprland`: X
|
|
||||||
- `dev-qt/qtbase`: wayland opengl vulkan widgets
|
|
||||||
- `dev-qt/qtdeclarative`: opengl vulkan
|
|
||||||
- `media-libs/mesa`: opengl vulkan
|
|
||||||
- `gui-apps/quickshell`: breakpad jemalloc sockets wayland layer-shell session-lock toplevel-management screencopy X pipewire tray mpris pam hyprland hyprland-global-shortcuts hyprland-focus-grab i3 i3-ipc bluetooth
|
|
||||||
|
|
||||||
### NixOS (Not supported by Dank Linux, but with Flake)
|
|
||||||
|
|
||||||
NixOS users should use the [dms flake](https://github.com/AvengeMedia/DankMaterialShell/tree/master?tab=readme-ov-file#nixos---via-home-manager)
|
|
||||||
|
|
||||||
## Manual Package Building
|
|
||||||
|
|
||||||
The installer handles manual package building for packages not available in repositories:
|
|
||||||
|
|
||||||
### quickshell (Ubuntu, Debian, openSUSE)
|
|
||||||
- Built from source using cmake
|
|
||||||
- Requires Qt6 development libraries
|
|
||||||
- Automatically handles build dependencies
|
|
||||||
- **openSUSE:** Uses special CFLAGS with rpm optflags and wayland include path
|
|
||||||
|
|
||||||
### matugen (Ubuntu, Debian, Fedora, openSUSE)
|
|
||||||
- Built from Rust source
|
|
||||||
- Requires cargo and rust toolchain
|
|
||||||
- Installed to `/usr/local/bin`
|
|
||||||
|
|
||||||
### dgop (All distros)
|
|
||||||
- Built from Go source
|
|
||||||
- Simple dependency-free build
|
|
||||||
- Installed to `/usr/local/bin`
|
|
||||||
|
|
||||||
### niri (Ubuntu, Debian)
|
|
||||||
- Built from Rust source
|
|
||||||
- Requires cargo and rust toolchain
|
|
||||||
- Complex build with multiple dependencies
|
|
||||||
|
|
||||||
## Commands
|
|
||||||
|
|
||||||
### dankinstall
|
|
||||||
Main installer with interactive TUI for initial setup
|
|
||||||
|
|
||||||
### dms
|
|
||||||
Management interface for DankMaterialShell:
|
|
||||||
- `dms` - Interactive management TUI
|
|
||||||
- `dms run` - Start interactive shell
|
|
||||||
- `dms run -d` - Start shell as daemon
|
|
||||||
- `dms restart` - Restart running DMS shell
|
|
||||||
- `dms kill` - Kill running DMS shell processes
|
|
||||||
- `dms ipc <command>` - Send IPC commands to running shell
|
|
||||||
@@ -392,7 +392,7 @@ func updateDMSBinary() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fmt.Println("Fetching latest release version...")
|
fmt.Println("Fetching latest release version...")
|
||||||
cmd := exec.Command("curl", "-s", "https://api.github.com/repos/AvengeMedia/danklinux/releases/latest")
|
cmd := exec.Command("curl", "-s", "https://api.github.com/repos/AvengeMedia/DankMaterialShell/releases/latest")
|
||||||
output, err := cmd.Output()
|
output, err := cmd.Output()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to fetch latest release: %w", err)
|
return fmt.Errorf("failed to fetch latest release: %w", err)
|
||||||
@@ -421,8 +421,8 @@ func updateDMSBinary() error {
|
|||||||
}
|
}
|
||||||
defer os.RemoveAll(tempDir)
|
defer os.RemoveAll(tempDir)
|
||||||
|
|
||||||
binaryURL := fmt.Sprintf("https://github.com/AvengeMedia/DankMaterialShell/backend/releases/download/%s/dms-%s.gz", version, arch)
|
binaryURL := fmt.Sprintf("https://github.com/AvengeMedia/DankMaterialShell/releases/download/%s/dms-cli-%s.gz", version, arch)
|
||||||
checksumURL := fmt.Sprintf("https://github.com/AvengeMedia/DankMaterialShell/backend/releases/download/%s/dms-%s.gz.sha256", version, arch)
|
checksumURL := fmt.Sprintf("https://github.com/AvengeMedia/DankMaterialShell/releases/download/%s/dms-cli-%s.gz.sha256", version, arch)
|
||||||
|
|
||||||
binaryPath := filepath.Join(tempDir, "dms.gz")
|
binaryPath := filepath.Join(tempDir, "dms.gz")
|
||||||
checksumPath := filepath.Join(tempDir, "dms.gz.sha256")
|
checksumPath := filepath.Join(tempDir, "dms.gz.sha256")
|
||||||
|
|||||||
27
backend/flake.lock
generated
27
backend/flake.lock
generated
@@ -1,27 +0,0 @@
|
|||||||
{
|
|
||||||
"nodes": {
|
|
||||||
"nixpkgs": {
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1760878510,
|
|
||||||
"narHash": "sha256-K5Osef2qexezUfs0alLvZ7nQFTGS9DL2oTVsIXsqLgs=",
|
|
||||||
"owner": "NixOS",
|
|
||||||
"repo": "nixpkgs",
|
|
||||||
"rev": "5e2a59a5b1a82f89f2c7e598302a9cacebb72a67",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "NixOS",
|
|
||||||
"ref": "nixos-unstable",
|
|
||||||
"repo": "nixpkgs",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"root": {
|
|
||||||
"inputs": {
|
|
||||||
"nixpkgs": "nixpkgs"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"root": "root",
|
|
||||||
"version": 7
|
|
||||||
}
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
{
|
|
||||||
description = "DankMaterialShell Command Line Interface";
|
|
||||||
|
|
||||||
inputs = {
|
|
||||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
|
||||||
};
|
|
||||||
|
|
||||||
outputs =
|
|
||||||
{ self, nixpkgs }:
|
|
||||||
let
|
|
||||||
supportedSystems = [
|
|
||||||
"x86_64-linux"
|
|
||||||
"aarch64-linux"
|
|
||||||
];
|
|
||||||
|
|
||||||
forAllSystems =
|
|
||||||
f:
|
|
||||||
builtins.listToAttrs (
|
|
||||||
map (system: {
|
|
||||||
name = system;
|
|
||||||
value = f system;
|
|
||||||
}) supportedSystems
|
|
||||||
);
|
|
||||||
|
|
||||||
in
|
|
||||||
{
|
|
||||||
packages = forAllSystems (
|
|
||||||
system:
|
|
||||||
let
|
|
||||||
pkgs = import nixpkgs { inherit system; };
|
|
||||||
lib = pkgs.lib;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
dms-cli = pkgs.buildGoModule (finalAttrs: {
|
|
||||||
pname = "dms-cli";
|
|
||||||
version = "0.4.3";
|
|
||||||
src = ./.;
|
|
||||||
vendorHash = "sha256-XbCg6qQwD4g4R/hBReLGE4NOq9uv0LBqogmfpBs//Ic=";
|
|
||||||
|
|
||||||
subPackages = [ "cmd/dms" ];
|
|
||||||
|
|
||||||
ldflags = [
|
|
||||||
"-s"
|
|
||||||
"-w"
|
|
||||||
"-X main.Version=${finalAttrs.version}"
|
|
||||||
];
|
|
||||||
|
|
||||||
meta = {
|
|
||||||
description = "DankMaterialShell Command Line Interface";
|
|
||||||
homepage = "https://github.com/AvengeMedia/DankMaterialShell/backend";
|
|
||||||
mainProgram = "dms";
|
|
||||||
license = lib.licenses.mit;
|
|
||||||
platforms = lib.platforms.unix;
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
default = self.packages.${system}.dms-cli;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -36,7 +36,7 @@ case "$ARCH" in
|
|||||||
esac
|
esac
|
||||||
|
|
||||||
# Get the latest release version
|
# Get the latest release version
|
||||||
LATEST_VERSION=$(curl -s https://api.github.com/repos/AvengeMedia/danklinux/releases/latest | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
|
LATEST_VERSION=$(curl -s https://api.github.com/repos/AvengeMedia/DankMaterialShell/releases/latest | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
|
||||||
|
|
||||||
if [ -z "$LATEST_VERSION" ]; then
|
if [ -z "$LATEST_VERSION" ]; then
|
||||||
printf "%bError: Could not fetch latest version%b\n" "$RED" "$NC"
|
printf "%bError: Could not fetch latest version%b\n" "$RED" "$NC"
|
||||||
@@ -51,8 +51,8 @@ cd "$TEMP_DIR" || exit 1
|
|||||||
|
|
||||||
# Download the gzipped binary and its checksum
|
# Download the gzipped binary and its checksum
|
||||||
printf "%bDownloading installer...%b\n" "$GREEN" "$NC"
|
printf "%bDownloading installer...%b\n" "$GREEN" "$NC"
|
||||||
curl -L "https://github.com/AvengeMedia/DankMaterialShell/backend/releases/download/$LATEST_VERSION/dankinstall-$ARCH.gz" -o "installer.gz"
|
curl -L "https://github.com/AvengeMedia/DankMaterialShell/releases/download/$LATEST_VERSION/dankinstall-$ARCH.gz" -o "installer.gz"
|
||||||
curl -L "https://github.com/AvengeMedia/DankMaterialShell/backend/releases/download/$LATEST_VERSION/dankinstall-$ARCH.gz.sha256" -o "expected.sha256"
|
curl -L "https://github.com/AvengeMedia/DankMaterialShell/releases/download/$LATEST_VERSION/dankinstall-$ARCH.gz.sha256" -o "expected.sha256"
|
||||||
|
|
||||||
# Get the expected checksum
|
# Get the expected checksum
|
||||||
EXPECTED_CHECKSUM=$(cat expected.sha256 | awk '{print $1}')
|
EXPECTED_CHECKSUM=$(cat expected.sha256 | awk '{print $1}')
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import (
|
|||||||
|
|
||||||
// LocateDMSConfig searches for DMS installation following XDG Base Directory specification
|
// LocateDMSConfig searches for DMS installation following XDG Base Directory specification
|
||||||
func LocateDMSConfig() (string, error) {
|
func LocateDMSConfig() (string, error) {
|
||||||
var searchPaths []string
|
var primaryPaths []string
|
||||||
|
|
||||||
configHome := os.Getenv("XDG_CONFIG_HOME")
|
configHome := os.Getenv("XDG_CONFIG_HOME")
|
||||||
if configHome == "" {
|
if configHome == "" {
|
||||||
@@ -19,10 +19,10 @@ func LocateDMSConfig() (string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if configHome != "" {
|
if configHome != "" {
|
||||||
searchPaths = append(searchPaths, filepath.Join(configHome, "quickshell", "dms"))
|
primaryPaths = append(primaryPaths, filepath.Join(configHome, "quickshell", "dms"))
|
||||||
}
|
}
|
||||||
|
|
||||||
searchPaths = append(searchPaths, "/usr/share/quickshell/dms")
|
primaryPaths = append(primaryPaths, "/usr/share/quickshell/dms")
|
||||||
|
|
||||||
configDirs := os.Getenv("XDG_CONFIG_DIRS")
|
configDirs := os.Getenv("XDG_CONFIG_DIRS")
|
||||||
if configDirs == "" {
|
if configDirs == "" {
|
||||||
@@ -31,10 +31,17 @@ func LocateDMSConfig() (string, error) {
|
|||||||
|
|
||||||
for _, dir := range strings.Split(configDirs, ":") {
|
for _, dir := range strings.Split(configDirs, ":") {
|
||||||
if dir != "" {
|
if dir != "" {
|
||||||
searchPaths = append(searchPaths, filepath.Join(dir, "quickshell", "dms"))
|
primaryPaths = append(primaryPaths, filepath.Join(dir, "quickshell", "dms"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Build search paths with secondary (monorepo) paths interleaved
|
||||||
|
var searchPaths []string
|
||||||
|
for _, path := range primaryPaths {
|
||||||
|
searchPaths = append(searchPaths, path)
|
||||||
|
searchPaths = append(searchPaths, filepath.Join(path, "quickshell"))
|
||||||
|
}
|
||||||
|
|
||||||
for _, path := range searchPaths {
|
for _, path := range searchPaths {
|
||||||
shellPath := filepath.Join(path, "shell.qml")
|
shellPath := filepath.Join(path, "shell.qml")
|
||||||
if info, err := os.Stat(shellPath); err == nil && !info.IsDir() {
|
if info, err := os.Stat(shellPath); err == nil && !info.IsDir() {
|
||||||
|
|||||||
@@ -587,7 +587,7 @@ func (b *BaseDistribution) installDMSBinary(ctx context.Context, sudoPassword st
|
|||||||
|
|
||||||
// Get latest release version
|
// Get latest release version
|
||||||
latestVersionCmd := exec.CommandContext(ctx, "bash", "-c",
|
latestVersionCmd := exec.CommandContext(ctx, "bash", "-c",
|
||||||
`curl -s https://api.github.com/repos/AvengeMedia/danklinux/releases/latest | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/'`)
|
`curl -s https://api.github.com/repos/AvengeMedia/DankMaterialShell/releases/latest | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/'`)
|
||||||
versionOutput, err := latestVersionCmd.Output()
|
versionOutput, err := latestVersionCmd.Output()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to get latest DMS version: %w", err)
|
return fmt.Errorf("failed to get latest DMS version: %w", err)
|
||||||
@@ -608,7 +608,7 @@ func (b *BaseDistribution) installDMSBinary(ctx context.Context, sudoPassword st
|
|||||||
defer os.RemoveAll(tmpDir)
|
defer os.RemoveAll(tmpDir)
|
||||||
|
|
||||||
// Download the gzipped binary
|
// Download the gzipped binary
|
||||||
downloadURL := fmt.Sprintf("https://github.com/AvengeMedia/DankMaterialShell/backend/releases/download/%s/dms-%s.gz", version, arch)
|
downloadURL := fmt.Sprintf("https://github.com/AvengeMedia/DankMaterialShell/releases/download/%s/dms-cli-%s.gz", version, arch)
|
||||||
gzPath := filepath.Join(tmpDir, "dms.gz")
|
gzPath := filepath.Join(tmpDir, "dms.gz")
|
||||||
|
|
||||||
downloadCmd := exec.CommandContext(ctx, "curl", "-L", downloadURL, "-o", gzPath)
|
downloadCmd := exec.CommandContext(ctx, "curl", "-L", downloadURL, "-o", gzPath)
|
||||||
|
|||||||
@@ -659,7 +659,7 @@ func (m *ManualPackageInstaller) installDankMaterialShell(ctx context.Context, s
|
|||||||
Progress: 0.90,
|
Progress: 0.90,
|
||||||
Step: "Cloning DankMaterialShell config...",
|
Step: "Cloning DankMaterialShell config...",
|
||||||
IsComplete: false,
|
IsComplete: false,
|
||||||
CommandInfo: "git clone https://github.com/AvengeMedia/DankMaterialShell.git ~/.config/quickshell/dms",
|
CommandInfo: "git clone https://github.com/AvengeMedia/DankMaterialShell.git",
|
||||||
}
|
}
|
||||||
|
|
||||||
configDir := filepath.Dir(dmsPath)
|
configDir := filepath.Dir(dmsPath)
|
||||||
@@ -667,19 +667,22 @@ func (m *ManualPackageInstaller) installDankMaterialShell(ctx context.Context, s
|
|||||||
return fmt.Errorf("failed to create quickshell config directory: %w", err)
|
return fmt.Errorf("failed to create quickshell config directory: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tmpRepoPath := filepath.Join(os.TempDir(), "dms-clone-tmp")
|
||||||
|
defer os.RemoveAll(tmpRepoPath)
|
||||||
|
|
||||||
cloneCmd := exec.CommandContext(ctx, "git", "clone",
|
cloneCmd := exec.CommandContext(ctx, "git", "clone",
|
||||||
"https://github.com/AvengeMedia/DankMaterialShell.git", dmsPath)
|
"https://github.com/AvengeMedia/DankMaterialShell.git", tmpRepoPath)
|
||||||
if err := cloneCmd.Run(); err != nil {
|
if err := cloneCmd.Run(); err != nil {
|
||||||
return fmt.Errorf("failed to clone DankMaterialShell: %w", err)
|
return fmt.Errorf("failed to clone DankMaterialShell: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !forceDMSGit {
|
if !forceDMSGit {
|
||||||
fetchCmd := exec.CommandContext(ctx, "git", "-C", dmsPath, "fetch", "--tags")
|
fetchCmd := exec.CommandContext(ctx, "git", "-C", tmpRepoPath, "fetch", "--tags")
|
||||||
if err := fetchCmd.Run(); err == nil {
|
if err := fetchCmd.Run(); err == nil {
|
||||||
tagCmd := exec.CommandContext(ctx, "git", "-C", dmsPath, "describe", "--tags", "--abbrev=0", "origin/master")
|
tagCmd := exec.CommandContext(ctx, "git", "-C", tmpRepoPath, "describe", "--tags", "--abbrev=0", "origin/master")
|
||||||
if tagOutput, err := tagCmd.Output(); err == nil {
|
if tagOutput, err := tagCmd.Output(); err == nil {
|
||||||
latestTag := strings.TrimSpace(string(tagOutput))
|
latestTag := strings.TrimSpace(string(tagOutput))
|
||||||
checkoutCmd := exec.CommandContext(ctx, "git", "-C", dmsPath, "checkout", latestTag)
|
checkoutCmd := exec.CommandContext(ctx, "git", "-C", tmpRepoPath, "checkout", latestTag)
|
||||||
if err := checkoutCmd.Run(); err == nil {
|
if err := checkoutCmd.Run(); err == nil {
|
||||||
m.log(fmt.Sprintf("Checked out latest tag: %s", latestTag))
|
m.log(fmt.Sprintf("Checked out latest tag: %s", latestTag))
|
||||||
}
|
}
|
||||||
@@ -687,6 +690,12 @@ func (m *ManualPackageInstaller) installDankMaterialShell(ctx context.Context, s
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
srcPath := filepath.Join(tmpRepoPath, "quickshell")
|
||||||
|
cpCmd := exec.CommandContext(ctx, "cp", "-r", srcPath, dmsPath)
|
||||||
|
if err := cpCmd.Run(); err != nil {
|
||||||
|
return fmt.Errorf("failed to copy quickshell directory: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
m.log("DankMaterialShell config cloned successfully")
|
m.log("DankMaterialShell config cloned successfully")
|
||||||
} else {
|
} else {
|
||||||
// Config exists, update it
|
// Config exists, update it
|
||||||
@@ -695,15 +704,41 @@ func (m *ManualPackageInstaller) installDankMaterialShell(ctx context.Context, s
|
|||||||
Progress: 0.90,
|
Progress: 0.90,
|
||||||
Step: "Updating DankMaterialShell config...",
|
Step: "Updating DankMaterialShell config...",
|
||||||
IsComplete: false,
|
IsComplete: false,
|
||||||
CommandInfo: "git pull in ~/.config/quickshell/dms",
|
CommandInfo: "Updating ~/.config/quickshell/dms",
|
||||||
}
|
}
|
||||||
|
|
||||||
pullCmd := exec.CommandContext(ctx, "git", "pull")
|
tmpRepoPath := filepath.Join(os.TempDir(), "dms-update-tmp")
|
||||||
pullCmd.Dir = dmsPath
|
defer os.RemoveAll(tmpRepoPath)
|
||||||
if err := pullCmd.Run(); err != nil {
|
|
||||||
m.logError("Failed to update DankMaterialShell config", err)
|
cloneCmd := exec.CommandContext(ctx, "git", "clone",
|
||||||
|
"https://github.com/AvengeMedia/DankMaterialShell.git", tmpRepoPath)
|
||||||
|
if err := cloneCmd.Run(); err != nil {
|
||||||
|
m.logError("Failed to clone DankMaterialShell for update", err)
|
||||||
} else {
|
} else {
|
||||||
m.log("DankMaterialShell config updated successfully")
|
if !forceDMSGit {
|
||||||
|
fetchCmd := exec.CommandContext(ctx, "git", "-C", tmpRepoPath, "fetch", "--tags")
|
||||||
|
if err := fetchCmd.Run(); err == nil {
|
||||||
|
tagCmd := exec.CommandContext(ctx, "git", "-C", tmpRepoPath, "describe", "--tags", "--abbrev=0", "origin/master")
|
||||||
|
if tagOutput, err := tagCmd.Output(); err == nil {
|
||||||
|
latestTag := strings.TrimSpace(string(tagOutput))
|
||||||
|
checkoutCmd := exec.CommandContext(ctx, "git", "-C", tmpRepoPath, "checkout", latestTag)
|
||||||
|
_ = checkoutCmd.Run()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
srcPath := filepath.Join(tmpRepoPath, "quickshell")
|
||||||
|
rsyncCmd := exec.CommandContext(ctx, "rsync", "-a", "--delete", srcPath+"/", dmsPath+"/")
|
||||||
|
if err := rsyncCmd.Run(); err != nil {
|
||||||
|
cpCmd := exec.CommandContext(ctx, "cp", "-rf", srcPath+"/.", dmsPath+"/")
|
||||||
|
if err := cpCmd.Run(); err != nil {
|
||||||
|
m.logError("Failed to update DankMaterialShell config", err)
|
||||||
|
} else {
|
||||||
|
m.log("DankMaterialShell config updated successfully")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
m.log("DankMaterialShell config updated successfully")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ func (m Model) viewWelcome() string {
|
|||||||
case "nixos":
|
case "nixos":
|
||||||
errorMsg = "NixOS is currently not supported, but there is a DankMaterialShell flake available."
|
errorMsg = "NixOS is currently not supported, but there is a DankMaterialShell flake available."
|
||||||
default:
|
default:
|
||||||
errorMsg = fmt.Sprintf("%s is not supported.\nFeel free to request on https://github.com/AvengeMedia/DankMaterialShell/backend", m.osInfo.PrettyName)
|
errorMsg = fmt.Sprintf("%s is not supported.\nFeel free to request on https://github.com/AvengeMedia/DankMaterialShell", m.osInfo.PrettyName)
|
||||||
}
|
}
|
||||||
|
|
||||||
errorMsgStyled := lipgloss.NewStyle().
|
errorMsgStyled := lipgloss.NewStyle().
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ func GetLatestDMSVersion() (string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Add timeout to prevent hanging when GitHub is down
|
// Add timeout to prevent hanging when GitHub is down
|
||||||
cmd := exec.Command("curl", "-s", "--max-time", "5", "https://api.github.com/repos/AvengeMedia/danklinux/releases/latest")
|
cmd := exec.Command("curl", "-s", "--max-time", "5", "https://api.github.com/repos/AvengeMedia/DankMaterialShell/releases/latest")
|
||||||
output, err := cmd.Output()
|
output, err := cmd.Output()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("failed to fetch latest release: %w", err)
|
return "", fmt.Errorf("failed to fetch latest release: %w", err)
|
||||||
|
|||||||
@@ -44,18 +44,18 @@ authentication, and dynamic theming.
|
|||||||
{{{ git_repo_setup_macro }}}
|
{{{ git_repo_setup_macro }}}
|
||||||
|
|
||||||
%install
|
%install
|
||||||
# Install greeter files to shared data location
|
# Install greeter files to shared data location (from quickshell/ subdirectory)
|
||||||
install -dm755 %{buildroot}%{_datadir}/quickshell/dms-greeter
|
install -dm755 %{buildroot}%{_datadir}/quickshell/dms-greeter
|
||||||
cp -r * %{buildroot}%{_datadir}/quickshell/dms-greeter/
|
cp -r %{_builddir}/%{name}-%{version}/quickshell/* %{buildroot}%{_datadir}/quickshell/dms-greeter/
|
||||||
|
|
||||||
# Install launcher script
|
# Install launcher script
|
||||||
install -Dm755 Modules/Greetd/assets/dms-greeter %{buildroot}%{_bindir}/dms-greeter
|
install -Dm755 %{_builddir}/%{name}-%{version}/quickshell/Modules/Greetd/assets/dms-greeter %{buildroot}%{_bindir}/dms-greeter
|
||||||
|
|
||||||
# Install documentation
|
# Install documentation
|
||||||
install -Dm644 Modules/Greetd/README.md %{buildroot}%{_docdir}/dms-greeter/README.md
|
install -Dm644 %{_builddir}/%{name}-%{version}/quickshell/Modules/Greetd/README.md %{buildroot}%{_docdir}/dms-greeter/README.md
|
||||||
|
|
||||||
# Create cache directory for greeter data
|
# Create cache directory for greeter data
|
||||||
install -Dpm0644 ./systemd/tmpfiles-dms-greeter.conf %{buildroot}%{_tmpfilesdir}/dms-greeter.conf
|
install -Dpm0644 %{_builddir}/%{name}-%{version}/quickshell/systemd/tmpfiles-dms-greeter.conf %{buildroot}%{_tmpfilesdir}/dms-greeter.conf
|
||||||
|
|
||||||
# Create greeter home directory
|
# Create greeter home directory
|
||||||
install -dm755 %{buildroot}%{_sharedstatedir}/greeter
|
install -dm755 %{buildroot}%{_sharedstatedir}/greeter
|
||||||
@@ -67,9 +67,7 @@ install -dm755 %{buildroot}%{_sharedstatedir}/greeter
|
|||||||
rm -rf %{buildroot}%{_datadir}/quickshell/dms-greeter/.git*
|
rm -rf %{buildroot}%{_datadir}/quickshell/dms-greeter/.git*
|
||||||
rm -f %{buildroot}%{_datadir}/quickshell/dms-greeter/.gitignore
|
rm -f %{buildroot}%{_datadir}/quickshell/dms-greeter/.gitignore
|
||||||
rm -rf %{buildroot}%{_datadir}/quickshell/dms-greeter/.github
|
rm -rf %{buildroot}%{_datadir}/quickshell/dms-greeter/.github
|
||||||
rm -f %{buildroot}%{_datadir}/quickshell/dms-greeter/*.spec
|
rm -rf %{buildroot}%{_datadir}/quickshell/dms-greeter/distro
|
||||||
rm -f %{buildroot}%{_datadir}/quickshell/dms-greeter/dms.spec
|
|
||||||
rm -f %{buildroot}%{_datadir}/quickshell/dms-greeter/dms-greeter.spec
|
|
||||||
|
|
||||||
%posttrans
|
%posttrans
|
||||||
# Clean up old installation path from previous versions (only if empty)
|
# Clean up old installation path from previous versions (only if empty)
|
||||||
@@ -81,7 +79,7 @@ if [ -d "%{_sysconfdir}/xdg/quickshell/dms-greeter" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
%files
|
%files
|
||||||
%license LICENSE
|
%license %{_builddir}/%{name}-%{version}/LICENSE
|
||||||
%doc %{_docdir}/dms-greeter/README.md
|
%doc %{_docdir}/dms-greeter/README.md
|
||||||
%{_bindir}/dms-greeter
|
%{_bindir}/dms-greeter
|
||||||
%{_datadir}/quickshell/dms-greeter/
|
%{_datadir}/quickshell/dms-greeter/
|
||||||
@@ -15,9 +15,6 @@ URL: https://github.com/AvengeMedia/DankMaterialShell
|
|||||||
VCS: {{{ git_repo_vcs }}}
|
VCS: {{{ git_repo_vcs }}}
|
||||||
Source0: {{{ git_repo_pack }}}
|
Source0: {{{ git_repo_pack }}}
|
||||||
|
|
||||||
# DMS CLI from danklinux latest commit
|
|
||||||
Source1: https://github.com/AvengeMedia/danklinux/archive/refs/heads/master.tar.gz
|
|
||||||
|
|
||||||
BuildRequires: git-core
|
BuildRequires: git-core
|
||||||
BuildRequires: rpkg
|
BuildRequires: rpkg
|
||||||
BuildRequires: gzip
|
BuildRequires: gzip
|
||||||
@@ -58,7 +55,7 @@ lock screen, and comprehensive plugin system.
|
|||||||
%package -n dms-cli
|
%package -n dms-cli
|
||||||
Summary: DankMaterialShell CLI tool
|
Summary: DankMaterialShell CLI tool
|
||||||
License: MIT
|
License: MIT
|
||||||
URL: https://github.com/AvengeMedia/danklinux
|
URL: https://github.com/AvengeMedia/DankMaterialShell
|
||||||
|
|
||||||
%description -n dms-cli
|
%description -n dms-cli
|
||||||
Command-line interface for DankMaterialShell configuration and management.
|
Command-line interface for DankMaterialShell configuration and management.
|
||||||
@@ -78,9 +75,6 @@ used standalone. This package always includes the latest stable dgop release.
|
|||||||
%prep
|
%prep
|
||||||
{{{ git_repo_setup_macro }}}
|
{{{ git_repo_setup_macro }}}
|
||||||
|
|
||||||
# Extract DankLinux source
|
|
||||||
tar -xzf %{SOURCE1} -C %{_builddir}
|
|
||||||
|
|
||||||
# Download and extract DGOP binary for target architecture
|
# Download and extract DGOP binary for target architecture
|
||||||
case "%{_arch}" in
|
case "%{_arch}" in
|
||||||
x86_64)
|
x86_64)
|
||||||
@@ -103,8 +97,8 @@ gunzip -c %{_builddir}/dgop.gz > %{_builddir}/dgop
|
|||||||
chmod +x %{_builddir}/dgop
|
chmod +x %{_builddir}/dgop
|
||||||
|
|
||||||
%build
|
%build
|
||||||
# Build DMS CLI from source
|
# Build DMS CLI from source (backend/ subdirectory in monorepo)
|
||||||
cd %{_builddir}/danklinux-master
|
cd %{_builddir}/%{name}-%{version}/backend
|
||||||
make dist
|
make dist
|
||||||
|
|
||||||
%install
|
%install
|
||||||
@@ -122,31 +116,31 @@ case "%{_arch}" in
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
install -Dm755 %{_builddir}/danklinux-master/bin/${DMS_BINARY} %{buildroot}%{_bindir}/dms
|
install -Dm755 %{_builddir}/%{name}-%{version}/backend/bin/${DMS_BINARY} %{buildroot}%{_bindir}/dms
|
||||||
|
|
||||||
# Shell completions
|
# Shell completions
|
||||||
install -d %{buildroot}%{_datadir}/bash-completion/completions
|
install -d %{buildroot}%{_datadir}/bash-completion/completions
|
||||||
install -d %{buildroot}%{_datadir}/zsh/site-functions
|
install -d %{buildroot}%{_datadir}/zsh/site-functions
|
||||||
install -d %{buildroot}%{_datadir}/fish/vendor_completions.d
|
install -d %{buildroot}%{_datadir}/fish/vendor_completions.d
|
||||||
%{_builddir}/danklinux-master/bin/${DMS_BINARY} completion bash > %{buildroot}%{_datadir}/bash-completion/completions/dms || :
|
%{_builddir}/%{name}-%{version}/backend/bin/${DMS_BINARY} completion bash > %{buildroot}%{_datadir}/bash-completion/completions/dms || :
|
||||||
%{_builddir}/danklinux-master/bin/${DMS_BINARY} completion zsh > %{buildroot}%{_datadir}/zsh/site-functions/_dms || :
|
%{_builddir}/%{name}-%{version}/backend/bin/${DMS_BINARY} completion zsh > %{buildroot}%{_datadir}/zsh/site-functions/_dms || :
|
||||||
%{_builddir}/danklinux-master/bin/${DMS_BINARY} completion fish > %{buildroot}%{_datadir}/fish/vendor_completions.d/dms.fish || :
|
%{_builddir}/%{name}-%{version}/backend/bin/${DMS_BINARY} completion fish > %{buildroot}%{_datadir}/fish/vendor_completions.d/dms.fish || :
|
||||||
|
|
||||||
# Install dgop binary
|
# Install dgop binary
|
||||||
install -Dm755 %{_builddir}/dgop %{buildroot}%{_bindir}/dgop
|
install -Dm755 %{_builddir}/dgop %{buildroot}%{_bindir}/dgop
|
||||||
|
|
||||||
# Install systemd user service
|
# Install systemd user service (from quickshell/ subdirectory)
|
||||||
install -Dm644 assets/systemd/dms.service %{buildroot}%{_userunitdir}/dms.service
|
install -Dm644 %{_builddir}/%{name}-%{version}/quickshell/assets/systemd/dms.service %{buildroot}%{_userunitdir}/dms.service
|
||||||
|
|
||||||
# Install shell files to shared data location
|
# Install shell files to shared data location (from quickshell/ subdirectory)
|
||||||
install -dm755 %{buildroot}%{_datadir}/quickshell/dms
|
install -dm755 %{buildroot}%{_datadir}/quickshell/dms
|
||||||
cp -r * %{buildroot}%{_datadir}/quickshell/dms/
|
cp -r %{_builddir}/%{name}-%{version}/quickshell/* %{buildroot}%{_datadir}/quickshell/dms/
|
||||||
|
|
||||||
# Remove build files
|
# Remove build files
|
||||||
rm -rf %{buildroot}%{_datadir}/quickshell/dms/.git*
|
rm -rf %{buildroot}%{_datadir}/quickshell/dms/.git*
|
||||||
rm -f %{buildroot}%{_datadir}/quickshell/dms/.gitignore
|
rm -f %{buildroot}%{_datadir}/quickshell/dms/.gitignore
|
||||||
rm -rf %{buildroot}%{_datadir}/quickshell/dms/.github
|
rm -rf %{buildroot}%{_datadir}/quickshell/dms/.github
|
||||||
rm -f %{buildroot}%{_datadir}/quickshell/dms/*.spec
|
rm -rf %{buildroot}%{_datadir}/quickshell/dms/distro
|
||||||
|
|
||||||
%posttrans
|
%posttrans
|
||||||
# Clean up old installation path from previous versions (only if empty)
|
# Clean up old installation path from previous versions (only if empty)
|
||||||
@@ -163,8 +157,9 @@ if [ "$1" -ge 2 ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
%files
|
%files
|
||||||
%license LICENSE
|
%license %{_builddir}/%{name}-%{version}/LICENSE
|
||||||
%doc README.md CONTRIBUTING.md
|
%doc %{_builddir}/%{name}-%{version}/quickshell/README.md
|
||||||
|
%doc %{_builddir}/%{name}-%{version}/quickshell/CONTRIBUTING.md
|
||||||
%{_datadir}/quickshell/dms/
|
%{_datadir}/quickshell/dms/
|
||||||
%{_userunitdir}/dms.service
|
%{_userunitdir}/dms.service
|
||||||
|
|
||||||
0
quickshell/flake.lock → flake.lock
generated
0
quickshell/flake.lock → flake.lock
generated
@@ -41,7 +41,7 @@
|
|||||||
];
|
];
|
||||||
in pkgs.stdenvNoCC.mkDerivation {
|
in pkgs.stdenvNoCC.mkDerivation {
|
||||||
pname = "dankMaterialShell";
|
pname = "dankMaterialShell";
|
||||||
version = pkgs.lib.removePrefix "v" (pkgs.lib.trim (builtins.readFile ./VERSION))
|
version = pkgs.lib.removePrefix "v" (pkgs.lib.trim (builtins.readFile ./quickshell/VERSION))
|
||||||
+ "+date=" + mkDate (self.lastModifiedDate or "19700101")
|
+ "+date=" + mkDate (self.lastModifiedDate or "19700101")
|
||||||
+ "_" + (self.shortRev or "dirty");
|
+ "_" + (self.shortRev or "dirty");
|
||||||
src = pkgs.lib.cleanSourceWith {
|
src = pkgs.lib.cleanSourceWith {
|
||||||
@@ -1,219 +1,238 @@
|
|||||||
# DankMaterialShell (dms)
|
# DMS Quickshell Interface
|
||||||
|
|
||||||
<div align="center">
|
QML-based desktop shell interface for DankMaterialShell providing panels, widgets, and overlays.
|
||||||
<a href="https://danklinux.com">
|
|
||||||
<img src="assets/danklogo2.svg" alt="DankMaterialShell Logo" width="200">
|
|
||||||
</a>
|
|
||||||
|
|
||||||
### A modern Wayland desktop shell
|
**See [root README](../README.md) for project overview and installation.**
|
||||||
|
|
||||||
Built with [Quickshell](https://quickshell.org/) and [Go](https://go.dev/)
|
## Architecture
|
||||||
|
|
||||||
[](https://danklinux.com/docs)
|
**Modular QML Structure**
|
||||||
[](https://github.com/AvengeMedia/DankMaterialShell/stargazers)
|
- `Modules/` - UI components (panels, widgets, overlays)
|
||||||
[](https://github.com/AvengeMedia/DankMaterialShell/blob/master/LICENSE)
|
- `Services/` - System integration singletons (audio, network, bluetooth)
|
||||||
[](https://github.com/AvengeMedia/DankMaterialShell/releases)
|
- `Widgets/` - Reusable UI controls
|
||||||
[](https://aur.archlinux.org/packages/dms-shell-bin)
|
- `Common/` - Shared resources and themes
|
||||||
[)](https://aur.archlinux.org/packages/dms-shell-git)
|
|
||||||
[](https://ko-fi.com/avengemediallc)
|
|
||||||
|
|
||||||
</div>
|
**Technology Stack**
|
||||||
|
- [Quickshell](https://quickshell.org/) - QML-based shell framework
|
||||||
|
- Qt/QtQuick - UI rendering and controls
|
||||||
|
- Material Design 3 - Design system and theming
|
||||||
|
|
||||||
DankMaterialShell is a complete desktop shell for [niri](https://github.com/YaLTeR/niri), [Hyprland](https://hypr.land), [MangoWC](https://github.com/DreamMaoMao/mangowc), [Sway](https://swaywm.org), and other Wayland compositors. It replaces waybar, swaylock, swayidle, mako, fuzzel, polkit, and everything else you'd normally stitch together to make a desktop - all in one cohesive package with a gorgeous interface.
|
## Development
|
||||||
|
|
||||||
|
**Run the shell:**
|
||||||
|
```bash
|
||||||
|
quickshell -p quickshell/
|
||||||
|
```
|
||||||
|
|
||||||
|
**Code formatting:**
|
||||||
|
```bash
|
||||||
|
qmlfmt -t 4 -i 4 -b 250 -w path/to/file.qml
|
||||||
|
qmllint **/*.qml
|
||||||
|
```
|
||||||
|
|
||||||
## Components
|
## Components
|
||||||
|
|
||||||
DankMaterialShell combines two main 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
|
||||||
|
|
||||||
- **[QML/UI Layer](https://github.com/AvengeMedia/DankMaterialShell)** (this repo) - All the visual components, widgets, and shell interface built with Quickshell
|
**System Controls**
|
||||||
- **[Go Backend](https://github.com/AvengeMedia/danklinux)** - System integration, IPC, process management, and core services
|
- `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
|
||||||
|
|
||||||
## See it in Action
|
**Utilities**
|
||||||
|
- `Modules/ProcessList/` - System monitoring and process management
|
||||||
|
- `Modules/Calendar/` - Calendar widget with event sync
|
||||||
|
- `Modules/Weather/` - Weather display
|
||||||
|
|
||||||
<div align="center">
|
## Services
|
||||||
|
|
||||||
https://github.com/user-attachments/assets/1200a739-7770-4601-8b85-695ca527819a
|
Singletons providing system integration:
|
||||||
|
|
||||||
</div>
|
**Media & Audio**
|
||||||
|
- `AudioService` - PipeWire/PulseAudio volume and device control
|
||||||
|
- `MprisController` - Media player integration
|
||||||
|
|
||||||
<details><summary><strong>More Screenshots</strong></summary>
|
**Network**
|
||||||
|
- `NetworkService` - NetworkManager WiFi control
|
||||||
|
- `BluetoothService` - BlueZ Bluetooth management
|
||||||
|
|
||||||
<div align="center">
|
**Display**
|
||||||
|
- `DisplayService` - Brightness control and night mode
|
||||||
|
- `WallpaperService` - Wallpaper management and effects
|
||||||
|
|
||||||
<img src="https://github.com/user-attachments/assets/203a9678-c3b7-4720-bb97-853a511ac5c8" width="600" alt="Desktop" />
|
**System**
|
||||||
|
- `BatteryService` - Battery status and power profiles
|
||||||
|
- `IdleService` - Idle detection and inhibit locks
|
||||||
|
- `ClipboardService` - Clipboard history with images
|
||||||
|
- `DgopService` - System metrics (CPU, RAM, GPU)
|
||||||
|
|
||||||
<img src="https://github.com/user-attachments/assets/a937cf35-a43b-4558-8c39-5694ff5fcac4" width="600" alt="Dashboard" />
|
**Integration**
|
||||||
|
- `NiriService` - Niri workspace integration
|
||||||
|
- `HyprlandService` - Hyprland workspace integration
|
||||||
|
- `PluginService` - Plugin discovery and lifecycle
|
||||||
|
|
||||||
<img src="https://github.com/user-attachments/assets/2da00ea1-8921-4473-a2a9-44a44535a822" width="450" alt="Launcher" />
|
## Widgets
|
||||||
|
|
||||||
<img src="https://github.com/user-attachments/assets/732c30de-5f4a-4a2b-a995-c8ab656cecd5" width="600" alt="Control Center" />
|
Reusable Material Design 3 components in `Widgets/`:
|
||||||
|
|
||||||
</div>
|
- `DankIcon` - Icon component with Material font
|
||||||
|
- `DankSlider` - Enhanced slider with animations
|
||||||
</details>
|
- `DankToggle` - Toggle switch component
|
||||||
|
- `DankTabBar` - Tab bar implementation
|
||||||
---
|
- `DankGridView` - Grid layout with adaptive columns
|
||||||
|
- `DankListView` - Scrollable list view
|
||||||
## Quick Install
|
- `DankTextField` - Text input with validation
|
||||||
|
- `DankDropdown` - Dropdown selection
|
||||||
```bash
|
- `DankPopout` - Base for overlay components
|
||||||
curl -fsSL https://install.danklinux.com | sh
|
- `StateLayer` - Material interaction states
|
||||||
```
|
|
||||||
|
|
||||||
That's it. One command installs dms and all dependencies on Arch, Fedora, Debian, Ubuntu, openSUSE, or Gentoo.
|
|
||||||
|
|
||||||
**[Manual Installation Guide →](https://danklinux.com/docs/dankmaterialshell/installation)**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## What You Get
|
|
||||||
|
|
||||||
**Dynamic Theming**
|
|
||||||
Wallpaper-based color schemes that automatically theme GTK, Qt, terminals, editors (like vscode, vscodium), and more with [matugen](https://github.com/InioX/matugen) and [dank16](https://github.com/AvengeMedia/danklinux/blob/master/internal/dank16/dank16.go).
|
|
||||||
|
|
||||||
**System Monitoring**
|
|
||||||
Real-time CPU, RAM, GPU metrics and temps with [dgop](https://github.com/AvengeMedia/dgop). Full process list with search and management.
|
|
||||||
|
|
||||||
**Powerful Launcher**
|
|
||||||
Spotlight-style search for apps, files (via [dsearch](https://github.com/AvengeMedia/danksearch)), emojis, running windows, calculator, commands - extensible with plugins.
|
|
||||||
|
|
||||||
**Control Center**
|
|
||||||
Network, Bluetooth, audio devices, display settings, night mode - all in one clean interface.
|
|
||||||
|
|
||||||
**Smart Notifications**
|
|
||||||
Notification center with grouping, rich text support, and keyboard navigation.
|
|
||||||
|
|
||||||
**Media Integration**
|
|
||||||
MPRIS player controls, calendar sync, weather widgets, clipboard history with image previews.
|
|
||||||
|
|
||||||
**Complete Session Management**
|
|
||||||
Lock screen, idle detection, auto-lock/suspend with separate AC/battery settings, greeter support.
|
|
||||||
|
|
||||||
**Plugin System**
|
|
||||||
Endless customization with the [plugin registry](https://plugins.danklinux.com).
|
|
||||||
|
|
||||||
**TL;DR** - One shell replaces waybar, swaylock, swayidle, mako, fuzzel, polkit and everything else you normally piece together to create a linux desktop.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Supported Compositors
|
|
||||||
|
|
||||||
DankMaterialShell works best with **[niri](https://github.com/YaLTeR/niri)**, **[Hyprland](https://hyprland.org/)**, **[sway](https://swaywm.org/)**, and **[dwl/MangoWC](https://github.com/DreamMaoMao/mangowc)**. - with full workspace switching, overview integration, and monitor management.
|
|
||||||
|
|
||||||
Other Wayland compositors work too, just with a reduced feature set.
|
|
||||||
|
|
||||||
**[Compositor configuration guide →](https://danklinux.com/docs/dankmaterialshell/compositors)**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Keybinds & IPC
|
|
||||||
|
|
||||||
Control everything from the command line or keybinds:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
dms ipc call spotlight toggle
|
|
||||||
dms ipc call audio setvolume 50
|
|
||||||
dms ipc call wallpaper set /path/to/image.jpg
|
|
||||||
dms ipc call theme toggle
|
|
||||||
```
|
|
||||||
|
|
||||||
**[Full keybind and IPC documentation →](https://danklinux.com/docs/dankmaterialshell/keybinds-ipc)**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Theming
|
## Theming
|
||||||
|
|
||||||
DankMaterialShell automatically generates color schemes from your wallpaper or theme and applies them to GTK, Qt, terminals, and more.
|
**Dynamic Color Schemes**
|
||||||
|
|
||||||
DMS is not opinionated or forcing these themes - they are created as optional themes you can enable. You can refer to the documentation if you want to use them:
|
Wallpaper-based theming using [matugen](https://github.com/InioX/matugen):
|
||||||
|
|
||||||
**Application theming:** [GTK, Qt, Firefox, terminals, vscode+vscodium →](https://danklinux.com/docs/dankmaterialshell/application-themes)
|
```qml
|
||||||
|
import qs.Common
|
||||||
|
|
||||||
**Custom themes:** [Create your own color schemes →](https://danklinux.com/docs/dankmaterialshell/custom-themes)
|
Rectangle {
|
||||||
|
color: Theme.container
|
||||||
---
|
border.color: Theme.outline
|
||||||
|
}
|
||||||
## Plugins
|
|
||||||
|
|
||||||
Extend dms with the plugin system. Browse community plugins at [plugins.danklinux.com](https://plugins.danklinux.com).
|
|
||||||
|
|
||||||
**[Plugin development guide →](https://danklinux.com/docs/dankmaterialshell/plugins-overview)**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Documentation
|
|
||||||
|
|
||||||
**Website:** [danklinux.com](https://danklinux.com)
|
|
||||||
|
|
||||||
**Docs:** [danklinux.com/docs](https://danklinux.com/docs)
|
|
||||||
|
|
||||||
**Support:** [Ko-fi](https://ko-fi.com/avengemediallc)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Contributing
|
|
||||||
|
|
||||||
Contributions welcome! Bug fixes, new widgets, theme improvements, or docs - it all helps.
|
|
||||||
|
|
||||||
**Contributing Code:**
|
|
||||||
1. Fork the repository
|
|
||||||
2. Set up the development environment
|
|
||||||
3. Make your changes
|
|
||||||
4. Open a pull request
|
|
||||||
|
|
||||||
**Contributing Documentation:**
|
|
||||||
1. Fork the [DankLinux-Docs](https://github.com/AvengeMedia/DankLinux-Docs) repository
|
|
||||||
2. Update files in the `docs/` folder
|
|
||||||
3. Open a pull request
|
|
||||||
|
|
||||||
### Development Setup
|
|
||||||
|
|
||||||
**Requirements:**
|
|
||||||
- `python3` - Translation management
|
|
||||||
|
|
||||||
**Git Hooks:**
|
|
||||||
|
|
||||||
Enable the pre-commit hook to check translation sync status:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git config core.hooksPath .githooks
|
|
||||||
```
|
```
|
||||||
|
|
||||||
**Translation Workflow**
|
Theme singleton provides Material Design 3 color system, spacing, fonts, and elevation.
|
||||||
|
|
||||||
Set POEditor credentials:
|
**Application Themes**
|
||||||
|
|
||||||
```bash
|
Templates in `scripts/templates/` generate themes for:
|
||||||
export POEDITOR_API_TOKEN="your_api_token"
|
- GTK 3/4
|
||||||
export POEDITOR_PROJECT_ID="your_project_id"
|
- Qt5/Qt6
|
||||||
|
- Alacritty, Kitty, Foot terminals
|
||||||
|
- VSCode/VSCodium
|
||||||
|
- Firefox
|
||||||
|
|
||||||
|
## Multi-Monitor Support
|
||||||
|
|
||||||
|
Per-monitor panel instances using Quickshell `Variants`:
|
||||||
|
|
||||||
|
```qml
|
||||||
|
Variants {
|
||||||
|
model: Quickshell.screens
|
||||||
|
PanelWindow {
|
||||||
|
screen: modelData
|
||||||
|
// Per-screen configuration
|
||||||
|
}
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Sync translations before committing:
|
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`):
|
||||||
|
```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:
|
||||||
|
```qml
|
||||||
|
pluginService.savePluginData("pluginId", "key", value)
|
||||||
|
pluginService.loadPluginData("pluginId", "key", defaultValue)
|
||||||
|
```
|
||||||
|
|
||||||
|
## IPC Integration
|
||||||
|
|
||||||
|
Backend IPC socket communication:
|
||||||
|
|
||||||
|
```qml
|
||||||
|
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:**
|
||||||
|
```qml
|
||||||
|
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):**
|
||||||
|
```qml
|
||||||
|
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:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
export POEDITOR_API_TOKEN="token"
|
||||||
|
export POEDITOR_PROJECT_ID="id"
|
||||||
python3 scripts/i18nsync.py sync
|
python3 scripts/i18nsync.py sync
|
||||||
```
|
```
|
||||||
|
|
||||||
This script:
|
Pre-commit hook checks translation sync status.
|
||||||
- Extracts strings from QML files
|
|
||||||
- Uploads changed English terms to POEditor
|
|
||||||
- Downloads updated translations from POEditor
|
|
||||||
- Stages all changes for commit
|
|
||||||
|
|
||||||
The pre-commit hook will block commits if translations are out of sync and remind you to run the sync script.
|
## License
|
||||||
|
|
||||||
Without POEditor credentials, the hook is skipped and commits proceed normally.
|
MIT License - See [LICENSE](../LICENSE) for details.
|
||||||
|
|
||||||
Check the [issues](https://github.com/AvengeMedia/DankMaterialShell/issues) or join the community.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Credits
|
|
||||||
|
|
||||||
- [quickshell](https://quickshell.org/) the core of what makes a shell like this possible.
|
|
||||||
- [niri](https://github.com/YaLTeR/niri) for the awesome scrolling compositor.
|
|
||||||
- [Ly-sec](http://github.com/ly-sec) for awesome wallpaper effects among other things from [Noctalia](https://github.com/noctalia-dev/noctalia-shell)
|
|
||||||
- [soramanew](https://github.com/soramanew) who built [caelestia](https://github.com/caelestia-dots/shell) which served as inspiration and guidance for many dank widgets.
|
|
||||||
- [end-4](https://github.com/end-4) for [dots-hyprland](https://github.com/end-4/dots-hyprland) which also served as inspiration and guidance for many dank widgets.
|
|
||||||
|
|||||||
Reference in New Issue
Block a user