Есть ли способ сделать docky доступный только в одной рабочей области а не в любой другой рабочей области в Ubuntu 14.04.
На основе точно того же механизма как этот ответ, ниже фонового сценария, который запускает/останавливает Docky
средство запуска, в зависимости от текущей рабочей области.
Сам механизм в значительной степени проверяется. Однако в связанном вопросе это тестируется с установкой различных Средств запуска Единицы и установкой различных обоев на рабочую область, не запуск/остановку Docky
. Это не должно однако иметь никакого значения вообще, и в часы я протестировал его, это работало без единственной ошибки.
Потребности сценария wmctrl
:
sudo apt-get install wmctrl
Скопируйте сценарий ниже в пустой файл, сохраните его как docky_perworkspace.py
Тестовый прогон сценарий:
Docky
Запустите сценарий с команды:
python3 /path/to/docky_perworkspace.py
Теперь Docky работает на всех рабочих областях. Перейдите к рабочим областям, которые Вы не хотите Docky
появиться и работать (в то время как на рабочей области):
pkill docky
N.B. используйте pkill docky
, не закрывайте docky из его собственного меню!
Если все хорошо работает, добавьте его к своим приложениям запуска: Тире> Приложения Запуска> Добавляет команду:
/bin/bash -c "sleep 15&&python3 /path/to/docky_perworkspace.py"
#!/usr/bin/env python3
import subprocess
import os
import time
datadir = os.environ["HOME"]+"/.config/docky_run"
if not os.path.exists(datadir):
os.makedirs(datadir)
workspace_data = datadir+"/docky_set_"
def get_runs():
try:
subprocess.check_output(["pgrep", "docky"]).decode("utf-8")
return True
except:
return False
def get_res():
# get resolution
xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
pos = xr.index("current")
return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]
def current():
# get the current viewport
res = get_res()
vp_data = subprocess.check_output(
["wmctrl", "-d"]
).decode("utf-8").split()
dt = [int(n) for n in vp_data[3].split("x")]
cols = int(dt[0]/res[0])
curr_vpdata = [int(n) for n in vp_data[5].split(",")]
curr_col = int(curr_vpdata[0]/res[0])+1
curr_row = int(curr_vpdata[1]/res[1])
return str(curr_col+curr_row*cols)
curr_ws1 = current()
runs1 = get_runs()
while True:
time.sleep(1)
runs2 = get_runs()
curr_ws2 = current()
datafile = workspace_data+curr_ws2
if curr_ws2 == curr_ws1:
if runs2 != runs1:
open(datafile, "wt").write(str(runs2))
else:
if not os.path.exists(datafile):
open(datafile, "wt").write(str(runs2))
else:
curr_set = eval(open(datafile).read())
if all([curr_set == True, runs2 == False]):
subprocess.Popen(["docky"])
elif all([curr_set == False, runs2 == True]):
subprocess.Popen(["pkill", "docky"])
curr_ws1 = curr_ws2
runs1 = get_runs()
Сценарий отслеживает текущую рабочую область (неважно, сколько рабочих областей Вы имеете). На рабочую область файл создается в /.config/docky_run
, в котором "записан", если docky должен присутствовать или не на относящейся рабочей области (True
или False
)
Если Вы остаетесь на той же рабочей области, но docky или запускается или уничтожается ( pid
появляется или концы), сценарий "понимает", что это - Вы, кто внес изменение на относящейся рабочей области, и файл обновляется.
Если рабочая область изменяется однако, сценарий видит, существует ли файл, читает его и или запускает или уничтожает docky (или ничего не делает если не необходимый), согласно содержанию файла и текущей ситуации. Если файл еще не существует (потому что Вы используете рабочую область впервые, так как Вы запустили сценарий впервые), файл создается и устанавливается на текущую (последнюю) ситуацию.
Поскольку настройки на рабочую область помнят в файлах, их будут помнить даже после перезапуска.