diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 00000000..46178074
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,8 @@
+[*.sh]
+# like -i=4
+indent_style = space
+indent_size = 4
+[*.nix]
+# like -i=4
+indent_style = space
+indent_size = 4
diff --git a/.githooks/pre-commit b/.githooks/pre-commit
deleted file mode 100755
index 7e96a024..00000000
--- a/.githooks/pre-commit
+++ /dev/null
@@ -1,69 +0,0 @@
-#!/usr/bin/env bash
-set -euo pipefail
-
-HOOK_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-REPO_ROOT="$(cd "$HOOK_DIR/.." && pwd)"
-
-cd "$REPO_ROOT"
-
-# =============================================================================
-# Go CI checks (when core/ files are staged)
-# =============================================================================
-STAGED_CORE_FILES=$(git diff --cached --name-only --diff-filter=ACMR | grep '^core/' || true)
-
-if [[ -n "$STAGED_CORE_FILES" ]]; then
- echo "Go files staged in core/, running CI checks..."
- cd "$REPO_ROOT/core"
-
- # Format check
- echo " Checking gofmt..."
- UNFORMATTED=$(gofmt -s -l . 2>/dev/null || true)
- if [[ -n "$UNFORMATTED" ]]; then
- echo "The following files are not formatted:"
- echo "$UNFORMATTED"
- echo ""
- echo "Run: cd core && gofmt -s -w ."
- exit 1
- fi
-
- # golangci-lint
- if command -v golangci-lint &>/dev/null; then
- echo " Running golangci-lint..."
- golangci-lint run ./...
- else
- echo " Warning: golangci-lint not installed, skipping lint"
- echo " Install: go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest"
- fi
-
- # Tests
- echo " Running tests..."
- if ! go test ./... >/dev/null 2>&1; then
- echo "Tests failed! Run 'go test ./...' for details."
- exit 1
- fi
-
- # Build checks
- echo " Building..."
- mkdir -p bin
- go build -buildvcs=false -o bin/dms ./cmd/dms
- go build -buildvcs=false -o bin/dms-distro -tags distro_binary ./cmd/dms
- go build -buildvcs=false -o bin/dankinstall ./cmd/dankinstall
-
- echo "All Go CI checks passed!"
- cd "$REPO_ROOT"
-fi
-
-# =============================================================================
-# i18n sync check (DISABLED for now)
-# =============================================================================
-# if [[ -n "${POEDITOR_API_TOKEN:-}" ]] && [[ -n "${POEDITOR_PROJECT_ID:-}" ]]; then
-# if command -v python3 &>/dev/null; then
-# if ! python3 scripts/i18nsync.py check &>/dev/null; then
-# echo "Translations out of sync"
-# echo "Run: python3 scripts/i18nsync.py sync"
-# exit 1
-# fi
-# fi
-# fi
-
-exit 0
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index ea66a71e..4b26c8ae 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -6,7 +6,7 @@ labels: "bug"
assignees: ""
---
-
\ No newline at end of file
+
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
index ead756aa..d7f8fef6 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -30,4 +30,4 @@ Is this feature specific to one compositor?
## Alternatives/Existing Solutions
-
\ No newline at end of file
+
diff --git a/.github/ISSUE_TEMPLATE/support_request.md b/.github/ISSUE_TEMPLATE/support_request.md
index 0aa9d396..defa6135 100644
--- a/.github/ISSUE_TEMPLATE/support_request.md
+++ b/.github/ISSUE_TEMPLATE/support_request.md
@@ -37,4 +37,4 @@ assignees: ""
## Screenshots/Recordings
-
\ No newline at end of file
+
diff --git a/.github/workflows/go-ci.yml b/.github/workflows/go-ci.yml
index ef65454f..5c0698fd 100644
--- a/.github/workflows/go-ci.yml
+++ b/.github/workflows/go-ci.yml
@@ -33,20 +33,6 @@ jobs:
with:
go-version-file: ./core/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: Run golangci-lint
- uses: golangci/golangci-lint-action@v9
- with:
- version: v2.6
- working-directory: core
-
- name: Test
run: go test -v ./...
diff --git a/.github/workflows/prek.yml b/.github/workflows/prek.yml
new file mode 100644
index 00000000..1b2b95af
--- /dev/null
+++ b/.github/workflows/prek.yml
@@ -0,0 +1,15 @@
+name: Pre-commit Checks
+
+on:
+ push:
+ pull_request:
+ branches: [master, main]
+jobs:
+ pre-commit-check:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: run pre-commit hooks
+ uses: j178/prek-action@v1
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index c4da4e3c..ea6f2e63 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -272,7 +272,7 @@ jobs:
# Create QML source package (exclude build artifacts and git files)
# Copy root LICENSE and CONTRIBUTING.md to quickshell/ for packaging
cp LICENSE CONTRIBUTING.md quickshell/
-
+
# Copy root assets directory to quickshell for systemd service and desktop file
cp -r assets quickshell/
diff --git a/.github/workflows/run-copr.yml b/.github/workflows/run-copr.yml
index e6ae796c..6568ef23 100644
--- a/.github/workflows/run-copr.yml
+++ b/.github/workflows/run-copr.yml
@@ -19,7 +19,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
-
+
- name: Determine version
id: version
run: |
@@ -40,31 +40,31 @@ jobs:
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "release=$RELEASE" >> $GITHUB_OUTPUT
echo "✅ Building DMS hotfix version: $VERSION-$RELEASE"
-
+
- 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}
echo "✅ RPM build environment ready"
-
+
- name: Download release assets
run: |
VERSION="${{ steps.version.outputs.version }}"
cd ~/rpmbuild/SOURCES
-
+
echo "📦 Downloading DMS QML source for v${VERSION}..."
-
+
# Download DMS QML source
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
}
-
+
echo "✅ Source downloaded"
echo "Note: dms-cli binary will be downloaded during build based on target architecture"
ls -lh
-
+
- name: Generate stable spec file
run: |
VERSION="${{ steps.version.outputs.version }}"
@@ -211,38 +211,38 @@ jobs:
echo ""
echo "=== Spec file preview ==="
head -40 ~/rpmbuild/SPECS/dms.spec
-
+
- name: Build SRPM
id: build
run: |
cd ~/rpmbuild/SPECS
-
+
echo "🔨 Building SRPM..."
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"
echo ""
echo "=== SRPM Info ==="
rpm -qpi "$SRPM"
-
+
- 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]
@@ -252,30 +252,30 @@ jobs:
copr_url = https://copr.fedorainfracloud.org
EOF
chmod 600 ~/.config/copr
-
+
echo "✅ Copr CLI configured"
-
+
- name: Upload to Copr
run: |
SRPM="${{ steps.build.outputs.srpm_path }}"
VERSION="${{ steps.version.outputs.version }}"
-
+
echo "🚀 Uploading SRPM to avengemedia/dms..."
echo " SRPM: $(basename $SRPM)"
echo " Version: $VERSION"
-
+
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 successfully!"
echo "🔗 https://copr.fedorainfracloud.org/coprs/avengemedia/dms/build/$BUILD_ID/"
else
echo "⚠️ Could not extract build ID, but upload may have succeeded"
fi
-
+
- name: Build summary
if: always()
run: |
diff --git a/.github/workflows/run-obs.yml b/.github/workflows/run-obs.yml
index d32610fb..632069d5 100644
--- a/.github/workflows/run-obs.yml
+++ b/.github/workflows/run-obs.yml
@@ -21,34 +21,34 @@ jobs:
check-updates:
name: Check for updates
runs-on: ubuntu-latest
-
+
outputs:
has_updates: ${{ steps.check.outputs.has_updates }}
packages: ${{ steps.check.outputs.packages }}
version: ${{ steps.check.outputs.version }}
-
+
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
-
+
- name: Install OSC
run: |
sudo apt-get update
sudo apt-get install -y osc
-
+
mkdir -p ~/.config/osc
cat > ~/.config/osc/oscrc << EOF
[general]
apiurl = https://api.opensuse.org
-
+
[https://api.opensuse.org]
user = ${{ secrets.OBS_USERNAME }}
pass = ${{ secrets.OBS_PASSWORD }}
EOF
chmod 600 ~/.config/osc/oscrc
-
+
- name: Check for updates
id: check
run: |
@@ -116,13 +116,13 @@ jobs:
if: |
github.event_name == 'workflow_dispatch' ||
needs.check-updates.outputs.has_updates == 'true'
-
+
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
-
+
- name: Determine packages to update
id: packages
run: |
@@ -140,7 +140,7 @@ jobs:
else
echo "packages=${{ needs.check-updates.outputs.packages }}" >> $GITHUB_OUTPUT
fi
-
+
- name: Update dms-git spec version
if: contains(steps.packages.outputs.packages, 'dms-git') || steps.packages.outputs.packages == 'all'
run: |
@@ -148,13 +148,13 @@ jobs:
COMMIT_HASH=$(git rev-parse --short=8 HEAD)
COMMIT_COUNT=$(git rev-list --count HEAD)
BASE_VERSION=$(grep -oP '^Version:\s+\K[0-9.]+' distro/opensuse/dms.spec | head -1 || echo "0.6.2")
-
+
NEW_VERSION="${BASE_VERSION}+git${COMMIT_COUNT}.${COMMIT_HASH}"
echo "📦 Updating dms-git.spec to version: $NEW_VERSION"
-
+
# Update version in spec
sed -i "s/^Version:.*/Version: $NEW_VERSION/" distro/opensuse/dms-git.spec
-
+
# Add changelog entry
DATE_STR=$(date "+%a %b %d %Y")
CHANGELOG_ENTRY="* $DATE_STR Avenge Media
`);
return `\x00CODEBLOCK${blockIndex++}\x00`;
});
-
+
// Extract and replace inline code
html = html.replace(/`([^`]+)`/g, (match, code) => {
// Escape HTML entities in code
@@ -31,18 +31,18 @@ function markdownToHtml(text) {
inlineCode.push(`${escapedCode}${escapedCode}`);
return `\x00INLINECODE${inlineIndex++}\x00`;
});
-
+
// Now process everything else
// Escape HTML entities (but not in code blocks)
html = html.replace(/&/g, '&')
.replace(//g, '>');
-
+
// Headers
html = html.replace(/^### (.*?)$/gm, '$1
');
html = html.replace(/^## (.*?)$/gm, '$1
');
html = html.replace(/^# (.*?)$/gm, '$1
');
-
+
// Bold and italic (order matters!)
html = html.replace(/\*\*\*(.*?)\*\*\*/g, '$1');
html = html.replace(/\*\*(.*?)\*\*/g, '$1');
@@ -50,15 +50,15 @@ function markdownToHtml(text) {
html = html.replace(/___(.*?)___/g, '$1');
html = html.replace(/__(.*?)__/g, '$1');
html = html.replace(/_(.*?)_/g, '$1');
-
+
// Links
html = html.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '$1');
-
+
// Lists
html = html.replace(/^\* (.*?)$/gm, '' + match + '
';
@@ -71,36 +71,36 @@ function markdownToHtml(text) {
html = html.replace(/\x00CODEBLOCK(\d+)\x00/g, (match, index) => {
return codeBlocks[parseInt(index)];
});
-
+
html = html.replace(/\x00INLINECODE(\d+)\x00/g, (match, index) => {
return inlineCode[parseInt(index)];
});
-
+
// Line breaks (after code blocks are restored)
html = html.replace(/\n\n/g, '
');
html = html.replace(/\n/g, '
');
-
+
// Wrap in paragraph tags if not already wrapped
if (!html.startsWith('<')) {
html = '
' + html + '
'; } - + // Clean up the final HTML // Remove/g, '');
html = html.replace(/
\s*\s*<\/p>/g, ''); html = html.replace(/
\s*
\s*<\/p>/g, '');
-
+
// Remove excessive line breaks
html = html.replace(/(
){3,}/g, '
'); // Max 2 consecutive line breaks
html = html.replace(/(<\/p>)\s*(
)/g, '$1$2'); // Remove whitespace between paragraphs
-
+
// Remove leading/trailing whitespace
html = html.trim();
-
+
return html;
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modals/Spotlight/SpotlightContextMenu.qml b/quickshell/Modals/Spotlight/SpotlightContextMenu.qml
index 9a72d252..df00296f 100644
--- a/quickshell/Modals/Spotlight/SpotlightContextMenu.qml
+++ b/quickshell/Modals/Spotlight/SpotlightContextMenu.qml
@@ -18,18 +18,18 @@ PanelWindow {
property var parentModal: null
property real menuPositionX: 0
property real menuPositionY: 0
-
+
readonly property real shadowBuffer: 5
-
+
screen: parentModal?.effectiveScreen
function show(x, y, app, fromKeyboard) {
fromKeyboard = fromKeyboard || false;
menuContent.currentApp = app;
-
+
let screenX = x;
let screenY = y;
-
+
if (parentModal) {
if (fromKeyboard) {
screenX = x + parentModal.alignedX;
@@ -39,14 +39,14 @@ PanelWindow {
screenY = y + (parentModal.alignedY - shadowBuffer);
}
}
-
+
menuPositionX = screenX;
menuPositionY = screenY;
-
+
menuContent.selectedMenuIndex = fromKeyboard ? 0 : -1;
menuContent.keyboardNavigation = true;
visible = true;
-
+
if (parentHandler) {
parentHandler.enabled = false;
}
diff --git a/quickshell/Modals/Spotlight/SpotlightContextMenuContent.qml b/quickshell/Modals/Spotlight/SpotlightContextMenuContent.qml
index 50f41fdc..2ec5a5f6 100644
--- a/quickshell/Modals/Spotlight/SpotlightContextMenuContent.qml
+++ b/quickshell/Modals/Spotlight/SpotlightContextMenuContent.qml
@@ -143,7 +143,7 @@ Item {
implicitWidth: Math.max(180, menuColumn.implicitWidth + Theme.spacingS * 2)
implicitHeight: menuColumn.implicitHeight + Theme.spacingS * 2
-
+
width: implicitWidth
height: implicitHeight
diff --git a/quickshell/Modals/Spotlight/SpotlightContextMenuPopup.qml b/quickshell/Modals/Spotlight/SpotlightContextMenuPopup.qml
index 16f25766..ae5ecca3 100644
--- a/quickshell/Modals/Spotlight/SpotlightContextMenuPopup.qml
+++ b/quickshell/Modals/Spotlight/SpotlightContextMenuPopup.qml
@@ -14,20 +14,20 @@ Popup {
function show(x, y, app, fromKeyboard) {
fromKeyboard = fromKeyboard || false;
menuContent.currentApp = app;
-
+
root.x = x + 4;
root.y = y + 4;
-
+
menuContent.selectedMenuIndex = fromKeyboard ? 0 : -1;
menuContent.keyboardNavigation = true;
-
+
if (parentHandler) {
parentHandler.enabled = false;
}
-
+
open();
}
-
+
onOpened: {
Qt.callLater(() => {
menuContent.keyboardHandler.forceActiveFocus();
diff --git a/quickshell/Modules/ControlCenter/Components/ActionTile.qml b/quickshell/Modules/ControlCenter/Components/ActionTile.qml
index 00eb3d0c..5186c8f7 100644
--- a/quickshell/Modules/ControlCenter/Components/ActionTile.qml
+++ b/quickshell/Modules/ControlCenter/Components/ActionTile.qml
@@ -117,4 +117,4 @@ Rectangle {
easing.type: Theme.standardEasing
}
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/ControlCenter/Components/DragDropDetailHost.qml b/quickshell/Modules/ControlCenter/Components/DragDropDetailHost.qml
index 2f00af9c..261b6841 100644
--- a/quickshell/Modules/ControlCenter/Components/DragDropDetailHost.qml
+++ b/quickshell/Modules/ControlCenter/Components/DragDropDetailHost.qml
@@ -88,4 +88,4 @@ Item {
}
}
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/ControlCenter/Components/DragDropWidgetWrapper.qml b/quickshell/Modules/ControlCenter/Components/DragDropWidgetWrapper.qml
index 6a005241..7cb0e2cc 100644
--- a/quickshell/Modules/ControlCenter/Components/DragDropWidgetWrapper.qml
+++ b/quickshell/Modules/ControlCenter/Components/DragDropWidgetWrapper.qml
@@ -286,4 +286,4 @@ Item {
ColorAnimation { duration: Theme.shortDuration }
}
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/ControlCenter/Components/EditControls.qml b/quickshell/Modules/ControlCenter/Components/EditControls.qml
index 848d36b1..70c37aaf 100644
--- a/quickshell/Modules/ControlCenter/Components/EditControls.qml
+++ b/quickshell/Modules/ControlCenter/Components/EditControls.qml
@@ -237,4 +237,4 @@ Row {
onClicked: root.clearAll()
}
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/ControlCenter/Components/PowerButton.qml b/quickshell/Modules/ControlCenter/Components/PowerButton.qml
index a0c83fb2..8672f49d 100644
--- a/quickshell/Modules/ControlCenter/Components/PowerButton.qml
+++ b/quickshell/Modules/ControlCenter/Components/PowerButton.qml
@@ -49,4 +49,4 @@ Rectangle {
cursorShape: Qt.PointingHandCursor
onPressed: root.pressed()
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/ControlCenter/Components/SizeControls.qml b/quickshell/Modules/ControlCenter/Components/SizeControls.qml
index efbc3cb9..aeae4ee2 100644
--- a/quickshell/Modules/ControlCenter/Components/SizeControls.qml
+++ b/quickshell/Modules/ControlCenter/Components/SizeControls.qml
@@ -49,4 +49,4 @@ Row {
}
}
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/ControlCenter/Components/Typography.qml b/quickshell/Modules/ControlCenter/Components/Typography.qml
index c2c739b9..f3e554f0 100644
--- a/quickshell/Modules/ControlCenter/Components/Typography.qml
+++ b/quickshell/Modules/ControlCenter/Components/Typography.qml
@@ -43,4 +43,4 @@ StyledText {
default: return Theme.surfaceText
}
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/ControlCenter/Details/BluetoothDetail.qml b/quickshell/Modules/ControlCenter/Details/BluetoothDetail.qml
index 04176447..b209c67c 100644
--- a/quickshell/Modules/ControlCenter/Details/BluetoothDetail.qml
+++ b/quickshell/Modules/ControlCenter/Details/BluetoothDetail.qml
@@ -161,7 +161,7 @@ Rectangle {
const pins = SettingsData.bluetoothDevicePins || {}
const pinnedAddr = pins["preferredDevice"]
-
+
let devices = [...BluetoothService.adapter.devices.values.filter(dev => dev && (dev.paired || dev.trusted))]
devices.sort((a, b) => {
// Pinned device first
@@ -337,13 +337,13 @@ Rectangle {
onClicked: {
const pins = JSON.parse(JSON.stringify(SettingsData.bluetoothDevicePins || {}))
const isCurrentlyPinned = pins["preferredDevice"] === modelData.address
-
+
if (isCurrentlyPinned) {
delete pins["preferredDevice"]
} else {
pins["preferredDevice"] = modelData.address
}
-
+
SettingsData.set("bluetoothDevicePins", pins)
}
}
@@ -642,4 +642,4 @@ Rectangle {
}
}
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/ControlCenter/Details/DiskUsageDetail.qml b/quickshell/Modules/ControlCenter/Details/DiskUsageDetail.qml
index bcb9fd7f..c08476d9 100644
--- a/quickshell/Modules/ControlCenter/Details/DiskUsageDetail.qml
+++ b/quickshell/Modules/ControlCenter/Details/DiskUsageDetail.qml
@@ -163,4 +163,4 @@ Rectangle {
}
}
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/ControlCenter/Widgets/BatteryPill.qml b/quickshell/Modules/ControlCenter/Widgets/BatteryPill.qml
index 5c73dc14..76516534 100644
--- a/quickshell/Modules/ControlCenter/Widgets/BatteryPill.qml
+++ b/quickshell/Modules/ControlCenter/Widgets/BatteryPill.qml
@@ -45,4 +45,4 @@ CompoundPill {
onToggled: {
expandClicked()
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/ControlCenter/Widgets/ColorPickerPill.qml b/quickshell/Modules/ControlCenter/Widgets/ColorPickerPill.qml
index e066862b..238360a1 100644
--- a/quickshell/Modules/ControlCenter/Widgets/ColorPickerPill.qml
+++ b/quickshell/Modules/ControlCenter/Widgets/ColorPickerPill.qml
@@ -30,4 +30,4 @@ CompoundPill {
colorPickerModal.show()
}
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/ControlCenter/Widgets/CompactSlider.qml b/quickshell/Modules/ControlCenter/Widgets/CompactSlider.qml
index 610f45c5..0f8b0e3a 100644
--- a/quickshell/Modules/ControlCenter/Widgets/CompactSlider.qml
+++ b/quickshell/Modules/ControlCenter/Widgets/CompactSlider.qml
@@ -67,4 +67,4 @@ Rectangle {
onSliderValueChanged: root.sliderValueChanged(newValue / 100.0)
}
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/ControlCenter/Widgets/CompoundPill.qml b/quickshell/Modules/ControlCenter/Widgets/CompoundPill.qml
index 1ccd46a8..3b75ddb3 100644
--- a/quickshell/Modules/ControlCenter/Widgets/CompoundPill.qml
+++ b/quickshell/Modules/ControlCenter/Widgets/CompoundPill.qml
@@ -167,4 +167,4 @@ Rectangle {
if (ev.key === Qt.Key_Space || ev.key === Qt.Key_Return) { root.toggled(); ev.accepted = true }
else if (ev.key === Qt.Key_Right) { root.expandClicked(); ev.accepted = true }
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/ControlCenter/Widgets/DetailView.qml b/quickshell/Modules/ControlCenter/Widgets/DetailView.qml
index bffa0ff0..b0417fbf 100644
--- a/quickshell/Modules/ControlCenter/Widgets/DetailView.qml
+++ b/quickshell/Modules/ControlCenter/Widgets/DetailView.qml
@@ -26,4 +26,4 @@ Rectangle {
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/ControlCenter/Widgets/DiskUsagePill.qml b/quickshell/Modules/ControlCenter/Widgets/DiskUsagePill.qml
index f51fb84d..f0917274 100644
--- a/quickshell/Modules/ControlCenter/Widgets/DiskUsagePill.qml
+++ b/quickshell/Modules/ControlCenter/Widgets/DiskUsagePill.qml
@@ -75,4 +75,4 @@ CompoundPill {
onToggled: {
expandClicked()
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/ControlCenter/Widgets/SmallBatteryButton.qml b/quickshell/Modules/ControlCenter/Widgets/SmallBatteryButton.qml
index 49b330a7..3e11d125 100644
--- a/quickshell/Modules/ControlCenter/Widgets/SmallBatteryButton.qml
+++ b/quickshell/Modules/ControlCenter/Widgets/SmallBatteryButton.qml
@@ -97,4 +97,4 @@ Rectangle {
easing.type: Theme.standardEasing
}
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/ControlCenter/Widgets/SmallToggleButton.qml b/quickshell/Modules/ControlCenter/Widgets/SmallToggleButton.qml
index 49ca5cef..bcac135f 100644
--- a/quickshell/Modules/ControlCenter/Widgets/SmallToggleButton.qml
+++ b/quickshell/Modules/ControlCenter/Widgets/SmallToggleButton.qml
@@ -77,4 +77,4 @@ Rectangle {
easing.type: Theme.standardEasing
}
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/ControlCenter/Widgets/ToggleButton.qml b/quickshell/Modules/ControlCenter/Widgets/ToggleButton.qml
index c46c40f1..5c2cbca0 100644
--- a/quickshell/Modules/ControlCenter/Widgets/ToggleButton.qml
+++ b/quickshell/Modules/ControlCenter/Widgets/ToggleButton.qml
@@ -118,4 +118,4 @@ Rectangle {
easing.type: Theme.standardEasing
}
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/ControlCenter/utils/layout.js b/quickshell/Modules/ControlCenter/utils/layout.js
index b1f9b44b..b8e5651f 100644
--- a/quickshell/Modules/ControlCenter/utils/layout.js
+++ b/quickshell/Modules/ControlCenter/utils/layout.js
@@ -42,4 +42,4 @@ function calculateRowsAndWidgets(controlCenterColumn, expandedSection, expandedW
}
return { rows: rows, expandedRowIndex: expandedRow }
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/ControlCenter/utils/state.js b/quickshell/Modules/ControlCenter/utils/state.js
index b7240db3..393ca296 100644
--- a/quickshell/Modules/ControlCenter/utils/state.js
+++ b/quickshell/Modules/ControlCenter/utils/state.js
@@ -22,4 +22,4 @@ function toggleSection(root, section) {
} else {
root.expandedSection = section
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/ControlCenter/utils/widgets.js b/quickshell/Modules/ControlCenter/utils/widgets.js
index abb6f4f2..3e11d886 100644
--- a/quickshell/Modules/ControlCenter/utils/widgets.js
+++ b/quickshell/Modules/ControlCenter/utils/widgets.js
@@ -87,4 +87,4 @@ function resetToDefault() {
function clearAll() {
SettingsData.set("controlCenterWidgets", [])
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/DankBar/AxisContext.qml b/quickshell/Modules/DankBar/AxisContext.qml
index 25dcbe87..8a8fe97c 100644
--- a/quickshell/Modules/DankBar/AxisContext.qml
+++ b/quickshell/Modules/DankBar/AxisContext.qml
@@ -54,4 +54,4 @@ QtObject {
axisOrientationChanged()
changed()
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/DankBar/Widgets/ClipboardButton.qml b/quickshell/Modules/DankBar/Widgets/ClipboardButton.qml
index 50849c32..32d86ace 100644
--- a/quickshell/Modules/DankBar/Widgets/ClipboardButton.qml
+++ b/quickshell/Modules/DankBar/Widgets/ClipboardButton.qml
@@ -22,4 +22,4 @@ BasePill {
}
}
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/DankBar/Widgets/NotepadButton.qml b/quickshell/Modules/DankBar/Widgets/NotepadButton.qml
index fd8db7f3..a61b8776 100644
--- a/quickshell/Modules/DankBar/Widgets/NotepadButton.qml
+++ b/quickshell/Modules/DankBar/Widgets/NotepadButton.qml
@@ -60,4 +60,4 @@ BasePill {
}
}
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/DankBar/Widgets/PowerMenuButton.qml b/quickshell/Modules/DankBar/Widgets/PowerMenuButton.qml
index f2068c06..b02090f9 100644
--- a/quickshell/Modules/DankBar/Widgets/PowerMenuButton.qml
+++ b/quickshell/Modules/DankBar/Widgets/PowerMenuButton.qml
@@ -21,4 +21,4 @@ BasePill {
}
}
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/DankDash/Overview/CalendarOverviewCard.qml b/quickshell/Modules/DankDash/Overview/CalendarOverviewCard.qml
index 00535d62..f486091c 100644
--- a/quickshell/Modules/DankDash/Overview/CalendarOverviewCard.qml
+++ b/quickshell/Modules/DankDash/Overview/CalendarOverviewCard.qml
@@ -444,4 +444,4 @@ Rectangle {
id: systemClock
precision: SystemClock.Hours
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/DankDash/Overview/Card.qml b/quickshell/Modules/DankDash/Overview/Card.qml
index ffff2b62..f071510f 100644
--- a/quickshell/Modules/DankDash/Overview/Card.qml
+++ b/quickshell/Modules/DankDash/Overview/Card.qml
@@ -19,4 +19,4 @@ Rectangle {
anchors.fill: parent
anchors.margins: card.pad
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/DankDash/Overview/ClockCard.qml b/quickshell/Modules/DankDash/Overview/ClockCard.qml
index e50d571e..603e9f93 100644
--- a/quickshell/Modules/DankDash/Overview/ClockCard.qml
+++ b/quickshell/Modules/DankDash/Overview/ClockCard.qml
@@ -110,4 +110,4 @@ Card {
id: systemClock
precision: SettingsData.showSeconds ? SystemClock.Seconds : SystemClock.Minutes
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/DankDash/Overview/MediaOverviewCard.qml b/quickshell/Modules/DankDash/Overview/MediaOverviewCard.qml
index 8f40de1e..d1f8e96c 100644
--- a/quickshell/Modules/DankDash/Overview/MediaOverviewCard.qml
+++ b/quickshell/Modules/DankDash/Overview/MediaOverviewCard.qml
@@ -215,4 +215,4 @@ Card {
onClicked: root.clicked()
visible: activePlayer
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/DankDash/Overview/SystemMonitorCard.qml b/quickshell/Modules/DankDash/Overview/SystemMonitorCard.qml
index 9251a367..cb7089bc 100644
--- a/quickshell/Modules/DankDash/Overview/SystemMonitorCard.qml
+++ b/quickshell/Modules/DankDash/Overview/SystemMonitorCard.qml
@@ -175,4 +175,4 @@ Card {
}
}
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/DankDash/Overview/WeatherOverviewCard.qml b/quickshell/Modules/DankDash/Overview/WeatherOverviewCard.qml
index f60f9aa0..e3fc037f 100644
--- a/quickshell/Modules/DankDash/Overview/WeatherOverviewCard.qml
+++ b/quickshell/Modules/DankDash/Overview/WeatherOverviewCard.qml
@@ -86,4 +86,4 @@ Card {
cursorShape: Qt.PointingHandCursor
onClicked: root.clicked()
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/DankDash/OverviewTab.qml b/quickshell/Modules/DankDash/OverviewTab.qml
index eb900ffd..75b5fdfa 100644
--- a/quickshell/Modules/DankDash/OverviewTab.qml
+++ b/quickshell/Modules/DankDash/OverviewTab.qml
@@ -73,4 +73,4 @@ Item {
onClicked: root.switchToMediaTab()
}
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/Greetd/GreeterContent.qml b/quickshell/Modules/Greetd/GreeterContent.qml
index fb2be8a7..fb70bf17 100644
--- a/quickshell/Modules/Greetd/GreeterContent.qml
+++ b/quickshell/Modules/Greetd/GreeterContent.qml
@@ -1093,7 +1093,7 @@ Item {
command: {
var paths = [
"/usr/share/wayland-sessions",
- "/usr/share/xsessions",
+ "/usr/share/xsessions",
"/usr/local/share/wayland-sessions",
"/usr/local/share/xsessions"
]
@@ -1110,7 +1110,7 @@ Item {
}
})
}
- // 1. Explicit system/user paths
+ // 1. Explicit system/user paths
var explicitFind = "find " + paths.join(" ") + " -maxdepth 1 -name '*.desktop' -type f -follow 2>/dev/null"
// 2. Scan all /home user directories for local session files
var homeScan = "find /home -maxdepth 5 \\( -path '*/wayland-sessions/*.desktop' -o -path '*/xsessions/*.desktop' \\) -type f -follow 2>/dev/null"
diff --git a/quickshell/Modules/Greetd/README.md b/quickshell/Modules/Greetd/README.md
index 58ee6207..333d4de7 100644
--- a/quickshell/Modules/Greetd/README.md
+++ b/quickshell/Modules/Greetd/README.md
@@ -45,7 +45,7 @@ setfacl -m u:greeter:x ~ ~/.config ~/.local ~/.cache ~/.local/state
# Set group ownership on config directories
sudo chgrp -R greeter ~/.config/DankMaterialShell
-sudo chgrp -R greeter ~/.local/state/DankMaterialShell
+sudo chgrp -R greeter ~/.local/state/DankMaterialShell
sudo chgrp -R greeter ~/.cache/DankMaterialShell
sudo chmod -R g+rX ~/.config/DankMaterialShell ~/.cache/DankMaterialShell ~/.cache/quickshell
diff --git a/quickshell/Modules/Greetd/assets/dms-niri.kdl b/quickshell/Modules/Greetd/assets/dms-niri.kdl
index 79f75425..dfc47038 100644
--- a/quickshell/Modules/Greetd/assets/dms-niri.kdl
+++ b/quickshell/Modules/Greetd/assets/dms-niri.kdl
@@ -20,4 +20,4 @@ gestures {
layout {
background-color "#000000"
-}
\ No newline at end of file
+}
diff --git a/quickshell/Modules/Greetd/assets/greet-niri.sh b/quickshell/Modules/Greetd/assets/greet-niri.sh
index fe77faaa..d31db65d 100755
--- a/quickshell/Modules/Greetd/assets/greet-niri.sh
+++ b/quickshell/Modules/Greetd/assets/greet-niri.sh
@@ -5,4 +5,4 @@ export QT_QPA_PLATFORM=wayland
export QT_WAYLAND_DISABLE_WINDOWDECORATION=1
export EGL_PLATFORM=gbm
-exec niri -c /etc/greetd/dms-niri.kdl
\ No newline at end of file
+exec niri -c /etc/greetd/dms-niri.kdl
diff --git a/quickshell/Modules/Notepad/NotepadTextEditor.qml b/quickshell/Modules/Notepad/NotepadTextEditor.qml
index 998c015b..7cc47995 100644
--- a/quickshell/Modules/Notepad/NotepadTextEditor.qml
+++ b/quickshell/Modules/Notepad/NotepadTextEditor.qml
@@ -616,4 +616,4 @@ Column {
autoSaveToSession()
}
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/PLUGINS/LauncherExample/LauncherExampleSettings.qml b/quickshell/PLUGINS/LauncherExample/LauncherExampleSettings.qml
index db1947e6..e30aaa81 100644
--- a/quickshell/PLUGINS/LauncherExample/LauncherExampleSettings.qml
+++ b/quickshell/PLUGINS/LauncherExample/LauncherExampleSettings.qml
@@ -241,4 +241,4 @@ FocusScope {
}
return defaultValue
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Services/BatteryService.qml b/quickshell/Services/BatteryService.qml
index 279394d7..edf90937 100644
--- a/quickshell/Services/BatteryService.qml
+++ b/quickshell/Services/BatteryService.qml
@@ -73,7 +73,7 @@ Singleton {
}
const profileValue = BatteryService.isPluggedIn
- ? SettingsData.acProfileName
+ ? SettingsData.acProfileName
: SettingsData.batteryProfileName;
if (profileValue !== "") {
diff --git a/quickshell/Services/LegacyNetworkService.qml b/quickshell/Services/LegacyNetworkService.qml
index a9d93ad2..97d87458 100644
--- a/quickshell/Services/LegacyNetworkService.qml
+++ b/quickshell/Services/LegacyNetworkService.qml
@@ -984,4 +984,4 @@ Singleton {
"bssid": network.bssid
}
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Services/NotepadStorageService.qml b/quickshell/Services/NotepadStorageService.qml
index 4548a495..67a14366 100644
--- a/quickshell/Services/NotepadStorageService.qml
+++ b/quickshell/Services/NotepadStorageService.qml
@@ -429,4 +429,4 @@ Singleton {
id: mkdirProcess
command: ["mkdir", "-p", root.baseDir, root.filesDir]
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Services/PrivacyService.qml b/quickshell/Services/PrivacyService.qml
index f3255d82..42364b0e 100644
--- a/quickshell/Services/PrivacyService.qml
+++ b/quickshell/Services/PrivacyService.qml
@@ -47,7 +47,7 @@ Singleton {
if (!node || !node.ready) {
continue
}
-
+
if (node.properties && node.properties["media.class"] === "Stream/Input/Video") {
if (node.properties["stream.is-live"] === "true") {
return true
diff --git a/quickshell/Services/niri-wpblur.kdl b/quickshell/Services/niri-wpblur.kdl
index 88ac8313..667042fa 100644
--- a/quickshell/Services/niri-wpblur.kdl
+++ b/quickshell/Services/niri-wpblur.kdl
@@ -1,4 +1,4 @@
layer-rule {
match namespace="dms:blurwallpaper"
place-within-backdrop true
-}
\ No newline at end of file
+}
diff --git a/quickshell/Shaders/frag/wp_disc.frag b/quickshell/Shaders/frag/wp_disc.frag
index 58a5e029..254ae419 100644
--- a/quickshell/Shaders/frag/wp_disc.frag
+++ b/quickshell/Shaders/frag/wp_disc.frag
@@ -15,7 +15,7 @@ layout(std140, binding = 0) uniform buf {
float centerY; // Y coordinate of disc center (0.0 to 1.0)
float smoothness; // Edge smoothness (0.0 to 1.0, 0=sharp, 1=very smooth)
float aspectRatio; // Width / Height of the screen
-
+
float fillMode; // 0=stretch, 1=fit, 2=crop, 3=tile, 4=tileV, 5=tileH, 6=pad
float imageWidth1;
float imageHeight1;
@@ -97,30 +97,30 @@ void main() {
// This makes distances circular instead of elliptical
vec2 adjustedUV = vec2(uv.x * ubuf.aspectRatio, uv.y);
vec2 adjustedCenter = vec2(ubuf.centerX * ubuf.aspectRatio, ubuf.centerY);
-
+
// Calculate distance in aspect-corrected space
float dist = distance(adjustedUV, adjustedCenter);
-
+
// Calculate the maximum possible distance (corner to corner)
// This ensures the disc can cover the entire screen
- float maxDistX = max(ubuf.centerX * ubuf.aspectRatio,
+ float maxDistX = max(ubuf.centerX * ubuf.aspectRatio,
(1.0 - ubuf.centerX) * ubuf.aspectRatio);
float maxDistY = max(ubuf.centerY, 1.0 - ubuf.centerY);
float maxDist = length(vec2(maxDistX, maxDistY));
-
+
// Scale progress to cover the maximum distance
// Add extra range for smoothness to ensure complete coverage
// Adjust smoothness for aspect ratio to maintain consistent visual appearance
float adjustedSmoothness = mappedSmoothness * max(1.0, ubuf.aspectRatio);
float radius = ubuf.progress * (maxDist + adjustedSmoothness);
-
+
// Use smoothstep for a smooth edge transition
float factor = smoothstep(radius - adjustedSmoothness, radius + adjustedSmoothness, dist);
-
+
// Mix the textures (factor = 0 inside disc, 1 outside)
fragColor = mix(color2, color1, factor);
-
+
if (ubuf.progress <= 0.0) fragColor = color1;
fragColor *= ubuf.qt_Opacity;
-}
\ No newline at end of file
+}
diff --git a/quickshell/Shaders/frag/wp_fade.frag b/quickshell/Shaders/frag/wp_fade.frag
index 7b42139f..31a404d3 100644
--- a/quickshell/Shaders/frag/wp_fade.frag
+++ b/quickshell/Shaders/frag/wp_fade.frag
@@ -11,7 +11,7 @@ layout(std140, binding = 0) uniform buf {
mat4 qt_Matrix;
float qt_Opacity;
float progress;
-
+
// Fill mode parameters
float fillMode; // 0=stretch, 1=fit, 2=crop, 3=tile, 4=tileV, 5=tileH, 6=pad
float imageWidth1; // Width of source1 image
@@ -81,11 +81,11 @@ vec4 sampleWithFillMode(sampler2D tex, vec2 uv, float imgWidth, float imgHeight)
void main() {
vec2 uv = qt_TexCoord0;
-
+
// Sample textures with fill mode
vec4 color1 = sampleWithFillMode(source1, uv, ubuf.imageWidth1, ubuf.imageHeight1);
vec4 color2 = sampleWithFillMode(source2, uv, ubuf.imageWidth2, ubuf.imageHeight2);
-
+
// Mix the two textures based on progress value
fragColor = mix(color1, color2, ubuf.progress) * ubuf.qt_Opacity;
-}
\ No newline at end of file
+}
diff --git a/quickshell/Shaders/frag/wp_iris_bloom.frag b/quickshell/Shaders/frag/wp_iris_bloom.frag
index 74cc42c4..548d5bd3 100644
--- a/quickshell/Shaders/frag/wp_iris_bloom.frag
+++ b/quickshell/Shaders/frag/wp_iris_bloom.frag
@@ -104,7 +104,7 @@ void main() {
float radius = p * maxDist;
// squash factor for the "eye" slit
- float squash = mix(0.2, 1.0, p);
+ float squash = mix(0.2, 1.0, p);
q.y /= squash;
float dist = length(q);
diff --git a/quickshell/Shaders/frag/wp_stripes.frag b/quickshell/Shaders/frag/wp_stripes.frag
index 62da21e2..fcc216bb 100644
--- a/quickshell/Shaders/frag/wp_stripes.frag
+++ b/quickshell/Shaders/frag/wp_stripes.frag
@@ -15,7 +15,7 @@ layout(std140, binding = 0) uniform buf {
float angle; // Angle of stripes in degrees (default 30.0)
float smoothness; // Edge smoothness (0.0 to 1.0, 0=sharp, 1=very smooth)
float aspectRatio; // Width / Height of the screen
-
+
float fillMode; // 0=stretch, 1=fit, 2=crop, 3=tile, 4=tileV, 5=tileH, 6=pad
float imageWidth1;
float imageHeight1;
@@ -84,58 +84,58 @@ vec4 sampleWithFillMode(sampler2D tex, vec2 uv, float imgWidth, float imgHeight)
void main() {
vec2 uv = qt_TexCoord0;
-
+
// Sample textures with fill mode
vec4 color1 = sampleWithFillMode(source1, uv, ubuf.imageWidth1, ubuf.imageHeight1);
vec4 color2 = sampleWithFillMode(source2, uv, ubuf.imageWidth2, ubuf.imageHeight2);
-
+
// Map smoothness from 0.0-1.0 to 0.001-0.3 range
// Using a non-linear mapping for better control at low values
float mappedSmoothness = mix(0.001, 0.3, ubuf.smoothness * ubuf.smoothness);
-
+
// Use values directly without forcing defaults
float stripes = (ubuf.stripeCount > 0.0) ? ubuf.stripeCount : 12.0;
float angleRad = radians(ubuf.angle);
float edgeSmooth = mappedSmoothness;
-
+
// Create a coordinate system for stripes based on angle
// At 0°: vertical stripes (divide by x)
// At 45°: diagonal stripes
// At 90°: horizontal stripes (divide by y)
-
+
// Transform coordinates based on angle
float cosA = cos(angleRad);
float sinA = sin(angleRad);
-
+
// Project the UV position onto the stripe direction
// This gives us the position along the stripe direction
float stripeCoord = uv.x * cosA + uv.y * sinA;
-
+
// Perpendicular coordinate (for edge movement)
float perpCoord = -uv.x * sinA + uv.y * cosA;
-
+
// Calculate the range of perpCoord based on angle
// This determines how far edges need to travel to fully cover the screen
float minPerp = min(min(0.0 * -sinA + 0.0 * cosA, 1.0 * -sinA + 0.0 * cosA),
min(0.0 * -sinA + 1.0 * cosA, 1.0 * -sinA + 1.0 * cosA));
float maxPerp = max(max(0.0 * -sinA + 0.0 * cosA, 1.0 * -sinA + 0.0 * cosA),
max(0.0 * -sinA + 1.0 * cosA, 1.0 * -sinA + 1.0 * cosA));
-
+
// Determine which stripe we're in
float stripePos = stripeCoord * stripes;
int stripeIndex = int(floor(stripePos));
-
+
// Determine if this is an odd or even stripe
bool isOddStripe = mod(float(stripeIndex), 2.0) != 0.0;
-
+
// Calculate the progress for this specific stripe with wave delay
// Use absolute stripe position for consistent delay across all stripes
float normalizedStripePos = clamp(stripePos / stripes, 0.0, 1.0);
-
+
// Increased delay and better distribution
float maxDelay = 0.1;
float stripeDelay = normalizedStripePos * maxDelay;
-
+
// Better progress mapping that uses the full 0.0-1.0 range
// Map progress so that:
// - First stripe starts at progress = 0.0
@@ -151,13 +151,13 @@ void main() {
float activeEnd = stripeDelay + (1.0 - maxDelay);
stripeProgress = (ubuf.progress - activeStart) / (activeEnd - activeStart);
}
-
+
// Use gentler easing curve
stripeProgress = stripeProgress * stripeProgress * (3.0 - 2.0 * stripeProgress); // Smootherstep instead of smoothstep
-
+
// Use the perpendicular coordinate for edge comparison
float yPos = perpCoord;
-
+
// Calculate edge position for this stripe
// Use the actual perpendicular coordinate range for this angle
float perpRange = maxPerp - minPerp;
@@ -170,7 +170,7 @@ void main() {
// Even stripes: edge moves from min to max
edgePosition = minPerp - margin + stripeProgress * (perpRange + margin * 2.0);
}
-
+
// Determine which wallpaper to show based on rotated position
float mask;
if (isOddStripe) {
@@ -180,10 +180,10 @@ void main() {
// Even stripes reveal new wallpaper from top
mask = 1.0 - smoothstep(edgePosition - edgeSmooth, edgePosition + edgeSmooth, yPos);
}
-
+
// Mix the wallpapers
fragColor = mix(color1, color2, mask);
-
+
// Force exact values at start and end to prevent any bleed-through
if (ubuf.progress <= 0.0) {
fragColor = color1; // Only show old wallpaper at start
@@ -195,11 +195,11 @@ void main() {
float shadowStrength = 1.0 - smoothstep(0.0, edgeSmooth * 2.5, edgeDist);
shadowStrength *= 0.2 * (1.0 - abs(stripeProgress - 0.5) * 2.0);
fragColor.rgb *= (1.0 - shadowStrength);
-
- // Add slight vignette during transition for dramatic effect
+
+ // Add slight vignette during transition for dramatic effect
float vignette = 1.0 - ubuf.progress * 0.1 * (1.0 - abs(stripeProgress - 0.5) * 2.0);
fragColor.rgb *= vignette;
}
-
+
fragColor *= ubuf.qt_Opacity;
-}
\ No newline at end of file
+}
diff --git a/quickshell/Shaders/frag/wp_wipe.frag b/quickshell/Shaders/frag/wp_wipe.frag
index 4960ef8f..5fc6d327 100644
--- a/quickshell/Shaders/frag/wp_wipe.frag
+++ b/quickshell/Shaders/frag/wp_wipe.frag
@@ -13,7 +13,7 @@ layout(std140, binding = 0) uniform buf {
float progress; // Transition progress (0.0 to 1.0)
float direction; // 0=left, 1=right, 2=up, 3=down
float smoothness; // Edge smoothness (0.0 to 1.0, 0=sharp, 1=very smooth)
-
+
float fillMode; // 0=stretch, 1=fit, 2=crop, 3=tile, 4=tileV, 5=tileH, 6=pad
float imageWidth1;
float imageHeight1;
@@ -82,22 +82,22 @@ vec4 sampleWithFillMode(sampler2D tex, vec2 uv, float imgWidth, float imgHeight)
void main() {
vec2 uv = qt_TexCoord0;
-
+
// Sample textures with fill mode
vec4 color1 = sampleWithFillMode(source1, uv, ubuf.imageWidth1, ubuf.imageHeight1);
vec4 color2 = sampleWithFillMode(source2, uv, ubuf.imageWidth2, ubuf.imageHeight2);
-
+
// Map smoothness from 0.0-1.0 to 0.001-0.5 range
// Using a non-linear mapping for better control
float mappedSmoothness = mix(0.001, 0.5, ubuf.smoothness * ubuf.smoothness);
-
+
float edge = 0.0;
float factor = 0.0;
-
+
// Extend the progress range to account for smoothness
// This ensures the transition completes fully at the edges
float extendedProgress = ubuf.progress * (1.0 + 2.0 * mappedSmoothness) - mappedSmoothness;
-
+
// Calculate edge position based on direction
// As progress goes from 0 to 1, we reveal source2 (new wallpaper)
if (ubuf.direction < 0.5) {
@@ -105,7 +105,7 @@ void main() {
edge = 1.0 - extendedProgress;
factor = smoothstep(edge - mappedSmoothness, edge + mappedSmoothness, uv.x);
fragColor = mix(color1, color2, factor);
- }
+ }
else if (ubuf.direction < 1.5) {
// Wipe from left to right (new image enters from left)
edge = extendedProgress;
@@ -124,6 +124,6 @@ void main() {
factor = smoothstep(edge - mappedSmoothness, edge + mappedSmoothness, uv.y);
fragColor = mix(color2, color1, factor);
}
-
+
fragColor *= ubuf.qt_Opacity;
-}
\ No newline at end of file
+}
diff --git a/quickshell/Widgets/DankButtonGroup.qml b/quickshell/Widgets/DankButtonGroup.qml
index 64d0260d..fc9faf7e 100644
--- a/quickshell/Widgets/DankButtonGroup.qml
+++ b/quickshell/Widgets/DankButtonGroup.qml
@@ -210,4 +210,4 @@ Flow {
}
}
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Widgets/DankCircularImage.qml b/quickshell/Widgets/DankCircularImage.qml
index fdafd5f6..e54289e4 100644
--- a/quickshell/Widgets/DankCircularImage.qml
+++ b/quickshell/Widgets/DankCircularImage.qml
@@ -76,4 +76,4 @@ Rectangle {
font.weight: Font.Bold
color: Theme.surfaceVariantText
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Widgets/DankIcon.qml b/quickshell/Widgets/DankIcon.qml
index a647cfef..66362c8c 100644
--- a/quickshell/Widgets/DankIcon.qml
+++ b/quickshell/Widgets/DankIcon.qml
@@ -3,7 +3,7 @@ import qs.Common
Item {
id: root
-
+
property alias name: icon.text
property alias size: icon.font.pixelSize
property alias color: icon.color
@@ -11,22 +11,22 @@ Item {
property real fill: filled ? 1.0 : 0.0
property int grade: Theme.isLightMode ? 0 : -25
property int weight: filled ? 500 : 400
-
+
implicitWidth: icon.implicitWidth
implicitHeight: icon.implicitHeight
-
+
signal rotationCompleted()
-
+
FontLoader {
id: materialSymbolsFont
source: Qt.resolvedUrl("../assets/fonts/material-design-icons/variablefont/MaterialSymbolsRounded[FILL,GRAD,opsz,wght].ttf")
}
-
+
StyledText {
id: icon
-
+
anchors.fill: parent
-
+
font.family: materialSymbolsFont.name
font.pixelSize: Theme.fontSizeMedium
font.weight: root.weight
@@ -40,7 +40,7 @@ Item {
"opsz": 24,
"wght": root.weight
}
-
+
Behavior on font.weight {
NumberAnimation {
duration: Theme.shortDuration
@@ -48,22 +48,22 @@ Item {
}
}
}
-
+
Behavior on fill {
NumberAnimation {
duration: Theme.shortDuration
easing.type: Theme.standardEasing
}
}
-
+
Timer {
id: rotationTimer
interval: 16
repeat: false
onTriggered: root.rotationCompleted()
}
-
+
onRotationChanged: {
rotationTimer.restart()
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Widgets/DankSeekbar.qml b/quickshell/Widgets/DankSeekbar.qml
index e085c64e..d30249a0 100644
--- a/quickshell/Widgets/DankSeekbar.qml
+++ b/quickshell/Widgets/DankSeekbar.qml
@@ -179,4 +179,4 @@ Item {
}
}
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Widgets/DankSlideout.qml b/quickshell/Widgets/DankSlideout.qml
index 3cbcd715..35aa3535 100644
--- a/quickshell/Widgets/DankSlideout.qml
+++ b/quickshell/Widgets/DankSlideout.qml
@@ -202,4 +202,4 @@ PanelWindow {
}
}
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/Widgets/DankTabBar.qml b/quickshell/Widgets/DankTabBar.qml
index e2f2be85..f29a62f2 100644
--- a/quickshell/Widgets/DankTabBar.qml
+++ b/quickshell/Widgets/DankTabBar.qml
@@ -251,4 +251,4 @@ FocusScope {
Qt.callLater(updateIndicator)
}
onWidthChanged: Qt.callLater(updateIndicator)
-}
\ No newline at end of file
+}
diff --git a/quickshell/Widgets/DankTextField.qml b/quickshell/Widgets/DankTextField.qml
index f0620069..a0d7d7d3 100644
--- a/quickshell/Widgets/DankTextField.qml
+++ b/quickshell/Widgets/DankTextField.qml
@@ -139,7 +139,7 @@ StyledRect {
MouseArea {
anchors.fill: parent
- hoverEnabled: true
+ hoverEnabled: true
cursorShape: Qt.IBeamCursor
acceptedButtons: Qt.NoButton
}
diff --git a/quickshell/Widgets/DankTooltip.qml b/quickshell/Widgets/DankTooltip.qml
index be880352..0e57de9f 100644
--- a/quickshell/Widgets/DankTooltip.qml
+++ b/quickshell/Widgets/DankTooltip.qml
@@ -89,4 +89,4 @@ PanelWindow {
width: Math.min(implicitWidth, 300 - Theme.spacingM * 2)
}
}
-}
\ No newline at end of file
+}
diff --git a/quickshell/assets/dank.svg b/quickshell/assets/dank.svg
index a78609e7..73ba0b4d 100644
--- a/quickshell/assets/dank.svg
+++ b/quickshell/assets/dank.svg
@@ -7,7 +7,7 @@