Como obter um Unity Launcher diferente com ícones diferentes em cada espaço de trabalho?

20

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

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

Pense em um tablet Android em que cada tela pode 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!

    
por Dennis J 10.04.2015 / 16:18

1 resposta

24

Definindo um Unity Launcher diferente por área de trabalho:


1. 2. 3. < em> 4.

A solução abaixo torna possível ter um conjunto diferente de ícones de inicialização por espaço de trabalho, independentemente de quantos espaços de trabalho você tenha.

A configuração inclui duas partes:

  1. Uma (uma) combinação de teclas de atalho para "lembrar" o conjunto de ícones do ativador para a área de trabalho atual.

  2. Um script para ser executado em segundo plano, acompanhando o que é o espaço de trabalho atual e configurando o Iniciador de Unidades correspondente. Atua sempre que o usuário troca de espaço de trabalho.

Como funciona

Dois pequenos scripts estão envolvidos:

O script primeiro faz uma coisa simples: ele grava o conteúdo do ativador atual em um arquivo (oculto) em seu diretório inicial, nomeado (numerado) após sua área de trabalho atual.

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

É isso.

Como configurar

  1. O script precisa de wmctrl para ser instalado:

    sudo apt-get install wmctrl
    
  2. Crie um diretório no qual ambos os scripts serão armazenados. É importante que ambos os scripts sejam mantidos juntos em um diretório, já que eles compartilham funcionalidade e um importa do outro. Pela mesma razão, é importante que você os nomeie exatamente como indicado abaixo.

  3. Copie cada um dos scripts abaixo em um arquivo (diferente) vazio, salve-os 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 & gt; "Teclado" & gt; "Atalhos" & gt; "Atalhos personalizados". Clique no botão "+" 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 + H para tornar o arquivo visível (arquivos, começando com . são invisíveis por padrão).

    Navegue pelas áreas 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 para esse espaço de trabalho específico.

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

    python3 /path/to/launcher_perworkspace.py
    

    Se tudo funcionar bem e seu ativador alternar por espaço de trabalho, adicione o seguinte comando aos seus aplicativos de inicialização: Dash & gt; Aplicativos de inicialização & gt; Adicione:

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

Notas

  1. Se você quiser alterar o conjunto de ícones do iniciador para uma área de trabalho específica, simplesmente navegue até a área de trabalho, adicione / remova ícones como desejar e pressione a combinação de teclas (não é necessário reiniciar o script de plano de fundo).
  2. A partir do (s) comentário (s), tenho a sensação de que há algum mal-entendido no atalho para lembrar o Launcher atual do espaço de trabalho atual. Você só precisa de um um atalho de teclado para "salvar" o lançador atual da área de trabalho atual. Ele funcionará exatamente da mesma maneira, não importa em qual espaço de trabalho você esteja. O próprio script determinará o que é o espaço de trabalho atual.

Editar

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

Tenho certeza que isso é muito (ou muito pouco :)) respeito pelo que o script está fazendo. No entanto, você pode simplesmente fazer backup de seu Unity Launcher atual 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 seu Unity Launcher para a 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ê atrapalhe seu lançador, a menos que você 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 qualquer combinação de atalhos qualquer ; basta executar o script e começar a configurar seus ativadores nas áreas de trabalho específicas. O script criará arquivos (invisíveis) no seu diretório pessoal, para lembrar o conjunto de iniciadores (Unity-) nos diferentes espaços de trabalho.

Eu tentei isso na "versão 1" do script, mas sempre "incorporando" as duas verificações de inicialização entre duas verificações de espaço de trabalho acabou sendo o truque para evitar comportamento indesejado (salvando dados incorretos) ao mover rapidamente pelo espaços de trabalho.

Como usar

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

    sudo apt-get instala o 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 seus 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

A partir de 2015-04-23, a boa pergunta de Dennis J e o incentivo do Parto levaram à criação de um ppa para o script, cobrado 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

Desde agora, é empacotado para Trusty & amp; Utópico. Eu adicionarei outros após o teste. Também adicionarei um .deb instalador, 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 exibição mudou de ~/ para ~/.config/lswitcher , você precisará configurar seu Unity Launcher novamente se tiver usado o script anterior.

    
por Jacob Vlijm 12.04.2015 / 09:15