feat: show messages under the menu instead of waiting for a key

This commit is contained in:
Felitendo committed 2026-09-22 23:07:51 +02:00
1 parent 51d29d84a6
commit dc0f680652
4 files changed
+108 -100

No files matched your search

-3
View File
@@ -317,9 +317,6 @@ msgid ""
"password." "password."
msgstr "Das waren zu viele Versuche. Die Gesichtsentsperrung ist pausiert, bis du mit deinem Passwort entsperrst." msgstr "Das waren zu viele Versuche. Die Gesichtsentsperrung ist pausiert, bis du mit deinem Passwort entsperrst."
#: src/lib/menu.sh:122
msgid "Press any key to continue..."
msgstr "Beliebige Taste drücken …"
#: src/lib/menu.sh:130 #: src/lib/menu.sh:130
msgid "[y/N]" msgid "[y/N]"
+65 -68
View File
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: plasma-face-unlock 1.0.0\n" "Project-Id-Version: plasma-face-unlock 1.0.0\n"
"Report-Msgid-Bugs-To: https://github.com/LoonixTools/plasma-face-unlock/" "Report-Msgid-Bugs-To: https://github.com/LoonixTools/plasma-face-unlock/"
"issues\n" "issues\n"
"POT-Creation-Date: 2026-09-22 18:45+0200\n" "POT-Creation-Date: 2026-09-22 23:06+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -55,7 +55,8 @@ msgstr ""
msgid "First, set up your face." msgid "First, set up your face."
msgstr "" msgstr ""
#: src/plasma-face-unlock:100 src/plasma-face-unlock:120 src/lib/menu.sh:338 #: src/plasma-face-unlock:100 src/plasma-face-unlock:120 src/lib/menu.sh:348
#: src/lib/menu.sh:352 src/lib/menu.sh:358 src/lib/menu.sh:360
msgid "Could not save the setting." msgid "Could not save the setting."
msgstr "" msgstr ""
@@ -83,16 +84,16 @@ msgstr ""
msgid "No face is set up yet." msgid "No face is set up yet."
msgstr "" msgstr ""
#: src/plasma-face-unlock:148 src/lib/menu.sh:157 src/lib/menu.sh:460 #: src/plasma-face-unlock:148 src/lib/menu.sh:167 src/lib/menu.sh:472
msgid "on" msgid "on"
msgstr "" msgstr ""
#: src/plasma-face-unlock:148 src/lib/menu.sh:159 src/lib/menu.sh:169 #: src/plasma-face-unlock:148 src/lib/menu.sh:169 src/lib/menu.sh:179
#: src/lib/menu.sh:461 #: src/lib/menu.sh:473
msgid "off" msgid "off"
msgstr "" msgstr ""
#: src/plasma-face-unlock:150 src/lib/menu.sh:478 #: src/plasma-face-unlock:150 src/lib/menu.sh:490
#, sh-printf-format #, sh-printf-format
msgid "%s samples, %s learned" msgid "%s samples, %s learned"
msgstr "" msgstr ""
@@ -122,7 +123,7 @@ msgstr ""
msgid "Turn it off (faces are kept)" msgid "Turn it off (faces are kept)"
msgstr "" msgstr ""
#: src/plasma-face-unlock:176 src/lib/menu.sh:540 #: src/plasma-face-unlock:176 src/lib/menu.sh:555
msgid "Add a face" msgid "Add a face"
msgstr "" msgstr ""
@@ -221,7 +222,7 @@ msgstr ""
msgid "The camera could not be used." msgid "The camera could not be used."
msgstr "" msgstr ""
#: src/lib/daemon.sh:111 src/lib/menu.sh:233 #: src/lib/daemon.sh:111 src/lib/menu.sh:243
msgid "The recognition models are missing. Reinstall the package." msgid "The recognition models are missing. Reinstall the package."
msgstr "" msgstr ""
@@ -318,176 +319,172 @@ msgid ""
"password." "password."
msgstr "" msgstr ""
#: src/lib/menu.sh:122 #: src/lib/menu.sh:140
msgid "Press any key to continue..."
msgstr ""
#: src/lib/menu.sh:130
msgid "[y/N]" msgid "[y/N]"
msgstr "" msgstr ""
#: src/lib/menu.sh:149 src/lib/menu.sh:382 #: src/lib/menu.sh:159 src/lib/menu.sh:392
msgid "ON" msgid "ON"
msgstr "" msgstr ""
#: src/lib/menu.sh:151 src/lib/menu.sh:383 #: src/lib/menu.sh:161 src/lib/menu.sh:393
msgid "OFF" msgid "OFF"
msgstr "" msgstr ""
#: src/lib/menu.sh:167 #: src/lib/menu.sh:177
msgid "strict (blink or turn your head)" msgid "strict (blink or turn your head)"
msgstr "" msgstr ""
#: src/lib/menu.sh:168 #: src/lib/menu.sh:178
msgid "basic (screens and phone edges)" msgid "basic (screens and phone edges)"
msgstr "" msgstr ""
#: src/lib/menu.sh:170 #: src/lib/menu.sh:180
msgid "normal" msgid "normal"
msgstr "" msgstr ""
#: src/lib/menu.sh:171 #: src/lib/menu.sh:181
msgid "strict" msgid "strict"
msgstr "" msgstr ""
#: src/lib/menu.sh:172 #: src/lib/menu.sh:182
msgid "relaxed" msgid "relaxed"
msgstr "" msgstr ""
#: src/lib/menu.sh:173 #: src/lib/menu.sh:183
msgid "island with the face" msgid "island with the face"
msgstr "" msgstr ""
#: src/lib/menu.sh:174 #: src/lib/menu.sh:184
msgid "small pill with a lock" msgid "small pill with a lock"
msgstr "" msgstr ""
#: src/lib/menu.sh:175 #: src/lib/menu.sh:185
#, sh-printf-format #, sh-printf-format
msgid "%s seconds" msgid "%s seconds"
msgstr "" msgstr ""
#: src/lib/menu.sh:176 src/lib/menu.sh:313 #: src/lib/menu.sh:186 src/lib/menu.sh:323
msgid "automatic" msgid "automatic"
msgstr "" msgstr ""
#: src/lib/menu.sh:193 #: src/lib/menu.sh:203
msgid "Face unlock" msgid "Face unlock"
msgstr "" msgstr ""
#: src/lib/menu.sh:197 #: src/lib/menu.sh:207
msgid "Service" msgid "Service"
msgstr "" msgstr ""
#: src/lib/menu.sh:197 #: src/lib/menu.sh:207
msgid "not running" msgid "not running"
msgstr "" msgstr ""
#: src/lib/menu.sh:199 #: src/lib/menu.sh:209
msgid "Turning face unlock on again starts it." msgid "Turning face unlock on again starts it."
msgstr "" msgstr ""
#: src/lib/menu.sh:210 src/lib/menu.sh:212 src/lib/menu.sh:457 #: src/lib/menu.sh:220 src/lib/menu.sh:222 src/lib/menu.sh:469
#: src/lib/menu.sh:541 #: src/lib/menu.sh:556
msgid "Faces" msgid "Faces"
msgstr "" msgstr ""
#: src/lib/menu.sh:210 #: src/lib/menu.sh:220
msgid "none set up yet" msgid "none set up yet"
msgstr "" msgstr ""
#: src/lib/menu.sh:212 #: src/lib/menu.sh:222
msgid "all turned off" msgid "all turned off"
msgstr "" msgstr ""
#: src/lib/menu.sh:218 #: src/lib/menu.sh:228
msgid "none found" msgid "none found"
msgstr "" msgstr ""
#: src/lib/menu.sh:220 /tmp/tmp.q9gMIu3Tjj/settings.sh:9 #: src/lib/menu.sh:230 /tmp/tmp.FOzKaHKE4a/settings.sh:9
msgid "Camera" msgid "Camera"
msgstr "" msgstr ""
#: src/lib/menu.sh:222 #: src/lib/menu.sh:232
msgid "Lock screen" msgid "Lock screen"
msgstr "" msgstr ""
#: src/lib/menu.sh:223 #: src/lib/menu.sh:233
msgid "sudo" msgid "sudo"
msgstr "" msgstr ""
#: src/lib/menu.sh:224 #: src/lib/menu.sh:234
msgid "Admin prompts" msgid "Admin prompts"
msgstr "" msgstr ""
#: src/lib/menu.sh:225 /tmp/tmp.q9gMIu3Tjj/settings.sh:6 #: src/lib/menu.sh:235 /tmp/tmp.FOzKaHKE4a/settings.sh:6
msgid "Photo check" msgid "Photo check"
msgstr "" msgstr ""
#: src/lib/menu.sh:228 #: src/lib/menu.sh:238
msgid "Paused" msgid "Paused"
msgstr "" msgstr ""
#: src/lib/menu.sh:228 #: src/lib/menu.sh:238
#, sh-printf-format #, sh-printf-format
msgid "for %d more minutes, or until the password is used" msgid "for %d more minutes, or until the password is used"
msgstr "" msgstr ""
#: src/lib/menu.sh:230 #: src/lib/menu.sh:240
msgid "Last unlock" msgid "Last unlock"
msgstr "" msgstr ""
#: src/lib/menu.sh:309 #: src/lib/menu.sh:319
#, sh-printf-format #, sh-printf-format
msgid "automatic (%s)" msgid "automatic (%s)"
msgstr "" msgstr ""
#: src/lib/menu.sh:319 #: src/lib/menu.sh:329
msgid "(infrared)" msgid "(infrared)"
msgstr "" msgstr ""
#: src/lib/menu.sh:323 #: src/lib/menu.sh:333
msgid "(not connected)" msgid "(not connected)"
msgstr "" msgstr ""
#: src/lib/menu.sh:379 src/lib/menu.sh:542 #: src/lib/menu.sh:389 src/lib/menu.sh:557
msgid "Settings" msgid "Settings"
msgstr "" msgstr ""
#: src/lib/menu.sh:380 #: src/lib/menu.sh:390
msgid "Up/Down: select, Space or Right: change, q: back" msgid "Up/Down: select, Space or Right: change, q: back"
msgstr "" msgstr ""
#: src/lib/menu.sh:381 #: src/lib/menu.sh:391
msgid "Settings marked * are for the whole computer and ask for your password." msgid "Settings marked * are for the whole computer and ask for your password."
msgstr "" msgstr ""
#: src/lib/menu.sh:458 #: src/lib/menu.sh:470
msgid "Up/Down: select, Space: on/off, r: rename, d: delete, a: add, q: back" msgid "Up/Down: select, Space: on/off, r: rename, d: delete, a: add, q: back"
msgstr "" msgstr ""
#: src/lib/menu.sh:459 #: src/lib/menu.sh:471
msgid "No face is set up yet. Press a to add one." msgid "No face is set up yet. Press a to add one."
msgstr "" msgstr ""
#: src/lib/menu.sh:502 #: src/lib/menu.sh:516
msgid "New name:" msgid "New name:"
msgstr "" msgstr ""
#: src/lib/menu.sh:509 #: src/lib/menu.sh:523
#, sh-printf-format #, sh-printf-format
msgid "Delete \"%s\"?" msgid "Delete \"%s\"?"
msgstr "" msgstr ""
#: src/lib/menu.sh:539 #: src/lib/menu.sh:554
msgid "Turn face unlock on or off" msgid "Turn face unlock on or off"
msgstr "" msgstr ""
#: src/lib/menu.sh:543 #: src/lib/menu.sh:558
msgid "Try it" msgid "Try it"
msgstr "" msgstr ""
#: src/lib/menu.sh:544 #: src/lib/menu.sh:559
msgid "Quit" msgid "Quit"
msgstr "" msgstr ""
@@ -571,35 +568,35 @@ msgstr ""
msgid "Bubble for sudo and admin prompts too" msgid "Bubble for sudo and admin prompts too"
msgstr "" msgstr ""
#: src/agent/bubblecontroller.cpp:91 #: src/agent/bubblecontroller.cpp:92
msgid "Blink once" msgid "Blink once"
msgstr "" msgstr ""
#: src/agent/bubblecontroller.cpp:93 #: src/agent/bubblecontroller.cpp:94
msgid "Look at the screen" msgid "Look at the screen"
msgstr "" msgstr ""
#: src/agent/bubblecontroller.cpp:95 #: src/agent/bubblecontroller.cpp:96
msgid "Move closer" msgid "Move closer"
msgstr "" msgstr ""
#: src/agent/bubblecontroller.cpp:97 #: src/agent/bubblecontroller.cpp:98
msgid "Too dark" msgid "Too dark"
msgstr "" msgstr ""
#: src/agent/bubblecontroller.cpp:117 #: src/agent/bubblecontroller.cpp:118
msgid "Use your password" msgid "Use your password"
msgstr "" msgstr ""
#: src/agent/bubblecontroller.cpp:123 #: src/agent/bubblecontroller.cpp:124
msgid "Not recognized" msgid "Not recognized"
msgstr "" msgstr ""
#: src/agent/bubblecontroller.cpp:125 #: src/agent/bubblecontroller.cpp:126
msgid "Try again and blink" msgid "Try again and blink"
msgstr "" msgstr ""
#: src/agent/bubblecontroller.cpp:127 #: src/agent/bubblecontroller.cpp:128
msgid "Camera unavailable" msgid "Camera unavailable"
msgstr "" msgstr ""
@@ -743,26 +740,26 @@ msgid ""
"with glasses for example, from the menu." "with glasses for example, from the menu."
msgstr "" msgstr ""
#: src/agent/qml/Enroll.qml:156 #: src/agent/qml/Enroll.qml:157
msgid "Name (optional)" msgid "Name (optional)"
msgstr "" msgstr ""
#: src/agent/qml/Enroll.qml:171 #: src/agent/qml/Enroll.qml:172
msgid "Cancel" msgid "Cancel"
msgstr "" msgstr ""
#: src/agent/qml/Enroll.qml:177 #: src/agent/qml/Enroll.qml:178
msgid "Finish now" msgid "Finish now"
msgstr "" msgstr ""
#: src/agent/qml/Enroll.qml:182 #: src/agent/qml/Enroll.qml:183
msgid "Try again" msgid "Try again"
msgstr "" msgstr ""
#: src/agent/qml/Enroll.qml:182 #: src/agent/qml/Enroll.qml:183
msgid "Get started" msgid "Get started"
msgstr "" msgstr ""
#: src/agent/qml/Enroll.qml:187 #: src/agent/qml/Enroll.qml:188
msgid "Done" msgid "Done"
msgstr "" msgstr ""
+7 -7
View File
@@ -135,16 +135,16 @@ else
PFU_C_GREEN='' PFU_C_YELLOW='' PFU_C_RED='' PFU_C_GREEN='' PFU_C_YELLOW='' PFU_C_RED=''
fi fi
# Set by pfu_bad and pfu_note. The menu redraws straight after an action, which # What pfu_ok, pfu_bad and pfu_note printed. The menu redraws straight after an
# would wipe the screen; this marks that something was printed the user still # action, which wipes the screen, so it shows these again under the new frame
# has to read. # rather than holding everything up for a key press.
PFU_UI_NEEDS_ACK='' PFU_UI_NOTICES=()
pfu_say() { printf '%s\n' "$*"; } pfu_say() { printf '%s\n' "$*"; }
pfu_head() { printf '\n%s%s%s\n\n' "$PFU_C_BOLD$PFU_C_BLUE" "$*" "$PFU_C_RESET"; } pfu_head() { printf '\n%s%s%s\n\n' "$PFU_C_BOLD$PFU_C_BLUE" "$*" "$PFU_C_RESET"; }
pfu_ok() { printf '%s✔%s %s\n' "$PFU_C_GREEN" "$PFU_C_RESET" "$*"; } pfu_ok() { PFU_UI_NOTICES+=("$PFU_C_GREEN✔$PFU_C_RESET $*"); printf '%s✔%s %s\n' "$PFU_C_GREEN" "$PFU_C_RESET" "$*"; }
pfu_bad() { PFU_UI_NEEDS_ACK=1; printf '%s✘%s %s\n' "$PFU_C_RED" "$PFU_C_RESET" "$*" >&2; } pfu_bad() { PFU_UI_NOTICES+=("$PFU_C_RED✘$PFU_C_RESET $*"); printf '%s✘%s %s\n' "$PFU_C_RED" "$PFU_C_RESET" "$*" >&2; }
pfu_note() { PFU_UI_NEEDS_ACK=1; printf '%s•%s %s\n' "$PFU_C_DIM" "$PFU_C_RESET" "$*"; } pfu_note() { PFU_UI_NOTICES+=("$PFU_C_DIM•$PFU_C_RESET $*"); printf '%s•%s %s\n' "$PFU_C_DIM" "$PFU_C_RESET" "$*"; }
pfu_have() { command -v "$1" > /dev/null 2>&1; } pfu_have() { command -v "$1" > /dev/null 2>&1; }
+36 -22
View File
@@ -118,10 +118,20 @@ pfu_ui_read_line() {
done done
} }
pfu_pause() { # _pfu_ui_take_notices
printf '\n %s' "$(pfu_msg "Press any key to continue...")" # The messages the last action left, as lines for under a frame, in
read -rsn1 _ || true # PFU_UI_NOTICE_TEXT. Each is shown once.
printf '\n' PFU_UI_NOTICE_TEXT=''
_pfu_ui_take_notices() {
local n
PFU_UI_NOTICE_TEXT=''
(( ${#PFU_UI_NOTICES[@]} )) || return 0
PFU_UI_NOTICE_TEXT=$'\n'
for n in "${PFU_UI_NOTICES[@]}"; do
PFU_UI_NOTICE_TEXT+=" $n"$'\n'
done
PFU_UI_NOTICES=()
} }
# pfu_ui_confirm <question> # pfu_ui_confirm <question>
@@ -335,19 +345,19 @@ _pfu_setting_change() {
case "$scope" in case "$scope" in
user) user)
pfu_config_set "$key" "$next" || { pfu_bad "$(pfu_msg "Could not save the setting.")"; pfu_pause; } pfu_config_set "$key" "$next" || pfu_bad "$(pfu_msg "Could not save the setting.")"
;; ;;
sys) sys)
printf '\n' printf '\n'
pfu_ui_cooked pfu_root set "$key" "$next" || pfu_pause pfu_ui_cooked pfu_root set "$key" "$next" || pfu_bad "$(pfu_msg "Could not save the setting.")"
PFU_KV_CACHE=() PFU_KV_CACHE=()
;; ;;
pam) pam)
printf '\n' printf '\n'
if [[ $next == yes ]]; then if [[ $next == yes ]]; then
pfu_ui_cooked pfu_root pam-enable "$key" || pfu_pause pfu_ui_cooked pfu_root pam-enable "$key" || pfu_bad "$(pfu_msg "Could not save the setting.")"
else else
pfu_ui_cooked pfu_root pam-disable "$key" || pfu_pause pfu_ui_cooked pfu_root pam-disable "$key" || pfu_bad "$(pfu_msg "Could not save the setting.")"
fi fi
# Remembered, so that turning face unlock off and on again brings # Remembered, so that turning face unlock off and on again brings
# it back. # it back.
@@ -428,6 +438,8 @@ pfu_ui_settings() {
frame+=$'\n'" ${PFU_C_DIM}${legend}${PFU_C_RESET}"$'\n' frame+=$'\n'" ${PFU_C_DIM}${legend}${PFU_C_RESET}"$'\n'
frame+=" ${PFU_C_DIM}${hint}${PFU_C_RESET}"$'\n' frame+=" ${PFU_C_DIM}${hint}${PFU_C_RESET}"$'\n'
_pfu_ui_take_notices
frame+="$PFU_UI_NOTICE_TEXT"
printf '%s' "$frame" printf '%s' "$frame"
key="$(pfu_read_key)" || return 0 key="$(pfu_read_key)" || return 0
@@ -483,6 +495,8 @@ pfu_ui_faces() {
frame+="$row"$'\n' frame+="$row"$'\n'
done done
frame+=$'\n'" ${PFU_C_DIM}${hint}${PFU_C_RESET}"$'\n' frame+=$'\n'" ${PFU_C_DIM}${hint}${PFU_C_RESET}"$'\n'
_pfu_ui_take_notices
frame+="$PFU_UI_NOTICE_TEXT"
printf '%s' "$frame" printf '%s' "$frame"
key="$(pfu_read_key)" || return 0 key="$(pfu_read_key)" || return 0
@@ -510,11 +524,7 @@ pfu_ui_faces() {
pfu_ctl remove "${PFU_FACE_IDS[cursor]}" > /dev/null pfu_ctl remove "${PFU_FACE_IDS[cursor]}" > /dev/null
fi fi
;; ;;
a|A) a|A) pfu_ui_cooked pfu_do_setup ;;
pfu_ui_cooked pfu_do_setup
[[ -n $PFU_UI_NEEDS_ACK ]] && pfu_pause
PFU_UI_NEEDS_ACK=''
;;
q|Q|escape) return 0 ;; q|Q|escape) return 0 ;;
*) ;; *) ;;
esac esac
@@ -526,13 +536,18 @@ pfu_ui_faces() {
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
pfu_ui_menu() { pfu_ui_menu() {
local choice local choice keep=0
pfu_ui_term_raw pfu_ui_term_raw
trap 'pfu_ui_term_restore' EXIT INT TERM trap 'pfu_ui_term_restore' EXIT INT TERM
while true; do while true; do
clear 2>/dev/null || true # After a test the menu goes under what the camera saw instead.
if (( keep )); then
keep=0
else
clear 2>/dev/null || true
fi
pfu_head " $PFU_PRETTY" pfu_head " $PFU_PRETTY"
pfu_ui_status pfu_ui_status
printf '\n' printf '\n'
@@ -542,6 +557,8 @@ pfu_ui_menu() {
printf ' [4] %s\n' "$(pfu_msg "Settings")" printf ' [4] %s\n' "$(pfu_msg "Settings")"
printf ' [5] %s\n' "$(pfu_msg "Try it")" printf ' [5] %s\n' "$(pfu_msg "Try it")"
printf ' [q] %s\n' "$(pfu_msg "Quit")" printf ' [q] %s\n' "$(pfu_msg "Quit")"
_pfu_ui_take_notices
printf '%s' "$PFU_UI_NOTICE_TEXT"
printf '\n > ' printf '\n > '
choice="$(pfu_read_key)" || { choice="$(pfu_read_key)" || {
@@ -552,7 +569,6 @@ pfu_ui_menu() {
esac esac
printf '%s\n' "$choice" printf '%s\n' "$choice"
PFU_UI_NEEDS_ACK=''
case "$choice" in case "$choice" in
1) 1)
pfu_config_load pfu_config_load
@@ -561,18 +577,16 @@ pfu_ui_menu() {
else else
pfu_ui_cooked pfu_do_enable pfu_ui_cooked pfu_do_enable
fi fi
[[ -n $PFU_UI_NEEDS_ACK ]] && pfu_pause
;;
2)
pfu_ui_cooked pfu_do_setup
[[ -n $PFU_UI_NEEDS_ACK ]] && pfu_pause
;; ;;
2) pfu_ui_cooked pfu_do_setup ;;
3) pfu_ui_faces ;; 3) pfu_ui_faces ;;
4) pfu_ui_settings ;; 4) pfu_ui_settings ;;
5) 5)
printf '\n' printf '\n'
pfu_ui_cooked pfu_test pfu_ui_cooked pfu_test
pfu_pause # Already on screen, with the rest of the test.
PFU_UI_NOTICES=()
keep=1
;; ;;
q|Q) pfu_ui_term_restore; trap - EXIT INT TERM; return 0 ;; q|Q) pfu_ui_term_restore; trap - EXIT INT TERM; return 0 ;;
# Anything else (Enter, arrow keys, stray characters) just # Anything else (Enter, arrow keys, stray characters) just