//@ pragma UseQApplication import Quickshell import Quickshell.Wayland import Quickshell.Io import Quickshell.Services.Greetd import QtQml ShellRoot { id: displaymanager settings.watchFiles: false property string currentText: "" property string username: @username@ property list command: @niri_session@ property list messages: [] property bool responseRequired: false property bool responseVisible: false signal startAuth() onStartAuth: { if (Greetd.state !== GreetdState.Inactive) Greetd.cancelSession(); displaymanager.messages = []; Greetd.createSession(displaymanager.username); } Connections { target: Greetd function onStateChanged() { console.log("greetd state: ", GreetdState.toString(Greetd.state)); if (Greetd.state === GreetdState.ReadyToLaunch) Greetd.launch(displaymanager.command); } function onAuthMessage(message: string, error: bool, responseRequired: bool, echoResponse: bool) { displaymanager.responseVisible = echoResponse; displaymanager.responseRequired = responseRequired; displaymanager.messages = Array.from(displaymanager.messages).concat([{ "text": message, "error": error }]); } function onAuthFailure(message: string) { displaymanager.responseRequired = false; displaymanager.messages = Array.from(displaymanager.messages).concat([{ "text": message, "error": true }]); } } Component.onCompleted: { if (Greetd.state !== GreetdState.Inactive) Greetd.cancelSession(); } Variants { model: Quickshell.screens delegate: Scope { id: screenScope required property var modelData PanelWindow { color: "black" screen: screenScope.modelData WlrLayershell.keyboardFocus: WlrKeyboardFocus.Exclusive anchors.top: true anchors.bottom: true anchors.left: true anchors.right: true LockSurface { id: surfaceContent screen: screenScope.modelData onCurrentTextChanged: displaymanager.currentText = currentText Connections { target: displaymanager function onCurrentTextChanged() { surfaceContent.currentText = displaymanager.currentText; } function onMessagesChanged() { surfaceContent.messages = Array.from(displaymanager.messages); } function onResponseRequiredChanged() { surfaceContent.responseRequired = displaymanager.responseRequired; } function onResponseVisibleChanged() { surfaceContent.responseVisible = displaymanager.responseVisible; } } onResponse: responseText => Greetd.respond(responseText); Connections { target: Greetd function onStateChanged() { if (Greetd.state === GreetdState.Authenticating) { surfaceContent.authRunning = true; } else { surfaceContent.authRunning = false; } } } onAuthRunningChanged: { if (surfaceContent.authRunning && Greetd.state !== GreetdState.Authenticating) displaymanager.startAuth(); } Component.onCompleted: { surfaceContent.authRunning = Greetd.state === GreetdState.Authenticating surfaceContent.messages = Array.from(displaymanager.messages); surfaceContent.responseVisible = displaymanager.responseVisible; surfaceContent.responseRequired = displaymanager.responseRequired; surfaceContent.currentText = displaymanager.currentText; } } } } } }