Accueil / Informatique / NixOS / Sway

Sway

Sway est un gestionnaire de fenêtre/bureau (j'ai toujours du mal à saisir la différence j'avoue) qui ressemble beaucoup à i3 mais qui fonctionne sous Wayland au lieu de X11.

La configuration ressemble beaucoup à celle d'i3 et est assez bien documentée donc je pense pas que je vais m'étendre dessus.

Installation

Adapté depuis le wiki NixOS.

{
  programs.sway = {
    enable = true;
    wrapperFeatures = { base = true; gtk = true; };
    extraPackages = with pkgs; [
      swaylock
      swayidle
      xwayland
      mako
      kanshi
    ];
  };

  environment = {
    etc = {
      "sway/config".source = ./dotfiles/sway/config;
    };
  };

  systemd.user.services.kanshi = {
    description = "Kanshi output autoconfig ";
    wantedBy = [ "graphical-session.target" ];
    partOf = [ "graphical-session.target" ];
    serviceConfig = {
      ExecStart = "${pkgs.kanshi}/bin/kanshi";
      RestartSec = 5;
      Restart = "always";
    };
  };
}

Installe Sway et :

  • swaylock pour avoir un écran de verrouillage ;
  • swayidle pour verrouiller/éteindre l'écran au bout d'un certains temps
  • xwayland qui fait le pont entre Wayland/Sway et les applications qui ne supportent que X11 ;
  • mako pour afficher les notifications ;
  • kanshi pour configurer les nouveaux écrans automagiquement.

Ça dit aussi de copier /etc/sway/config (un des chemins possible pour la configuration sway) depuis ./dotfiles/sway/config. Pour en savoir plus sur la syntaxe de la config sway, la commande c'est man 5 sway.

Enfin, ça crée un service systemd pour lancer kanshi automatiquement quand graphical-session.target est lancé. Le souci c'est que ce target est jamais lancé, il faut le faire à la main avec :

programs.sway.extraSessionCommands = ''
#! $[pkgs.bash}/bin/bash

# Pour avoir les variables d'environnement bien définies
systemctl --user import-environment

systemctl start --user graphical-session.target
''

GDM

Pour avoir un écran de connexion plus sympa qu'un terminal où il faut taper sway quand on ouvre son ordi, on peut utiliser GDM (ou SDDM, ou LightDM, ou autre). GDM a une interface simple et propre, et tourne sous Wayland sans souci, donc on peut se passer de X11 à 100%.

Pour l'installer :

config.services.xserver.displayManager.gdm = {
  enable = true;
  wayland = true;
};

Truc à fixer et à documenter avec GDM :

  • comment verrouiller le pavé numérique par défaut ;
  • comment avoir la liste des utilisateurices

PyWal

PyWal est un programme qui permet de générer un jeu de couleur à partir d'un fond d'écran. Il peut aussi mettre à jour le fond d'écran et le jeu de couleur automatiquement, si jamais on veut un nouveau fond d'écran à chaque démarrage ou toute les heures par exemple.

Le jeu de couleur peut être utilisé dans plein d'applications différentes. PyWal est assez bien documenté.

Pour l'utiliser avec Sway sous NixOS, on va commencer par l'installer :

environment.systemPackages = with pkgs; [ pywal ];

Pour l'utiliser ensuite, c'est :

${pkgs.pywal}/bin/wal -l -i /chemin/vers/le/fond_d_ecran.jpg

L'option -l de PyWal génère un thème clair, enlevez-la pour un thème sombre. Le -i indique le chemin vers le fond d'écran (ou un dossier si on veut choisir un fond d'écran aléatoire dans ce dossier). Il y a plein d'autres options qui sont documentées dans wal --help mais celles là sont les plus utiles selon moi.

Dernière chose à faire : importer les couleurs choisies par PyWal dans la config Sway et les utiliser :

include "/home/VOTRE_USER_ICI/.cache/wal/colors-sway"

# Les variables disponibles sont
# $wallpaper,
# $background, $foreground,
# et $colorX où X est un nombre entre 0 et 15 inclus

output * bg $wallpaper fill

bar {
    colors {
        background $background
        statusline $foreground
        separator $foreground
        focused_workspace $color1 $color1 $background
        active_workspace $color3 $color3 $background
        inactive_workspace $color5 $color5 $background
        urgent_workspace $color7 $color7 $background
    }
}

client.unfocused $color5 $color5 $background $color7 $background
client.focused $background $background $foreground $color7 $background

Maintenant, quand on lancera Sway, le fond d'écran et le thème de couleurs seront changés.

Pour appliquer ce thème de couleurs dans d'autres applications, regardez la doc de PyWal (lien un peu plus haut).

Un exemple du rendu, on peut voir les couleurs dans le terminal et dans la barre en haut principalement (avec un fond d'écran fait par mochipanko) :

Mon bureau, avec un neofetch

Rofi

Petit truc pratique avec sway quand même c'est d'avoir une appli qui sert de launcher. Souvent c'est dmenu ou rofi qu'on utilise. Je préfère rofi parce qu'il est plus visible et lisible et surtout il se souvient des trucs qu'on tape souvent et les met au début de la liste de suggestions.

Pour l'installer :

environment.systemPackages = with pkgs; [ rofi ];

Et ensuite dans la config sway :

set $menu rofi -show run
bindsym $mod+d exec $menu

Si vous voulez utiliser les couleurs de PyWal dans rofi, vous pouvez faire quelque chose comme ça à la place :

set $menu rofi -show run -color-normal "$background,$foreground,$background,$foreground,$color12"
bindsym $mod+d exec $menu

Sachant que je pars du principe que $mod est défini (dans la config sway de base ça correspond à Mod4, soit la touche Windows/logo).

Prendre des screenshots

À détailler plus, mais en gros le mieux c'est grim et un bindsym qui va bien dans la config.

Référence des options de programs.sway

C'est extrait du fichier sway.nix globalement, mais c'est plus sympa de lire de la doc que du code :

enable : bool, dit si Sway doit être activé/installé.

wrapperFeatures : { base : bool, gtk : bool }, les fonctionnalités à ajouter via le wrapper. gtk ajoute des options pour lancer les apps GTK+ avec les bonnes variables d'environnements. Concrètement je l'ai pas activé et j'ai pas remarqué de soucis pour le moment… base permet d'utiliser extraSessionCommands en gros (et de lancer une session DBus), et est activé par défaut.

extraSessionCommands : string, un script à lancer juste avant sway. Nécessite wrapperFeatures.base = true

extraOptions : list string, les arguments supplémentaires à passer à Sway, cf man sway pour savoir ce qui est possible.

extraPackages : list package, des paquets à installer en plus de Sway.