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

20

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

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

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

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

    
задан Dennis J 10.04.2015 в 16:18
источник

1 ответ

24

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


1. 2. 3. < em> 4.

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

Настройка включает две части:

  1. A (одна) комбинация клавиш быстрого доступа, чтобы «запомнить» набор значков запуска для текущей рабочей области.

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

Как это работает

Применяются два небольших скрипта:

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

Скрипт second отслеживает текущее рабочее пространство. Если есть рабочая область change , скрипт видит, существует ли соответствующий (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 ) в комбинацию сочетаний клавиш по вашему выбору: System Settings & gt; «Клавиатура» & gt; «Ярлыки» & gt; «Пользовательские ярлыки». Нажмите «+» и добавьте команду:

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

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

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

    python3 /path/to/launcher_perworkspace.py
    

    Если все работает нормально и ваши коммутаторы запускаются на рабочее пространство, добавьте следующую команду в свои приложения для запуска: Dash & gt; Приложения для запуска & gt; Добавить:

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

Примечания

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

Изменить

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

Я уверен, что слишком много (или слишком мало :)) уважения к тому, что делает скрипт. Однако вы можете просто создать резервную копию текущего 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 install 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, хороший вопрос о Деннисе Дж и поощрение Парто привели к созданию ppa для скрипта, на webupd8 , включая графический интерфейс для управления им.

ppa:vlijm/lswitcher

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

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

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

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

    
ответ дан Jacob Vlijm 12.04.2015 в 09:15
источник