display corners

This commit is contained in:
Damocles 2026-04-12 15:17:19 +02:00
parent cfe1f948ec
commit d6d108ee7c
5 changed files with 96 additions and 0 deletions

View file

@ -59,6 +59,7 @@ PanelWindow {
Layout.maximumWidth: 400 Layout.maximumWidth: 400
visible: M.Modules.windowTitle visible: M.Modules.windowTitle
} }
Item { Layout.fillWidth: true }
} }
// ---- right ---- // ---- right ----

87
modules/ScreenCorners.qml Normal file
View file

@ -0,0 +1,87 @@
import QtQuick
import Quickshell
import Quickshell.Wayland
import "." as M
// Empty region = no input area clicks pass through to windows below
// Draws rounded black corners at the edges of each screen.
// Disabled when screenRadius is 0 (the default).
Item {
id: root
required property var screen
readonly property int _r: M.Theme.screenRadius
Repeater {
model: root._r > 0 ? [
{ top: true, left: true, right: false, bottom: false, corner: 0 },
{ top: true, left: false, right: true, bottom: false, corner: 1 },
{ top: false, left: true, right: false, bottom: true, corner: 2 },
{ top: false, left: false, right: true, bottom: true, corner: 3 }
] : []
delegate: PanelWindow {
id: cornerWindow
required property var modelData
screen: root.screen
color: "transparent"
WlrLayershell.layer: WlrLayer.Overlay
WlrLayershell.exclusiveZone: 0
WlrLayershell.namespace: "nova-corners"
mask: Region {}
anchors.top: cornerWindow.modelData.top
anchors.left: cornerWindow.modelData.left
anchors.right: cornerWindow.modelData.right
anchors.bottom: cornerWindow.modelData.bottom
implicitWidth: root._r
implicitHeight: root._r
Canvas {
anchors.fill: parent
onPaint: {
const r = root._r;
const ctx = getContext("2d");
ctx.clearRect(0, 0, r, r);
ctx.fillStyle = "black";
ctx.beginPath();
switch (cornerWindow.modelData.corner) {
case 0: // top-left
ctx.moveTo(0, 0);
ctx.lineTo(r, 0);
ctx.arc(r, r, r, -Math.PI / 2, Math.PI, true);
ctx.closePath();
break;
case 1: // top-right
ctx.moveTo(r, 0);
ctx.lineTo(0, 0);
ctx.arc(0, r, r, -Math.PI / 2, 0, false);
ctx.closePath();
break;
case 2: // bottom-left
ctx.moveTo(0, r);
ctx.lineTo(0, 0);
ctx.arc(r, 0, r, Math.PI, Math.PI / 2, true);
ctx.closePath();
break;
case 3: // bottom-right
ctx.moveTo(r, r);
ctx.lineTo(r, 0);
ctx.arc(0, 0, r, 0, Math.PI / 2, false);
ctx.closePath();
break;
}
ctx.fill();
}
}
}
}
}

View file

@ -34,6 +34,7 @@ QtObject {
property int barSpacing: 12 property int barSpacing: 12
property int moduleSpacing: 4 property int moduleSpacing: 4
property int radius: 4 property int radius: 4
property int screenRadius: 15
property FileView _themeFile: FileView { property FileView _themeFile: FileView {
path: (Quickshell.env("XDG_CONFIG_HOME") || (Quickshell.env("HOME") + "/.config")) + "/nova-shell/theme.json" path: (Quickshell.env("XDG_CONFIG_HOME") || (Quickshell.env("HOME") + "/.config")) + "/nova-shell/theme.json"
@ -72,5 +73,7 @@ QtObject {
root.moduleSpacing = data.moduleSpacing; root.moduleSpacing = data.moduleSpacing;
if (data.radius !== undefined) if (data.radius !== undefined)
root.radius = data.radius; root.radius = data.radius;
if (data.screenRadius !== undefined)
root.screenRadius = data.screenRadius;
} }
} }

View file

@ -12,6 +12,7 @@ Volume 1.0 Volume.qml
Tray 1.0 Tray.qml Tray 1.0 Tray.qml
TrayMenu 1.0 TrayMenu.qml TrayMenu 1.0 TrayMenu.qml
PowerMenu 1.0 PowerMenu.qml PowerMenu 1.0 PowerMenu.qml
ScreenCorners 1.0 ScreenCorners.qml
ThemedIcon 1.0 ThemedIcon.qml ThemedIcon 1.0 ThemedIcon.qml
Battery 1.0 Battery.qml Battery 1.0 Battery.qml
Mpris 1.0 Mpris.qml Mpris 1.0 Mpris.qml

View file

@ -18,6 +18,10 @@ ShellRoot {
Flyout { Flyout {
screen: scope.modelData screen: scope.modelData
} }
ScreenCorners {
screen: scope.modelData
}
} }
} }
} }