Chocoblog

Chocoblog

Billets sur l'informatique, les logiciels libres et retours d'utilisation sont au programme avec la possibilité de publier des billets de copains.

Présentation et configuration du tiling manager i3 avec i3pystatus

Lorsqu'on installe une distribution GNU/Linux classique (Ubuntu, Debian, Mint...), on a généralement le choix entre plusieurs environnements de bureau comme pour les plus connus KDE, Gnome, XFCE... Chacun possède son propre gestionnaire de fenêtre plutôt classique où on redimensionne/déplace les fenêtres à l'aide de la souris comme sous Windows ou Mac OS par exemple.

Il existe une autre catégorie de gestionnaires de fenêtres appelée tiling manager permettant d'organiser ses fenêtres automatiquement de façon à ce qu'elles prennent tout l'espace disponible de l'écran. Ce ne sont pas des environnements de bureau donc ils ne viennent pas avec 35 000 paquets qui peuvent ne pas vous servir. À vous de voir quels outils vous voulez pour visionner une image, lire un film, naviguer dans les fichiers... À la carte donc :)

Il existe de nombreux tilings manager : awesome, xmonad, i3.... J'ai choisi ici de présenter i3.

Installation

Sur ArchLinux, le paquet est nommé i3-wm. Au reboot, via votre gestionnaire de connexion sélectionnez i3 et le tour est joué. Je vous laisse vous référer à la documentation de votre distribution pour savoir comment installer i3.

Principes

Je vous conseille de jeter un oeil sur la très bonne documentation disponible. Pour résumer vous choisissez la touche nommée mod qui vous servira pour exécuter des actions. Dans mon cas j'ai choisi la touche SUPER (vous savez celle avec le logo windows). Cette touche combinée à d'autres vous permet de naviguer entre les workspaces, déplacer les fenêtres, changer le mode de tiling etc.

En parlant de mode de tiling vous en avez 3 :

  • stacking : les différentes fenêtres sont disposées en "pile". Vous pouvez naviguer entre elles via mod+flèches haut/bas
    https://lutim.cpy.re/73JSu9Yh

  • tabbed : les fenêtres sont disposées comme dans un navigateur internet. Vous pouvez naviguer entre elles via mod+flèches droite/gauche
    https://lutim.cpy.re/TDERttOW

  • split : toutes les fenêtres partagent l'espace de votre bureau. Vous pouvez naviguer entre elles via mod+flèches droite/gauche/haut/bas
    https://lutim.cpy.re/uWST7YLA

Enfin, une fenêtre peut se soustraire au mode tiling en passant en mode flottant. Si une fenêtre est flottante, i3 ne gère plus son positionnement et sa taille ce qui veut dire que vous pouvez la déplacer/redimensionner directement à la souris. Ce mode est principalement utilisé pour toutes les fenêtres "volantes" (applet, boite de dialogue etc). En revanche ce genre de fenêtre sera toujours au dessus de toutes les autres.

Combinaisons de touches utiles

Avant de parler de la configuration, voici quelques combinaisons par défaut pour vous aider à prendre en main le gestionnaire :

  • mod+Return : ouvre un terminal (tel que défini dans la configuration)
  • mod+d : ouvre le launcher (tel que défini dans la configuration)
  • mod+numero : se déplacer au workspace numéro...
  • mod+Shift+numero : déplacer la fenêtre active au workspace numéro...
  • mod+z : changer le mode du tiling en tabbed
  • mod+s : changer le mode du tiling en stacking
  • mod+e : changer le mode du tiling en split. Refaire cette combinaison alors qu'on est déjà en mode split inverse son sens (horizontal/vertical)
  • mod+f : passer en mode plein écran
  • mod+Shift+q : kill l'application active
  • mod+flêches : navigue entre les différentes fenêtres du workspace
  • mod+Shift+space : active/désactive le mode flottant pour la fenêtre courante

Configuration globale

Lorsqu'on installe i3, on ne dispose d'aucun outil comme c'est le cas avec des environnements de bureau complets (XFCE, Gnome...) qui viennent avec leurs propres outils de terminal, launcher etc. Ici c'est à vous de choisir personnellement chacun des outils que vous voulez utiliser. Autant dire que si on est tout nouveau dans l'environnement GNU/Linux c'est pas forcément évident.

Vous trouverez le fichier de configuration d'i3 dans ~/.config/i3. Comme vous pourrez le constater il est déjà bien fourni par défaut.

Terminal

Dans ce fichier vous trouverez la ligne $mod+Return exec i3-sensible-terminal. Cela veut dire que si vous faites un mod+Return i3 exécutera i3-sensible-terminal. Il s'agit d'un wrapper que vous pouvez modifier en surchargeant la variable d'environnement TERMINAL. Vous pouvez par exemple créer un fichier ~/.profile avec export TERMINAL="urxvtc" à l'intérieur.

Bindings

J'ai trouvé la configuration par défaut très bonne donc je n'ai pas fait de grandes modifications. J'ai simplement ajouté la ligne suivante me permettant de faire facilement un alt+f4 (que j'apprécie beaucoup). J'utilise aussi le programme Synapse au lieu de dmenu comme launcher d'applications.

bindsym $alt+F4      kill
bindsym $mod+d exec synapse

Raccourcis d'application

Il est possible d'ajouter des raccourcis d'application. En effet, les touches fn ne sont pas forcément reconnus et il faut donc (légèrement) bricoler. L'option --no-startup-id empêche grossomodo d'avoir la souris qui se met en mode "je réfléchis" (souvent avec un petit cercle qui tourne) en attendant que l'application se lance.

En ce qui concerne les contrôles pour PulseAudio pilotables avec des touches média :

# Pulse Audio controls
bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume alsa_output.pci-0000_00_1b.0.analog-stereo +5%
bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume alsa_output.pci-0000_00_1b.0.analog-stereo -5%
bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute alsa_output.pci-0000_00_1b.0.analog-stereo toggle

De même, le pilotage du rétro éclairage du clavier via les touches fn :

bindsym XF86KbdBrightnessUp exec --no-startup-id kbd_backlight.sh up
bindsym XF86KbdBrightnessDown exec --no-startup-id kbd_backlight.sh down

Pour faire une imprim' écran, j'utilise l'outil maim. Il permet de sélectionner une zone sur l'écran. Le || permet de faire en sorte que si je fais un clic droit (au lieu d'un clic gauche pour sélectionner ma zone) le programme fera un screen de tout l'écran.

bindsym Print exec --no-startup-id maim -s ~/Desktop/screen_$(date +%F-%T).png || maim ~/Desktop/region_$(date +%F-%T).png

En ce qui concerne le pilotage du player audio via une combinaison de touche (si votre clavier n'a pas les touches médias associées par exemple) :

bindsym $mod+Control+Left exec playerctl previous
bindsym $mod+Control+Right exec playerctl next
bindsym $mod+Control+Down exec playerctl play-pause
bindsym $mod+Control+Up exec playerctl stop

Enfin, du divers :

# Locker le screen sur fond noir
bindsym $mod+l exec --no-startup-id i3lock -c 000000
# Aller à la fenêtre "urgente"
bindsym $mod+u [urgent=latest] focus
# Ouvrir le navigateur de fichier
bindsym $mod+t exec --no-startup-id thunar
# Aller au workspace suivant/précédent
bindsym $mod+$alt+Right workspace next
bindsym $mod+$alt+Left workspace prev

Éteindre l'ordinateur

Vous l'avez peut-être constaté, il n'y a pas de menu permettant de faire des actions sur la session courante comme éteindre l'ordinateur, se déconnecter etc. Il va falloir le créer nous même (crédits wiki ArchLinux) :

set $Locker i3lock && sleep 1

set $mode_system System (l) lock, (e) logout, (s) suspend, (h) hibernate, (r) reboot, (Shift+s) shutdown
mode "$mode_system" {
  bindsym l exec --no-startup-id $Locker, mode "default"
  bindsym e exec --no-startup-id i3-msg exit, mode "default"
  bindsym s exec --no-startup-id $Locker && systemctl suspend, mode "default"
  bindsym h exec --no-startup-id $Locker && systemctl hibernate, mode "default"
  bindsym r exec --no-startup-id systemctl reboot, mode "default"
  bindsym Shift+s exec --no-startup-id systemctl poweroff -i, mode "default"  

  bindsym Return mode "default"
  bindsym Escape mode "default"
}

bindsym $mod+Pause mode "$mode_system"

Ce bout de code lancera un petit menu si vous appuyez sur mod+Pause où vous pourrez choisir parmi différentes actions (notamment éteindre l'ordinateur).

Applications au démarrage

Il est possible de lancer certaines applications au démarrage. Voici ma liste :

# Active le pavé numérique
exec --no-startup-id numlockx on
# Lance un petit script qui change le wallpaper à intervalle régulier
exec --no-startup-id wallpaper.sh
# Lance le démon Urxvt (terminal)
exec --no-startup-id urxvtd -q -o -f
# Permet d'avoir de la transparence, I3 de le gère pas de base
exec --no-startup-id compton
# Programme de notification (daemon)
exec --no-startup-id dunst
# Lance l'applet de Network Manager
exec --no-startup-id nm-applet

Applications flottantes

Certaines applications ont besoin d'être toujours flottantes. C'est le cas par exemple l'applet de Seafile :

https://lutim.cpy.re/MFeL7dlr

On peut le spécifier dans la configuration de cette manière :

for_window [class="Seafile"] floating enable

Barre de statut

Il est possible d'avoir une barre de statut afin d'afficher les informations qui vous semblent importantes (conso CPU, date, RAM, réseau, batterie, mails etc). Vous avez plusieurs utilitaires disponibles. J'ai personnellement choisi i3pystatus car proposant pas mal de plugins intéressants. Vous pouvez le configurer via le fichier ~/.config/i3/pystatus.py.

https://lutim.cpy.re/JEIJ5VWL

Je vais faire un tour rapide des plugins que j'utilise mais vous trouverez une très bonne documentation sur le site de i3pystatus. Vous pouvez voir ici la liste des modules disponibles.

Vérifier sa connexion internet

Par défaut i3pystatus vérifie que vous ayez une connexion internet avant de faire des requêtes (par exemple pour la météo) en envoyant une requête DNS chez Google. C'est pas glop et ça peut ne pas fonctionner derrière un firewall d'entreprise par exemple. La bonne nouvelle c'est que vous pouvez le changer :

status = Status(standalone=True, internet_check=('mondomaine.tld', 80))

Date et heure

status.register("clock",
    format="%a %-d %b %X KW%V",)

Météo

Vous pouvez trouver votre location_code sur le site http://www.weather.com/.

from i3pystatus.weather import weathercom
status.register(
    'weather',
    format='{current_temp}{temp_unit}{icon} {humidity}%',
    colorize=True,
    backend=weathercom.Weathercom(
        location_code='42000:4:FR',
    ),
)

Mémoire RAM

status.register("mem",
    log_level=10,
    format="Mem: {percent_used_mem}%",)

CPU

Pour le pourcentage d'usage courant :

status.register("cpu_usage")

Pour avoir un graphe (en UTF-8 :) ) :

status.register("cpu_usage_graph",
    graph_style="blocks",
    format="{cpu_graph}")

Et enfin sa fréquence :

status.register("cpu_freq",
    format="{avgg}Ghz)",)

Température

status.register("temp",
    format="{temp:.0f}°C",)

Disque

Si vous avez plusieurs disques vous pouvez choisir le point de montage. Par exemple pour un SSD et un disque dur :

status.register("disk",
    path="/home",
    critical_limit=10,
    interval=600,
    format="SSD {avail}G Av.",)
status.register("disk",
    critical_limit=100,
    path="/mnt/storage",
    interval=600,
    format="HDD {avail}G Av.",)

Réseau

Les kb/s en direct avec le graphe associé :

status.register("network",
    interface="wlan0",
    interval=1,
    graph_style="blocks",
    format_up="{network_graph} {packets_recv:04}kbs/{packets_sent:04}kbs",)

Le SSID sur lequel vous êtes connecté avec la qualité de connexion :

status.register("network",
    interface="wlan0",
    interval=60,
    format_up="{essid} {quality:03.0f}%",)

VPN

Si vous avez OpenVPN, vous pouvez voir si il est actif ou non :

status.register("openvpn",
    format="VPN {status}",
    vpn_name="client")

Batterie

Pour voir le pourcentage de batterie qu'il nous reste :

status.register("battery",
    format="{status}/{consumption:.2f}W {percentage:.2f}% [{percentage_design:.2f}%] {remaining:%E%hh:%Mm}",
    alert=True,
    alert_percentage=5,
    status={
        "DIS": "↓",
        "CHR": "↑",
        "FULL": "=",
    },)

Et faire une approximation du temps qu'il nous reste :

status.register("battery",
    format="{status} {remaining:%E%hh:%Mm}",
    alert=True,
    alert_percentage=5,
    status={
        "DIS":  "Discharging",
        "CHR":  "Charging",
        "FULL": "Bat full",
    },)

Volume son

Par exemple si vous utilisez PulseAudio :

status.register("pulseaudio",
    format="♪{volume}",)

Email

Il est possible de connaître les emails reçus selon différentes sources (imap, thunderbird...) : http://docs.enkore.de/i3pystatus/i3pystatus.html#mail-backends

from i3pystatus.mail import thunderbird
status.register("mail",
    backends=[
        thunderbird.Thunderbird()
    ],
    email_client='i3-msg -q [class="^Thunderbird$"] focus',)

Pour Thundebird vous aurez besoin d'une extension notifiant DBus lors de l'arrivée de nouveaux emails.

Now playing

Simplement :

status.register("now_playing")

Conclusion

i3 m'a permis d'exploiter intelligemment l'espace disponible sur mon écran, de minimiser l'utilisation de la souris et est beaucoup plus léger que les environnements de bureau (on y gagne en performance, autonomie...).
Il ne vient avec aucun outil ce qui peut être un avantage pour certain ou un inconvénient pour d'autres.
Je n'ai pas utilisé d'autres tiling managers, mais j'apprécie beaucoup i3 qui est relativement facile à prendre en main, possède une documentation complète et accessible ainsi qu'une configuration simple à modifier.