#!/bin/bash while true ; do getopts 'a:d:' x case "$x" in a) app="$OPTARG" ;; d) win="$OPTARG" ;; ?) break ;; esac done shift $(( $OPTIND - 1 )) prog="$1" shift if [ x"$app" = x -o x"$win" = x -o x"$prog" = x ] ; then echo "Start program on virtual window" echo "usage:" echo "$0 -d desktop -a appname command" echo "example:" echo "$0 -d 3 -a calc xcalc -stipple -rpn" exit 1 fi f() { # returns 0 if app is running in win wmctrl -l -x | awk -v app="$2" -v win="$1" ' BEGIN { a=1 } { class = $3 if ($2 == win && match(class, app) != 0) a = 0 } END {exit a} ' } if f $win "$app" ; then echo "$app already running in $win" exit 0 fi w=20 cw=$(wmctrl -d | grep ' \* DG' | awk '{ print $1 }') wmctrl -s "$win" xmessage "starting $prog ..." -center -timeout "$w" & pz="$!" nohup $prog "$@" >/dev/null & while ! f "$win" "$app" ; do echo "waiting $w '$win' '$app'" sleep 1 (( w = w-1 )) if [ "$w" -eq 0 ] ; then echo "$prog does not start, exiting" exit 1 fi done kill "$pz" wmctrl -s "$cw"