Как сделать docky доступным только в одной рабочей области?

Есть ли способ сделать docky доступным только в одном рабочем пространстве, а не в любом другом рабочем пространстве в Ubuntu 14.04.

1 ответ

Решение

Фоновый скрипт для запуска Docky в определенных рабочих пространствах (или нет)

Основанный на том же механизме, что и этот ответ, ниже фонового скрипта, который запускает / останавливает Docky лаунчер, в зависимости от текущего рабочего пространства.

Сам механизм в значительной степени проверен. Сказав это, в связанном вопросе это проверяется с установкой различных программ запуска Unity и установкой разных обоев для рабочего пространства, а не с запуском / остановкой Docky, Это, однако, не должно иметь никакого значения, и в те часы, когда я его тестировал, он работал без единой ошибки.

Как пользоваться

  1. Скрипт нужен wmctrl:

    sudo apt-get install wmctrl
    
  2. Скопируйте приведенный ниже скрипт в пустой файл и сохраните его как docky_perworkspace.py

  3. Протестируйте скрипт:

    • Начните Docky
    • Запустите скрипт с помощью команды:

      python3 /path/to/docky_perworkspace.py
      
    • Теперь Docky работает на всех рабочих пространствах. Перейдите к рабочим областям, которые вы не хотите Docky появляться и запускаться (находясь в рабочей области):

      pkill docky
      

    NB Использование pkill docky, не закрывайте докки из собственного меню!

  4. Вот и все. Если вы хотите изменить настройку, просто запустите или убейте docky в рабочей области, хотите, чтобы он запускался или нет; скрипт запомнит ваши предпочтения.
  5. Если все работает нормально, добавьте его в свои автозагрузки: Dash > Startup Applications > Добавить команду:

    /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 (или ничего не делает, если не нужно), в соответствии с содержимым файла и текущей ситуацией. Если файл еще не существует (поскольку вы впервые используете рабочее пространство с момента запуска сценария в первый раз), файл создается и устанавливается в текущую (последнюю) ситуацию.

Поскольку настройки для каждой рабочей области запоминаются в файлах, они запоминаются даже после перезапуска.

Другие вопросы по тегам