Como obter um Unity Launcher diferente com ícones diferentes em cada área de trabalho?

20

Eu li as várias respostas para ter pastas separadas na área de trabalho em cada área de trabalho usando Screenlets, devilspie ou CCSM ... mas essa não é a resposta para minha pergunta. Instalei o 14.04 LTS há alguns dias e tive um bom sucesso ao executar a maioria dos meus aplicativos e alguns novos. O que eu gostaria é de ter 4 espaços de trabalho separados, cada um com alguns ícones diferentes para os ambientes que corro. Por exemplo,

  • Área de trabalho 1 - dedicada a aplicativos de ciências e matemática
  • Área de trabalho 2 - dedicada a ferramentas de música
  • Área de trabalho 3 - para circuitos eletrônicos e simulações
  • Área de trabalho 4 - para navegação na web e computação em geral

Pense em um tablet Android em que cada tela possa conter ícones separados.

Deve ser óbvio como fazer isso, mas não consigo encontrar uma resposta. Eu tenho 4 dias no Ubuntu, então, por favor, não assuma que eu sei o que estou fazendo!

Dennis J
fonte
Você quer dizer um conjunto diferente de ícones do iniciador por área de trabalho? Gostoso eu gosto disso, mas eu tenho que correr, vou trabalhar amanhã, se é isso que você quer dizer. Por favor deixe-me saber.
Jacob Vlijm
Sim, é isso Jacob. Existem ferramentas específicas (como LTspice) para simulação de circuito que não têm relevância para a música.
Dennis J
Pode ser feito sem dúvida. Provavelmente amanhã ou domingo :).
Jacob Vlijm
Obrigado Jacob. Apenas começando o dia, então vou tentar. Isso soa exatamente como o que eu pedi !!! Vou entrar e relatar de volta.
Dennis J
Jacob, eu ainda não comecei isso. Antes de começar, quero fazer uma imagem de backup. Não tenho certeza de que os backups nas configurações do sistema restaurem toda a partição. Pesquisando o Clonezilla, parece uma boa ferramenta para criar / restaurar uma imagem. Dessa forma, se algo der errado, eu posso voltar antes de estragar tudo. Há uma nova unidade de 1 TB a caminho nesta semana. Vou precisar usar o Clonezilla para mover o sistema para ele. Os scripts parecem que eu posso segui-los, e irei reportar assim que começar. Obrigado pelo acompanhamento, aposto que os outros também apreciarão o que você fez.
Dennis J

Respostas:

24

Configurando um Unity Launcher diferente por área de trabalho:


1. insira a descrição da imagem aqui 2. insira a descrição da imagem aqui 3. insira a descrição da imagem aqui 4. insira a descrição da imagem aqui

A solução abaixo facilita a possibilidade de ter um conjunto diferente de ícones do iniciador por área de trabalho, independentemente de quantos espaços de trabalho você tenha.

A configuração inclui duas partes:

  1. Uma combinação de teclas de atalho para "lembrar" o conjunto de ícones do iniciador da área de trabalho atual.

  2. Um script para ser executado em segundo plano, mantendo o controle da área de trabalho atual e definindo o Unity Launcher correspondente. Ele age sempre que o usuário alterna a área de trabalho.

Como funciona

Dois pequenos scripts estão envolvidos:

O primeiro script faz uma coisa simples: grava o conteúdo do iniciador atual em um arquivo (oculto) no diretório inicial, nomeado (numerado) após o seu espaço de trabalho atual.

O segundo script fica de olho em qual é o espaço de trabalho atual. Se houver uma alteração no espaço de trabalho , o script verá se existe um arquivo de dados correspondente (iniciador-) (criado pelo primeiro script). Nesse caso, ele lê o arquivo e altera o Unity Launcher, conforme lembrado no arquivo.

É isso aí.

Como configurar

  1. O script precisa wmctrlser instalado:

    sudo apt-get install wmctrl
    
  2. Crie um diretório no qual os dois scripts serão armazenados. É importante que os dois scripts sejam mantidos juntos em um diretório, pois compartilham a funcionalidade e um importa do outro. Pelo mesmo motivo, é importante que você os nomeie exatamente como indicado abaixo.

  3. Copie cada um dos scripts abaixo em um arquivo vazio (diferente), salve-o no diretório (criado em 2.), exatamente chamado como:

    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. Adicione o primeiro script ( set_workspace.py) a uma combinação de teclas de atalho de sua escolha: Configurações do sistema> "Teclado"> "Atalhos"> "Atalhos personalizados". Clique no "+" e adicione o comando:

    python3 /path/to/set_workspace.py
    
  5. Execute a combinação de teclas e veja se um arquivo, como:, .launcher_data_3é criado em seu diretório pessoal. Você provavelmente precisará pressionar Ctrl+ Hpara tornar o arquivo visível (os arquivos que começam com a .são invisíveis por padrão).

    Navegue pelos espaços de trabalho e repita o procedimento: defina uma combinação de ícones do iniciador e pressione a combinação de teclas para "lembrar" o conjunto desse espaço de trabalho específico.

  6. Você está praticamente pronto agora. Teste o script em segundo plano com o comando (a partir de uma janela do terminal, mantenha-o em execução):

    python3 /path/to/launcher_perworkspace.py
    

    Se tudo funcionar bem, e o iniciador alternar por área de trabalho, adicione o seguinte comando aos aplicativos de Inicialização: Dash> Startup Applications> Add:

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

Notas

  1. Se você deseja alterar o conjunto de ícones do iniciador para um espaço de trabalho específico, simplesmente navegue até o espaço de trabalho, adicione / remova ícones como desejar e pressione a combinação de teclas (não é necessário reiniciar o script em segundo plano).
  2. Pelo (s) comentário (s), sinto que há algum mal-entendido no atalho para lembrar o Launcher atual do espaço de trabalho atual. Você só precisa de um atalho de teclado para "salvar" o iniciador atual do espaço de trabalho atual. Funcionará exatamente da mesma forma, não importa em que área de trabalho você esteja. O próprio script determinará qual é o espaço de trabalho atual.

Editar

Pelo seu comentário, entendo que você não tem certeza de executar o (s) script (s) e tem medo de estragar seu lançador atual.

Tenho certeza de que há muito (ou pouco :) respeito pelo que o script está fazendo. No entanto, você pode simplesmente fazer backup do atual Unity Launcher com o comando:

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

Isso criará um arquivo ~/launcher_output, contendo o comando completo para restaurar o Unity Launcher à situação inicial. Em caso de emergência, basta copiar o conteúdo do arquivo e colá-lo no terminal.

Mas, novamente, é muito improvável que você estrague o seu iniciador, a menos que altere o script manualmente.


EDIÇÃO IMPORTANTE (2)

Conforme solicitado em um comentário, por meio deste, uma versão que é executada sem a necessidade de usar nenhuma combinação de atalhos; basta executar o script e começar a configurar seus lançadores nos espaços de trabalho específicos. O script criará arquivos (invisíveis) em seu diretório pessoal, para lembrar seu conjunto de ativadores (Unity-) nos diferentes espaços de trabalho.

Eu tentei isso na "versão 1" do script, mas sempre "incorporar" as duas verificações do iniciador entre duas verificações do espaço de trabalho acabou sendo o truque para evitar comportamentos indesejados (salvando dados incorretos) ao mover-se rapidamente pelos espaços de trabalho.

Como usar

  1. Como a primeira versão, este script usa wmctrl:

    sudo apt-get install wmctrl

  2. Copie o script em um arquivo vazio, salve-o como launcher_toworkspace.py

  3. Execute-o com o comando:

    python3 /path/to/launcher_toworkspace.py
    
  4. Se funcionar como esperado, adicione o seguinte comando aos aplicativos de inicialização:

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

O script

#!/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()

Nota

Se você configurar seus espaços de trabalho com a versão anterior do script, eles também deverão funcionar para esta versão.

PPA

De acordo com 23/04/2015, a boa pergunta de Dennis J e o incentivo de Parto levaram à criação de um ppapara o script, abordado no webupd8 , incluindo uma GUI para gerenciá-lo.

ppa:vlijm/lswitcher

Para instalá-lo, execute:

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

insira a descrição da imagem aqui

Desde agora, é embalado para Trusty & Utopic. Vou adicionar outros após o teste. Também adicionarei um .debinstalador, mas sugiro usar o ppa, pois geralmente esse tipo de coisa é atualizado de vez em quando.

Como a localização dos dados da janela de visualização mudou de ~/para ~/.config/lswitcher, você precisará configurar o Unity Launcher novamente se tiver usado o script anterior.

Jacob Vlijm
fonte
Isso é possível sem usar os atalhos do teclado? Como eu o visualizo, é como abaixo: Quando no espaço de trabalho um, apenas um conjunto de ícones é mostrado; quando alterno para o espaço de trabalho dois, o iniciador está vazio, exceto os ícones de traço e lixeira - em seguida, adiciono os ícones desejados que são salvos automaticamente. Repita para os outros espaços de trabalho. Talvez você possa até criar uma GUI para isso - você receberá +500 se você fizer isso funcionar. A GUI é opcional.
Parto
11
@ Cartoon WOW, você sabe como chamar a atenção de alguém :) Isso é possível com certeza, mas seriam necessários vários threads para fazê-lo funcionar sem problemas (tentei em um script de trilha "mono"). Espere uma resposta nos próximos dias :).
Jacob Vlijm
11
Impressionante. Eu estarei esperando ... boa pergunta, pergunto-me como eu não pensei nisso.
Parto
11
@ Cartoon Devo dizer que estou impressionado com a sua generosidade. Estou pensando em trabalhar mais nisso e talvez criar uma ppaGUI, incluindo para iniciar / parar, preferências etc. Obrigado pelo empurrão! A propósito, sua área de trabalho fica ótima!
Jacob Vlijm
11
A qualquer momento. Todo mundo precisa de um empurrão de vez em quando. Além disso, você já me ajudou antes - considere um agradecimento. Sobre esse 'projeto', um ppa seria bom, pois nem todo mundo é técnico.
Parto