mrrl-logincaps

MRRL version of logincaps
git clone https://ccx.te2000.cz/git/mrrl-logincaps
Log | Files | Refs

commit 6dfc6d8d245083704b6824620b93c50eca69055b
parent 9c7182d9ec1dac8021f28652a131c05dc825e219
Author: Jan Pobrislo <ccx@te2000.cz>
Date:   Sun, 16 Mar 2025 20:26:26 +0000

changes from carbon: bin/handle-nsx11-message

Diffstat:
Mbin/handle-nsx11-message | 90++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 82 insertions(+), 8 deletions(-)

diff --git a/bin/handle-nsx11-message b/bin/handle-nsx11-message @@ -126,19 +126,85 @@ abduco-run() { if ! s6-sudo $x_container_tmpfs/run/exec/exec urxvt \ -name abduco:${session//./-}:${container//./-} \ -title "[$session@$container] abduco" \ - -e abduco -a /.inbox/${socket#/run/containers/} + -e abduco -a /run/inbox/${socket#/run/containers/} then - nag -m "Failed to spawn terminal for abduco session: /.inbox/${socket#/run/containers/}" + nag -m "Failed to spawn terminal for abduco session: /run/inbox/${socket#/run/containers/}" fi } typeset -f -t abduco-run +abduco-xpra-run() { + local display container session cmd rest out + local -a socket + display=${1%%/*} + rest=${1#*/} + + container=${rest%%/*} + rest=${rest#*/} + + session=${rest%%/*} + if [[ $rest == */* ]]; then + cmd=${rest#*/} + fi + + if [[ $container == */* ]]; then + nag -m "Invalid container name: contains slashes" + return 1 + fi + + if [[ $session == */* ]]; then + nag -m "Invalid session name: contains slashes" + return 1 + fi + + if ! ensure-container-started $container; then + nag -m "Failed to start container ${(qqq)container}" + return 1 + fi + + socket=( /run/containers/$container/run/abduco/$USER/$session@*(=N) ) + if (( $#socket == 0 )); then + if [[ -n $cmd ]]; then + if out=$( 2>&1 s6-sudo /run/containers/$container/run/exec/exec execlineb -c "env TERM=rxvt-unicode-256color abduco -n ${(qqq)session} $cmd" ); then + socket=( /run/containers/$container/run/abduco/$USER/$session@*(=N) ) + if (( $#socket == 0 )); then + nag -m "Session spawned but no socket found." + return 1 + fi + else + nag -m "Error spawning session (exit $?): ${(qqq)out}" + return 1 + fi + else + nag -m "Session ${(qqq)session} does not exist in ${(qqq)container} and no command provided." + return 1 + fi + fi + if (( $#socket > 1 )); then + nag -m "More than one socket found for session ${(qqq)session} in ${(qqq)container}: ${socket:t}" + return 1 + fi + if ! link-to-container-inbox $container xsession.$X.$USER ${socket#/run/containers/${container}}; then + nag -m "Failed to link abduco socket." + return 1 + fi + if ! s6-sudo $x_container_tmpfs/run/exec/exec env DISPLAY=$display urxvt \ + -fn 'xft:Terminus:pixelsize=16,xft:Unifont:pixelsize=16' \ + -name abduco:${session//./-}:${container//./-} \ + -title "[$session@$container] abduco" \ + -e abduco -a /run/inbox/${socket#/run/containers/} + then + nag -m "Failed to spawn terminal for abduco session: /run/inbox/${socket#/run/containers/}" + fi +} +typeset -f -t abduco-xpra-run + x11-run() { if ! [[ $1 == */*/*/* ]]; then nag -m "Got malformed x11 command: ${(qqq)1}" return 1 fi - local container display cookie cmd rest out + local container display cookie cmd rest out cmd_ret container=${1%%/*} rest=${1#*/} @@ -178,12 +244,13 @@ x11-run() { return 1 fi - if out=$( 2>&1 env EXEC_PATH=/run/containers/$container/run/exec/x11 execlineb -c "importas -i -u EXEC_PATH EXEC_PATH s6-sudo \$EXEC_PATH ${(qqq)display} ${(qqq)cookie} $cmd" ); then - return 0 - else - nag -m "Error spawning session (exit $?): ${(qqq)out}" + out=$( 2>&1 env EXEC_PATH=/run/containers/$container/run/exec/x11 execlineb -c "importas -i -u EXEC_PATH EXEC_PATH s6-sudo \$EXEC_PATH ${(qqq)display} ${(qqq)cookie} $cmd" | tail -n 5 ) + cmd_ret=$pipestatus[1] + if (($cmd_ret)); then + nag -m "Error spawning session (exit $cmd_ret): ${(qqq)out}" return 1 fi + return 0 } typeset -f -t x11-run @@ -291,7 +358,7 @@ pass-input() { local wid=$1 local entry=$2 pass show -- $entry | \ - awk -v wid=$wid 'NR == 1 { printf("type --window %s %s\n", wid, $0) }' | \ + awk -v wid=$wid 'NR == 1 { printf("type --window \"%s\" \"%s\"\n", wid, $0) }' | \ s6-sudo $x_container_tmpfs/run/exec/exec xdotool - # s6-sudo $x_container_tmpfs/run/exec/exec forstdin IN importas -i IN IN i3-nagbar -f fixed -t warning -m '$IN' } @@ -332,6 +399,10 @@ case $data in (abduco/*/*) abduco-run "${data#*/}" ;; + + (abduco-xpra/*/*/*) + abduco-xpra-run "${data#*/}" + ;; (x11/*) x11-run "${data#*/}" @@ -369,6 +440,9 @@ case $data in pass-input $wid $entry ;; + (amixer/*) + local amixer_args="${data#amixer/}" + execlineb -c "amixer $amixer_args" (*) nag -t warning -m "Powerbox got message: ${(qqq)plumb_data}" ;;