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.
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.