Touches multimédia dans Emacs avec D-Bus et Gnome
J'utilise l'environnement de bureau Gnome et l'éditeur de textes Emacs.
Comme de nombreux utilisateurs de cet éditeur, j'ai tendance lui faire faire un peu tout et n'importe quoi, y compris jouer de la musique (en particulier parce que j'aime bien dired pour gérer la collection).
Il existe de nombreuses façons de faire jouer de la musique à Emacs. J'utilise Emms, qui ne requiert quasiment aucune configuration, et n'oblige pas la maintenance d'une base de donnée musicale. De plus, il se débrouille tout seul pour trouver les outils nécessaires à la lecture des fichiers audio sur le système, sans plus d'indication.
Le clavier que j'utilise est doté de touches multimédia agréablement placées. Ces touches génèrent les évènements X bien connus XF86Audio* et sont déjà facile à assigner aux fonctions de Emms, mais je voulais aller un peu plus loin.
Gnome intègre de base une gestion des touches multimédia, qu'il transmet via D-Bus aux applications qui le demandent. Il permet aussi de le faire lorsque l'écran est verrouillé !
Emacs supporte D-Bus, le tour est joué !
(require 'dbus)
(defvar gnome-mmkeys-pressed-hook nil)
(defun gnome-mmkeys-callback (from key)
(run-hook-with-args 'gnome-mmkeys-pressed-hook key))
(setq gnome-mmkeys-registration nil)
(defun enable-gnome-mmkeys()
(interactive)
(when (not gnome-mmkeys-registration)
(dbus-call-method
"org.gnome.SettingsDaemon"
"/org/gnome/SettingsDaemon/MediaKeys"
"org.gnome.SettingsDaemon.MediaKeys"
"GrabMediaPlayerKeys" "Emacs" 0)
(setq gnome-mmkeys-registration
(dbus-register-signal
"org.gnome.SettingsDaemon"
"/org/gnome/SettingsDaemon/MediaKeys"
"org.gnome.SettingsDaemon.MediaKeys"
"MediaPlayerKeyPressed"
'gnome-mmkeys-callback))))
(defun disable-gnome-mmkeys()
(interactive)
(when gnome-mmkeys-registration
(dbus-unregister-object gnome-mmkeys-registration)
(setq gnome-mmkeys-registration nil)))
;; Utilisation pour Emms
(defun emms-bind-gnome-mmkeys (key)
(cond ((string= "Next" key)
(emms-next))
((string= "Play" key)
(emms-pause))
((string= "Previous" key)
(emms-previous))))
(add-hook 'gnome-mmkeys-pressed-hook 'emms-bind-gnome-mmkeys)