Могу ли я по-другому настроить мои рабочие пространства xfce?
В настоящее время у меня есть четыре рабочих пространства ("Основное", "Игра", "Работа", "Переполнение"). В идеальной настройке рабочее пространство "Игры" будет иметь ярлыки (на рабочем столе или на панели) для Steam и отдельных игр.
Переключение на "Работа" НЕ должно иметь ничего общего с игрой, но вместо этого должно быть что-то вроде ссылок на Документы Google и ярлыков на все мои файлы, связанные с работой.
Возможны ли индивидуально настроенные рабочие пространства в xfce4?
2 ответа
Если мы ограничим установку другим набором программ запуска для каждого рабочего стола, это будет не очень сложно. Нам нужен скрипт, работающий в фоновом режиме, чтобы отслеживать текущее рабочее пространство и автоматически изменять набор программ запуска.
1. Набор пусковых установок для каждой рабочей области
Допустим, у меня есть четыре рабочих пространства, и я хочу, чтобы в разных рабочих пространствах были доступны следующие программы запуска:
рабочая область 1 > рабочая область 2> рабочая область 3 > рабочая область 4 >
- Рабочая область 1: Firefox / Idle
- Рабочая область 2: Gcolor2 / Gimp Image Editor / Inkskape
- Рабочая область 3: Abiword / Gnumeric / Mail Reader
- Рабочая область 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 имя папки "Рабочий стол" может отличаться (на голландском языке: "Bureaublad"). Если в вашей версии Ubuntu имя папки рабочего стола не "Рабочий стол", измените его в строке:
desktop_dir = home+"/"+"Desktop"
2. Расширение возможностей, лаунчеров и ссылок
Если мы добавим несколько строк в сценарий, параметры настройки для рабочего пространства могут быть расширены с помощью изменяющегося набора ссылок на каталоги:
В одной рабочей области у нас есть, например, ссылка на папку " Документы " в сочетании с программами запуска офисных приложений
В другом рабочем пространстве у нас есть ссылка на папку " Изображения " в сочетании с программами-редакторами изображений:
Как настроить
Настройка практически такая же, как в варианте 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:
- Вы можете установить различные обои для каждой рабочей области, это полностью поддерживается и может быть легко настроено через графический интерфейс настроек рабочей области.
- Вы можете привязать панель к определенному рабочему пространству, но на AFAIK нет опции графического интерфейса, позволяющей настроить это, но приведенный ниже скрипт возьмет все на себя ответственность.
Решение, которое я принял:
- Создайте новую панель для каждого рабочего пространства. Вы также можете создать дополнительные глобальные панели, которые будут отображаться во всех рабочих пространствах (некоторые элементы, такие как панель уведомлений, могут быть добавлены только один раз, поэтому единственный способ сделать их видимыми в каждом рабочем пространстве - это добавить их в глобальную панель).
- Сконфигурируйте и запустите приведенный ниже сценарий, чтобы распределить каждую локальную панель в своем рабочем пространстве.
- Настройте 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$' \
| 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 > Сеанс и запуск, щелкните вкладку Автозапуск приложения, а затем нажмите кнопку Добавить, чтобы запланировать выполнение сценария при каждом открытии сеанса.