Novo análogo do Punto Switcher para Linux: xswitcher

O fim do suporte do xneur me causou algum sofrimento nos últimos seis meses. (com o advento do OpenSUSE 15.1 em meus desktops: com o xneur habilitado, as janelas perdem o foco e piscam de maneira engraçada com a entrada do teclado).

“Ah, droga, comecei a digitar no layout errado de novo” - isso acontece com frequência indecente no meu trabalho. E não acrescenta nada de positivo.

Novo análogo do Punto Switcher para Linux: xswitcher
Ao mesmo tempo, eu (como engenheiro de design) posso formular com bastante clareza o que desejo. Mas eu queria (primeiro do Punto Switcher, e depois, graças ao Windows Vista, finalmente mudando para o Linux, do xneur) exatamente uma coisa. Ao perceber que o lixo na tela está no layout errado (isso geralmente acontece ao final da digitação de uma nova palavra), pise em “Pause/Break”. E pegue o que você imprimiu.

No momento, o produto tem a relação funcionalidade/complexidade ideal (do meu ponto de vista). É hora de compartilhar.

TL.DR

Haverá todos os tipos de detalhes técnicos mais tarde, então primeiro... link "tocar" para os impacientes.

Atualmente, o seguinte comportamento está codificado:

  • “Pausa/Pausa”: recua a última palavra, alterna o layout da janela ativa (entre 0 e 1) e disca novamente.
  • “Ctrl esquerdo sem nada”: alterna o layout da janela ativa (entre 0 e 1).
  • “Left Shift sem nada”: ativa o layout nº 0 na janela ativa.
  • “Shift para a direita sem nada”: ativa o layout nº 1 na janela ativa.

De agora em diante pretendo personalizar o comportamento. Sem feedback, não é interessante (de qualquer maneira, estou bem com isso). Acredito que em Habré haverá uma percentagem suficiente de público com problemas semelhantes.

NB Porque na versão atual, o keylogger está anexado a "/dev/input/", o xswitcher deve ser iniciado com direitos de root:

chown root:root xswitcher
chmod +xs xswitcher

Por favor, note: O proprietário do arquivo com suid deve ser root, porque quem quer que seja o proprietário será transformado em suid na inicialização.

Paranóicos (não sou exceção) podem clonar GIT e monte no local. Assim:

go get "github.com/micmonay/keybd_event"
go get "github.com/gvalkov/golang-evdev"

### X11 headers for OpenSUSE/deb-based
zypper install libX11-devel libXmu-devel
apt-get install libx11-dev libxmu-dev

cd "x switcher/src/"
go build -o xswitcher -ldflags "-s -w" --tags static_all src/*.go

Adicione inicialização automática a gosto (dependendo de DE).

Funciona, “não pede mingau” (≈30 segundos de CPU por dia, ≈12 MB em RSS).

detalhes

Agora – os detalhes.

Todo o repositório foi originalmente dedicado ao meu projeto favorito e estou com preguiça de começar outro. Então, tudo fica empilhado (só em pastas) e coberto pela AGPL (“patente reversa”).

O código xswitcher é escrito em golang, com inclusões mínimas de C. Supõe-se que esta abordagem resultará no menor esforço (até agora). Mantendo a capacidade de conectar o que está faltando usando cgo.

O texto contém comentários sobre de onde foi emprestado e por quê. Porque o código xneur “não me inspirou”, tomei-o como ponto de partida loloswitcher.

Usar "/dev/input/" tem vantagens (tudo é visível, incluindo a tecla de repetição automática pressionada) e desvantagens. As desvantagens são:

  • A repetição automática (eventos com código “2”) não se correlaciona com a repetição com x.
  • A entrada através das interfaces X11 não é visível (é assim que o VNC funciona, por exemplo).
  • Precisa de raiz.

Por outro lado, é possível assinar eventos X via "XSelectExtensionEvent()". Você pode espiar código xinput. Não encontrei nada parecido com isso, e a implementação aproximada imediatamente exigiu cem linhas de código C. Deixe isso de lado por enquanto.

A saída “reversa” atualmente é feita aparafusando o teclado virtual. Obrigado ao autor de keybd_event, mas a abstração é de nível muito alto e terá que ser refeita ainda mais. Por exemplo, eu uso a tecla Win direita para selecionar a terceira linha. E apenas o Win esquerdo é transmitido de volta.

Erros conhecidos

  • Não sabemos nada sobre entrada “composta” (exemplo: ½). Não é necessário agora.
  • Estamos jogando o Win certo de forma incorreta. No meu caso, isso quebra a ênfase.
  • Não há análise de entrada clara. Em vez disso, existem várias funções: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Obrigado nsmcan aos seus cuidados: corrigi no código e aqui. Com uma certa probabilidade, você pode detectar bugs durante a substituição.
    Neste ponto não sei “como fazer” e gostaria de receber sugestões.
  • (Oh Deus) uso competitivo de canais (keyboardEvents, miceEvents).

Conclusão

O código é o processual mais simples. E estúpido como eu. Por isso, me lisonjeio com a esperança de que quase qualquer técnico consiga realizar o que deseja. E graças a isso, este produto não perecerá sem suporte, como a maioria apenas por diversão.

Boa sorte!

Fonte: habr.com

Adicionar um comentário