diff --git a/po/de.po b/po/de.po index 512d752..82db100 100644 --- a/po/de.po +++ b/po/de.po @@ -317,9 +317,6 @@ msgid "" "password." 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 msgid "[y/N]" diff --git a/po/plasma-face-unlock.pot b/po/plasma-face-unlock.pot index 5d25f8b..45da943 100644 --- a/po/plasma-face-unlock.pot +++ b/po/plasma-face-unlock.pot @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: plasma-face-unlock 1.0.0\n" "Report-Msgid-Bugs-To: https://github.com/LoonixTools/plasma-face-unlock/" "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" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -55,7 +55,8 @@ msgstr "" msgid "First, set up your face." 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." msgstr "" @@ -83,16 +84,16 @@ msgstr "" msgid "No face is set up yet." 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" msgstr "" -#: src/plasma-face-unlock:148 src/lib/menu.sh:159 src/lib/menu.sh:169 -#: src/lib/menu.sh:461 +#: src/plasma-face-unlock:148 src/lib/menu.sh:169 src/lib/menu.sh:179 +#: src/lib/menu.sh:473 msgid "off" msgstr "" -#: src/plasma-face-unlock:150 src/lib/menu.sh:478 +#: src/plasma-face-unlock:150 src/lib/menu.sh:490 #, sh-printf-format msgid "%s samples, %s learned" msgstr "" @@ -122,7 +123,7 @@ msgstr "" msgid "Turn it off (faces are kept)" 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" msgstr "" @@ -221,7 +222,7 @@ msgstr "" msgid "The camera could not be used." 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." msgstr "" @@ -318,176 +319,172 @@ msgid "" "password." msgstr "" -#: src/lib/menu.sh:122 -msgid "Press any key to continue..." -msgstr "" - -#: src/lib/menu.sh:130 +#: src/lib/menu.sh:140 msgid "[y/N]" msgstr "" -#: src/lib/menu.sh:149 src/lib/menu.sh:382 +#: src/lib/menu.sh:159 src/lib/menu.sh:392 msgid "ON" msgstr "" -#: src/lib/menu.sh:151 src/lib/menu.sh:383 +#: src/lib/menu.sh:161 src/lib/menu.sh:393 msgid "OFF" msgstr "" -#: src/lib/menu.sh:167 +#: src/lib/menu.sh:177 msgid "strict (blink or turn your head)" msgstr "" -#: src/lib/menu.sh:168 +#: src/lib/menu.sh:178 msgid "basic (screens and phone edges)" msgstr "" -#: src/lib/menu.sh:170 +#: src/lib/menu.sh:180 msgid "normal" msgstr "" -#: src/lib/menu.sh:171 +#: src/lib/menu.sh:181 msgid "strict" msgstr "" -#: src/lib/menu.sh:172 +#: src/lib/menu.sh:182 msgid "relaxed" msgstr "" -#: src/lib/menu.sh:173 +#: src/lib/menu.sh:183 msgid "island with the face" msgstr "" -#: src/lib/menu.sh:174 +#: src/lib/menu.sh:184 msgid "small pill with a lock" msgstr "" -#: src/lib/menu.sh:175 +#: src/lib/menu.sh:185 #, sh-printf-format msgid "%s seconds" msgstr "" -#: src/lib/menu.sh:176 src/lib/menu.sh:313 +#: src/lib/menu.sh:186 src/lib/menu.sh:323 msgid "automatic" msgstr "" -#: src/lib/menu.sh:193 +#: src/lib/menu.sh:203 msgid "Face unlock" msgstr "" -#: src/lib/menu.sh:197 +#: src/lib/menu.sh:207 msgid "Service" msgstr "" -#: src/lib/menu.sh:197 +#: src/lib/menu.sh:207 msgid "not running" msgstr "" -#: src/lib/menu.sh:199 +#: src/lib/menu.sh:209 msgid "Turning face unlock on again starts it." msgstr "" -#: src/lib/menu.sh:210 src/lib/menu.sh:212 src/lib/menu.sh:457 -#: src/lib/menu.sh:541 +#: src/lib/menu.sh:220 src/lib/menu.sh:222 src/lib/menu.sh:469 +#: src/lib/menu.sh:556 msgid "Faces" msgstr "" -#: src/lib/menu.sh:210 +#: src/lib/menu.sh:220 msgid "none set up yet" msgstr "" -#: src/lib/menu.sh:212 +#: src/lib/menu.sh:222 msgid "all turned off" msgstr "" -#: src/lib/menu.sh:218 +#: src/lib/menu.sh:228 msgid "none found" 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" msgstr "" -#: src/lib/menu.sh:222 +#: src/lib/menu.sh:232 msgid "Lock screen" msgstr "" -#: src/lib/menu.sh:223 +#: src/lib/menu.sh:233 msgid "sudo" msgstr "" -#: src/lib/menu.sh:224 +#: src/lib/menu.sh:234 msgid "Admin prompts" 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" msgstr "" -#: src/lib/menu.sh:228 +#: src/lib/menu.sh:238 msgid "Paused" msgstr "" -#: src/lib/menu.sh:228 +#: src/lib/menu.sh:238 #, sh-printf-format msgid "for %d more minutes, or until the password is used" msgstr "" -#: src/lib/menu.sh:230 +#: src/lib/menu.sh:240 msgid "Last unlock" msgstr "" -#: src/lib/menu.sh:309 +#: src/lib/menu.sh:319 #, sh-printf-format msgid "automatic (%s)" msgstr "" -#: src/lib/menu.sh:319 +#: src/lib/menu.sh:329 msgid "(infrared)" msgstr "" -#: src/lib/menu.sh:323 +#: src/lib/menu.sh:333 msgid "(not connected)" msgstr "" -#: src/lib/menu.sh:379 src/lib/menu.sh:542 +#: src/lib/menu.sh:389 src/lib/menu.sh:557 msgid "Settings" msgstr "" -#: src/lib/menu.sh:380 +#: src/lib/menu.sh:390 msgid "Up/Down: select, Space or Right: change, q: back" msgstr "" -#: src/lib/menu.sh:381 +#: src/lib/menu.sh:391 msgid "Settings marked * are for the whole computer and ask for your password." 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" msgstr "" -#: src/lib/menu.sh:459 +#: src/lib/menu.sh:471 msgid "No face is set up yet. Press a to add one." msgstr "" -#: src/lib/menu.sh:502 +#: src/lib/menu.sh:516 msgid "New name:" msgstr "" -#: src/lib/menu.sh:509 +#: src/lib/menu.sh:523 #, sh-printf-format msgid "Delete \"%s\"?" msgstr "" -#: src/lib/menu.sh:539 +#: src/lib/menu.sh:554 msgid "Turn face unlock on or off" msgstr "" -#: src/lib/menu.sh:543 +#: src/lib/menu.sh:558 msgid "Try it" msgstr "" -#: src/lib/menu.sh:544 +#: src/lib/menu.sh:559 msgid "Quit" msgstr "" @@ -571,35 +568,35 @@ msgstr "" msgid "Bubble for sudo and admin prompts too" msgstr "" -#: src/agent/bubblecontroller.cpp:91 +#: src/agent/bubblecontroller.cpp:92 msgid "Blink once" msgstr "" -#: src/agent/bubblecontroller.cpp:93 +#: src/agent/bubblecontroller.cpp:94 msgid "Look at the screen" msgstr "" -#: src/agent/bubblecontroller.cpp:95 +#: src/agent/bubblecontroller.cpp:96 msgid "Move closer" msgstr "" -#: src/agent/bubblecontroller.cpp:97 +#: src/agent/bubblecontroller.cpp:98 msgid "Too dark" msgstr "" -#: src/agent/bubblecontroller.cpp:117 +#: src/agent/bubblecontroller.cpp:118 msgid "Use your password" msgstr "" -#: src/agent/bubblecontroller.cpp:123 +#: src/agent/bubblecontroller.cpp:124 msgid "Not recognized" msgstr "" -#: src/agent/bubblecontroller.cpp:125 +#: src/agent/bubblecontroller.cpp:126 msgid "Try again and blink" msgstr "" -#: src/agent/bubblecontroller.cpp:127 +#: src/agent/bubblecontroller.cpp:128 msgid "Camera unavailable" msgstr "" @@ -743,26 +740,26 @@ msgid "" "with glasses for example, from the menu." msgstr "" -#: src/agent/qml/Enroll.qml:156 +#: src/agent/qml/Enroll.qml:157 msgid "Name (optional)" msgstr "" -#: src/agent/qml/Enroll.qml:171 +#: src/agent/qml/Enroll.qml:172 msgid "Cancel" msgstr "" -#: src/agent/qml/Enroll.qml:177 +#: src/agent/qml/Enroll.qml:178 msgid "Finish now" msgstr "" -#: src/agent/qml/Enroll.qml:182 +#: src/agent/qml/Enroll.qml:183 msgid "Try again" msgstr "" -#: src/agent/qml/Enroll.qml:182 +#: src/agent/qml/Enroll.qml:183 msgid "Get started" msgstr "" -#: src/agent/qml/Enroll.qml:187 +#: src/agent/qml/Enroll.qml:188 msgid "Done" msgstr "" diff --git a/src/lib/common.sh b/src/lib/common.sh index 70c40c1..0503d28 100644 --- a/src/lib/common.sh +++ b/src/lib/common.sh @@ -135,16 +135,16 @@ else PFU_C_GREEN='' PFU_C_YELLOW='' PFU_C_RED='' fi -# Set by pfu_bad and pfu_note. The menu redraws straight after an action, which -# would wipe the screen; this marks that something was printed the user still -# has to read. -PFU_UI_NEEDS_ACK='' +# What pfu_ok, pfu_bad and pfu_note printed. The menu redraws straight after an +# action, which wipes the screen, so it shows these again under the new frame +# rather than holding everything up for a key press. +PFU_UI_NOTICES=() pfu_say() { printf '%s\n' "$*"; } 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_bad() { PFU_UI_NEEDS_ACK=1; 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_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_NOTICES+=("$PFU_C_RED✘$PFU_C_RESET $*"); printf '%s✘%s %s\n' "$PFU_C_RED" "$PFU_C_RESET" "$*" >&2; } +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; } diff --git a/src/lib/menu.sh b/src/lib/menu.sh index 5d5d495..a5d020b 100644 --- a/src/lib/menu.sh +++ b/src/lib/menu.sh @@ -118,10 +118,20 @@ pfu_ui_read_line() { done } -pfu_pause() { - printf '\n %s' "$(pfu_msg "Press any key to continue...")" - read -rsn1 _ || true - printf '\n' +# _pfu_ui_take_notices +# The messages the last action left, as lines for under a frame, in +# PFU_UI_NOTICE_TEXT. Each is shown once. +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 @@ -335,19 +345,19 @@ _pfu_setting_change() { case "$scope" in 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) 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=() ;; pam) printf '\n' 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 - 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 # Remembered, so that turning face unlock off and on again brings # it back. @@ -428,6 +438,8 @@ pfu_ui_settings() { frame+=$'\n'" ${PFU_C_DIM}${legend}${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" key="$(pfu_read_key)" || return 0 @@ -483,6 +495,8 @@ pfu_ui_faces() { frame+="$row"$'\n' done frame+=$'\n'" ${PFU_C_DIM}${hint}${PFU_C_RESET}"$'\n' + _pfu_ui_take_notices + frame+="$PFU_UI_NOTICE_TEXT" printf '%s' "$frame" key="$(pfu_read_key)" || return 0 @@ -510,11 +524,7 @@ pfu_ui_faces() { pfu_ctl remove "${PFU_FACE_IDS[cursor]}" > /dev/null fi ;; - a|A) - pfu_ui_cooked pfu_do_setup - [[ -n $PFU_UI_NEEDS_ACK ]] && pfu_pause - PFU_UI_NEEDS_ACK='' - ;; + a|A) pfu_ui_cooked pfu_do_setup ;; q|Q|escape) return 0 ;; *) ;; esac @@ -526,13 +536,18 @@ pfu_ui_faces() { # --------------------------------------------------------------------------- pfu_ui_menu() { - local choice + local choice keep=0 pfu_ui_term_raw trap 'pfu_ui_term_restore' EXIT INT TERM 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_ui_status printf '\n' @@ -542,6 +557,8 @@ pfu_ui_menu() { printf ' [4] %s\n' "$(pfu_msg "Settings")" printf ' [5] %s\n' "$(pfu_msg "Try it")" printf ' [q] %s\n' "$(pfu_msg "Quit")" + _pfu_ui_take_notices + printf '%s' "$PFU_UI_NOTICE_TEXT" printf '\n > ' choice="$(pfu_read_key)" || { @@ -552,7 +569,6 @@ pfu_ui_menu() { esac printf '%s\n' "$choice" - PFU_UI_NEEDS_ACK='' case "$choice" in 1) pfu_config_load @@ -561,18 +577,16 @@ pfu_ui_menu() { else pfu_ui_cooked pfu_do_enable 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 ;; 4) pfu_ui_settings ;; 5) printf '\n' 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 ;; # Anything else (Enter, arrow keys, stray characters) just