#!/bin/zsh setopt no_unset extended_glob warn_create_global typeset -g -A container_exec_linked c_exec() { local container=$1 display=${DISPLAY#:} shift if ! (( $+container_exec_linked[$container] )); then s6-sudo /run/cmd.s link $container xsession.$display.$USER run/exec/exec || exit $? container_exec_linked[$container]=1 fi s6-sudo /run/inbox/$container/run/exec/exec "$@" } load_wininfo() { local line local -a l i3windowlist | while IFS= read -r line; do l=( "${(@ps:\t:)line}" ) (( $l[1] == $1 )) || continue wid=$l[1] typeset -g w_host w_class w_instance w_title term_container term_pts w_host=${(Q)l[2]} w_class=${(Q)l[3]} w_instance=${(Q)l[4]} w_title=${(Q)l[5]} return 0 done return 1 } make_paste_command() { if [[ $w_host == $HOST && $w_class == URxvt ]]; then # local urxvt local term_container term_pts if [[ $w_instance == *:/dev/pts/* ]]; then term_container=${${w_instance%%:/dev/pts/*}//:/.} term_pts=${w_instance#*:/dev/pts/} else make_paste_command_fallback return $? fi if [[ $w_title == *tmux::* ]]; then make_paste_command_container_tmux $term_container $term_pts return $? fi elif [[ $w_host == xpra && $w_title == *'«s=xpra c'* ]]; then make_paste_command_xpra return $? fi #return 1 make_paste_command_fallback return $? } make_paste_command_container_tmux() { local term_container term_pts line n local -a l tmux_vars tmux_fmt term_container=$1 term_pts=$2 tmux_vars=( client_tty session_name window_index pane_id #client_flags #client_termfeatures #client_activity #client_created #client_readonly ) tmux_fmt=( "#{"$^tmux_vars"}" ) c_exec $term_container tmux list-clients -F ${(pj:\t:)tmux_fmt} | \ while IFS= read line; do l=( "${(@ps:\t:)line}" ) local -A info=( ) for n in {1..$#tmux_vars}; do info[$tmux_vars[$n]]=$l[$n] done [[ $info[client_tty] == /dev/pts/$term_pts ]] || continue # TODO local -a el=( 'multisubstitute {' ' importas -i container_name container_name' ' importas -i pane_id pane_id' '}' 's6-sudo /run/inbox/${container_name}/run/exec/exec' 'tmux load-buffer -b shiftinsert - ; paste-buffer -p -b shiftinsert -t $pane_id' ) typeset -ga paste_command paste_command=( env container_name=$term_container pane_id=$info[pane_id] execlineb -c "${(@F)el}" ) return 0 done return 1 } make_paste_command_xpra() { local x= local -A xpra_info=( ) for x in "${(@s: :)${w_title##*«s=xpra }}"; do [[ $x == ?=* ]] || die "Malformed xpra info: ${(qqq)x}" xpra_info[${x%%=*}]=${x#?=} done local -a el=( 'multisubstitute {' ' importas -i wid wid' ' importas -i xpra_w xpra_w' ' importas -i xpra_d xpra_d' '}' 'if {' ' s6-sudo /run/inbox/xpra.ccx/run/exec/exec' ' in-xpra $xpra_d' ' xclip -i -sel CLIPBOARD' '}' 'xdotool windowfocus $wid key --clearmodifiers --window $wid Shift+Insert' ) typeset -ga paste_command paste_command=( env xpra_d=${xpra_info[d]} xpra_w=${xpra_info[w]} wid=$wid execlineb -c "${(@F)el}" ) } make_paste_command_fallback() { local -a el=( 'importas -i wid wid' 'if { xclip -i }' 'xdotool windowfocus $wid key --clearmodifiers --window $wid Shift+Insert' ) typeset -ga paste_command paste_command=( env wid=$wid execlineb -c "${(@F)el}" ) } main() { local wid clip wid=$(xdotool getactivewindow) || exit $? load_wininfo $wid || exit $? make_paste_command || exit $? clip | IFS= read -r -d '' clip [[ -n $clip ]] || exit 1 printf '%s' $clip | "$paste_command[@]" } typeset -f -t main main "$@" exit $? # old code set -x wid=$(xdotool getactivewindow) || exit $? title=$(xdotool getwindowname $wid) || exit $? if [[ $title != *«s=xpra\ * ]]; then echo >&2 "failed to determine xpra window" exit 3 fi typeset -gA win_meta for kv in ${=${title##*«s=xpra\ }}; do [[ $kv != *=* ]] && exit 3 win_meta[${kv%%=*}]=${kv#*=} done [[ -n $win_meta[w] && -n $win_meta[d] ]] || exit 3 #s6-sudo /run/inbox/xpra.ccx/run/exec/exec export DISPLAY $win_meta[d] xdotool getwindowname $win_meta[w] s6-sudo /run/inbox/xpra.ccx/run/exec/exec in-xpra $win_meta[d] wmctrl -l clip | IFS= read -r -d '' clip [[ -n $clip ]] || exit $? s6-sudo /run/inbox/xpra.ccx/run/exec/exec in-xpra $win_meta[d] xclip -i -sel CLIPBOARD <<<$clip || exit $? xdotool windowfocus $wid key --clearmodifiers --window $wid 'Shift+Insert'