summaryrefslogtreecommitdiff
path: root/modules/lock
diff options
context:
space:
mode:
Diffstat (limited to 'modules/lock')
-rw-r--r--modules/lock/Center.qml417
-rw-r--r--modules/lock/Content.qml27
-rw-r--r--modules/lock/InputField.qml149
-rw-r--r--modules/lock/Lock.qml55
-rw-r--r--modules/lock/LockSurface.qml231
-rw-r--r--modules/lock/Pam.qml193
6 files changed, 0 insertions, 1072 deletions
diff --git a/modules/lock/Center.qml b/modules/lock/Center.qml
deleted file mode 100644
index 4e2215b..0000000
--- a/modules/lock/Center.qml
+++ /dev/null
@@ -1,417 +0,0 @@
-pragma ComponentBehavior: Bound
-
-import qs.components
-import qs.components.controls
-import qs.services
-import qs.config
-import qs.utils
-import QtQuick
-import QtQuick.Layouts
-
-ColumnLayout {
- id: root
-
- required property var lock
- readonly property list<string> timeComponents: Time.format(Config.services.useTwelveHourClock ? "hh:mm:A" : "hh:mm").split(":")
- readonly property real centerScale: Math.min(1, (lock.screen?.height ?? 1440) / 1440)
- readonly property int centerWidth: Config.lock.sizes.centerWidth * centerScale
-
- Layout.preferredWidth: centerWidth
- Layout.fillWidth: false
- Layout.fillHeight: true
-
- spacing: Appearance.spacing.large * 2
-
- RowLayout {
- Layout.alignment: Qt.AlignHCenter
- spacing: Appearance.spacing.small
-
- StyledText {
- Layout.alignment: Qt.AlignVCenter
- text: root.timeComponents[0]
- color: Colours.palette.m3secondary
- font.pointSize: Math.floor(Appearance.font.size.extraLarge * 3 * root.centerScale)
- font.family: Appearance.font.family.clock
- font.bold: true
- }
-
- StyledText {
- Layout.alignment: Qt.AlignVCenter
- text: ":"
- color: Colours.palette.m3primary
- font.pointSize: Math.floor(Appearance.font.size.extraLarge * 3 * root.centerScale)
- font.family: Appearance.font.family.clock
- font.bold: true
- }
-
- StyledText {
- Layout.alignment: Qt.AlignVCenter
- text: root.timeComponents[1]
- color: Colours.palette.m3secondary
- font.pointSize: Math.floor(Appearance.font.size.extraLarge * 3 * root.centerScale)
- font.family: Appearance.font.family.clock
- font.bold: true
- }
-
- Loader {
- Layout.leftMargin: Appearance.spacing.small
- Layout.alignment: Qt.AlignVCenter
-
- asynchronous: true
- active: Config.services.useTwelveHourClock
- visible: active
-
- sourceComponent: StyledText {
- text: root.timeComponents[2] ?? ""
- color: Colours.palette.m3primary
- font.pointSize: Math.floor(Appearance.font.size.extraLarge * 2 * root.centerScale)
- font.family: Appearance.font.family.clock
- font.bold: true
- }
- }
- }
-
- StyledText {
- Layout.alignment: Qt.AlignHCenter
- Layout.topMargin: -Appearance.padding.large * 2
-
- text: Time.format("dddd, d MMMM yyyy")
- color: Colours.palette.m3tertiary
- font.pointSize: Math.floor(Appearance.font.size.extraLarge * root.centerScale)
- font.family: Appearance.font.family.mono
- font.bold: true
- }
-
- StyledClippingRect {
- Layout.topMargin: Appearance.spacing.large * 2
- Layout.alignment: Qt.AlignHCenter
-
- implicitWidth: root.centerWidth / 2
- implicitHeight: root.centerWidth / 2
-
- color: Colours.tPalette.m3surfaceContainer
- radius: Appearance.rounding.full
-
- MaterialIcon {
- anchors.centerIn: parent
-
- text: "person"
- color: Colours.palette.m3onSurfaceVariant
- font.pointSize: Math.floor(root.centerWidth / 4)
- }
-
- Image {
- id: pfp
-
- anchors.fill: parent
- source: Paths.face
- }
- }
-
- StyledRect {
- Layout.alignment: Qt.AlignHCenter
-
- implicitWidth: root.centerWidth * 0.8
- implicitHeight: input.implicitHeight + Appearance.padding.small * 2
-
- color: Colours.tPalette.m3surfaceContainer
- radius: Appearance.rounding.full
-
- focus: true
- onActiveFocusChanged: {
- if (!activeFocus)
- forceActiveFocus();
- }
-
- Keys.onPressed: event => {
- if (root.lock.unlocking)
- return;
-
- if (event.key === Qt.Key_Enter || event.key === Qt.Key_Return)
- inputField.placeholder.animate = false;
-
- root.lock.pam.handleKey(event);
- }
-
- StateLayer {
- hoverEnabled: false
- cursorShape: Qt.IBeamCursor
-
- function onClicked(): void {
- parent.forceActiveFocus();
- }
- }
-
- RowLayout {
- id: input
-
- anchors.fill: parent
- anchors.margins: Appearance.padding.small
- spacing: Appearance.spacing.normal
-
- Item {
- implicitWidth: implicitHeight
- implicitHeight: fprintIcon.implicitHeight + Appearance.padding.small * 2
-
- MaterialIcon {
- id: fprintIcon
-
- anchors.centerIn: parent
- animate: true
- text: {
- if (root.lock.pam.fprint.tries >= Config.lock.maxFprintTries)
- return "fingerprint_off";
- if (root.lock.pam.fprint.active)
- return "fingerprint";
- return "lock";
- }
- color: root.lock.pam.fprint.tries >= Config.lock.maxFprintTries ? Colours.palette.m3error : Colours.palette.m3onSurface
- opacity: root.lock.pam.passwd.active ? 0 : 1
-
- Behavior on opacity {
- Anim {}
- }
- }
-
- CircularIndicator {
- anchors.fill: parent
- running: root.lock.pam.passwd.active
- }
- }
-
- InputField {
- id: inputField
-
- pam: root.lock.pam
- }
-
- StyledRect {
- implicitWidth: implicitHeight
- implicitHeight: enterIcon.implicitHeight + Appearance.padding.small * 2
-
- color: root.lock.pam.buffer ? Colours.palette.m3primary : Colours.layer(Colours.palette.m3surfaceContainerHigh, 2)
- radius: Appearance.rounding.full
-
- StateLayer {
- color: root.lock.pam.buffer ? Colours.palette.m3onPrimary : Colours.palette.m3onSurface
-
- function onClicked(): void {
- root.lock.pam.passwd.start();
- }
- }
-
- MaterialIcon {
- id: enterIcon
-
- anchors.centerIn: parent
- text: "arrow_forward"
- color: root.lock.pam.buffer ? Colours.palette.m3onPrimary : Colours.palette.m3onSurface
- font.weight: 500
- }
- }
- }
- }
-
- Item {
- Layout.fillWidth: true
- Layout.topMargin: -Appearance.spacing.large
-
- implicitHeight: Math.max(message.implicitHeight, stateMessage.implicitHeight)
-
- Behavior on implicitHeight {
- Anim {}
- }
-
- StyledText {
- id: stateMessage
-
- readonly property string msg: {
- if (Hypr.kbLayout !== Hypr.defaultKbLayout) {
- if (Hypr.capsLock && Hypr.numLock)
- return qsTr("Caps lock and Num lock are ON.\nKeyboard layout: %1").arg(Hypr.kbLayoutFull);
- if (Hypr.capsLock)
- return qsTr("Caps lock is ON. Kb layout: %1").arg(Hypr.kbLayoutFull);
- if (Hypr.numLock)
- return qsTr("Num lock is ON. Kb layout: %1").arg(Hypr.kbLayoutFull);
- return qsTr("Keyboard layout: %1").arg(Hypr.kbLayoutFull);
- }
-
- if (Hypr.capsLock && Hypr.numLock)
- return qsTr("Caps lock and Num lock are ON.");
- if (Hypr.capsLock)
- return qsTr("Caps lock is ON.");
- if (Hypr.numLock)
- return qsTr("Num lock is ON.");
-
- return "";
- }
-
- property bool shouldBeVisible
-
- onMsgChanged: {
- if (msg) {
- if (opacity > 0) {
- animate = true;
- text = msg;
- animate = false;
- } else {
- text = msg;
- }
- shouldBeVisible = true;
- } else {
- shouldBeVisible = false;
- }
- }
-
- anchors.left: parent.left
- anchors.right: parent.right
-
- scale: shouldBeVisible && !message.msg ? 1 : 0.7
- opacity: shouldBeVisible && !message.msg ? 1 : 0
- color: Colours.palette.m3onSurfaceVariant
- animateProp: "opacity"
-
- font.family: Appearance.font.family.mono
- horizontalAlignment: Qt.AlignHCenter
- wrapMode: Text.WrapAtWordBoundaryOrAnywhere
- lineHeight: 1.2
-
- Behavior on scale {
- Anim {}
- }
-
- Behavior on opacity {
- Anim {}
- }
- }
-
- StyledText {
- id: message
-
- readonly property Pam pam: root.lock.pam
- readonly property string msg: {
- if (pam.fprintState === "error")
- return qsTr("FP ERROR: %1").arg(pam.fprint.message);
- if (pam.state === "error")
- return qsTr("PW ERROR: %1").arg(pam.passwd.message);
-
- if (pam.lockMessage)
- return pam.lockMessage;
-
- if (pam.state === "max" && pam.fprintState === "max")
- return qsTr("Maximum password and fingerprint attempts reached.");
- if (pam.state === "max") {
- if (pam.fprint.available)
- return qsTr("Maximum password attempts reached. Please use fingerprint.");
- return qsTr("Maximum password attempts reached.");
- }
- if (pam.fprintState === "max")
- return qsTr("Maximum fingerprint attempts reached. Please use password.");
-
- if (pam.state === "fail") {
- if (pam.fprint.available)
- return qsTr("Incorrect password. Please try again or use fingerprint.");
- return qsTr("Incorrect password. Please try again.");
- }
- if (pam.fprintState === "fail")
- return qsTr("Fingerprint not recognized (%1/%2). Please try again or use password.").arg(pam.fprint.tries).arg(Config.lock.maxFprintTries);
-
- return "";
- }
-
- anchors.left: parent.left
- anchors.right: parent.right
-
- scale: 0.7
- opacity: 0
- color: Colours.palette.m3error
-
- font.pointSize: Appearance.font.size.small
- font.family: Appearance.font.family.mono
- horizontalAlignment: Qt.AlignHCenter
- wrapMode: Text.WrapAtWordBoundaryOrAnywhere
-
- onMsgChanged: {
- if (msg) {
- if (opacity > 0) {
- animate = true;
- text = msg;
- animate = false;
-
- exitAnim.stop();
- if (scale < 1)
- appearAnim.restart();
- else
- flashAnim.restart();
- } else {
- text = msg;
- exitAnim.stop();
- appearAnim.restart();
- }
- } else {
- appearAnim.stop();
- flashAnim.stop();
- exitAnim.start();
- }
- }
-
- Connections {
- target: root.lock.pam
-
- function onFlashMsg(): void {
- exitAnim.stop();
- if (message.scale < 1)
- appearAnim.restart();
- else
- flashAnim.restart();
- }
- }
-
- Anim {
- id: appearAnim
-
- target: message
- properties: "scale,opacity"
- to: 1
- onFinished: flashAnim.restart()
- }
-
- SequentialAnimation {
- id: flashAnim
-
- loops: 2
-
- FlashAnim {
- to: 0.3
- }
- FlashAnim {
- to: 1
- }
- }
-
- ParallelAnimation {
- id: exitAnim
-
- Anim {
- target: message
- property: "scale"
- to: 0.7
- duration: Appearance.anim.durations.large
- }
- Anim {
- target: message
- property: "opacity"
- to: 0
- duration: Appearance.anim.durations.large
- }
- }
- }
- }
-
- component FlashAnim: NumberAnimation {
- target: message
- property: "opacity"
- duration: Appearance.anim.durations.small
- easing.type: Easing.Linear
- }
-}
diff --git a/modules/lock/Content.qml b/modules/lock/Content.qml
deleted file mode 100644
index daa87ac..0000000
--- a/modules/lock/Content.qml
+++ /dev/null
@@ -1,27 +0,0 @@
-import qs.components
-import qs.services
-import qs.config
-import QtQuick
-import QtQuick.Layouts
-
-RowLayout {
- id: root
-
- required property var lock
-
- spacing: Appearance.spacing.large * 2
-
- ColumnLayout {
- Layout.fillWidth: true
- spacing: Appearance.spacing.normal
- }
-
- Center {
- lock: root.lock
- }
-
- ColumnLayout {
- Layout.fillWidth: true
- spacing: Appearance.spacing.normal
- }
-}
diff --git a/modules/lock/InputField.qml b/modules/lock/InputField.qml
deleted file mode 100644
index 1acc787..0000000
--- a/modules/lock/InputField.qml
+++ /dev/null
@@ -1,149 +0,0 @@
-pragma ComponentBehavior: Bound
-
-import qs.components
-import qs.services
-import qs.config
-import Quickshell
-import QtQuick
-import QtQuick.Layouts
-
-Item {
- id: root
-
- required property Pam pam
- readonly property alias placeholder: placeholder
- property string buffer
-
- Layout.fillWidth: true
- Layout.fillHeight: true
-
- clip: true
-
- Connections {
- target: root.pam
-
- function onBufferChanged(): void {
- if (root.pam.buffer.length > root.buffer.length) {
- charList.bindImWidth();
- } else if (root.pam.buffer.length === 0) {
- charList.implicitWidth = charList.implicitWidth;
- placeholder.animate = true;
- }
-
- root.buffer = root.pam.buffer;
- }
- }
-
- StyledText {
- id: placeholder
-
- anchors.centerIn: parent
-
- text: {
- if (root.pam.passwd.active)
- return qsTr("Loading...");
- if (root.pam.state === "max")
- return qsTr("You have reached the maximum number of tries");
- return qsTr("Enter your password");
- }
-
- animate: true
- color: root.pam.passwd.active ? Colours.palette.m3secondary : Colours.palette.m3outline
- font.pointSize: Appearance.font.size.normal
- font.family: Appearance.font.family.mono
-
- opacity: root.buffer ? 0 : 1
-
- Behavior on opacity {
- Anim {}
- }
- }
-
- ListView {
- id: charList
-
- readonly property int fullWidth: count * (implicitHeight + spacing) - spacing
-
- function bindImWidth(): void {
- imWidthBehavior.enabled = false;
- implicitWidth = Qt.binding(() => fullWidth);
- imWidthBehavior.enabled = true;
- }
-
- anchors.centerIn: parent
- anchors.horizontalCenterOffset: implicitWidth > root.width ? -(implicitWidth - root.width) / 2 : 0
-
- implicitWidth: fullWidth
- implicitHeight: Appearance.font.size.normal
-
- orientation: Qt.Horizontal
- spacing: Appearance.spacing.small / 2
- interactive: false
-
- model: ScriptModel {
- values: root.buffer.split("")
- }
-
- delegate: StyledRect {
- id: ch
-
- implicitWidth: implicitHeight
- implicitHeight: charList.implicitHeight
-
- color: Colours.palette.m3onSurface
- radius: Appearance.rounding.full
-
- opacity: 0
- scale: 0
- Component.onCompleted: {
- opacity = 1;
- scale = 1;
- }
- ListView.onRemove: removeAnim.start()
-
- SequentialAnimation {
- id: removeAnim
-
- PropertyAction {
- target: ch
- property: "ListView.delayRemove"
- value: true
- }
- ParallelAnimation {
- Anim {
- target: ch
- property: "opacity"
- to: 0
- }
- Anim {
- target: ch
- property: "scale"
- to: 0.5
- }
- }
- PropertyAction {
- target: ch
- property: "ListView.delayRemove"
- value: false
- }
- }
-
- Behavior on opacity {
- Anim {}
- }
-
- Behavior on scale {
- Anim {
- duration: Appearance.anim.durations.expressiveFastSpatial
- easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial
- }
- }
- }
-
- Behavior on implicitWidth {
- id: imWidthBehavior
-
- Anim {}
- }
- }
-}
diff --git a/modules/lock/Lock.qml b/modules/lock/Lock.qml
deleted file mode 100644
index 6fd5277..0000000
--- a/modules/lock/Lock.qml
+++ /dev/null
@@ -1,55 +0,0 @@
-pragma ComponentBehavior: Bound
-
-import qs.components.misc
-import Quickshell
-import Quickshell.Io
-import Quickshell.Wayland
-
-Scope {
- property alias lock: lock
-
- WlSessionLock {
- id: lock
-
- signal unlock
-
- LockSurface {
- lock: lock
- pam: pam
- }
- }
-
- Pam {
- id: pam
-
- lock: lock
- }
-
- CustomShortcut {
- name: "lock"
- description: "Lock the current session"
- onPressed: lock.locked = true
- }
-
- CustomShortcut {
- name: "unlock"
- description: "Unlock the current session"
- onPressed: lock.unlock()
- }
-
- IpcHandler {
- target: "lock"
-
- function lock(): void {
- lock.locked = true;
- }
-
- function unlock(): void {
- lock.unlock();
- }
-
- function isLocked(): bool {
- return lock.locked;
- }
- }
-}
diff --git a/modules/lock/LockSurface.qml b/modules/lock/LockSurface.qml
deleted file mode 100644
index 0c3ce69..0000000
--- a/modules/lock/LockSurface.qml
+++ /dev/null
@@ -1,231 +0,0 @@
-pragma ComponentBehavior: Bound
-
-import qs.components
-import qs.services
-import qs.config
-import qs.utils
-import Quickshell.Wayland
-import QtQuick
-import QtQuick.Effects
-
-WlSessionLockSurface {
- id: root
-
- required property WlSessionLock lock
- required property Pam pam
-
- readonly property alias unlocking: unlockAnim.running
-
- color: "transparent"
-
- Connections {
- target: root.lock
-
- function onUnlock(): void {
- unlockAnim.start();
- }
- }
-
- SequentialAnimation {
- id: unlockAnim
-
- ParallelAnimation {
- Anim {
- target: lockContent
- properties: "implicitWidth,implicitHeight"
- to: lockContent.size
- duration: Appearance.anim.durations.expressiveDefaultSpatial
- easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial
- }
- Anim {
- target: lockBg
- property: "radius"
- to: lockContent.radius
- }
- Anim {
- target: content
- property: "scale"
- to: 0
- duration: Appearance.anim.durations.expressiveDefaultSpatial
- easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial
- }
- Anim {
- target: content
- property: "opacity"
- to: 0
- duration: Appearance.anim.durations.small
- }
- Anim {
- target: lockIcon
- property: "opacity"
- to: 1
- duration: Appearance.anim.durations.large
- }
- Anim {
- target: background
- property: "opacity"
- to: 0
- duration: Appearance.anim.durations.large
- }
- SequentialAnimation {
- PauseAnimation {
- duration: Appearance.anim.durations.small
- }
- Anim {
- target: lockContent
- property: "opacity"
- to: 0
- }
- }
- }
- PropertyAction {
- target: root.lock
- property: "locked"
- value: false
- }
- }
-
- ParallelAnimation {
- id: initAnim
-
- running: true
-
- Anim {
- target: background
- property: "opacity"
- to: 1
- duration: Appearance.anim.durations.large
- }
- SequentialAnimation {
- ParallelAnimation {
- Anim {
- target: lockContent
- property: "scale"
- to: 1
- duration: Appearance.anim.durations.expressiveFastSpatial
- easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial
- }
- Anim {
- target: lockContent
- property: "rotation"
- to: 360
- duration: Appearance.anim.durations.expressiveFastSpatial
- easing.bezierCurve: Appearance.anim.curves.standardAccel
- }
- }
- ParallelAnimation {
- Anim {
- target: lockIcon
- property: "rotation"
- to: 360
- easing.bezierCurve: Appearance.anim.curves.standardDecel
- }
- Anim {
- target: lockIcon
- property: "opacity"
- to: 0
- }
- Anim {
- target: content
- property: "opacity"
- to: 1
- }
- Anim {
- target: content
- property: "scale"
- to: 1
- duration: Appearance.anim.durations.expressiveDefaultSpatial
- easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial
- }
- Anim {
- target: lockBg
- property: "radius"
- to: Appearance.rounding.large * 1.5
- }
- Anim {
- target: lockContent
- property: "implicitWidth"
- to: root.screen?.height * Config.lock.sizes.heightMult * Config.lock.sizes.ratio
- duration: Appearance.anim.durations.expressiveDefaultSpatial
- easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial
- }
- Anim {
- target: lockContent
- property: "implicitHeight"
- to: root.screen?.height * Config.lock.sizes.heightMult
- duration: Appearance.anim.durations.expressiveDefaultSpatial
- easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial
- }
- }
- }
- }
-
- Image {
- id: background
-
- anchors.fill: parent
- source: Paths.wallpaper ?? ""
- opacity: 1
-
- layer.enabled: true
- layer.effect: MultiEffect {
- autoPaddingEnabled: false
- blurEnabled: true
- blur: 1
- blurMax: 64
- blurMultiplier: 1
- }
- }
-
- Item {
- id: lockContent
-
- readonly property int size: lockIcon.implicitHeight + Appearance.padding.large * 4
- readonly property int radius: size / 4 * Appearance.rounding.scale
-
- anchors.centerIn: parent
- implicitWidth: size
- implicitHeight: size
-
- rotation: 180
- scale: 0
-
- StyledRect {
- id: lockBg
-
- anchors.fill: parent
- color: Colours.palette.m3surface
- radius: parent.radius
- opacity: Colours.transparency.enabled ? Colours.transparency.base : 1
-
- layer.enabled: true
- layer.effect: MultiEffect {
- shadowEnabled: true
- blurMax: 15
- shadowColor: Qt.alpha(Colours.palette.m3shadow, 0.7)
- }
- }
-
- MaterialIcon {
- id: lockIcon
-
- anchors.centerIn: parent
- text: "lock"
- font.pointSize: Appearance.font.size.extraLarge * 4
- font.bold: true
- rotation: 180
- }
-
- Content {
- id: content
-
- anchors.centerIn: parent
- width: (root.screen?.height ?? 0) * Config.lock.sizes.heightMult * Config.lock.sizes.ratio - Appearance.padding.large * 2
- height: (root.screen?.height ?? 0) * Config.lock.sizes.heightMult - Appearance.padding.large * 2
-
- lock: root
- opacity: 0
- scale: 0
- }
- }
-}
diff --git a/modules/lock/Pam.qml b/modules/lock/Pam.qml
deleted file mode 100644
index 0186c2f..0000000
--- a/modules/lock/Pam.qml
+++ /dev/null
@@ -1,193 +0,0 @@
-import qs.config
-import Quickshell
-import Quickshell.Io
-import Quickshell.Wayland
-import Quickshell.Services.Pam
-import QtQuick
-
-Scope {
- id: root
-
- required property WlSessionLock lock
-
- readonly property alias passwd: passwd
- readonly property alias fprint: fprint
- property string lockMessage
- property string state
- property string fprintState
- property string buffer
-
- signal flashMsg
-
- function handleKey(event: KeyEvent): void {
- if (passwd.active || state === "max")
- return;
-
- if (event.key === Qt.Key_Enter || event.key === Qt.Key_Return) {
- passwd.start();
- } else if (event.key === Qt.Key_Backspace) {
- if (event.modifiers & Qt.ControlModifier) {
- buffer = "";
- } else {
- buffer = buffer.slice(0, -1);
- }
- } else if (" abcdefghijklmnopqrstuvwxyz1234567890`~!@#$%^&*()-_=+[{]}\\|;:'\",<.>/?".includes(event.text.toLowerCase())) {
- // No illegal characters (you are insane if you use unicode in your password)
- buffer += event.text;
- }
- }
-
- PamContext {
- id: passwd
-
- config: "passwd"
- configDirectory: Quickshell.shellDir + "/assets/pam.d"
-
- onMessageChanged: {
- if (message.startsWith("The account is locked"))
- root.lockMessage = message;
- else if (root.lockMessage && message.endsWith(" left to unlock)"))
- root.lockMessage += "\n" + message;
- }
-
- onResponseRequiredChanged: {
- if (!responseRequired)
- return;
-
- respond(root.buffer);
- root.buffer = "";
- }
-
- onCompleted: res => {
- if (res === PamResult.Success)
- return root.lock.unlock();
-
- if (res === PamResult.Error)
- root.state = "error";
- else if (res === PamResult.MaxTries)
- root.state = "max";
- else if (res === PamResult.Failed)
- root.state = "fail";
-
- root.flashMsg();
- stateReset.restart();
- }
- }
-
- PamContext {
- id: fprint
-
- property bool available
- property int tries
- property int errorTries
-
- function checkAvail(): void {
- if (!available || !Config.lock.enableFprint || !root.lock.secure) {
- abort();
- return;
- }
-
- tries = 0;
- errorTries = 0;
- start();
- }
-
- config: "fprint"
- configDirectory: Quickshell.shellDir + "/assets/pam.d"
-
- onCompleted: res => {
- if (!available)
- return;
-
- if (res === PamResult.Success)
- return root.lock.unlock();
-
- if (res === PamResult.Error) {
- root.fprintState = "error";
- errorTries++;
- if (errorTries < 5) {
- abort();
- errorRetry.restart();
- }
- } else if (res === PamResult.MaxTries) {
- // Isn't actually the real max tries as pam only reports completed
- // when max tries is reached.
- tries++;
- if (tries < Config.lock.maxFprintTries) {
- // Restart if not actually real max tries
- root.fprintState = "fail";
- start();
- } else {
- root.fprintState = "max";
- abort();
- }
- }
-
- root.flashMsg();
- fprintStateReset.start();
- }
- }
-
- Process {
- id: availProc
-
- command: ["sh", "-c", "fprintd-list $USER"]
- onExited: code => {
- fprint.available = code === 0;
- fprint.checkAvail();
- }
- }
-
- Timer {
- id: errorRetry
-
- interval: 800
- onTriggered: fprint.start()
- }
-
- Timer {
- id: stateReset
-
- interval: 4000
- onTriggered: {
- if (root.state !== "max")
- root.state = "";
- }
- }
-
- Timer {
- id: fprintStateReset
-
- interval: 4000
- onTriggered: {
- root.fprintState = "";
- fprint.errorTries = 0;
- }
- }
-
- Connections {
- target: root.lock
-
- function onSecureChanged(): void {
- if (root.lock.secure) {
- availProc.running = true;
- root.buffer = "";
- root.state = "";
- root.fprintState = "";
- root.lockMessage = "";
- }
- }
-
- function onUnlock(): void {
- fprint.abort();
- }
- }
-
- Connections {
- target: Config.lock
-
- function onEnableFprintChanged(): void {
- fprint.checkAvail();
- }
- }
-}