From 1cb30757de62aaadde8e65ad94335a37f40bdf71 Mon Sep 17 00:00:00 2001 From: ly-sec Date: Sat, 12 Jul 2025 11:05:58 +0200 Subject: [PATCH] Fix lockscreen Add lockscreen ipc call Edit Applauncher --- Bar/Modules/Applauncher.qml | 14 +- Helpers/IPCHandlers.qml | 10 ++ README.md | 8 +- Widgets/LockScreen.qml | 330 +----------------------------------- shell.qml | 5 + 5 files changed, 26 insertions(+), 341 deletions(-) diff --git a/Bar/Modules/Applauncher.qml b/Bar/Modules/Applauncher.qml index 047bef1..d9733d3 100644 --- a/Bar/Modules/Applauncher.qml +++ b/Bar/Modules/Applauncher.qml @@ -157,17 +157,9 @@ PanelWindow { radius: 22 height: 48 Layout.fillWidth: true - //border.color: searchField.activeFocus ? Theme.accentPrimary : Theme.outline - //border.width: searchField.activeFocus ? 2.5 : 1.5 - layer.enabled: searchField.activeFocus - layer.effect: DropShadow { - color: Theme.accentPrimary - radius: 12 - samples: 16 - verticalOffset: 0 - horizontalOffset: 0 - opacity: 0.10 - } + border.color: searchField.activeFocus ? Theme.accentPrimary : Theme.outline + border.width: 2 + RowLayout { anchors.fill: parent spacing: 10 diff --git a/Helpers/IPCHandlers.qml b/Helpers/IPCHandlers.qml index 6599e34..ad66af2 100644 --- a/Helpers/IPCHandlers.qml +++ b/Helpers/IPCHandlers.qml @@ -2,6 +2,7 @@ import Quickshell.Io IpcHandler { property var appLauncherPanel + property var lockScreen target: "globalIPC" @@ -18,4 +19,13 @@ IpcHandler { appLauncherPanel.showAt(); } } + + function toggleLock(): void { + if (!lockScreen) { + console.warn("LockScreenIpcHandler: lockScreen not set!"); + return; + } + console.log("[IPC] LockScreen lock() called"); + lockScreen.locked = true; + } } diff --git a/README.md b/README.md index bea2274..401c2a8 100644 --- a/README.md +++ b/README.md @@ -118,12 +118,18 @@ To make the weather widget, wallpaper manager and record button work you will ha
Keybinds -### Open Applauncher: +### Toggle Applauncher: ``` qs ipc call globalIPC toggleLauncher ``` +### Toggle Lockscreen: + +``` +qs ipc call globalIPC toggleLock +``` + You can keybind it however you want in your niri setup.
diff --git a/Widgets/LockScreen.qml b/Widgets/LockScreen.qml index 3c0c24c..fc19e9e 100644 --- a/Widgets/LockScreen.qml +++ b/Widgets/LockScreen.qml @@ -14,7 +14,6 @@ import "../Helpers/Weather.js" as WeatherHelper // Password-only lockscreen for all screens WlSessionLock { id: lock - property bool demoMode: true // Set to true for demo/recording mode property string errorMessage: "" property bool authenticating: false property string password: "" @@ -121,303 +120,9 @@ WlSessionLock { console.log("PAM start result:", started); } - // Remove the surface property and use a Loader instead - Loader { - anchors.fill: parent - active: true - sourceComponent: demoMode ? demoComponent : lockComponent - } - Component { - id: demoComponent - Window { - id: demoWindow - visible: true - width: 900 - height: 600 - color: "transparent" - flags: Qt.Window | Qt.FramelessWindowHint - // Blurred wallpaper background - Image { - id: demoBgImage - anchors.fill: parent - fillMode: Image.PreserveAspectCrop - source: WallpaperManager.currentWallpaper !== "" ? WallpaperManager.currentWallpaper : "/home/lysec/nixos/assets/wallpapers/lantern.png" - cache: true - smooth: true - sourceSize.width: 2560 - sourceSize.height: 1440 - visible: true // Show the original for FastBlur input - } - FastBlur { - anchors.fill: parent - source: demoBgImage - radius: 48 // Adjust blur strength as needed - transparentBorder: true - } - // Main content container (moved up, Rectangle removed) - ColumnLayout { - anchors.centerIn: parent - spacing: 30 - width: Math.min(parent.width * 0.8, 400) - // User avatar/icon - Rectangle { - Layout.alignment: Qt.AlignHCenter - width: 80 - height: 80 - radius: 40 - color: Theme.accentPrimary - - Image { - id: avatarImage - anchors.fill: parent - anchors.margins: 4 - source: Settings.profileImage - fillMode: Image.PreserveAspectCrop - visible: false // Only show the masked version - asynchronous: true - } - OpacityMask { - anchors.fill: avatarImage - source: avatarImage - maskSource: Rectangle { - width: avatarImage.width - height: avatarImage.height - radius: avatarImage.width / 2 - visible: false - } - visible: Settings.profileImage !== "" - } - // Fallback icon - Text { - anchors.centerIn: parent - text: "person" - font.family: "Material Symbols Outlined" - font.pixelSize: 32 - color: Theme.onAccent - visible: Settings.profileImage === "" - } - // Glow effect - layer.enabled: true - layer.effect: Glow { - color: Theme.accentPrimary - radius: 8 - samples: 16 - } - } - // Username - Text { - Layout.alignment: Qt.AlignHCenter - text: Settings.userName - font.pixelSize: 24 - font.weight: Font.Medium - color: Theme.textPrimary - } - - // Password input container - Rectangle { - Layout.fillWidth: true - height: 50 - radius: 25 - color: Theme.surface - opacity: 0.3 - border.color: passwordInput.activeFocus ? Theme.accentPrimary : Theme.outline - border.width: 2 - - TextInput { - id: passwordInput - anchors.fill: parent - anchors.margins: 15 - verticalAlignment: TextInput.AlignVCenter - horizontalAlignment: TextInput.AlignHCenter - font.pixelSize: 16 - color: Theme.textPrimary - echoMode: TextInput.Password - passwordCharacter: "●" - passwordMaskDelay: 0 - - text: lock.password - onTextChanged: lock.password = text - - // Placeholder text - Text { - anchors.centerIn: parent - text: "Enter password..." - color: Theme.textSecondary - opacity: 0.6 - font.pixelSize: 16 - visible: !passwordInput.text && !passwordInput.activeFocus - } - - // Handle Enter key - Keys.onPressed: function(event) { - if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) { - lock.unlockAttempt() - } - } - } - } - - // Error message - Text { - Layout.alignment: Qt.AlignHCenter - text: lock.errorMessage - color: Theme.error - font.pixelSize: 14 - visible: lock.errorMessage !== "" - opacity: lock.errorMessage !== "" ? 1 : 0 - - Behavior on opacity { - NumberAnimation { duration: 200 } - } - } - - // Unlock button - Rectangle { - Layout.alignment: Qt.AlignHCenter - width: 120 - height: 44 - radius: 22 - color: unlockButtonArea.containsMouse ? Theme.accentPrimary : "transparent" - border.color: Theme.accentPrimary - border.width: 2 - opacity: lock.authenticating ? 0.5 : 0.8 - enabled: !lock.authenticating - - Text { - anchors.centerIn: parent - text: lock.authenticating ? "Authenticating..." : "Unlock" - font.pixelSize: 16 - font.bold: true - color: unlockButtonArea.containsMouse ? Theme.onAccent : Theme.accentPrimary - } - - MouseArea { - id: unlockButtonArea - anchors.fill: parent - hoverEnabled: true - onClicked: { - if (!lock.authenticating) { - lock.unlockAttempt() - } - } - } - } - // Bypass Login button - Rectangle { - Layout.alignment: Qt.AlignHCenter - width: 120 - height: 44 - radius: 22 - color: bypassButtonArea.containsMouse ? Theme.accentSecondary : "transparent" - border.color: Theme.accentSecondary - border.width: 2 - opacity: lock.authenticating ? 0.5 : 0.8 - enabled: !lock.authenticating - - Text { - anchors.centerIn: parent - text: "Bypass Login" - font.pixelSize: 16 - font.bold: true - color: bypassButtonArea.containsMouse ? Theme.onAccent : Theme.accentSecondary - } - - MouseArea { - id: bypassButtonArea - anchors.fill: parent - hoverEnabled: true - onClicked: { - if (!lock.authenticating) { - lock.locked = false; - lock.errorMessage = ""; - lock.password = ""; - } - } - } - } - } - - // Top-center info panel (clock + weather) - ColumnLayout { - anchors.top: parent.top - anchors.horizontalCenter: parent.horizontalCenter - anchors.topMargin: 40 - spacing: 8 - // Clock - Text { - id: timeText - text: Qt.formatDateTime(new Date(), "HH:mm") - font.pixelSize: 48 - font.bold: true - color: Theme.textPrimary - horizontalAlignment: Text.AlignHCenter - Layout.alignment: Qt.AlignHCenter - } - Text { - id: dateText - text: Qt.formatDateTime(new Date(), "dddd, MMMM d") - font.pixelSize: 16 - color: Theme.textSecondary - opacity: 0.8 - horizontalAlignment: Text.AlignHCenter - Layout.alignment: Qt.AlignHCenter - } - // Weather info (centered, no city) - RowLayout { - spacing: 6 - Layout.alignment: Qt.AlignHCenter - anchors.horizontalCenter: parent.horizontalCenter - visible: weatherData && weatherData.current_weather - Text { - text: weatherData && weatherData.current_weather ? materialSymbolForCode(weatherData.current_weather.weathercode) : "cloud" - font.family: "Material Symbols Outlined" - font.pixelSize: 28 - color: Theme.accentPrimary - verticalAlignment: Text.AlignVCenter - } - Text { - text: weatherData && weatherData.current_weather ? (Settings.useFahrenheit ? `${Math.round(weatherData.current_weather.temperature * 9/5 + 32)}°F` : `${Math.round(weatherData.current_weather.temperature)}°C`) : (Settings.useFahrenheit ? "--°F" : "--°C") - font.pixelSize: 18 - color: Theme.textSecondary - verticalAlignment: Text.AlignVCenter - } - } - // Weather error - Text { - text: weatherError - color: Theme.error - visible: weatherError !== "" - font.pixelSize: 10 - horizontalAlignment: Text.AlignHCenter - Layout.alignment: Qt.AlignHCenter - } - } - - // Update clock every second - Timer { - interval: 1000 - running: true - repeat: true - onTriggered: { - timeText.text = Qt.formatDateTime(new Date(), "HH:mm") - dateText.text = Qt.formatDateTime(new Date(), "dddd, MMMM d") - } - } - - // Update weather every 10 minutes - Timer { - interval: 600000 // 10 minutes - running: true - repeat: true - onTriggered: { - fetchWeatherData() - } - } - } - } Component { id: lockComponent @@ -427,7 +132,7 @@ WlSessionLock { id: lockBgImage anchors.fill: parent fillMode: Image.PreserveAspectCrop - source: WallpaperManager.currentWallpaper !== "" ? WallpaperManager.currentWallpaper : "/home/lysec/nixos/assets/wallpapers/lantern.png" + source: Settings.currentWallpaper !== "" ? Settings.currentWallpaper : "/home/lysec/nixos/assets/wallpapers/lantern.png" cache: true smooth: true sourceSize.width: 2560 @@ -590,39 +295,6 @@ WlSessionLock { } } } - // Bypass Login button - Rectangle { - Layout.alignment: Qt.AlignHCenter - width: 120 - height: 44 - radius: 22 - color: bypassButtonArea.containsMouse ? Theme.accentSecondary : "transparent" - border.color: Theme.accentSecondary - border.width: 2 - opacity: lock.authenticating ? 0.5 : 0.8 - enabled: !lock.authenticating - - Text { - anchors.centerIn: parent - text: "Bypass Login" - font.pixelSize: 16 - font.bold: true - color: bypassButtonArea.containsMouse ? Theme.onAccent : Theme.accentSecondary - } - - MouseArea { - id: bypassButtonArea - anchors.fill: parent - hoverEnabled: true - onClicked: { - if (!lock.authenticating) { - lock.locked = false; - lock.errorMessage = ""; - lock.password = ""; - } - } - } - } } // Top-center info panel (clock + weather) diff --git a/shell.qml b/shell.qml index 0bcaab3..f669f72 100644 --- a/shell.qml +++ b/shell.qml @@ -29,6 +29,10 @@ Scope { visible: false } + LockScreen { + id: lockScreen + } + NotificationServer { id: notificationServer onNotification: function(notification) { @@ -54,5 +58,6 @@ Scope { IPCHandlers { appLauncherPanel: appLauncherPanel + lockScreen: lockScreen } }