У меня в настоящее время есть четыре рабочих области ('Основной', 'Игра', 'Работа', 'Переполнение'). В идеальной установке 'Игровая' рабочая область имела бы ярлыки (или на Рабочем столе или в Панели) для Пара и отдельных игр.
Переключение на 'Работу' ничего не должно иметь связанная игра, но вместо этого иметь вещи как ссылки Google Docs и ярлыки на все мои связанные с работой файлы.
Действительно ли исключительно настроенные рабочие области возможны в xfce4?
Если мы ограничиваем установку, чтобы иметь другой набор средств запуска на рабочий стол, это не очень сложно. То, в чем мы нуждаемся, является сценарием, работая в фоновом режиме, чтобы отслеживать текущую рабочую область и автоматически изменить набор средств запуска соответственно.
Скажем, у меня есть четыре рабочих области, я хочу, чтобы следующие средства запуска были доступны на различных рабочих областях:
рабочая область 1> рабочая область 2> рабочая область 3> рабочая область 4>
Использование сценария wmctrl
:
sudo apt-get install wmctrl
В Вашем корневом каталоге (не в подкаталоге, а на "первом" уровне), создают каталог (точно) названный:
desktop_data
в этом каталоге создайте для каждого из Ваших рабочих столов, папка, названная (точно):
desktop_1
desktop_2
desktop_3
desktop_4
Создайте средства запуска для всех приложений (для всех рабочих областей) на Вашем рабочем столе и скопируйте их в соответствующие папки.
Скопируйте сценарий ниже в пустой файл, сохраните его как change_launchers.py
. Тестовый прогон это путем выполнения в окне терминала команды:
python3 /path/to/change_launchers.py
Если все хорошо работает, добавьте его к своим приложениям запуска
Сценарий
#!/usr/bin/env python3
import subprocess
import os
import time
import shutil
home = os.environ["HOME"]
desktop_dir = home+"/"+"Desktop"
data_dirstr = home+"/desktop_data/desktop_"
get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def get_desktop():
return [l for l in get("wmctrl -d").splitlines() if "*" in l][0].split()[-1]
while True:
curr_dt1 = get_desktop()
time.sleep(1)
curr_dt2 = get_desktop()
# alter the set of launchers when workspace changes
if not curr_dt1 == curr_dt2:
datafolder = data_dirstr+curr_dt2
for f in [f for f in os.listdir(desktop_dir)if f.endswith(".desktop")]:
subject = desktop_dir+"/"+f
os.remove(subject)
for f in os.listdir(datafolder):
subject = datafolder+"/"+f; target = desktop_dir+"/"+f
shutil.copyfile(subject, target)
subprocess.call(["/bin/bash", "-c", "chmod +x "+target])
В различных локализованных версиях Ubuntu может отличаться название папки "Desktop" (На нидерландском языке: "Bureaublad"). Если в Вашей версии Ubuntu название настольной папки не является "Настольным", измените его в строке:
desktop_dir = home+"/"+"Desktop"
Если мы добавляем несколько строк к сценарию, опции установки на рабочую область могут быть расширены с помощью изменяющегося набора ссылок на каталоги:
На одной рабочей области у нас есть a, например, ссылка на папку Documents, объединенную со средствами запуска офисных приложений:
На другой рабочей области у нас есть ссылка на папку Pictures, объединенную со средствами запуска Редакторов изображений:
Установка является в значительной степени тем же как в опции 1, но дополнительно, в папках данных (см. опцию 1), создайте ссылки на папки (использование ln -s <source> <destination>
) требуется быть доступными на соответствующей рабочей области:
Сценарий
#!/usr/bin/env python3
import subprocess
import os
import time
import shutil
home = os.environ["HOME"]
desktop_dir = home+"/"+"Desktop"
data_dirstr = home+"/desktop_data/desktop_"
get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def get_desktop():
return [l for l in get("wmctrl -d").splitlines() if "*" in l][0].split()[-1]
while True:
curr_dt1 = get_desktop()
time.sleep(1)
curr_dt2 = get_desktop()
# alter the set of launchers & links when workspace changes
if not curr_dt1 == curr_dt2:
datafolder = data_dirstr+curr_dt2
for f in os.listdir(desktop_dir):
subject = desktop_dir+"/"+f
if os.path.islink(subject) or subject.endswith(".desktop") :
os.remove(subject)
for f in os.listdir(datafolder):
subject = datafolder+"/"+f; target = desktop_dir+"/"+f
if os.path.islink(subject):
os.symlink(os.readlink(subject), target)
else:
shutil.copy(subject,target)
Некоторые другие настольные среды (как KDE) предлагают это исходно, но это только частично поддерживается в XFCE.
, Что работы исходно в XFCE:
решение я принял:
Вопреки другому ответу, этот сценарий не будет работать как бесконечный цикл, выбирающий состояние каждую секунду. Это работает только однажды во время открытия сессии для соединения каждого локальные панели к их собственной рабочей области, впоследствии все, что остальное обрабатывается исходно менеджером окон.
#! /bin/sh
# First panel to move
start=2
# Number of panels to move
count=$( wmctrl -d | wc -l )
desk=0
for winid in $( wmctrl -l | grep 'dom0 xfce4-panel -
Сохраняют этот сценарий, например, как local-panels.sh
в Вашем корневом каталоге, и делают это, исполняемый файл (chmod u+x ~/local-panels.sh
)
-
Настраивает сценарий для удовлетворения потребностям:
-
$start
: XFCE нумерует Ваши панели, это - количество панели кулака, которую Вы хотите сделать локальным. Здесь первая панель сохранена глобальной, и панель 2 и вперед сделана локальной для их собственных рабочих областей. -
$count
: количество панелей для создания локальным. По умолчанию это равно количеству рабочих областей, т.е. одной другой локальной панели на рабочую область. -
$desk
: первая рабочая область, которая будет иметь локальную панель. По умолчанию каждая рабочая область будет иметь локальную панель, но устанавливающий эту переменную на более высокое значение позволяет Вам не иметь никакой локальной панели на первых нескольких рабочих областях, если требуется.
-
Настраивают XFCE для автоматического запуска этого сценария после открытия сессии: войдите менеджер по Настройкам XFCE > Сессия и Запуск , нажмите вкладка Application Autostart , и затем на кнопка Add для планирования выполнения сценария после каждого открытия сессии.
\
| awk "NR==$start,NR==$(( start + count - 1 )) { print \$1; }" )
do
wmctrl -i -r $winid -b remove,sticky
wmctrl -i -r $winid -t $desk
desk=$(( desk + 1 ))
done
Сохраняют этот сценарий, например, как local-panels.sh
в Вашем корневом каталоге, и делают это, исполняемый файл (chmod u+x ~/local-panels.sh
)
Настраивает сценарий для удовлетворения потребностям:
$start
: XFCE нумерует Ваши панели, это - количество панели кулака, которую Вы хотите сделать локальным. Здесь первая панель сохранена глобальной, и панель 2 и вперед сделана локальной для их собственных рабочих областей. $count
: количество панелей для создания локальным. По умолчанию это равно количеству рабочих областей, т.е. одной другой локальной панели на рабочую область. $desk
: первая рабочая область, которая будет иметь локальную панель. По умолчанию каждая рабочая область будет иметь локальную панель, но устанавливающий эту переменную на более высокое значение позволяет Вам не иметь никакой локальной панели на первых нескольких рабочих областях, если требуется. Настраивают XFCE для автоматического запуска этого сценария после открытия сессии: войдите менеджер по Настройкам XFCE > Сессия и Запуск , нажмите вкладка Application Autostart , и затем на кнопка Add для планирования выполнения сценария после каждого открытия сессии.