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

20

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

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

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

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

Деннис Дж
источник
Вы имеете в виду различный набор иконок запуска для каждой рабочей области? Вкуснятина, мне это нравится, но я должен бежать, буду работать над этим завтра, если ты это имеешь в виду. Пожалуйста, дайте мне знать.
Джейкоб Влейм
Да, это все, Джейкоб. Существуют специальные инструменты (например, LTspice) для моделирования цепей, которые не имеют отношения к музыке.
Деннис Дж
Можно сделать без сомнения. Вероятно, завтра или в воскресенье :).
Джейкоб Влейм
Спасибо, Джейкоб. Просто начну день, поэтому я попробую. Это звучит так же, как то, что я просил !!! Я займусь этим и сообщу.
Деннис Дж
Джейкоб, я еще не начал это. Прежде чем начать, я хочу сделать резервную копию образа. Я не уверен, что Резервные копии в Системных настройках восстановят весь раздел. Были исследования Clonezilla, выглядит как хороший инструмент для создания / восстановления изображения. Таким образом, если что-то пойдет не так, я смогу вернуться до того, как все испортилось. На этой неделе будет выпущен новый накопитель емкостью 1 ТБ. Мне нужно будет использовать Clonezilla, чтобы переместить систему на него. Сценарии выглядят так, будто я могу следовать за ними, и я сообщу, как только начну. Спасибо за продолжение, готов поспорить, другие тоже оценят то, что вы сделали.
Деннис Дж

Ответы:

24

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

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

  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, хороший вопрос Денниса Дж и поддержка Parto привели к созданию 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, если вы использовали предыдущий скрипт.

Якоб Влейм
источник
Возможно ли это без использования сочетаний клавиш? Как я это представляю, как показано ниже: Когда в рабочей области один, отображается только набор значков; когда я переключаюсь на рабочее пространство два, панель запуска пуста, за исключением черточки и значков корзины - затем я добавляю нужные значки, которые сохраняются автоматически. Повторите для других рабочих пространств. Может быть, вы даже можете создать графический интерфейс для него - даст вам +500, если вы заставите его работать. GUI является необязательным.
Парто
1
@Parto WOW, вы знаете, как привлечь чье-то внимание :) Это возможно, но потребуется несколько потоков, чтобы все работало гладко (пробовал в «моно» скрипте). Ожидайте ответ в ближайшие дни :).
Джейкоб Влейм
1
Потрясающе. Я буду ждать ... хороший вопрос, интересно, как я об этом не подумал.
Парто
1
@ Парто, должен сказать, я впечатлен твоей щедростью. Я планирую работать над этим и, возможно, создать ppa, включая графический интерфейс для запуска / остановки, настройки и т. Д. Спасибо за толчок! Кстати, ваш рабочий стол выглядит великолепно!
Джейкоб Влейм
1
В любой момент. Всем нужен толчок сейчас и потом. Кроме того, ты мне тоже раньше помог - просто считай это благодарностью. Об этом «проекте» было бы неплохо, потому что не все такие хитрые.
Парто