Hyprland, un compositeur Wayland « tiling »

Posté par  (site web personnel) . Édité par orfenor, Benoît Sibaud, patrick_g et bobble bubble. Modéré par bobble bubble. Licence CC By‑SA.
17
4
avr.
2025
Technologie

Hyprland est un compositeur Wayland pavant (tiling) créé par Vaxri et placé sous licence BSD 3-Clause. Si vous n’avez aucune idée de ce que cela signifie, un compositeur inclut des fonctionnalités de gestion de fenêtres. D’autres compositeurs Wayland incluent GNOME, KDE et ceux basés sur wlroots.

Plus de détails dans la suite de la dépêche.

Sommaire

Hall of fame

Avant Hyprland, Vaxri avait créé Hypr, qui fonctionnait sous Xorg et utilisait XCB, tout en adoptant une philosophie similaire en matière de gestion des fenêtres. Revenons à Hyprland : c’est un « compositeur moderne avec du style » pour traduire leur formulation. La dernière version est la v0.47.2 (une mise à jour mineure), la v0.47 datant de janvier 2025. Il existe des paquets officiels pour Arch et NixOS, mais le site fournit des instructions pour l’installer ailleurs. Je l’ai testé sur Arch, j’ai voulu me faire une idée et j’ai trouvé que ça valait le coup de partager l’expérience (NdM: « Je » est l’auteur du journal, saltimbanque).

Notez que Hyprland est principalement un compositeur avec des fonctionnalités de gestion des fenêtres, mais pas un environnement de bureau complet. Plus de détails sur ça plus tard.

D’après le site officiel : « Hyprland fournit les dernières fonctionnalités de Wayland, un tiling dynamique, de nombreux effets visuels, des plugins puissants et bien plus, tout en restant léger et réactif ». Sans surprise, son créateur apprécie tout ce qui touche à l’esthétique graphique.

Ah, l’apparence !… a probablement beaucoup contribué à faire connaître Hyprland. D’après les sondages du créateur, r/unixporn a été l’un des principaux vecteurs de sa popularité. J’aime aussi, dans une certaine mesure, les effets visuels et j’apprécie l’effort fait en ce sens : de beaux espacements, des bordures, des animations. Nous avons tous joué avec Compiz quelques minutes… avant de le jeter à la poubelle car ça ne sert à rien. Heureusement, Hyprland ne se limite pas à l’esthétique et lorsque nous travaillons quotidiennement sur un ordinateur, nous pouvons apprécier son autre atout : la configurabilité. Vous pouvez utiliser plusieurs fichiers de configuration ou un seul, mais tout passe par fichier texte.

Petit détail : modifiez le fichier texte de config, enregistrez-le et votre configuration se recharge automatiquement à chaud. Simple détail, mais agréable. Si vous faites une erreur de syntaxe, un bandeau apparaîtra et affichera les erreurs qui empêchent le rechargement. Il vous suffira alors de corriger et de sauvegarder à nouveau.

Gestion des fenêtres

Pour comprendre la personnalisation, il faut d’abord comprendre les bases. Hyprland est un gestionnaire en mosaïque. Par défaut, il utilise la mise en page (layout) “Dwindle”, qui était déjà utilisé par le gestionnaire de fenêtres BSPWM. La description la plus courte de ce layout serait : « Pensez Fibonacci ! »

Fibonacci

Bon appliqué à des fenêtres… voilà un extrait du README de BSPWM

                     a                          a                          a
                    / \                        / \                        / \
                   1   b         --->         1   c         --->         1   d
                      / \                        / \                        / \
                     2   3                      4   b                      5   c
                     ^                          ^  / \                     ^  / \
                                                  3   2                      b   4
                                                                            / \
                                                                           3   2

         +-----------------------+  +-----------------------+  +-----------------------+
         |           |           |  |           |           |  |           |           |
         |           |     2     |  |           |     4     |  |           |     5     |
         |           |     ^     |  |           |     ^     |  |           |     ^     |
         |     1     |-----------|  |     1     |-----------|  |     1     |-----------|
         |           |           |  |           |     |     |  |           |  3  |     |
         |           |     3     |  |           |  3  |  2  |  |           |-----|  4  |
         |           |           |  |           |     |     |  |           |  2  |     |
         +-----------------------+  +-----------------------+  +-----------------------+

                     X                          Y                          Z

Un autre layout standard est “Master”. Vous pouvez modifier votre fichier de configuration pour l’utiliser à la place ou même assigner une touche pour basculer entre eux. Le layout Master fonctionne avec une fenêtre occupant la moitié de l’écran, tandis que les autres s’empilent sur l’autre moitié. Vous pouvez également changer la fenêtre maîtresse.

Bon cette fois partageons les GIF enragés du wiki de Hyprland :

MasterLayout

Hyprland offre aussi des fonctionnalités de gestion des fenêtres, communes aux différents layouts :

  • plusieurs espaces de travail (avec placement manuel ou automatique des fenêtres),
  • un espace de travail spécial,
  • un système de “groupement”, permettant de regrouper et dégrouper des fenêtres,
  • mode plein écran,
  • fenêtres flottantes.

Hyprland propose aussi un système de plugins. Et devinez quoi, un plugin a été développé pour ajouter le layout de i3 (i3 étant un WM pavant sous Xorg, dont l’équivalent sous Wayland est Sway, qui est dév. par Drew DeVault). Ce plugin s’appelle hy3. Dans i3, il y a des conteneurs, en gros c’est un layout « manuel avec des découpages horizontaux/verticaux, très simple et efficace, et la doc i3 est très bien. Parce que la doc Sway, ce sont juste des man page, ok c’est très bien aussi passons… Bref, voilà, maintenant j’ai un compositeur i3 avec des gaps et de belles animations, vous vous souvenez de i3-gaps – qui a entre-temps été intégré à i3 ? Bref, hy3 c’est ça en mieux.

Configuration, doc, outils

Notez que d’autres plugins existent, pour les animations, pour changer des comportements. La communauté pourrait être un bel axe de développement maintenant que d’après l’auteur le code se calme.

À un moment un gestionnaire de plugins a été ajouté, hyprpm (pm pour package manager je suppose). Alors j’ai essayé d’installer hy3 avec, mais j’ai rencontré des soucis de versions me rappelant le bon vieux temps où les dév. de plugins gnome-shell hurlaient comme des putois quand une nouvelle version sortait. Bon bref j’ai compilé hy3 à la main à la place, mais sortez cpp et une bonne tasse de café, c’est pas juste un script Emacs en Lisp qui prend 3 secondes. Mais au moins ça a bien marché.

Sinon la configuration permet de personnaliser le layout clavier, la résolution d’écran, l’esthétique et les animations. Beaucoup de possibilités, par ex. pour les raccourcis on peut faire des “submap” (oui je sais, i3 aussi). On peut modifier plein de choses sans redémarrer.

On peut aussi utiliser la commande hyprctl pour communiquer avec hypr.

Côté documentation, l’API technique est très bien couverte, mais il manque une documentation simplifiée pour une prise en main rapide. Et puis de base ne vous attendez pas à plein de raccourcis claviers pré-configurés, vous allez devoir faire les vôtres.

Ou alors vous pouvez aussi utiliser des configurations préexistantes. On se croirait dans Doom Emacs !

Hyprland n’est pas un environnement de bureau complet. Il vous faudra un tableau de bord, un lanceur d’applications et d’autres outils. Quelques options populaires :

  • barre d’état : Ashell (prêt à l’emploi) ou Waybar (très personnalisable). A noter qu’il y a maintenant des mini libs pour se faire ses barres facilement comme quickshell, astal ;
  • lanceur d’applications : Wofi (simple, clavier + souris) ;
  • ou le fait d’utiliser un tiling peut même vous donner envie de changer de terminal ? Foot, Kitty, Alacritty, etc.

Mais Awesome Hyprland vous listera bien plus de choses.

Je n’ai pas encore testé ibus, et je sais que je vais rencontrer des soucis avec cela, comme j’en aurai sous Sway… (Pas trop envie de passer sous fcitx mais on verra)

Aspects techniques, conclusion

Au cours du développement de Sway, Drew Devault a conçu une bibliothèque, wlroots, qui est devenue indépendante de Sway et utilisée par d’autres compositeurs wayland.

Hyprland a démarré en 2022. En 2024, la dépendance à wlroots, qui était inclus sous forme de « submodule git », a été abandonnée au profit de Aquamarine, un moteur de rendu en C++. L’abandon de wlroots, d’après l’auteur, tient au fait que

  • wlroots est en C,
  • wlroots manque de doc,
  • faire évoluer wlroots prend du temps,
  • et accessoirement parce qu’il a été banni ! (Bon là désolé je préfère passer du temps sur la revue de Hyprland que sur les feux de l’amour, voyez ici).

Mais Aquamarine n’est pas un compétiteur de wlroots.

Conclusion

Hyprland, comme d’autres, ça prend un max de temps à s’approprier. Il faut lire et configurer à tout-va, même si après-coup on se rend compte que c’était simple. Ce qui l’est moins, c’est de choisir sa manière de travailler.

J’adore jouer avec les gestionnaires de fenêtre en mosaïque et Hyprland est une belle découverte. J’avais peur d’un simple ensemble d’animations flashy, mais il offre bien plus que cela. J’aimerais voir un tableau de bord style “Activités” de GNOME pour visualiser toutes les fenêtres et espaces de travail en un coup d’œil. Peut-être qu’avec le temps, quelqu’un développera cette fonctionnalité… ou alors je finirai par coder un petit quelque chose moi-même ! j’ai déjà remarqué que quelqu’un a codé « hot corner », surprenant pour un tiling!

Commentaires du journal

Sources 1 et 2

  • multi-écran possible
  • définition des raccourcis et des règles.

Aller plus loin

  • # un jour

    Posté par  . Évalué à 4 (+2/-0).

    Un jour je m'installerai un WM Tiling à la place de Gnome.

    Je sais qu'il y a une petite marche alors je rechigne mais je sais que ça me plaira.

    J'y ai repensé quand j'ai lu cet article : The Future is Niri.

    • [^] # Re: un jour

      Posté par  . Évalué à 6 (+4/-0).

      En intermédiaire, tu as Regolith, qui est un mélange de Gnome et de i3 (pour Xorg) ou Sway (pour Wayland). C'est du tiling, mais avec le confort du DE.

      Tu as aussi, dans Gnome, l'extension Tactile (petite démo en trois minutes) qui permet d'avoir le positionnement par le clavier des fenêtres, sans changer d'environnement pour autant.

  • # Concrètement parlant

    Posté par  . Évalué à 2 (+0/-0).

    Il faut lire et configurer à tout-va, même si après-coup on se rend compte que c’était simple

    L'as tu fait? Si c'est le cas, partager ta conf comme d'autres l'ont fait (et une autre conf ici) serait une bonne idée. Personnellement, après moult recherches et essais pour configurer Hyprland, le résultat est (très) loin d'être probant. J'ai rencontré plus de succès avec Wayfire (dépouillé de tout bling bling)

    • [^] # Re: Concrètement parlant

      Posté par  . Évalué à 1 (+0/-0). Dernière modification le 09 avril 2025 à 11:46.

      Voici ma configuration. J'utilise au quotidien depuis 2 ans. J'ai encore qq bricoles à faire, mais c'est laaaaargement jouable. J'ai aussi une configuration pour waybar si ça intéresse qq1

      ```
      # #######################################################################################
      # AUTOGENERATED HYPR CONFIG.
      # PLEASE USE THE CONFIG PROVIDED IN THE GIT REPO /examples/hypr.conf AND EDIT IT,
      # OR EDIT THIS ONE ACCORDING TO THE WIKI INSTRUCTIONS.
      # #######################################################################################

      # This is an example Hyprland config file.
      # Refer to the wiki for more information.
      # https://wiki.hyprland.org/Configuring/Configuring-Hyprland/
      
      # Please note not all available settings / options are set here.
      # For a full list, see the wiki
      
      # You can split this configuration into multiple files
      # Create your files separately and then link them to this file like this:
      # source = ~/.config/hypr/myColors.conf
      
      
      ################
      ### MONITORS ###
      ################
      
      # See https://wiki.hyprland.org/Configuring/Monitors/
      monitor=HDMI-A-1,1920x1080@60,0x0,1
      #monitor=HDMI-A-1,1920x1080@60,0x0,1,transform,1
      monitor=eDP-1,1920x1080@60,-1920x0,1
      monitor=DVI-I-2,1920x1080@60,1920x0,1
      
      
      ###################
      ### MY PROGRAMS ###
      ###################
      
      # See https://wiki.hyprland.org/Configuring/Keywords/
      
      # Set programs that you use
      $terminal = alacritty -e tmux
      $fileManager = nautilus
      $menu = wofi --show drun
      
      
      #################
      ### AUTOSTART ###
      #################
      
      # Autostart necessary processes (like notifications daemons, status bars, etc.)
      # Or execute your favorite apps at launch like this:
      
       exec-once = waybar & hyprpaper
       exec-once = swayidle -w timeout 10 'if pgrep -x swaylock; then hyprctl dispatch dpms off; fi' resume 'hyprctl dispatch dpms on'
      
       exec-once = swayidle -w timeout 900 'swaylock -f -C ~/.config/swaylock/config' timeout 930 'hyprctl dispatch dpms off' resume 'hyprctl dispatch dpms on' before-sleep 'swaylock -f -C ~/.config/swayloc
      k/config' after-resume 'sleep .2; systemctl --user restart waybar'
       exec-once = nm-applet & nextcloud --background
       exec-once = nmcli connection up Serveur_VPN
       exec-once=[workspace 1 silent] firefox
       exec-once=[workspace 2 silent] thunderbird
       exec-once=[workspace 3 silent] $terminal
       exec-once=[workspace 8 silent] sublime-music
       exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=$XDG_CURRENT_DESKTOP PATH
      #############################
      ### ENVIRONMENT VARIABLES ###
      #############################
      
      # See https://wiki.hyprland.org/Configuring/Environment-variables/
      
      env = XCURSOR_SIZE,24
      env = HYPRCURSOR_SIZE,24
      
      
      #####################
      ### LOOK AND FEEL ###
      #####################
      
      # Refer to https://wiki.hyprland.org/Configuring/Variables/
      
      # https://wiki.hyprland.org/Configuring/Variables/#general
      general {
          gaps_in = 1 # distance entre les fenetres
          gaps_out = 2
      
          border_size = 2
      
          # https://wiki.hyprland.org/Configuring/Variables/#variable-types for info about colors
          col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg
          col.inactive_border = rgba(595959aa)
      
          # Set to true enable resizing windows by clicking and dragging on borders and gaps
          resize_on_border = false
      
          # Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on
          allow_tearing = false
      
          layout = dwindle
      }
      
      # https://wiki.hyprland.org/Configuring/Variables/#decoration
      decoration {
          rounding = 10
      
          # Change transparency of focused and unfocused windows
          active_opacity = 1.0
          inactive_opacity = 1.0
      
          # https://wiki.hyprland.org/Configuring/Variables/#blur
          blur {
              enabled = true
              size = 3
              passes = 1
              vibrancy = 0.1696
          }
      }
      
      # https://wiki.hyprland.org/Configuring/Variables/#animations
      animations {
          enabled = true
      
          # Default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
      
          bezier = myBezier, 0.05, 0.9, 0.1, 1.05
      
          animation = windows, 1, 7, myBezier
          animation = windowsOut, 1, 7, default, popin 80%
          animation = border, 1, 10, default
          animation = borderangle, 1, 8, default
          animation = fade, 1, 7, default
          animation = workspaces, 1, 6, default
      }
      
      # See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
      dwindle {
          pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
          preserve_split = true # You probably want this
      }
      
      
      # https://wiki.hyprland.org/Configuring/Variables/#misc
      misc {
          force_default_wallpaper = -1 # Set to 0 or 1 to disable the anime mascot wallpapers
          disable_hyprland_logo = true # If true disables the random hyprland logo / anime girl background. :(
      }
      
      
      #############
      ### INPUT ###
      #############
      
      # https://wiki.hyprland.org/Configuring/Variables/#input
      input {
          kb_layout = fr
          kb_variant =
          kb_model =
          kb_options =
          kb_rules =
      
          follow_mouse = 1
      
          sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
      
          touchpad {
              natural_scroll = false
          }
      }
      
      # https://wiki.hyprland.org/Configuring/Variables/#gestures
       gestures {
           workspace_swipe = false
       }
      
       # Example per-device config
       # See https://wiki.hyprland.org/Configuring/Keywords/#per-device-input-configs for more
       device {
           name = epic-mouse-v1
           sensitivity = -0.5
       }
      
      
       ####################
       ### KEYBINDINGSS ###
       ####################
      
       # See https://wiki.hyprland.org/Configuring/Keywords/
       $mainMod = SUPER # Sets "Windows" key as main modifier
      
       # Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more
       bind = $mainMod, Q, exec, $terminal
       bind = $mainMod, C, killactive,
       bind = $mainMod, M, exit,
       bind = $mainMod, E, exec, $fileManager
       bind = $mainMod, V, togglefloating,
       bind = $mainMod, D, exec, $menu
       bind = $mainMod, P, pseudo, # dwindle
       bind = $mainMod, J, togglesplit, # dwindle
       bind = $mainMod SHIFT, L, exec, swaylock -f -C ~/.config/swaylock/config
       bind = , Print, exec, grim -g "$(slurp)" - | swappy -f -
       bind = ALT, Tab, layoutmsg, cyclenext,           # change focus to another window
       bind = SUPER, Tab, workspace, previous
      
       # Move focus with mainMod + arrow keys
       bind = $mainMod, left, movefocus, l
       bind = $mainMod, right, movefocus, r
       bind = $mainMod, up, movefocus, u
       bind = $mainMod, down, movefocus, d
      
       # Switch workspaces with mainMod + [0-9]
       bind = SUPER, code:10, workspace, 1
       bind = SUPER, code:11, workspace, 2
       bind = $mainMod, quotedbl, workspace, 3
       bind = $mainMod, apostrophe, workspace, 4
       bind = $mainMod, parenleft, workspace, 5
       bind = $mainMod, minus, workspace, 6
       bind = $mainMod, egrave, workspace, 7
       bind = $mainMod, underscore, workspace, 8
       bind = $mainMod, ccedilla, workspace, 9
       bind = $mainMod, agrave, workspace, 10
      
       # Move active window to a workspace with mainMod + SHIFT + [0-9]
       bind = $mainMod SHIFT, code:10, movetoworkspace, 1
       bind = $mainMod SHIFT, code:11, movetoworkspace, 2
       bind = $mainMod SHIFT, code:12, movetoworkspace, 3
       bind = $mainMod SHIFT, code:13, movetoworkspace, 4
       bind = $mainMod SHIFT, code:14, movetoworkspace, 5
       bind = $mainMod SHIFT, code:15, movetoworkspace, 6
       bind = $mainMod SHIFT, code:16, movetoworkspace, 7
       bind = $mainMod SHIFT, code:17, movetoworkspace, 8
      bind = $mainMod, right, movefocus, r
      bind = $mainMod, up, movefocus, u
      bind = $mainMod, down, movefocus, d
      
      # Switch workspaces with mainMod + [0-9]
      bind = SUPER, code:10, workspace, 1
      bind = SUPER, code:11, workspace, 2
      bind = $mainMod, quotedbl, workspace, 3
      bind = $mainMod, apostrophe, workspace, 4
      bind = $mainMod, parenleft, workspace, 5
      bind = $mainMod, minus, workspace, 6
      bind = $mainMod, egrave, workspace, 7
      bind = $mainMod, underscore, workspace, 8
      bind = $mainMod, ccedilla, workspace, 9
      bind = $mainMod, agrave, workspace, 10
      
      # Move active window to a workspace with mainMod + SHIFT + [0-9]
      bind = $mainMod SHIFT, code:10, movetoworkspace, 1
      bind = $mainMod SHIFT, code:11, movetoworkspace, 2
      bind = $mainMod SHIFT, code:12, movetoworkspace, 3
      bind = $mainMod SHIFT, code:13, movetoworkspace, 4
      bind = $mainMod SHIFT, code:14, movetoworkspace, 5
      bind = $mainMod SHIFT, code:15, movetoworkspace, 6
      bind = $mainMod SHIFT, code:16, movetoworkspace, 7
      bind = $mainMod SHIFT, code:17, movetoworkspace, 8
      bind = $mainMod SHIFT, code:18, movetoworkspace, 9
      bind = $mainMod SHIFT, code:19, movetoworkspace, 10
      
      # Example special workspace (scratchpad)
      bind = $mainMod, S, togglespecialworkspace, magic
      bind = $mainMod SHIFT, S, movetoworkspace, special:magic
      
      # Scroll through existing workspaces with mainMod + scroll
      bind = $mainMod, mouse_down, workspace, e+1
      bind = $mainMod, mouse_up, workspace, e-1
      
      # Move/resize windows with mainMod + LMB/RMB and dragging
      bindm = $mainMod, mouse:272, movewindow
      bindm = $mainMod, mouse:273, resizewindow
      
      # fullscreen
      bind = $mainMod, F,fullscreen
      ##############################
      ### WINDOWS AND WORKSPACES ###
      ##############################
      
      # See https://wiki.hyprland.org/Configuring/Window-Rules/ for more
      # See https://wiki.hyprland.org/Configuring/Workspace-Rules/ for workspace rules
      
      # Example windowrule v1
      # windowrule = float, ^(kitty)$
      
      # Example windowrule v2
      # windowrulev2 = float,class:^(kitty)$,title:^(kitty)$
      workspace = 1, monitor:eDP-1,default:true
      workspace = 2, monitor:eDP-1,default:true,persistent:true
      workspace = 3, monitor:eDP-1,default:true,persistent:true
      workspace = 4, monitor:eDP-1,default:true
      windowrulev2 = suppressevent maximize, class:.* # You'll probably like this.
      
    • [^] # Re: Concrètement parlant

      Posté par  . Évalué à 1 (+0/-0). Dernière modification le 09 avril 2025 à 12:01.

      Plutôt que de faire un truc crade le dépot avec la conf de wayland, waybar et un screen. Si un modérateur peut supprimer le post dessus, c'est top.
      https://git.atlanticaweb.fr/alexandre/hyprland

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.