lockscreen: add example

This commit is contained in:
outfoxxed 2024-03-08 03:42:49 -08:00
parent 0c568317df
commit 56dc79816b
Signed by: outfoxxed
GPG Key ID: 4C88A185FB89301E
6 changed files with 160 additions and 0 deletions

View File

@ -0,0 +1,43 @@
import QtQuick
import Quickshell
import Quickshell.Io
QtObject {
property int status: AuthContext.Status.FirstLogin
signal unlocked();
enum Status {
FirstLogin,
Authenticating,
LoginFailed
}
property string password
property var pamtester: Process {
property bool failed: true
command: ["pamtester", "login", Quickshell.env("USER"), "authenticate"]
onStarted: this.write(`${password}\n`)
stdout: SplitParser {
// fails go to stderr
onRead: pamtester.failed = false
}
onExited: {
if (failed) {
status = AuthContext.Status.LoginFailed;
} else {
unlocked();
}
}
}
function tryLogin(password: string) {
this.password = password
status = AuthContext.Status.Authenticating;
pamtester.running = true;
}
}

51
lockscreen/Lockscreen.qml Normal file
View File

@ -0,0 +1,51 @@
import QtQuick
import QtQuick.Controls.Basic
Item {
required property AuthContext context
Item {
anchors.centerIn: parent
scale: 2
TextField {
id: entryBox
anchors.centerIn: parent
width: 300
enabled: context.status != AuthContext.Status.Authenticating
focus: true
horizontalAlignment: TextInput.AlignHCenter
echoMode: TextInput.Password
inputMethodHints: Qt.ImhSensitiveData
placeholderText: "Enter password"
onAccepted: {
if (text != "") context.tryLogin(text)
}
onEnabledChanged: {
if (enabled) text = ""
}
}
Text {
id: status
color: "white"
anchors {
horizontalCenter: entryBox.horizontalCenter
top: entryBox.bottom
topMargin: 20
}
text: {
switch (context.status) {
case AuthContext.Status.FirstLogin: return ""
case AuthContext.Status.Authenticating: return "Authenticating"
case AuthContext.Status.LoginFailed: return "Login Failed"
}
}
}
}
}

10
lockscreen/README.md Normal file
View File

@ -0,0 +1,10 @@
# Lockscreen
This is a barebones lockscreen with a password input box.
Note that you MUST have `pamtester` installed or you won't be able to log in.
You can run the lockscreen with `quickshell -c shell.qml`.
You can run the lockscreen in test mode (as a window) with `quickshell -c test.qml`.
![](./image.png)

BIN
lockscreen/image.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

38
lockscreen/shell.qml Normal file
View File

@ -0,0 +1,38 @@
import QtQuick
import QtQuick.Controls.Basic
import Quickshell
import Quickshell.Wayland
ShellRoot {
AuthContext {
id: authContext
onUnlocked: lock.locked = false
}
SessionLock {
id: lock
locked: true
onLockedChanged: {
if (!locked) Qt.quit();
}
SessionLockSurface {
// You probably want to replace this with an image.
color: "#303030"
// For your own sanity you should probably keep this
// while working on the lockscreen.
Button {
text: "Help! I misconfigured my lockscreen!"
onClicked: lock.locked = false
}
Lockscreen {
anchors.fill: parent
context: authContext
}
}
}
}

18
lockscreen/test.qml Normal file
View File

@ -0,0 +1,18 @@
import QtQuick
import Quickshell
ShellRoot {
AuthContext {
id: authContext
onUnlocked: Qt.quit()
}
FloatingWindow {
color: "#303030"
Lockscreen {
anchors.fill: parent
context: authContext
}
}
}