Réconcilier xmonad et IntelliJ

Au travail comme à la maison, j’utilise IntelliJ et xmonad. Le premier est un IDE java, le second un gestionnaire de fenêtres (que j’écrirai par la suite WM pour Window Manager) “tilé” (Tiling WM), écrit en haskell. Le rapport entre les deux ? Swing (utilisé par IntelliJ) n’aime pas xmonad, et ce dernier lui rend assez bien : voyons ça en détail.

Tiling WM ?

Placement des fenêtres

Un Tiling WM va s’occuper de placer les fenêtres suivant différents layouts (plein écran, une fenêtre principale et le reste sur le côté, les fenêtres en grille sur l’écran, etc) contrairement à un WM classique qui va juste afficher les fenêtres les unes par dessus les autres. Un WM dont la seule valeur ajoutée est de mettre une bordure et une barre en haut avec quelques boutons, j’ai du mal à appeler ça un gestionnaire de fenêtres :)

Si vous n’utilisez pas de tiling WM, vous devez très certainement passer du temps à placer les fenêtres, notamment lorsqu’il faut en afficher plusieurs côte à côte. Et recommencer une fois dès que le placement ne convient plus. Finalement, abandonner et rester aux bons vieux placements foireux du WM parce que déplacer les fenêtres c’est long (surtout sans connaitre le truc du alt+drag&drop / alt+drag&drop au clic droit (clic milieu pour gnome)) et qu’au final, c’est supportable.

Les tiling WM font ce boulot pour vous : vous gagnez plein de temps !

Double écran

Autre aspect cool, le double (ou triple) écran. Particulièrement vrai avec xmonad, je ne connais pas assez les autres pour en parler. Cas classique avec un double écran (et gnome 2) : sur le workspace 1, vous ouvrez sur l’écran 1 l’IDE et sur l’écran 2 la doc. Vous avez maintenant besoin d’afficher les logs (écran 1 du workspace 3) du serveur à côté du code. Bon courage pour déplacer toutes les fenêtres, bosser et tout remettre dans l’ordre par la suite.
Arrive xmonad. Il sépare la notion de workspace et d’écran : vous pouvez choisir quel workspace afficher sur quel écran ! Le cas précédent se résume alors à : afficher le workspace “logs” sur l’écran 2, bosser, remettre le workspace “doc”.

Pas besoin de continuer je pense, le gain est suffisamment flagrant. Si vous ne connaissez pas le concept de Tiling WM, je vous encourage à essayer (pas forcément xmonad, il y en a plein d’autres).

Revenons à nos moutons, la configuration de xmonad. Elle est écrite en haskell, ce qui tire ghc (compilateur) comme dépendance mais ce qui rend le fichier de configuration extrêmement puissant. Si toutes les configurations étaient compilées, le monde s’en porterait certainement mieux. Pour les sceptiques, sachez que xmonad permet de recompiler et de recharger la conf à chaud, sans fermer de fenêtre :-)
Partons d’une conf simple/minimaliste :

1
2
3
import XMonad

main = xmonad defaultConfig

Les ennuis commencent

Xmonad est un WM “non re-parenteur” : il ne change pas le parent des fenêtres ouvertes pour ajouter des bordures, la decoration de fenêtre, etc. Malheureusement, java a une liste de WM “non re-parenteur” en dur… et xmonad n’en fait pas parti. La première étape est donc de changer le nom de xmonad pour duper swing avec un startupHook :

1
2
3
4
5
6
import XMonad
import XMonad.Hooks.SetWMName

main = xmonad defaultConfig
    { startupHook = setWMName "LG3D"
    }

Cela résout pas mal de soucis avec les applis java.

Les ennuis continuent

Autre problème, xmonad ignore (pour l’instant) la partie WM_TAKE_FOCUS du standard ICCM. Conséquence direct : j’ai de gros problèmes de focus avec mon IDE. En attendant que la version 1.0 résolve le problème, on peut utiliser le patch proposé. Soit en patchant les sources, soit en utilisant le hook ICCCMFocus. Ce hook est apparu dans xmonad-contrib (collection de modules supplémentaires pour xmonad) dans sa version développement. Il reprend tout simplement le patch pour une intégration plus facile. Voyons comment installer tout ça et changer sa conf en conséquence.


<<<<<<<
Edit du 22 décembre
(un peu en retard) : xmonad 0.10 est sorti ! Plus besoin d’une version spéciale, la version stable suffit.

1
pacman -S xmonad xmonad-contrib

pour Archlinux ou

1
cabal update && cabal install xmonad xmonad-contrib

pour tout le monde suffit à l’installer.

=======
Version d’origine

Si votre distribution supporte les paquets gérés par la communauté et qu’une bonne âme a créé celui pour xmonad / xmonad-contrib version développement, alors il n’y a pas grand chose à faire. Exemple avec Archlinux, une de mes distros préférées :

1
yaourt -S xmonad-darcs xmonad-contrib-darcs

Pour les autres, il va falloir installer les deux à la main. Soit en faisant comme le package d’archlinux, soit avec cabal : (exemple avec ubuntu)

1
2
3
4
5
6
7
8
apt-get install darcs ghc
darcs pull -a http://code.haskell.org/xmonad
cd xmonad
cabal configure && cabal build && cabal install --global
cd ..
darcs get --partial --set-scripts-executable http://code.haskell.org/XMonadContrib
cd XMonadContrib
cabal configure && cabal build && cabal install --global

>>>>>>>

Il reste juste à ajouter deux lignes dans la configuration de xmonad pour utiliser le hook :

1
2
3
4
5
6
7
8
import XMonad
import XMonad.Hooks.ICCCMFocus
import XMonad.Hooks.SetWMName

main = xmonad defaultConfig
    { startupHook = setWMName "LG3D"
    , logHook = takeTopFocus
    }

Problèmes de focus

Xmonad a le comportement “focus follow mouse” (si on survole une fenêtre avec la souris, celle-ci aura le focus) par défaut. J’aime ce comportement, je le garde. Sauf que certaines applis tentent de gérer le gain/la perte de focus (exemple : la liste des méthodes, des classes, des fichiers dans IntelliJ). Si une fenêtre se redimensionne (la liste des classes qui se précise en écrivant) et passe sous la souris, la fenêtre se ferme. Rageant au début, insupportable à la fin. La solution est simple : ajouter le “mouse follow focus” :-)

1
2
3
4
5
6
7
8
9
import XMonad
import XMonad.Actions.UpdatePointer
import XMonad.Hooks.ICCCMFocus
import XMonad.Hooks.SetWMName

main = xmonad defaultConfig
    { startupHook = setWMName "LG3D"
    , logHook = updatePointer (Relative 0.5 0.5) >> takeTopFocus
    }

Maintenant, la souris est automatiquement déplacée au centre de la fenêtre qui a le focus.

Recompilons notre configuration

1
xmonad --recompile && xmonad --restart

Fini ! Enjoy :)

Contrat Creative Commons Article écrit sous Creative Commons 3.0 BY-SA.

VN:F [1.9.22_1171]
Rating: +6 (from 6 votes)
Share
Ce contenu a été publié dans Outils, Trucs & astuces, avec comme mot(s)-clef(s) , . Vous pouvez le mettre en favoris avec ce permalien.

7 réponses à Réconcilier xmonad et IntelliJ

  1. rlemaire@excilys.com dit :

    C’est bien compliqué pour afficher des fenêtres…

    Je ne suis pas assez geek pour ça. J’aime bien quand ça marche direct sans qu’il y ait à bidouiller.

    VN:F [1.9.22_1171]
    Rating: 0 (from 2 votes)
    • mgrenonville@excilys.com dit :

      Ceci dit, pour avoir utiliser xmonad avec Eclipse, le problème ne se pose pas puisque Eclipse utilise GTK (contrairement à intelliJ et netbeans qui sont en swing).
      Ensuite, comme le dit si bien David, la configuration de base fait 2 lignes. Le reste c’est de la personnalisation.
      Au final, le débat est plus : vi/emacs contre gedit (non, je n’entrerai pas dans le troll vi/emacs :D) Au debut, c’est difficile, il y a quelques raccourcis clavier à connaitre, et au final, c’est plus pratique.

      VN:F [1.9.22_1171]
      Rating: 0 (from 0 votes)
    • David Duponchel dit :

      Xmonad n’est pas vraiment compliqué, il propose surtout des concepts peu ou pas utilisés par les WM classiques. Ce qui est compliqué, c’est de faire cohabiter les applis Swing et les tiling WM (la faute à swing, cela devrait être résolu avec java 7. ENFIN).

      C’est le fait de coder sa conf en haskell qui va rebuter pas mal de monde. C’est bien dommage, car cela rend le fichier de conf extrêmement puissant. Infiniment plus que ce qu’offre (par exemple) le clickodrome gnome : changer le thème et le fond d’écran (troll inside).

      Moi aussi j’aime quand les applis fonctionnent directement sans bidouille (et xmonad fait ça très bien). Mais j’aime également deux choses : coder et pouvoir configurer/personnaliser comme je l’entend ce que j’utilise :-)

      VN:F [1.9.22_1171]
      Rating: +1 (from 1 vote)
    • nmaupu@excilys.com dit :

      A la différence de Gnome, KDE, …, il n’y a pas à bidouiller pour que ça marche. D’ailleurs, c’est un peu abuser de parler de WM dans le cas de Gnome et consort, on devrait plutôt presque parler d’OS. Gnome fait 1G et ne place pas les fenêtres … :D
      3 lignes de conf ou pas, c’est vrai qu’il y a un investissement temps au départ mais qu’après, c’est du bonheur ;)
      Et pour ceux que haskell rebute (pourtant c’est intéressant pour un informaticien de connaître un vrai langage fonctionnel et non pas une pale imitationCeci n’est pas un troll) il existe d’autres tiling WMs plus simples à configurer (ION, WMII, etc …) et tout aussi efficaces !

      VN:F [1.9.22_1171]
      Rating: +2 (from 2 votes)
  2. cbrouillard@excilys.com dit :

    En soit, ce genre de WM c’est toujours la même chose : la première configuration se fait souvent “dans la douleur”. Une fois “dépucelé” et la configuration au chaud quelque part sur un disque dur de backup, il n’y a plus grand chose d’autre à faire que d’apprécier tous les avantages du tiling (et à la rigueur mettre à jour si changement de version).
    Pour ma part, j’ai toujours mon petit faible pour ION3 ^^ (troll inside mais on l’a déjà fait hein …)

    VN:F [1.9.22_1171]
    Rating: 0 (from 0 votes)

Laisser un commentaire