4

Когда я запускаю программу с графическим интерфейсом, это окно появляется на текущем активном рабочем столе (по сути, на случайном рабочем столе).

Как заставить его появиться на конкретном рабочем столе? Например, при запуске я хочу, чтобы определенные программы запускались и распространялись на рабочие столы.

Я уже настроил конфигурационный файл 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 ответа2

1

попробуйте devilspie:

Пирог Дьявола может быть настроен на обнаружение окон по мере их создания и сопоставление окна с набором правил. Если окно соответствует правилам, оно может выполнить ряд действий над этим окном. Например, я могу сделать так, чтобы все окна, созданные X-Chat, появлялись во всех рабочих пространствах, а главное окно Gkrellm1 не появлялось в списке пейджеров или задач.
0

Вот первый проход в скрипте, чтобы сделать это с помощью 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 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .