Как открыть программу на определенном рабочем столе?
Когда я запускаю программу с графическим интерфейсом, это окно появляется на текущем активном рабочем столе (по сути, на случайном рабочем столе).
Как заставить его появиться на конкретном рабочем столе? Например, при запуске я хочу, чтобы определенные программы запускались и распространялись на рабочие столы.
Я уже настроил конфигурационный файл openbox, чтобы заставить некоторые программы всегда запускаться на определенном рабочем столе.
В идеале это должно быть так:
start_on_desktop 1 gnome-terminal --tab -e program1 --tab -e program2
start_on_desktop 2 gnome-terminal --tab -e program3 --tab -e program4
start_on_desktop 3 firefox
Он должен быть в состоянии запустить ту же программу на другом рабочем столе.
Также не нравится, когда я запускаю программу, находясь на рабочем столе X, затем переключаюсь на рабочий стол Y, и внезапно на Y появляется программа, которая должна быть на X. Когда я запускаю много программ и часто переключаюсь между рабочими столами, они оказываются в хаосе, и мне нужно собирать их вместе и распространять разумно.
Также я хочу, чтобы первый начальный gnome-терминал находился на рабочем столе 3, но я также хочу, чтобы последующие gnome-терминалы были на рабочем столе, где я нажал клавишу (также настроенную в openbox), которая запускает gnome-терминал.
2 ответа
Попробуйте devilspie:
Пирог Дьявола может быть настроен на обнаружение окон по мере их создания и сопоставление окна с набором правил. Если окно соответствует правилам, оно может выполнить ряд действий над этим окном. Например, я могу сделать так, чтобы все окна, созданные X-Chat, появлялись во всех рабочих пространствах, а главное окно Gkrellm1 не появлялось в списке пейджеров или задач.
Вот первый проход в сценарии, чтобы сделать это с помощью wmctrl
,
У меня работает с Metacity и должен работать в Openbox, потому что он также EWMH-совместимый.
Полагается на сон GNU. Если у вас этого нет, поменяйте tries
в 10
а также sleeptime
в 1
,
start_on_desktop
#!/bin/sh
if test $# -lt 2
then
echo "Usage: start_on_desktop <desktop> <command> [<command args>...]" 1>&2
exit 2
fi
desktop=$1
shift
"$@"&
pid=$!
tries=100
sleeptime=0.1
while test $tries -gt 0
do
sleep $sleeptime
windows=$(wmctrl -l -p)
while read _id _desktop _pid _rest
do
_ppid=$(ps -o ppid= -p $_pid)
if test "$_pid" = "$pid" -o "$_ppid" = "$pid"
then
id=$_id
break 2
fi
done <<EOF
$windows
EOF
tries=$((tries - 1))
done
if test -n "$id"
then
wmctrl -i -r "$id" -t "$desktop"
exit $?
else
echo "Window not found" 1>&2
exit 1
fi
А вот скрипт, чтобы узнать текущий рабочий стол.
current_desktop
#!/bin/sh
desktops=$(wmctrl -d)
while read id stat rest
do
if test "$stat" = "*"
then
echo $id
exit 0
fi
done <<EOF
$desktops
EOF
echo "Cannot determine current desktop" 1>&2
exit 1
Вы можете использовать его следующим образом, чтобы переместить любое приложение, которое занимает много времени, чтобы вернуться на рабочий стол, где вы его запустили:
start_on_desktop $(current_desktop) <firefox or eclipse or whatever>
Я думаю, вы бы поставили свои четыре start_on_desktop
линии в .Xclients
или же .xsession
,