Nuevo análogo de Punto Switcher para Linux: xswitcher

El fin del soporte de xneur me ha causado cierto sufrimiento durante los últimos seis meses. (con la llegada de OpenSUSE 15.1 a mis escritorios: con xneur habilitado, Windows pierde el foco y parpadea de forma extraña al ritmo de la entrada del teclado).

"Oh, maldita sea, comencé a escribir con el diseño incorrecto nuevamente": esto sucede a menudo de manera indecente en mi trabajo. Y no aporta nada positivo.

Nuevo análogo de Punto Switcher para Linux: xswitcher
Al mismo tiempo, yo (como ingeniero de diseño) puedo formular con bastante claridad lo que quiero. Pero quería (primero de Punto Switcher y luego, gracias a Windows Vista, finalmente cambiar a Linux, de xneur) exactamente una cosa. Al darse cuenta de que la basura en la pantalla tiene el diseño incorrecto (esto generalmente sucede al final de escribir una nueva palabra), presione "Pausa/Pausa". Y consigue lo que imprimiste.

Por el momento, el producto tiene la relación óptima (desde mi punto de vista) funcionalidad/complejidad. Es hora de compartir.

TL.DR

Habrá todo tipo de detalles técnicos más adelante, así que primero... enlace "tocar" para los impacientes.

Actualmente, el siguiente comportamiento está codificado:

  • “Pausa/Pausa”: retrocede la última palabra, cambia el diseño en la ventana activa (entre 0 y 1) y vuelve a marcar.
  • “Ctrl izquierdo sin nada”: cambia el diseño en la ventana activa (entre 0 y 1).
  • “Mayús a la izquierda sin nada”: activa el diseño No. 0 en la ventana activa.
  • “Mayús a la derecha sin nada”: activa el diseño número 1 en la ventana activa.

De ahora en adelante planeo personalizar el comportamiento. Sin comentarios, no es interesante (de todos modos, estoy de acuerdo con eso). Creo que en Habré habrá un porcentaje suficiente de espectadores con problemas similares.

NB Porque en la versión actual, el keylogger está adjunto a "/dev/input/", xswitcher debe iniciarse con derechos de root:

chown root:root xswitcher
chmod +xs xswitcher

Por favor, tenga en cuenta: El propietario del archivo con suid debe ser root, porque Quien sea el propietario se convertirá en suid al inicio.

Los paranoicos (yo no soy una excepción) pueden clonar desde GIT y ensamblar en sitio. Como eso:

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

Agregue inicio automático al gusto (según DE).

Funciona, “no pide papilla” (≈30 segundos de CPU por día, ≈12 MB en RSS).

detalles

Ahora, los detalles.

Todo el repositorio se dedicó originalmente a mi proyecto favorito y soy demasiado vago para iniciar otro. Así, todo está amontonado (sólo en carpetas) y cubierto por AGPL (“patente inversa”).

El código de xswitcher está escrito en golang, con inclusiones mínimas de C. Se supone que este enfoque resultará en la menor cantidad de esfuerzo (hasta ahora lo ha hecho). Manteniendo la capacidad de conectar lo que falta usando cgo.

El texto contiene comentarios sobre de dónde fue tomado prestado y por qué. Porque el código xneur “no me inspiró”, lo tomé como punto de partida loloswitcher.

Usar "/dev/input/" tiene ventajas (todo es visible, incluida la tecla de repetición automática presionada) y desventajas. Las desventajas son:

  • La repetición automática (eventos con código “2”) no se correlaciona con la repetición con x.
  • La entrada a través de interfaces X11 no es visible (así funciona, por ejemplo, VNC).
  • Necesita raíz.

Por otro lado, es posible suscribirse a eventos X mediante "XSelectExtensionEvent()". Puedes echar un vistazo a código de entrada. No encontré nada como esto y la implementación aproximada tomó inmediatamente cien líneas de código C. Déjalo a un lado por ahora.

La salida “inversa” actualmente se realiza atornillando el teclado virtual. Gracias al autor de keybd_event, pero la abstracción allí es de un nivel demasiado alto y habrá que rehacerla más. Por ejemplo, uso la tecla Win derecha para seleccionar la tercera fila. Y solo se transmite la victoria izquierda.

Errores conocidos

  • No sabemos nada sobre la entrada "compuesta" (ejemplo: ½). No es necesario ahora.
  • Estamos jugando incorrectamente la victoria correcta. En mi caso, rompe el énfasis.
  • No hay un análisis de entrada claro. En cambio, hay varias funciones: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Gracias nsmcan para tu cuidado: corregido en el código y aquí. Con cierta probabilidad, puede detectar errores al reemplazar.
    En este punto no sé “cómo hacerlo” y agradecería cualquier sugerencia.
  • (Oh Dios) Uso competitivo de canales (keyboardEvents, miceEvents).

Conclusión

El código es el procedimiento más simple. Y estúpido como yo. Por eso me enorgullezco de tener la esperanza de que casi cualquier técnico pueda completar lo que quiera. Y gracias a esto, este producto no perecerá sin soporte, como la mayoría de los productos sólo por diversión.

¡Buena suerte!

Fuente: habr.com

Añadir un comentario