Как получить разные Unity Launcher с разными значками на каждом рабочем пространстве?

Я прочитал различные ответы на наличие отдельных папок рабочего стола в каждой рабочей области, используя Screenlets, devilspie или CCSM ... но это не ответ на мой вопрос. Я установил 14.04 LTS несколько дней назад и добился большого успеха, запустив большинство своих приложений и несколько новых. Я хотел бы иметь 4 отдельных рабочих пространства, каждое из которых имеет несколько разных значков для сред, в которых я работаю. Например,

  • Рабочая область 1 - посвящена науке и математическим приложениям
  • Рабочая область 2 - посвящена музыкальным инструментам
  • Рабочая область 3 - для электронных схем и моделирования
  • Рабочая область 4 - для просмотра веб-страниц и общих вычислений

Подумайте о планшете Android, где каждый экран может содержать отдельные значки.

Должно быть очевидно, как это сделать, но я не могу найти ответ. Мне 4 дня на Ubuntu, поэтому, пожалуйста, не думайте, что я знаю, что делаю!

1 ответ

Решение

Установка другого Unity Launcher для рабочей области:


1. введите описание здесь 2. введите описание здесь 3. введите описание здесь 4. введите описание здесь

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

Установка состоит из двух частей:

  1. (Одна) комбинация сочетаний клавиш для "запоминания" набора значков запуска для текущей рабочей области.

  2. Скрипт, запускаемый в фоновом режиме, отслеживающий текущее рабочее пространство и устанавливающий соответствующий модуль запуска Unity. Он действует всякий раз, когда пользователь переключает рабочее пространство.

Как это устроено

Два небольших сценария участвуют:

Первый скрипт выполняет одну простую вещь: он записывает содержимое текущего модуля запуска в (скрытый) файл в вашем домашнем каталоге, который называется (нумеруется) после вашего текущего рабочего пространства.

Второй скрипт отслеживает текущее рабочее пространство. Если происходит изменение рабочей области, сценарий проверяет, существует ли соответствующий (launcher-) файл данных (созданный первым сценарием). Если это так, он читает файл и изменяет Unity Launcher, как запоминается в файле.

Вот и все.

Как настроить

  1. Скрипт нужен wmctrl быть установленным:

    sudo apt-get install wmctrl
    
  2. Создайте каталог, в котором будут храниться оба сценария. Важно то, что оба сценария хранятся вместе в одном каталоге, поскольку они совместно используют функциональность и один импортирует из другого. По той же причине важно, чтобы вы назвали их точно так, как указано ниже.

  3. Скопируйте каждый из приведенных ниже сценариев в (другой) пустой файл, сохраните их в каталог (созданный в 2.), точно названный как:

    set_workspace.py

    #!/usr/bin/env python3
    import subprocess    
    import os
    
    workspace_data = os.environ["HOME"]+"/.launcher_data_"
    key = ["gsettings get ", "gsettings set ", "com.canonical.Unity.Launcher favorites"]
    
    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)
    
    def remember_current():  
        currlauncher = subprocess.check_output(["/bin/bash", "-c", key[0]+key[2]]).decode("utf-8").strip()
        f = workspace_data+current()
        open(f, "w").write(currlauncher)
    
    if __name__ == "__main__":
        remember_current()
    

    launcher_perworkspace.py

    #!/usr/bin/env python3
    import subprocess
    import set_workspace
    import time
    
    workspace_data = set_workspace.workspace_data
    key = set_workspace.key
    
    def check_datafile(desktop):
        f = workspace_data+str(desktop)
        try:
            new_launcher = open(f).read()
            command = key[1]+key[2]+' "'+str(new_launcher)+'"'
            subprocess.Popen(["/bin/bash", "-c", command])
        except FileNotFoundError:
            pass
    
    curr_dt1 = set_workspace.current()
    check_datafile(curr_dt1)
    
    while True:
        time.sleep(1)
        curr_dt2 = set_workspace.current()
        if curr_dt2 != curr_dt1:
            check_datafile(curr_dt2)
        curr_dt1 = curr_dt2
    
  4. Добавьте первый скрипт (set_workspace.py) на комбинацию сочетаний клавиш по вашему выбору: "Системные настройки" > "Клавиатура" > "Ярлыки" > "Пользовательские сочетания клавиш". Нажмите "+" и добавьте команду:

    python3 /path/to/set_workspace.py
    
  5. Запустите комбинацию клавиш и посмотрите, есть ли файл, например: .launcher_data_3 создается в вашем домашнем каталоге. Вам, вероятно, потребуется нажать Ctrl + H, чтобы сделать файл видимым (файлы, начинающиеся с . по умолчанию невидимы).

    Перейдите по рабочим областям и повторите процедуру: установите комбинацию значков запуска и нажмите комбинацию клавиш, чтобы "запомнить" набор для этого конкретного рабочего пространства.

  6. Вы практически закончили Тестовый запуск фонового скрипта с помощью команды (из окна терминала, продолжайте работать):

    python3 /path/to/launcher_perworkspace.py
    

    Если все работает нормально, и ваш модуль запуска переключается на рабочую область, добавьте следующую команду в свои приложения автозагрузки: Dash > Startup Applications > Add:

    /bin/bash -c "sleep 15&&python3 /path/to/launcher_perworkspace.py"
    

Заметки

  1. Если вы хотите изменить набор значков запуска для определенной рабочей области, просто перейдите в рабочую область, добавьте / удалите значки по своему усмотрению и нажмите комбинацию клавиш (нет необходимости перезапускать фоновый скрипт).
  2. Из комментариев я чувствую, что на ярлыке есть некоторое недопонимание, чтобы вспомнить текущий Launcher для текущего рабочего пространства. Вам нужно только одно сочетание клавиш, чтобы "сохранить" текущую панель запуска для текущей рабочей области. Он будет работать точно так же, независимо от того, на каком рабочем пространстве вы находитесь. Сценарий сам определит текущее рабочее пространство.

редактировать

Из вашего комментария я понимаю, что вы не уверены, что хотите запустить скрипт (ы), и боитесь, что испортите свой текущий лаунчер.

Я почти уверен, что это слишком (или слишком мало) уважение к тому, что делает сценарий. Однако вы можете просто сделать резервную копию вашего текущего Unity Launcher с помощью команды:

printf 'gsettings set com.canonical.Unity.Launcher favorites "' > ~/launcher_output&&printf "$(gsettings get com.canonical.Unity.Launcher favorites)">>~/launcher_output&&printf '"'>>~/launcher_output

Это создаст файл ~/launcher_output, содержащий полную команду для восстановления вашего Unity Launcher в исходное положение. В случае необходимости просто скопируйте содержимое файла и вставьте его в терминал.

Но опять же, очень маловероятно, что вы запутаете свой лаунчер, если вы не измените скрипт вручную.


ВАЖНОЕ РЕДАКТИРОВАНИЕ (2)

В соответствии с запросом в комментарии, версия, которая запускается без использования сочетаний клавиш; просто запустите скрипт и начните настраивать свои пусковые установки в определенных рабочих пространствах. Сценарий создаст (невидимые) файлы в вашем домашнем каталоге, чтобы запомнить ваш набор (Unity-) пусковых установок в различных рабочих пространствах.

Я пробовал это в "версии 1" скрипта, но всегда "встраивание" двух проверок запуска между двумя проверками рабочего пространства оказалось уловкой, предотвращающей нежелательное поведение (сохранение неверных данных) при быстром перемещении по рабочим пространствам.

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

  1. Как и в первой версии, этот скрипт использует wmctrl:

    sudo apt-get установить wmctrl

  2. Скопируйте скрипт в пустой файл, сохраните его как launcher_toworkspace.py

  3. Запустите его с помощью команды:

    python3 /path/to/launcher_toworkspace.py
    
  4. Если все работает как положено, добавьте следующую команду в ваши автозагрузки:

    /bin/bash -c "sleep 15&&python3 /path/to/launcher_toworkspace.py"
    

Сценарий

#!/usr/bin/env python3
import subprocess    
import os
import time

datadir = os.environ["HOME"]+"/.config/lswitcher"
if not os.path.exists(datadir):
    os.makedirs(datadir)
workspace_data = datadir+"/launcher_data_"

key = [
    "gsettings get ",
    "gsettings set ",
    "com.canonical.Unity.Launcher favorites",
    ]

def get_launcher():
    return subprocess.check_output(
        ["/bin/bash", "-c", key[0]+key[2]]
        ).decode("utf-8").strip()

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()
currlauncher1 = get_launcher()

while True:
    time.sleep(1)
    currlauncher2 = get_launcher()
    curr_ws2 = current()
    datafile = workspace_data+curr_ws2
    if curr_ws2 == curr_ws1:
        if currlauncher2 != currlauncher1:
            open(datafile, "wt").write(currlauncher2)
    else:
        if not os.path.exists(datafile):
            open(datafile, "wt").write(currlauncher2)
        else:
            curr_set = open(datafile).read()
            command = key[1]+key[2]+' "'+str(curr_set)+'"'
            subprocess.Popen(["/bin/bash", "-c", command])
    curr_ws1 = curr_ws2
    currlauncher1 = get_launcher()

Заметка

Если вы настроили свои рабочие пространства с предыдущей версией скрипта, они также должны работать для этой версии.

PPA

Согласно 2015-04-23, хороший вопрос о Деннисе J и ободрение Парто привели к созданию ppa для скрипта, описанного в webupd8, включая графический интерфейс для управления им.

ppa:vlijm/lswitcher

Чтобы установить его, запустите:

sudo add-apt-repository ppa:vlijm/lswitcher
sudo apt-get update
sudo apt-get install lswitcher

введите описание здесь

С тех пор он упакован для Trusty & Utopic. Я добавлю другие после тестирования. Я также добавлю .deb установщик, но я бы предложил использовать ppa, так как обычно такие вещи обновляются время от времени.

Поскольку местоположение данных области просмотра изменилось с ~/ в ~/.config/lswitcher вам придется заново настроить Unity Launcher, если вы использовали предыдущий скрипт.

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