Touches multimédia dans Emacs avec D-Bus et Gnome

 · 1 min read
 · Jean Schurger

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)