Posso definir Hot Corners para executar comandos personalizados no Unity?

12

Eu gosto muito de Hot Corners. : -)

É de alguma forma possível executar um comando personalizado em um canto quente como mostrado abaixo?

    
por orschiro 18.02.2017 / 17:03

3 respostas

10

CCSM

  1. Instale o Gerenciador de Configurações CompizConfig (CCSM). Executar no terminal:

    sudo apt-get install compizconfig-settings-manager
    
  2. Abra o CCSM.

  3. Ir para "Comandos"
  4. Digite o comando desejado em um dos slots. Por exemplo:

  5. Váparaaguia"Ligações de borda"

  6. Clique em "None" e defina o canto ativo desejado (ou borda), que corresponde ao comando que você acabou de definir

  7. Movaomouseparaocanto

  8. Agoraseucomandoéexecutado!

Trabalho confirmado em 14.04.

    
por wjandrea 19.02.2017 / 02:27
6

Comandos personalizados

Se você estiver usando o Unity e tiver o ccsm instalado, a resposta do wjandrea é sua resposta, é claro. Se não , ou para usar em outras distros, uma alternativa leve pode ser útil.

Com o script abaixo, você pode definir qualquer comando, específico para cada um dos seus hotcorners.

Como exemplo, fiz a seguinte configuração:

  • Superior esquerdo Nenhuma ação
  • Superior direito Executar Gedit
  • Inferior à esquerda Nenhuma ação
  • Bottom RightRun terminal Gnome

É claro que você também pode fazer com que os comandos executem scripts externos.

Além disso, você pode definir o tamanho do canto ativo na linha:

cornersize = 10

Basta alterar o valor (pixels). O script define áreas (quadradas) para acionar seus comandos:

Oscript

#!/usr/bin/env python3 import subprocess import time cornersize = 20 commands = [ None, "gedit", None, "gnome-terminal", ] def get(cmd): return subprocess.check_output(cmd).decode("utf-8").strip() def get_pos(): return [int(s.split(":")[1]) for s in get(["xdotool", "getmouselocation"]).split()[:2]] scrdata = get("xrandr").split(); resindex = scrdata.index("connected")+2 res = [int(n) for n in scrdata[resindex].split("+")[0].split("x")] match1 = None while True: time.sleep(1) xy = get_pos() x = xy[0]; y = xy[1] test = [ [x < cornersize, y < cornersize], [x > res[0]-cornersize, y < cornersize], [x < cornersize, y > res[1]-cornersize], [x > res[0]-cornersize, y > res[1]-cornersize], ] match2 = [i for i, p in enumerate(test) if all(p)] if match2 != match1: if match2: cmd = commands[match2[0]] if cmd: subprocess.Popen(["/bin/bash", "-c", cmd]) match1 = match2

Configurar

  1. O script precisa de xdotool

    sudo apt install xdotool
    
  2. Copie o script em um arquivo vazio, salve-o como hotcorners2.py
  3. Na cabeça do script, defina seus comandos (lembre-se das aspas)

    commands = [
        None,
        "gedit",
        None,
        "gnome-terminal",
    ]
    

    (subsequentemente, superior esquerdo / direito, inferior esquerdo / direito)

  4. Teste: execute o script:

    python3 /path/to/hotcorners2.py
    
  5. Se tudo funcionar bem, adicione a Startup Applications: Dash > Aplicativos de inicialização > Adicionar. Adicione o comando:

    /bin/bash -c "sleep 5 && python3 /path/to/hotcorners2.py"
    

Notas

  • O script atualmente é executado na (primeira) tela. Ele pode ser facilmente editado para cuidar de várias telas, até mesmo fazer coisas diferentes em telas diferentes, por favor mencione.
  • Se algumas pessoas gostarem, podemos adicionar um gui e um ppa para uso conveniente e fácil instalação.

EDITAR

Se usarmos um pouco mais de computação avançada, podemos usar um raio em vez de uma área quadrada para acionar os comandos (graças ao bom @pythagoras):

Pequenadiferença,masapenaspordiversão:

Oscript

#!/usr/bin/env python3 import subprocess import math import time # set distance (hotcorner sensitivity) radius = 20 # top-left, top-right, bottom-left, bottom-right commands = [ None, "gedit", None, "gnome-terminal", ] def get(cmd): return subprocess.check_output(cmd).decode("utf-8").strip() def get_pos(): return [int(s.split(":")[1]) for s in get(["xdotool", "getmouselocation"]).split()[:2]] # get the resolution scrdata = get("xrandr").split(); resindex = scrdata.index("connected")+2 res = [int(n) for n in scrdata[resindex].split("+")[0].split("x")] # list the corners, could be more elegant no doubt corners = [[0, 0], [res[0], 0], [0, res[1]], [res[0], res[1]]] match1 = None while True: time.sleep(1) pos = get_pos() # get the current difference from the mousepointer to each of the corner (radius) diff = [int(math.sqrt(sum([(c[i]-pos[i])**2 for i, n in enumerate(res)])))\ for c in corners] # see if any of the corners is "approached" within the radius match2 = [diff.index(n) for n in diff if n < radius] # if so, and the corresponding command is not set to None, run it. if all([match2 != match1, match2]): cmd = commands[match2[0]] if cmd: subprocess.Popen(["/bin/bash", "-c", cmd]) match1 = match2

Uso

É praticamente o mesmo. Defina seus comandos e o raio a ser acionado na seção head do script.

    
por Jacob Vlijm 18.02.2017 / 18:12
5

NOTA:

a resposta do wjandrea é a resposta mais adequada para alguém que usa o Ubuntu padrão ou o Ubuntu Kylin (ou compiz como sua exibição gerente), assim fica meu voto e respeito. A resposta fornecida abaixo também pode ser usada no Unity, mas provavelmente seria um pouco redundante. No entanto, em ambientes de desktop que não têm compiz, pode-se usar o indicador apresentado abaixo. Eu testei isso brevemente no Lubuntu 16.04 VM, então eu sei que funciona lá, e também é compatível com o Kylin 14.04. Para os desktops GNOME e MATE, você precisará de suporte para que os AppIndicators sejam ativados primeiro para usar qualquer indicador.

Introdução

Eu implementei indicator-edger , o que permite acionar comandos definidos pelo usuário com base na posição do mouse em qualquer lugar ao longo das 4 bordas da tela. A versão original foi feita dentro de um dia, em aproximadamente 7 horas, portanto é bastante minimalista, mas faz o trabalho.

Oindicadorécontroladopeloarquivo~/.edger-commands.json,obviamentenoformatojson.PodeserescritomanualmentepelousuáriooudefinidoatravésdaopçãoDEFINECOMMANDSdoindicador.Aopçãodeativação/desativaçãodoacionamentoélembradaegravadaautomaticamentenoarquivoparaconveniênciadousuário.Oarquivodeconfiguraçãodeamostraseriaassim:

{"right": "gnome-terminal",
    "top": "firefox",
    "left": "",
    "bottom": "gnome-screenshot",
    "enabled": true
}

Observe a entrada "left" no arquivo. Essa borda não está definida, mas devido à sintaxe json , é necessário ter uma cadeia vazia, ou seja, aspas "" .

Quando o indicador detectar que o usuário colocou o mouse ao longo de qualquer uma das bordas (com ~ 3 pixels de margem), o indicador enviará uma notificação de bolha e executará o comando apropriado (se definido). A ativação do gatilho não será repetida a menos que o usuário afaste o mouse da borda.

Comovocêpodevernaimagemacima,oindicadortambémtemdepuraçãodesaídanalinhadecomando.Sevocêencontraralgumerro,sinta-seàvontadeparaexecutá-loapartirdoterminal,descobrirqualerroocorreeenviarorelatóriodeerroapropriadosobreosproblemas página do GitHub do projeto .

Atualmente, não há suporte para cantos (apenas arestas) e foi criado para configuração de um monitor (obviamente, não é possível abranger todas as bases dentro de 7 horas da criação), mas esses recursos podem estar disponíveis no futuro.

Instalação e código-fonte

O código-fonte está disponível na página do GitHub ou através do código Launchpad . A instalação é realizada através dos seguintes comandos no terminal:

sudo add-apt-repository ppa:1047481448-2/sergkolo
sudo apt-get update
sudo apt-get install indicator-edger
    
por Sergiy Kolodyazhnyy 18.02.2017 / 22:24