Есть ли способ скопировать окно в более чем одно рабочее пространство. Например. если chrome открыт на рабочем столе Workspace 1, вместо того, чтобы перемещать его, я хотел бы скопировать его в Workspace X, чтобы при переключении в Workspace X там также присутствовало окно chrome.
Предложения не должны ограничиваться только решениями для ОС. Если кто-то может предложить легкодоступную бесплатную программу, это тоже очень поможет.
Текущая версия ОС: Ubuntu 14.04-amd64
отображение окна на нескольких дестопах работает из коробки. Просто щелкните правой кнопкой мыши значок приложения на панели задач
и выберите «Переместить на рабочий стол» >> «Все рабочие столы»
. Таким образом, окно будет отображаться на каждом «рабочем столе» (формулировка «переместить» в контекстном меню немного вводит в заблуждение).
Оказывается, это тоже работает из коробки
Щелкните правой кнопкой мыши заголовок окна и выберите «Всегда в видимой рабочей области»
Я создал следующий скрипт bash, который, как мне кажется, примерно соответствует тому, что хочет OP. Он не копирует выбранное окно в выбранные рабочие области. Он скорее автоматически перемещает выбранное окно в выбранные рабочие области при изменении последних.
#!/bin/bash
# get id of window
id=$(xwininfo -id $(xdotool getwindowfocus) | grep "Window id" | cut -d' ' -f4)
# get pid of script
script_pid=$(echo $$)
# file for temporarily storing id-pid pairs
temp="/tmp/ids-pids.txt"
# create the file if it does not exist
touch $temp
# check if window id already exists in temp
# if yes, kill the script and remove the window id entry
# if no, add a window id-script pid entry
# this is used as a toggle for turning the script on/off with the same keystroke
if grep -q $id $temp; then
kill $(grep $id $temp | cut -d' ' -f2)
sed -i "/$id/d" $temp
kill $$
else
echo $id $script_pid >> $temp
fi
# enter the workspaces numbers that the window can appear on as an array
# input is space-delimited
IFS=' ' read -r -a array < <( zenity --entry \
--width 400 \
--title="Window on multiple workspaces" \
--text="Window on workspaces:" )
# if the user cancels text entry or inputs nothing, then exit and kill the script
if [ ${#array[@]} -eq 0 ]; then
sed -i "/$id/d" $temp
kill $$
fi
while true
do
# get current workspace
workspace=$(wmctrl -d | grep \* | cut -d' ' -f1)
# move window to the workspace if it is in the allowed workspaces array
if [[ "${array[@]}" =~ "${workspace}" ]]; then
wmctrl -i -r $id -t $workspace
fi
# check if window is closed
# if yes, remove its id-pid entry and kill the script
if echo $(xwininfo -id $id 2>&1) | grep -q "X Error:"; then
sed -i "/$id/d" $temp
kill $(grep $id $temp | cut -d' ' -f2)
kill $$
fi
# sleep is used so that the command won't run continuously
sleep 1
done
Как использовать
Во-первых, убедитесь, что у вас установлены программы, которые используются в этом скрипте:
sudo apt install xdotool wmctrl zenity
Скопируйте и вставьте скрипт в файл .sh на своем компьютере, например, в домашнюю папку (/home/user/window_workspaces.sh
).
Сделать его исполняемым:
chmod u+x /home/user/window_workspaces.sh
Назначьте скрипт ярлыку. В GNOME откройте Обзор приложений → Настройки → Устройства → Клавиатура → нажмите «+» внизу и введите имя ярлыка. , путь к скрипту и ярлык, который вы хотите использовать, как показано на рисунке ниже. Я выбрал Super+Z в качестве ярлыка для скрипта.
В активном окне нажмите Super+Z. Появится всплывающее окно, в котором вы можете ввести рабочие области, в которых вы хотите, чтобы ваше окно отображалось, , разделенные пробелом , как показано ниже.
Нажмите Super+Z еще раз, удерживая фокус на том же окне, и оно вернется в нормальное состояние, т. е. появится только в одном рабочем пространстве.
Сценарий должен работать во всех средах рабочего стола.
Не стесняйтесь предлагать любые изменения!