Novo analóxico de Punto Switcher para linux: xswitcher

O fin do apoio de xneur causóume algo de sufrimento nos últimos seis meses. (coa chegada de OpenSUSE 15.1 nos meus escritorios: con xneur activado, as fiestras perden o foco e parpadean divertido co tempo coa entrada do teclado).

"Oh, carallo, comecei a escribir o deseño incorrecto de novo" - no meu traballo isto ocorre indecentemente a miúdo. E non engade nada positivo.

Novo analóxico de Punto Switcher para linux: xswitcher
Ao mesmo tempo, eu (como enxeñeiro de deseño) podo formular con bastante claridade o que quero. Pero eu quería (primeiro de Punto Switcher, e despois, grazas a Windows Vista, cambiar finalmente a Linux, de xneur) exactamente unha cousa. Despois de entender que o lixo da pantalla está no deseño incorrecto (isto ocorre normalmente ao final de escribir unha palabra nova), pisa "Pausa/Pausa". E obtén o que imprimiste.

Polo momento, o produto ten a relación funcionalidade/complexidade óptima (desde o meu punto de vista). É hora de compartir.

TL.DR

Haberá todo tipo de detalles técnicos máis tarde, así que primeiro... ligazón "tocar" para os impacientes.

Actualmente o seguinte comportamento está codificado:

  • "Pausa/Pausa": retrocede a última palabra, cambia o deseño na xanela activa (entre 0 e 1) e marca de novo.
  • "Ctrl esquerda sen nada": cambia o deseño na xanela activa (entre 0 e 1).
  • "Maiúsculas á esquerda sen nada": activa o deseño número 0 na xanela activa.
  • "Maiúsculas á dereita sen nada": activa o deseño número 1 na xanela activa.

A partir de agora penso personalizar o comportamento. Sen comentarios, non é interesante (de todos os xeitos estou ben). Creo que en Habré haberá unha porcentaxe suficiente de público con problemas semellantes.

NB Porque na versión actual, o keylogger está anexo a "/dev/input/", o xswitcher debe iniciarse con dereitos de root:

chown root:root xswitcher
chmod +xs xswitcher

Por favor, teña en conta: O propietario do ficheiro con suid debe ser root, porque quen sexa o propietario converterase en suid ao iniciarse.

Os paranoides (non son unha excepción) poden clonar GIT e montar no lugar. Así:

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

Engade o inicio automático ao gusto (dependendo de DE).

Funciona, "non pide mingau" (≈30 segundos de CPU por día, ≈12 MB en RSS).

Detalles

Agora - os detalles.

Todo o repositorio estaba dedicado orixinalmente ao meu proxecto de mascota, e estou moi preguiceiro para comezar outro. Así, todo está amoreado (só en cartafoles) e cuberto por AGPL ("patente inversa").

O código xswitcher está escrito en golang, con inclusións mínimas de C. Suponse que este enfoque producirá o menor esforzo (ata o momento). Mentres se mantén a capacidade de conectar o que falta usando cgo.

O texto contén comentarios sobre de onde se tomou prestado e por que. Porque o código xneur "non me inspirou", tomeino como punto de partida loloswitcher.

Usar "/dev/input/" ten as súas vantaxes (todo é visible, incluída a tecla de repetición automática presionada) e as súas desvantaxes. As desvantaxes son:

  • A repetición automática (eventos co código "2") non se correlaciona coa repetición con x.
  • A entrada a través das interfaces X11 non é visible (así funciona VNC, por exemplo).
  • Necesita root.

Por outra banda, é posible subscribirse a eventos X a través de "XSelectExtensionEvent()". Podes asomarte código xinput. Non atopei nada como isto para ir, e a implementación aproximada levou inmediatamente cen liñas de código C. Déixao de lado por agora.

A saída "inversa" realízase actualmente atornillando o teclado virtual. Grazas ao autor de keybd_event, pero a abstracción hai un nivel demasiado alto e haberá que refacela máis. Por exemplo, uso a tecla Win dereita para seleccionar a terceira fila. E só o Win esquerdo se transmite de volta.

Erros coñecidos

  • Non sabemos nada sobre a entrada "composta" (exemplo: ½). Non é necesario agora.
  • Estamos xogando a vitoria correcta de forma incorrecta. No meu caso, rompe a énfase.
  • Non hai unha análise de entrada clara. En cambio, hai varias funcións: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Grazas nsmcan para o teu coidado: corrixilo no código e aquí. Con certa probabilidade, pode detectar erros ao substituír.
    Neste momento non sei "como" e agradecería calquera suxestión.
  • (Ai Señor) uso competitivo de canles (keyboardEvents, miceEvents).

Conclusión

O código é o procedemento máis sinxelo. E estúpido coma min. Así que, alégrome coa esperanza de que case calquera técnico poida completar o que queira. E grazas a isto, este produto non perecerá sen apoio, como a maioría dos só por diversión.

Boa sorte!

Fonte: www.habr.com

Engadir un comentario