#!/bin/zsh unset TMUX pidof urxvtd &>/dev/null || urxvtd -q -f -o if [[ -n "$XDG_DATA_HOME" ]]; then tmux_sesssion_dir=$XDG_DATA_HOME/tmux_session else tmux_sesssion_dir=$HOME/.local/share/tmux_session fi typeset -A sessions attached if [[ -f $tmux_sesssion_dir/$DISPLAY ]]; then while IFS=: read session workspace; do sessions[${session}]=$workspace done <$tmux_sesssion_dir/$DISPLAY fi # the "attached" flag of tmux is not reliable so we search window titles for # session identifiers, which has the advantage of supporting multiple displays attached=( $(wmctrl -l | sed -n "/tmux::[^:]*:$USER@$HOST/{ s/.*tmux::\([^:]*\):$USER@$HOST.*/\1 1/; p }") ) if wmctrl -m | grep -q 'Name: i3'; then is_i3=1 else is_i3=0 fi tmux list-sessions -F "#{session_name}" | \ while read session; do if ! (($+attached[$session])); then if (($+sessions[$session] && ! $is_i3)); then # not all windowmanagers support moving windows via wmctrl, so we # switch to desired workspace before spawning the terminal wmctrl -s $sessions[$session] urxvtc -name "tmux_$session" -e tmux-workspace-attach $sessions[$session] $session # wait until the window appears N=120 while ! wmctrl -l | grep tmux::${session}:$USER@$HOST; do N=$(($N - 1)) if (($N)); then sleep .01; else break; fi done else urxvtc -name "tmux_$session" -e tmux attach -t $session fi fi done