Novo Punto Switcher para linux: xswitcher

A descontinuação do suporte ao xneur me causou algum sofrimento nos últimos seis meses (com o advento do OpenSUSE 15.1 em minhas áreas de trabalho: quando o xneur é ativado, as janelas perdem o foco e piscam divertidamente com a entrada do teclado) .

“Ah, droga, eu comecei a digitar novamente no layout errado” - é obsceno no meu trabalho frequentemente. E não adiciona positivo.


Ao mesmo tempo, eu (como engenheiro de design) posso articular claramente o que quero. E eu queria (primeiro do Punto Switcher, e depois, graças ao Windows Vista, finalmente replantando no Linux, do xneur) exatamente um. Percebendo que o lixo na tela está no layout errado (isso geralmente acontece no final da digitação de uma nova palavra), clique em "Pausar / Interromper". E pegue o que imprimi.

No momento, o produto possui uma ótima relação (do ponto de vista de mim) funcionalidade / complexidade. É hora de compartilhar.

TL.DR


Todos os tipos de detalhes técnicos continuarão, então primeiro - um link de "toque" para os impacientes.

Atualmente, o seguinte comportamento está codificado:

  • “Pausar / Quebrar”: retrocede a última palavra, alterna o layout na janela ativa (entre 0 e 1) e digita novamente.
  • Ctrl esquerdo sem nada: alterna o layout na janela ativa (entre 0 e 1).
  • “Mudança à esquerda sem nada”: ativa o layout 0 na janela ativa.
  • “Mudança à direita sem nada”: ativa o layout nº 1 na janela ativa.

A partir de agora, pretendo personalizar o comportamento. Sem feedback, não é interessante (estou feliz com isso de qualquer maneira). Acredito que em Habré haverá uma porcentagem suficiente da audiência com problemas semelhantes.

NB Desde na versão atual, o keylogger está parafusado em "/ dev / input /", o xswitcher deve ser executado com direitos de root:

chown root:root xswitcher
chmod +xs xswitcher

Observe: o proprietário do arquivo com suid deve ser root, como quem é o proprietário é suid e ativará a inicialização.

Os paranóicos (não sou exceção) podem clonar do GIT e montar no local. Curtiu isso:

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

O início automático adiciona a gosto (dependendo da DE).

Funciona: "não peça mingau" (~ 30 segundos de CPU por dia, ~ 12 MB em RSS).

Detalhes


Agora para os detalhes.

Todo o repositório foi originalmente dedicado ao meu projeto de estimação, e iniciar outro é muito preguiçoso. Então, tudo é empilhado (apenas em pastas) e coberto com AGPL ("patente vice-versa").

O código do xswitcher é escrito em golang, com um mínimo de C. É assumido que essa abordagem dará o mínimo de esforço (até o momento). Mantendo a capacidade de conectar os desaparecidos via cgo.

O texto do comentário é apresentado, de onde foi emprestado e por quê. Porque o código xneur “não me inspirou”, loloswitcher tomou como ponto de partida .

O uso de "/ dev / input /" tem suas vantagens (tudo pode ser visto, incluindo a tecla pressionada com repetição automática) e os menos. Os contras são:

  • A repetição automática (eventos com código "2") não se correlaciona com a repetição com X.
  • Você não pode ver a entrada pelas interfaces X11 (por exemplo, o VNC funciona).
  • Precisa de uma raiz.

Como alternativa, você pode assinar eventos X através de "XSelectExtensionEvent ()". Você pode espiar o código xinput . Por enquanto, não encontrei nada parecido, e o rascunho da implementação deu centenas de linhas de código C de uma só vez. Até agora reservado.

A conclusão "voltar" até agora foi feita apertando o teclado virtual. Graças ao autor keybd_event, mas há abstração de alto nível e precisará ser refeita ainda mais. Por exemplo, eu tenho a tecla Win correta, a terceira linha seleciona. E apenas o Win esquerdo é transmitido de volta.

Bugs conhecidos


  • Não sabemos nada sobre a entrada "composta" (exemplo: ½). Não é necessário no momento.
  • Reproduzimos incorretamente a vitória correta. No meu caso, isso quebra o arranjo de sotaques.
  • Não há uma análise clara da entrada. Em vez disso, existem várias funções: Compare (), CtrlSequence (), RepeatSequence (), SpaceSequence (). obrigadonsmcanpara atenção: corrigido no código aqui. Com uma certa probabilidade, você pode pegar bugs ao substituir.
    Neste local, não sei "como fazer" e terei prazer em dar sugestões.
  • (Oh, horror) uso competitivo de canais (keyboardEvents, miceEvents).

Conclusão


O código é o procedimento mais simples. E estúpido como eu. Então, estou me confortando com a esperança de que quase qualquer técnico possa terminar o que ele quer. E esse produto, devido a isso, não desaparecerá sem o suporte, como a maioria por diversão.

Boa sorte

All Articles