El nombre es una referencia a Devilspie, una utilidad similar. Es notable por el hecho de que la configuración está escrita en el dialecto Lisp, a pesar de esto tiene capacidades muy limitadas. Especialmente para utilidades como wmctl, etc.
Puede hacer mucho más con la biblioteca wnck e incluso más con gdk.
Para las teclas de acceso rápido globales, usé libkeybinder, solía hacer esto en xlib "desnudo", pero es más conveniente (y portátil). Sin embargo, también se usa xlib / xtest para emular las pulsaciones de botones. Pero estas funciones son opcionales.
Elegí yaml como formato de configuración. Las versiones anteriores usaban una configuración de Python, pero decidí que yaml es más conveniente para los usuarios finales. Además, puede incrustar código en Python y entrar en él.
No entraré en detalles de la implementación. Hay mucha magia y metaprogramación, se genera parte del código.
Prefiero mostrar un ejemplo de una configuración que usa algunas de las capacidades. Por cierto, se pueden generar nuevas reglas desde la línea de comando, tomará el nombre y class_group de la ventana activa.
click_with_F1:
if:
key: F1
then:
click: 3
El ejemplo más simple. Al presionar F1 se emulará un clic con el botón derecho del mouse.
save_image:
if:
key: F2
class_group: Google-chrome
then:
- click: 3
- sleep: 0.1
- press: v
- enable: autosave
Al presionar F2, se hará clic derecho, v (guardar como) y se activará la regla de guardado automático
# Would type "filename" and press alt+s to save when Save file dialog of chrome appears. But only after we pressed F2.
autosave:
if:
name: Save File
class_group: Google-chrome
enabled: false
then:
- press: f i l e n a m e Alt+S
# Disable autosaving every 2 secs.
timer_test:
if:
event: timer 2
then:
disable: autosave
Cuando aparezca la ventana Guardar archivo, recordará el nombre del archivo y lo guardará. Esta regla se desactiva después de 2 segundos. El nombre del archivo se completará automáticamente solo cuando presione F2, no para ninguna ventana.
print_debug:
if:
event: never
then:
debug:
win_changed:
if:
event: active_window_changed
then:
echo: "window changed {name} {class_group}"
switched_to_xterm:
if:
name:
contains: mc
class_group: XTerm
then:
- maximize:
- disable: win_changed
- trigger: print_debug
not_in_mc:
if:
or:
class_group:
ne: xterm
name:
contains_not: mc
then:
- sh: date
- py: from datetime import datetime;print(datetime.now())
print_debug trigger, . . wnck gdk. wnck. if , sh.
- . . , . , .
, , - mpv. , .
Por cierto. aunque hay mucha magia en el código, creo que tiene una buena arquitectura. Me gustaría escuchar críticas. Pero aquí es importante el equilibrio entre la comprensibilidad del código y su versatilidad / compacidad. El énfasis está en este último.
El código está disponible en github y pypi. Por cierto. ¿Dónde más colocar el programa? Me gustaría transmitirlo a los usuarios de escritorio. Es posible que deba agregar una interfaz gráfica de usuario, pero hay demasiadas funciones allí. Es más conveniente simplemente editar el archivo config.