greeter test

This commit is contained in:
Zacharias-Brohn
2026-03-18 23:39:37 +01:00
parent e65ec01b12
commit 6b482979fe
104 changed files with 7911 additions and 3 deletions
+140
View File
@@ -0,0 +1,140 @@
pragma ComponentBehavior: Bound
import Quickshell
import Quickshell.Services.Greetd
import Quickshell.Io
import QtQuick
Scope {
id: root
property bool awaitingResponse: false
property string buffer: ""
property bool echoResponse: false
property string errorMessage: ""
property bool launching: false
property string promptMessage: ""
readonly property var selectedSession: sessionIndex >= 0 ? sessions[sessionIndex] : null
property int sessionIndex: sessions.length > 0 ? 0 : -1
property var sessions: []
required property string username
signal flashMsg
function handleKey(event: KeyEvent): void {
if (launching)
return;
if (event.key === Qt.Key_Enter || event.key === Qt.Key_Return) {
submit();
event.accepted = true;
return;
}
if (event.key === Qt.Key_Backspace) {
if (event.modifiers & Qt.ControlModifier)
buffer = "";
else
buffer = buffer.slice(0, -1);
event.accepted = true;
return;
}
if (event.text && !/[\r\n]/.test(event.text)) {
buffer += event.text;
event.accepted = true;
}
}
function launchSelected(): void {
if (!selectedSession || !selectedSession.command || selectedSession.command.length === 0) {
errorMessage = qsTr("No session selected.");
flashMsg();
launching = false;
return;
}
launching = true;
Greetd.launch(selectedSession.command, [], true);
}
function submit(): void {
errorMessage = "";
if (awaitingResponse) {
Greetd.respond(buffer);
buffer = "";
awaitingResponse = false;
return;
}
Greetd.createSession(username);
}
Process {
id: sessionLister
command: ["python3", Quickshell.shellDir + "/scripts/get-sessions"]
running: true
stdout: StdioCollector {
onStreamFinished: {
try {
root.sessions = JSON.parse(text);
if (root.sessions.length > 0 && root.sessionIndex < 0)
root.sessionIndex = 0;
} catch (e) {
root.errorMessage = `Failed to parse sessions: ${e}`;
}
}
}
}
Connections {
function onAuthFailure(message): void {
root.awaitingResponse = false;
root.launching = false;
root.buffer = "";
root.errorMessage = message || qsTr("Authentication failed.");
root.flashMsg();
}
function onAuthMessage(message, error, responseRequired, echoResponse): void {
root.promptMessage = message;
root.echoResponse = echoResponse;
if (error) {
root.errorMessage = message;
root.flashMsg();
}
if (responseRequired) {
// lets the existing “type password then press enter” UX still work
if (root.buffer.length > 0) {
Greetd.respond(root.buffer);
root.buffer = "";
root.awaitingResponse = false;
} else {
root.awaitingResponse = true;
}
} else {
root.awaitingResponse = false;
}
}
function onError(error): void {
root.awaitingResponse = false;
root.launching = false;
root.errorMessage = error;
root.flashMsg();
}
function onReadyToLaunch(): void {
root.launchSelected();
}
target: Greetd
}
}