Le nom est une référence à devilspie, un utilitaire similaire. Il est remarquable par le fait que la configuration est écrite dans le dialecte Lisp, malgré cela, elle a des capacités très limitées. Surtout pour les utilitaires comme wmctl, etc.
Vous pouvez faire beaucoup plus avec la bibliothèque wnck, et encore plus avec gdk.
Pour les raccourcis clavier globaux, j'ai utilisé libkeybinder, je le faisais sur xlib "nu", mais c'est plus pratique (et portable). Cependant, xlib / xtest est également utilisé - pour émuler les pressions sur les boutons. Mais ces fonctions sont facultatives.
J'ai choisi yaml comme format de configuration. Les anciennes versions utilisaient une configuration python, mais j'ai décidé que yaml est plus pratique pour les utilisateurs finaux. De plus, vous pouvez intégrer du code en python et sh dedans.
Je n'entrerai pas dans les détails de la mise en œuvre. Il y a beaucoup de magie et de métaprogrammation, une partie du code est générée.
Je préfère montrer un exemple de configuration qui utilise certaines des capacités. Au fait, de nouvelles règles peuvent être générées à partir de la ligne de commande, elle prendra le nom et le groupe_classe de la fenêtre active.
click_with_F1:
if:
key: F1
then:
click: 3
L'exemple le plus simple. Appuyez sur F1 pour émuler un clic droit de la souris.
save_image:
if:
key: F2
class_group: Google-chrome
then:
- click: 3
- sleep: 0.1
- press: v
- enable: autosave
Appuyez sur F2 pour faire un clic droit, v (enregistrer sous) et activer la règle d'enregistrement automatique
# 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
Lorsque la fenêtre Enregistrer le fichier apparaît, il se souviendra du nom du fichier et l'enregistrera. Cette règle est désactivée après 2 secondes. Le nom du fichier ne sera rempli automatiquement que lorsque vous appuyez sur F2, pas pour n'importe quelle fenêtre.
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. , .
D'ailleurs. bien qu'il y ait beaucoup de magie dans le code, je pense qu'il a une bonne architecture. J'aimerais entendre des critiques. Mais ici l'équilibre entre la compréhensibilité du code et sa polyvalence / compacité est important. L'accent est mis sur ce dernier.
Le code est disponible sur github et pypi. D'ailleurs. où d'autre placer le programme? Je voudrais le transmettre aux utilisateurs de bureau. Vous devrez peut-être ajouter une interface graphique, mais il y a trop de fonctionnalités. Il est plus pratique de simplement éditer la config.