lockscreen background

This commit is contained in:
Zacharias-Brohn
2025-12-05 19:45:15 +01:00
parent 563d881d6f
commit 64fc68cc3a
11 changed files with 211 additions and 168 deletions
-10
View File
@@ -40,16 +40,6 @@ Scope {
implicitHeight: 34 implicitHeight: 34
} }
NotificationCenter {
bar: bar
}
Process {
id: ncProcess
command: ["sh", "-c", `qs -p ${bar.root}/shell.qml ipc call root showCenter`]
running: false
}
anchors { anchors {
top: true top: true
left: true left: true
+1
View File
@@ -2,4 +2,5 @@ import Quickshell.Io
JsonObject { JsonObject {
property bool fixLockScreen: false property bool fixLockScreen: false
property bool useWallpaper: true
} }
+4
View File
@@ -39,6 +39,10 @@ Singleton {
signal configReloaded signal configReloaded
function getActiveScreen(): ShellScreen {
return Quickshell.screens.find(screen => root.monitorFor(screen) === root.focusedMonitor)
}
function dispatch(request: string): void { function dispatch(request: string): void {
Hyprland.dispatch(request); Hyprland.dispatch(request);
} }
+20 -11
View File
@@ -21,7 +21,7 @@ WlSessionLockSurface {
property string buffer property string buffer
color: overlay.visible ? "black" : "transparent" color: "transparent"
Connections { Connections {
target: root.pam target: root.pam
@@ -38,7 +38,7 @@ WlSessionLockSurface {
} }
Timer { Timer {
interval: 100 interval: 5
running: true running: true
repeat: false repeat: false
onTriggered: { onTriggered: {
@@ -62,6 +62,7 @@ WlSessionLockSurface {
onTextChanged: text = "" onTextChanged: text = ""
} }
ScreencopyView { ScreencopyView {
id: background id: background
@@ -70,23 +71,31 @@ WlSessionLockSurface {
anchors.fill: parent anchors.fill: parent
captureSource: root.screen captureSource: root.screen
opacity: 1 opacity: 1
visible: !Config.lock.useWallpaper
layer.enabled: true layer.enabled: true
layer.effect: MultiEffect { layer.effect: MultiEffect {
autoPaddingEnabled: false autoPaddingEnabled: false
blurEnabled: true blurEnabled: true
blur: 2 blur: 0.8
blurMax: 32 blurMax: 64
blurMultiplier: 0 blurMultiplier: 1
brightness: 0
} }
} }
// Image { Image {
// id: backgroundImage id: backgroundImage
// anchors.fill: parent anchors.fill: parent
// asynchronous: true asynchronous: false
// source: root.backgroundImage cache: false
// } source: WallpaperPath.lockscreenBg
visible: Config.lock.useWallpaper
Component.onCompleted: {
console.log(source);
}
}
Rectangle { Rectangle {
id: overlay id: overlay
+2 -1
View File
@@ -1,3 +1,4 @@
import Quickshell.Hyprland
import QtQuick import QtQuick
import qs.Config import qs.Config
import qs.Helpers import qs.Helpers
@@ -32,7 +33,7 @@ Item {
anchors.fill: parent anchors.fill: parent
cursorShape: Qt.PointingHandCursor cursorShape: Qt.PointingHandCursor
onClicked: { onClicked: {
ncProcess.running = true Hyprland.dispatch("global zshell-nc:toggle-nc");
} }
} }
} }
+145 -134
View File
@@ -12,163 +12,174 @@ import qs.Daemons
import qs.Effects import qs.Effects
PanelWindow { PanelWindow {
id: root id: root
color: "transparent" color: "transparent"
anchors { anchors {
top: true top: true
right: true right: true
left: true left: true
bottom: true bottom: true
} }
WlrLayershell.namespace: "ZShell-Notifs" WlrLayershell.namespace: "ZShell-Notifs"
WlrLayershell.layer: WlrLayer.Overlay WlrLayershell.layer: WlrLayer.Overlay
WlrLayershell.keyboardFocus: WlrKeyboardFocus.OnDemand WlrLayershell.keyboardFocus: WlrKeyboardFocus.OnDemand
required property PanelWindow bar property bool centerShown: false
property bool centerShown: false property alias posX: backgroundRect.x
property alias posX: backgroundRect.x visible: false
visible: false
mask: Region { item: backgroundRect } mask: Region { item: backgroundRect }
IpcHandler { Connections {
id: ipcHandler target: Hypr
target: "root"
function showCenter(): void { root.centerShown = !root.centerShown; } function onFocusedMonitorChanged(): void {
} if ( !root.centerShown ) {
root.screen = Hypr.getActiveScreen();
}
}
}
onVisibleChanged: { GlobalShortcut {
if ( root.visible ) { appid: "zshell-nc"
showAnimation.start(); name: "toggle-nc"
} onPressed: {
} root.screen = Hypr.getActiveScreen();
root.centerShown = !root.centerShown;
}
}
onCenterShownChanged: { onVisibleChanged: {
if ( !root.centerShown ) { if ( root.visible ) {
closeAnimation.start(); showAnimation.start();
closeTimer.start(); }
} else { }
root.visible = true;
}
}
Keys.onPressed: { onCenterShownChanged: {
if ( event.key === Qt.Key_Escape ) { if ( !root.centerShown ) {
root.centerShown = false; closeAnimation.start();
event.accepted = true; closeTimer.start();
} } else {
} root.visible = true;
}
}
Timer { Keys.onPressed: {
id: closeTimer if ( event.key === Qt.Key_Escape ) {
interval: 300 root.centerShown = false;
onTriggered: { event.accepted = true;
root.visible = false; }
} }
}
NumberAnimation { Timer {
id: showAnimation id: closeTimer
target: backgroundRect interval: 300
property: "x" onTriggered: {
to: Math.round(root.bar.screen.width - backgroundRect.implicitWidth - 10) root.visible = false;
from: root.bar.screen.width }
duration: MaterialEasing.expressiveEffectsTime }
easing.bezierCurve: MaterialEasing.expressiveEffects
onStopped: {
focusGrab.active = true;
}
}
NumberAnimation { NumberAnimation {
id: closeAnimation id: showAnimation
target: backgroundRect target: backgroundRect
property: "x" property: "x"
from: root.bar.screen.width - backgroundRect.implicitWidth - 10 to: Math.round(root.screen.width - backgroundRect.implicitWidth - 10)
to: root.bar.screen.width from: root.screen.width
duration: MaterialEasing.expressiveEffectsTime duration: MaterialEasing.expressiveEffectsTime
easing.bezierCurve: MaterialEasing.expressiveEffects easing.bezierCurve: MaterialEasing.expressiveEffects
} onStopped: {
focusGrab.active = true;
}
}
HyprlandFocusGrab { NumberAnimation {
id: focusGrab id: closeAnimation
active: false target: backgroundRect
windows: [ root ] property: "x"
onCleared: { from: root.screen.width - backgroundRect.implicitWidth - 10
root.centerShown = false; to: root.screen.width
} duration: MaterialEasing.expressiveEffectsTime
} easing.bezierCurve: MaterialEasing.expressiveEffects
}
TrackedNotification { HyprlandFocusGrab {
centerShown: root.centerShown id: focusGrab
bar: root.bar active: false
} windows: [ root ]
onCleared: {
root.centerShown = false;
}
}
ShadowRect { TrackedNotification {
anchors.fill: backgroundRect centerShown: root.centerShown
radius: backgroundRect.radius screen: root.screen
} }
Rectangle { ShadowRect {
id: backgroundRect anchors.fill: backgroundRect
y: 10 radius: backgroundRect.radius
x: Screen.width }
z: 1
property color backgroundColor: Config.useDynamicColors ? DynamicColors.tPalette.m3surface : Config.baseBgColor Rectangle {
id: backgroundRect
y: 10
x: Screen.width
z: 1
implicitWidth: 400 property color backgroundColor: Config.useDynamicColors ? DynamicColors.tPalette.m3surface : Config.baseBgColor
implicitHeight: root.height - 20
color: backgroundColor
radius: 8
border.color: "#555555"
border.width: Config.useDynamicColors ? 0 : 1
ColumnLayout {
anchors.fill: parent
anchors.margins: 10
spacing: 10
NotificationCenterHeader { } implicitWidth: 400
implicitHeight: root.height - 20
color: backgroundColor
radius: 8
border.color: "#555555"
border.width: Config.useDynamicColors ? 0 : 1
ColumnLayout {
anchors.fill: parent
anchors.margins: 10
spacing: 10
Rectangle { NotificationCenterHeader { }
color: "#333333"
Layout.preferredHeight: Config.useDynamicColors ? 0 : 1
Layout.fillWidth: true
}
Flickable { Rectangle {
Layout.fillWidth: true color: "#333333"
Layout.fillHeight: true Layout.preferredHeight: Config.useDynamicColors ? 0 : 1
pixelAligned: true Layout.fillWidth: true
contentHeight: notificationColumn.implicitHeight }
clip: true
Column { Flickable {
id: notificationColumn Layout.fillWidth: true
width: parent.width Layout.fillHeight: true
spacing: 10 pixelAligned: true
contentHeight: notificationColumn.implicitHeight
clip: true
add: Transition { Column {
NumberAnimation { id: notificationColumn
properties: "x"; width: parent.width
duration: 300; spacing: 10
easing.type: Easing.OutCubic
}
}
move: Transition { add: Transition {
NumberAnimation { NumberAnimation {
properties: "x"; properties: "x";
duration: 200; duration: 300;
easing.type: Easing.OutCubic easing.type: Easing.OutCubic
} }
} }
GroupListView { } move: Transition {
NumberAnimation {
properties: "x";
duration: 200;
easing.type: Easing.OutCubic
}
}
} GroupListView { }
}
} }
} }
}
}
} }
+8 -8
View File
@@ -4,10 +4,10 @@ import Quickshell
import QtQuick import QtQuick
Singleton { Singleton {
id: root id: root
readonly property string time: { readonly property string time: {
Qt.formatDateTime(clock.date, "ddd d MMM - hh:mm:ss") Qt.formatDateTime(clock.date, "ddd d MMM - hh:mm:ss")
} }
readonly property string shortTime: { readonly property string shortTime: {
Qt.formatDateTime(clock.date, "hh:mm") Qt.formatDateTime(clock.date, "hh:mm")
@@ -17,8 +17,8 @@ Singleton {
Qt.formatDateTime(clock.date, "hh:mm:ss") Qt.formatDateTime(clock.date, "hh:mm:ss")
} }
SystemClock { SystemClock {
id: clock id: clock
precision: SystemClock.Seconds precision: SystemClock.Seconds
} }
} }
+2 -4
View File
@@ -12,7 +12,6 @@ import qs.Effects
PanelWindow { PanelWindow {
id: root id: root
color: "transparent" color: "transparent"
screen: root.bar.screen
anchors { anchors {
top: true top: true
@@ -28,10 +27,9 @@ PanelWindow {
exclusionMode: ExclusionMode.Ignore exclusionMode: ExclusionMode.Ignore
property list<Region> notifRegions: [] property list<Region> notifRegions: []
required property bool centerShown required property bool centerShown
required property PanelWindow bar
property color textColor: Config.useDynamicColors ? DynamicColors.palette.m3onSurface : "white" property color textColor: Config.useDynamicColors ? DynamicColors.palette.m3onSurface : "white"
property color backgroundColor: Config.useDynamicColors ? DynamicColors.tPalette.m3surface : Config.baseBgColor property color backgroundColor: Config.useDynamicColors ? DynamicColors.tPalette.m3surface : Config.baseBgColor
visible: Hyprland.monitorFor(screen).focused // visible: Hyprland.monitorFor(screen).focused
ListView { ListView {
id: notifListView id: notifListView
@@ -44,7 +42,7 @@ PanelWindow {
} }
anchors.top: parent.top anchors.top: parent.top
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
x: root.centerShown ? root.bar.width - width - 420 : root.bar.width - width - 20 x: root.centerShown ? root.screen.width - width - 420 : root.screen.width - width - 20
z: 0 z: 0
anchors.topMargin: 54 anchors.topMargin: 54
width: 400 width: 400
+22
View File
@@ -0,0 +1,22 @@
uniform sampler2D image;
out vec4 FragmentColor;
uniform float offset[3] = float[](0.0, 1.3846153846, 3.2307692308);
uniform float weight[3] = float[](0.2270270270, 0.3162162162, 0.0702702703);
void main(void) {
FragmentColor = texture2D(image, vec2(gl_FragCoord) / 1024.0) * weight[0];
for (int i=1; i<3; i++) {
FragmentColor +=
texture2D(image, (vec2(gl_FragCoord) + vec2(0.0, offset[i])) / 1024.0)
* weight[i];
FragmentColor +=
texture2D(image, (vec2(gl_FragCoord) - vec2(0.0, offset[i])) / 1024.0)
* weight[i];
}
}
+3
View File
@@ -3,8 +3,11 @@ import argparse
def gen_blurred_image(input_image, output_path): def gen_blurred_image(input_image, output_path):
img = Image.open(input_image) img = Image.open(input_image)
size = img.size
img = img.resize((size[0] // 2, size[1] // 2), Image.NEAREST)
img = img.filter(ImageFilter.GaussianBlur(40)) img = img.filter(ImageFilter.GaussianBlur(40))
# img = img.resize(size, Image.LANCZOS)
img.save(output_path, "PNG") img.save(output_path, "PNG")
+4
View File
@@ -17,4 +17,8 @@ Scope {
IdleInhibitor { IdleInhibitor {
lock: lock lock: lock
} }
NotificationCenter {
}
} }