diff --git a/Modules/Greetd/GreeterContent.qml b/Modules/Greetd/GreeterContent.qml index fa6109f4..1042ba5c 100644 --- a/Modules/Greetd/GreeterContent.qml +++ b/Modules/Greetd/GreeterContent.qml @@ -11,6 +11,7 @@ import Quickshell.Services.Mpris import qs.Common import qs.Services import qs.Widgets +import qs.Modules.Lock Item { id: root @@ -322,6 +323,8 @@ Item { TextInput { id: inputField + property bool syncingFromState: false + anchors.fill: parent anchors.leftMargin: lockIcon.width + Theme.spacingM * 2 anchors.rightMargin: { @@ -329,6 +332,9 @@ Item { if (GreeterState.showPasswordInput && revealButton.visible) { margin += revealButton.width } + if (virtualKeyboardButton.visible) { + margin += virtualKeyboardButton.width + } if (enterButton.visible) { margin += enterButton.width + 2 } @@ -338,6 +344,7 @@ Item { focus: true echoMode: GreeterState.showPasswordInput ? (parent.showPassword ? TextInput.Normal : TextInput.Password) : TextInput.Normal onTextChanged: { + if (syncingFromState) return if (GreeterState.showPasswordInput) { GreeterState.passwordBuffer = text } else { @@ -355,13 +362,17 @@ Item { GreeterState.showPasswordInput = true PortalService.getGreeterUserProfileImage(GreeterState.username) GreeterState.passwordBuffer = "" - inputField.text = "" + syncingFromState = true + text = "" + syncingFromState = false } } } Component.onCompleted: { + syncingFromState = true text = GreeterState.showPasswordInput ? GreeterState.passwordBuffer : GreeterState.usernameInput + syncingFromState = false if (isPrimaryScreen) forceActiveFocus() } @@ -371,12 +382,18 @@ Item { } } + KeyboardController { + id: keyboard_controller + target: inputField + rootObject: root + } + StyledText { id: placeholder anchors.left: lockIcon.right anchors.leftMargin: Theme.spacingM - anchors.right: (GreeterState.showPasswordInput && revealButton.visible ? revealButton.left : (enterButton.visible ? enterButton.left : parent.right)) + anchors.right: (GreeterState.showPasswordInput && revealButton.visible ? revealButton.left : (virtualKeyboardButton.visible ? virtualKeyboardButton.left : (enterButton.visible ? enterButton.left : parent.right))) anchors.rightMargin: 2 anchors.verticalCenter: parent.verticalCenter text: { @@ -413,7 +430,7 @@ Item { StyledText { anchors.left: lockIcon.right anchors.leftMargin: Theme.spacingM - anchors.right: (GreeterState.showPasswordInput && revealButton.visible ? revealButton.left : (enterButton.visible ? enterButton.left : parent.right)) + anchors.right: (GreeterState.showPasswordInput && revealButton.visible ? revealButton.left : (virtualKeyboardButton.visible ? virtualKeyboardButton.left : (enterButton.visible ? enterButton.left : parent.right))) anchors.rightMargin: 2 anchors.verticalCenter: parent.verticalCenter text: { @@ -441,8 +458,8 @@ Item { DankActionButton { id: revealButton - anchors.right: enterButton.visible ? enterButton.left : parent.right - anchors.rightMargin: enterButton.visible ? 0 : Theme.spacingS + anchors.right: virtualKeyboardButton.visible ? virtualKeyboardButton.left : (enterButton.visible ? enterButton.left : parent.right) + anchors.rightMargin: 0 anchors.verticalCenter: parent.verticalCenter iconName: parent.showPassword ? "visibility_off" : "visibility" buttonSize: 32 @@ -450,6 +467,24 @@ Item { enabled: visible onClicked: parent.showPassword = !parent.showPassword } + DankActionButton { + id: virtualKeyboardButton + + anchors.right: enterButton.visible ? enterButton.left : parent.right + anchors.rightMargin: enterButton.visible ? 0 : Theme.spacingS + anchors.verticalCenter: parent.verticalCenter + iconName: "keyboard" + buttonSize: 32 + visible: Greetd.state === GreetdState.Inactive && !GreeterState.unlocking + enabled: visible + onClicked: { + if (keyboard_controller.isKeyboardActive) { + keyboard_controller.hide() + } else { + keyboard_controller.show() + } + } + } DankActionButton { id: enterButton