SwayWM - UnixPorn vous-même

Bonjour à tous. Dans cet article, je décrirai mon expérience dans la configuration et l'utilisation de sway, un gestionnaire de fenêtres de mosaïque pour Linux.


Qu'est-ce que c'est et pourquoi est-il nécessaire?


Officiellement, sway est un gestionnaire de fenêtres en mosaïque, un remplacement transparent pour i3wm, travaillant au sommet de Wayland.


Weiland, alias Wölund, etc. - Un personnage de la mythologie du vieil allemand et du vieux norrois, un livre sur lequel a été écrit à un moment donné par la folkloriste anglaise Jessie Weston. Maintenant tu sais.

Cependant, à mon avis, la caractéristique principale de Sway est qu'il s'agit d'un constructeur, avec tous les avantages et les inconvénients de cette approche. Si vous aimez Vim (la similitude est aggravée par l'orientation sur l'utilisation du clavier), Archlinux et des projets similaires, alors je vous conseille de regarder de plus près le balancement. Mon opinion personnelle est qu'une fois que vous passez un peu plus de temps à le configurer, vous obtiendrez un environnement très stable et pratique pour vous personnellement, dans lequel rien d'inattendu ne se produira.


Si les inconvénients de Sway et Wayland (comme le manque de prise en charge des pilotes privés de NVidia et la nécessité de rechercher des analogues pour de nombreux programmes familiers) vous semblent fatals, je vous conseille de faire attention au x3 i3wm. Les parties constructeurs y seront complètement différentes, vous devrez installer xinit, configurer divers .Xauthority, il est possible de gérer les déchirures, mais la logique générale du système est exactement la même.


L'installation


Sway est probablement dans les référentiels de votre distribution. Cependant, si vous souhaitez installer une version plus récente, c'est très simple. La page du projet github a une liste limitée de ses dépendances. Installez-les, wlroots le référentiel, wlroots dans le dossier des subprojects - subprojects :


 hub clone swaywm/sway hub clone swaywm/wlroots sway/subprojects/wlroots 

(ici j'utilise un hub . Un outil non standard mais très pratique). Après cela, vous pouvez configurer et créer:


 meson setup ./sway-build ./sway --buildtype=minsize ninja -C ./sway-build doas ninja -C ./sway-build install 

doas est un remplacement sudo léger des développeurs OpenBSD. Linux utilise généralement sa fourchette d' OpenDoas.

Lancement


Si vous souhaitez exécuter sway à partir de la ligne de commande sans utiliser de gestionnaires tels que SDDM, la seule bonne façon de le faire est


 $ exec sway 

Si vous exécutez sway sans exec , verrouillez l'écran avec swaylock et sway se bloque, vous serez renvoyé à la ligne de commande. La serrure sera inutile.


Remarque pour les fans de systemd: sway ne nécessite ni systemd-logind ni elogind. Certes, dans ce cas, vous devrez définir le bit suid ou configurer les capacités. Voir le wiki .

Variables d'environnement


Il y a plusieurs endroits où je les prescris.


Script shell à ~/.local/bin/sway - pour les variables spécifiques à sway. Par exemple, je veux que les applications Qt ne montrent pas le paysage et utilisent le thème de qt5ct :


 #!/bin/bash QT_QPA_PLATFORMTHEME=qt5ct \ QT_WAYLAND_DISABLE_WINDOWDECORATION=1 \ /usr/bin/sway 

~/.pam_environment - pour les variables que je veux rendre immédiatement disponibles dans la session utilisateur systemd. Un exemple:


 SSH_AUTH_SOCK DEFAULT="${XDG_RUNTIME_DIR}/gnupg/S.gpg-agent.ssh" 

Cependant, modifiez ce fichier avec prudence, surtout si vous utilisez d'autres environnements. Par exemple, KDE Plasma ne l' pam_env pas beaucoup s'il y détecte $WAYLAND_DISPLAY (ironiquement, le module pam_env ce fichier a été créé il y a N ans principalement pour définir la variable $DISPLAY ).


~/.bashrc - pour tous les autres cas.


Configuration du balancement


Entrer


Tout est assez simple dans mon système: nous installons des dispositions russes et anglaises et basculons entre elles par Alt+Shift . Dans la configuration de balancement, cela ressemble à ceci:


 input * { xkb_layout us,ru xkb_options grp:alt_shift_toggle } 

Sway utilise la bibliothèque libinput pour l'entrée, la même que KDE et Gnome. Nous avons donc plusieurs de ses options disponibles. Paramètres du pavé tactile, défilement naturel, accélération du pointeur de la souris, etc. etc. La liste des options peut être consultée dans man sway-input , et la liste des périphériques d'entrée dans la sortie de la commande


 swaymsg -t get_inputs 

Cependant, je voudrais attirer l'attention sur une opportunité intéressante. Si vous quittez un environnement X, vous pouvez simplement transférer les paramètres de votre clavier à partir de là. Exécutez la commande dans cet environnement


 $ xkbcomp $DISPLAY /path/to/keymap.xkb 

et dans le registre de configuration de balancement


 input * { xkb_file /path/to/keymap.xkb } 

Raccourcis clavier


Les raccourcis clavier, comme tout le reste dans sway, sont définis dans la configuration. Il existe 3 commandes pour les définir:


  1. bindswitch . Il est effectué lors de l'ouverture / fermeture du couvercle de l'ordinateur portable, du passage en mode tablette, etc.
  2. bindcode . Il est exécuté lorsqu'une touche avec le code spécifié est enfoncée. Cela ne dépend pas de la disposition actuelle, particulièrement utile pour les touches multimédia.
  3. bindsym . Le caractère actuellement entré dépend de la disposition. Cependant, si vous ajoutez le paramètre --to-code , ce caractère sera implicitement converti en code correspondant pour la première mise en page à partir de xkb_layout (voir les paramètres d'entrée).

Par exemple, un tel raccourci va battre la fenêtre actuelle quelle que soit la disposition:


 bindsym --to-code $mod+Shift+q kill 

Vous pouvez en savoir plus sur ces paramètres dans mana: man 5 sway .


Pour déterminer facilement ce qui a été pressé, l'auteur de sway a écrit un enregistreur de frappe spécial (il a besoin des droits root pour fonctionner, donc il n'y a pas besoin de se soucier de la sécurité).


Conclusion


Une liste des périphériques de sortie disponibles peut être obtenue avec la commande


 swaymsg -t get_outputs 

Dans la configuration de chacun d'eux, vous pouvez définir le mode vidéo, la mise à l'échelle (y compris fractionnaire), l'image, la rotation, etc. La configuration la plus simple ressemble à ceci:


 output HDMI-A-1 mode 1920x1080@60Hz output * bg /path/to/wallpaper.jpg fill 

Une liste complète des options peut être trouvée dans le mana de man sway-output l' man sway-output .
Il existe également un programme wlr-randr dans lequel tout cela peut être défini à partir de la ligne de commande (c'est-à-dire qu'il s'agit d'un analogue de XRandr pour Wayland).


Swaybar


Swaybar - un panneau sur lequel les informations d'état sont affichées. Date, heure, barre d'état système, etc. etc. Habituellement, les fans d'i3 et de sway passent le plus de temps à configurer ce panneau particulier (ou les panneaux, il peut y en avoir plusieurs). Personnellement, j'en ai assez, proche de la configuration minimale:


 bar { position top colors { statusline #ffffff background #282828E6 inactive_workspace #282936BF #282936BF #5c5c5c } font Hack 11 status_command i3blocks } 

Il existe de nombreuses options pour ajuster la position, les couleurs, les polices, le bac, etc. Vous pouvez les man 5 sway-bar dans mana - man 5 sway-bar .


Swaybar s'engage à lire et à analyser json au format i3bar, généré par status_command . Il existe de nombreux programmes qui peuvent être utilisés ici. i3status , waybar , i3status-rs et de nombreux autres projets. Personnellement, je préfère les i3blocks en raison de la simplicité de la configuration et de la facilité d'ajout de blocs personnalisés.


Configuration de l'application


Notifications


Cela peut être fait par le démon mako (très probablement il y en a dans votre distribution). Là, vous pouvez également régler les couleurs, etc., mais tout cela est facultatif. Il suffit de l'exécuter et cela fonctionnera.


Mako implémente la spécification XDG Desktop Notifications basée sur dbus. Il est pris en charge par de nombreux programmes, notamment Chromium, Firefox et Telegram.


Émulateur de terminal


Dans des environnements comme KDE, Plasma utilise généralement des émulateurs intégrés qui affichent des menus, des onglets et de nombreux autres éléments de conception. Mais pourquoi tout cela est-il en jeu? Je préfère Alacritty - très rapide grâce à l'utilisation de l'émulateur GPU, d'ailleurs écrit en Rust. J'ai ajouté de tels raccourcis clavier à la section key_bindings de sa configuration ( ~/.config/alacritty/alacritty.yml ):


 - { key: T, mods: Control|Shift, action: SpawnNewInstance } 

ouvrir une nouvelle fenêtre avec le répertoire courant. Un excellent remplacement pour les onglets et le balancement se chargera de la mise en page.


 - { key: Up, mods: Control|Shift, action: ScrollLineUp, mode: ~Alt } - { key: Down, mods: Control|Shift, action: ScrollLineDown, mode: ~Alt } 

faites défiler vers le haut / bas une ligne.


On écrit dans la config sway


 set $term alacritty bindsym $mod+Return exec $term 

Alacritty ne prend pas en charge les ligatures, car elles affectent la vitesse de rendu. Si vous en avez encore besoin, faites attention à Kitty - cet émulateur est également très rapide, et il y a juste une quantité effrayante de fonctionnalités et de paramètres sous le capot.


Lancer des applications


Les applications dans sway sont généralement lancées à l'aide du menu de raccourcis. Dans la configuration, ils écrivent quelque chose comme


 set $menu ... bindsym --to-code $mod+d exec $menu 

Il existe de nombreux programmes pour afficher le menu. Certains, comme dmenu ou rofi , ont besoin de XWayland. Parmi ceux qui travaillent sous Wayland, nous pouvons distinguer bemenu et même krunner (ce qui apparaît dans KDE par Alt+F2 . Oui, c'est un programme indépendant).


Cependant, je préfère une solution plus universelle, à savoir sway-launcher-desktop . Malgré son nom, il ne dépend pas de Sway et n'est généralement pas un programme GUI, mais un petit script shell fonctionnant dans la console. Ce script forme un menu à partir de programmes dans $PATH , de fichiers de bureau installés (conformément à la spécification XDG Desktop Entry) et éventuellement de sources supplémentaires (configurées dans la configuration). Le merveilleux utilitaire fzf est utilisé pour afficher et rechercher le menu - faites attention à lui.


Ainsi, pour afficher le menu, nous devons ouvrir une fenêtre de terminal avec ce programme. Avec alacritty, cela se fait comme ceci:


 set $menu exec alacritty -e sway-launcher-desktop bindsym --to-code $mod+d exec $menu 

Vous pouvez vouloir faire flotter cette fenêtre par défaut. Dans i3 et sway, ces règles sont configurées dans la configuration à l'aide de la directive for_window . Pour mapper la règle à la fenêtre sway-launcher-desktop , il faut lui assigner une classe unique, pour moi, c'est juste Launcher . Gardez à l'esprit qu'en raison de l'utilisation de Wayland, les critères énumérés dans le manuel i3 ne conviennent pas au balancement. Les bons peuvent être trouvés dans man 5 sway , section CRITERIA . Dans ce cas, app_id est tout à fait approprié, et la configuration finale ressemble à ceci:


 set $menu exec alacritty --class Launcher -e sway-launcher-desktop for_window [app_id="Launcher"] floating enable, border pixel 10, sticky enable bindsym --to-code $mod+d exec $menu 

Démarrage automatique des applications


En principe, pour démarrer automatiquement un programme, vous pouvez simplement écrire


 exec /path/to/program 

dans la configuration sway, ou même créer une unité systemd personnalisée. Cependant, dans cet article, j'utiliserai la spécification XDG Autostart adoptée par KDE et Gnome.


La spécification consiste à exécuter des fichiers de bureau situés dans les répertoires /etc/xdg/autostart et ~/.config/autostart . En règle générale, ces fichiers sont fournis dans des packages avec des programmes, mais ils sont faciles à créer vous-même.


C'est là que l'essence modulaire du balancement se manifeste. Sway lui-même ne sait rien du démarrage automatique XDG, ni de l'entrée de bureau XDG. De plus, ses développeurs n'aiment pas ces spécifications et toutes les spécifications similaires. Cependant, l'utilitaire de console dex est capable de les gérer (très probablement, il se trouve dans le référentiel de votre distribution).


Pour vérifier ce qui sera en exécution automatique, tapez la commande


 $ dex -ade Sway 

a signifie autostart, d - "dry run", -e Sway définit le nom de l'environnement (il peut être n'importe lequel) et est utilisé pour le filtrage.


Très probablement, la liste résultante ne vous conviendra pas. Par exemple, j'ai obtenu kgpg . Nous procédons comme suit: copiez le fichier de bureau correspondant depuis /etc/xdg/autostart vers ~/.config/autostart , ajoutez-y la ligne


 NotShowIn=Sway 

et vérifiez à nouveau l'exécution automatique. De nombreux programmes (en particulier ceux écrits en Electron) peuvent ne pas fonctionner sous Wayland. Nous faisons de même avec eux. Nous copions le fichier de bureau et y changeons la ligne de lancement. C'était:


 Exec=/usr/bin/skypeforlinux 

est devenu:


 Exec=env GDK_BACKEND=x11 /usr/bin/skypeforlinux 

la même technique peut être appliquée à sway-launcher-desktop à partir du paragraphe précédent. Lorsque tous les problèmes sont résolus, ajoutez la ligne à la configuration sway


 exec dex -ae Sway 

Ou vous pouvez faire le contraire: copiez les fichiers de bureau souhaités dans un répertoire non standard et définissez le dex dessus avec la commande


 exec dex -as /path/to/your/dir 

Captures d'écran


Deux des cercueils nous aideront avec cela. slurp vous permet de sélectionner une zone rectangulaire arbitraire sur l'écran, et sinistre en fait une capture d'écran. Dans ma configuration, cela ressemble à ceci:


 bindsym Print exec grim ~/Pictures/screen-"$(date +%s)".png bindsym $mod+Print exec grim -g "$(slurp)" ~/Pictures/screen-"$(date +%s)".png 

$mod+PrintScreen - capture d'écran d'une zone arbitraire, PrintScreen - capture d'écran de tout l'écran.


Screencasts


Si vous avez besoin d'écrire un screencast dans un fichier ou de le diffuser sur un flux RTMP (par exemple, sur Twitch), wf-recorder vous y aidera (prend également en charge slurp).


Si vous souhaitez utiliser OBS Studio, il existe le plugin wlrobs pour cela.


Cependant, la solution la plus universelle prise en charge d'une part dans KDE et Gnome, et d'autre part, en particulier dans les navigateurs Chrome et Firefox, est d'utiliser Pipewire et la spécification XDG Desktop Portal. Pour balancer, il y a la couche nécessaire xdg-desktop-portal-wlr , bien que je n'aie pas vérifié ses performances.


Mode nuit


Le mode nuit consiste à remplacer les couleurs du moniteur par des couleurs plus chaudes dans le noir. Les scientifiques doutent de l'utilité de cela, et les développeurs de Wayland ont décidé que la normalisation du protocole de correction gamma était inutile pour des raisons techniques.


Néanmoins, j'aime cette fonctionnalité, et elle est également présente. Pour le mode nuit, nous avons besoin de cette fourchette de redshift avec prise en charge du protocole spécifique à Sway.


Nous l'installons de quelque manière que ce soit, dans la ~/.config/redshift/redshift.conf , sélectionnez le protocole souhaité et spécifiez la longitude et la latitude.


 [redshift] location-provider=manual adjustment-method=wayland [manual] lat=xx.xx lon=yy.yy 

Verrouiller et éteindre l'écran


Deux d'un autre cercueil viennent à la rescousse ici. swayidle exécute les commandes données dans le délai d'expiration s'il n'y a pas d'activité (ou vice versa, son apparence), et swaylock verrouille l'écran et nécessite un mot de passe. Vous pouvez désactiver l'écran (ou tous les écrans, s'il y en a plusieurs)


 swaymsg "output * dpms off" 

Voici à quoi ressemblera le démon, bloquant l'écran après 300 secondes d'inactivité et le désactivant après 600:


 swayidle -w \ timeout 300 'swaylock -f -c 000000' \ timeout 600 'swaymsg "output * dpms off"' \ resume 'swaymsg "output * dpms on"' \ before-sleep 'swaylock -f -c 000000' 

Exécutez-le en aucune façon.


i3blocks


Blocs prêts à l'emploi avec calendrier, réseau, état du disque, etc. etc. peut être emprunté au référentiel i3blocks-contrib . Dans i3blocks, ils sont ajoutés dans la configuration à ~/.config/i3blocks/config . Par exemple, un bloc avec des mises à jour toutes les 5 secondes par jour de la semaine, date et heure:


 [time] command=date +"%a %d/%m %H:%M" interval=5 

Mais c'était un exemple trop simple. En fait, les passionnés d'i3 et de sway ont un Saint Graal: afficher la barre de titre de la fenêtre actuelle dans la barre supérieure. Voyons comment y parvenir.


Tout d'abord, nous commençons à lire man sway-ipc et constatons que vous pouvez vous y abonner. Le requis a le code 0x80000003. WINDOW 0x80000003. WINDOW et renvoie les objets json de cette structure:


 { "change" : "focus | title | ...", "container": { focused: true | false, name: "...", ... } } 

En effet, soit la fenêtre elle-même peut changer son titre ( change == title ), soit on peut déplacer le focus vers une autre fenêtre ( change == focus ). Cependant, la fenêtre peut changer le titre et être floue. Pour filtrer ces événements, nous devons vérifier la propriété container.focused .


Vous pouvez décrire toute cette logique en Python ou Go, mais il existe une meilleure façon. swaymsg facilite l'abonnement aux événements souhaités et leur sortie vers stdout:


 $ swaymsg -m -t SUBSCRIBE "['window']" 

et nous traiterons le json résultant en jq . Sans entrer dans les subtilités de la syntaxe de requête de ce merveilleux utilitaire, voici le résultat:


 $ query='select(.change == "focus" or (.change == "title" and .container.focused)) | .container.name' $ swaymsg -m -t SUBSCRIBE "['window']" | jq --unbuffered -r "$query" 

Un script à deux lignes sur le bash, et plus de code! L'indicateur --unbuffered nécessaire, sinon i3blocks ne recevra pas de nouvelles lignes immédiatement, mais uniquement lorsque le tampon sera effacé.


Enfin, ajoutez le bloc suivant à la configuration i3blocks:


 [active_window] command=/path/to/our/script.sh interval=persist 

Devoirs: apprenez à Grim à prendre une capture d'écran de la fenêtre actuelle. Ils disent que de telles choses sont impossibles à Wayland, mais les hommes en doutent.


Devoirs 2: apprenez à i3blocks à afficher la disposition actuelle du clavier sous forme d'indicateur. Il y a quelques blocs dans i3blocks-contrib, mais ils affichent du texte au lieu d'un indicateur et ne fonctionnent pas dans Wayland.


Autres programmes


wl-clipboard vous permet de travailler avec le presse-papiers depuis le terminal, c'est-à-dire qu'il remplace xclip et xsel. Il est particulièrement utile pour les utilisateurs de vim, dans lesquels le copier / coller commence à utiliser "+y / "+p (installez simplement ce paquet, aucune configuration supplémentaire n'est requise).


ydotool - remplacement de xdotool.


waypipe - proxy pour la transparence du réseau. Pour être honnête, je ne me souviens pas de la dernière fois que quelqu'un a posé une question relative à cette fonctionnalité sur des forums spécialisés. Peut-être qu'ils ne l'utilisent pas du tout? Certainement pas.


KDE Connect Ajoutez le fichier org.kde.kdeconnect.nonplasma.desktop à l' org.kde.kdeconnect.nonplasma.desktop (voir les sections précédentes), installez KDE Connect sur votre smartphone et configurez leur connexion - et vous pouvez contrôler la lecture de musique et de vidéo depuis votre smartphone dans un navigateur avec le plug - in d' intégration plasma , dans vlc , en cantate, en mpv avec le plugin mpv-mpris , et aussi recevoir des notifications en mako. Mon respect pour le projet KDE pour le développement de programmes non cloués à leur écosystème.


Conclusion


Vous pouvez écrire sur la configuration de tout cela (en particulier le panneau i3blocks) à l'infini, mais il vaut mieux s'arrêter ici. Voici ce que j'ai obtenu:



Allez aussi sur le subreddit / r / unixporn et admirez ce que les gens font. (Cependant, 95% de tout ce qui y est présenté est magnifique, mais ne convient absolument pas au travail quotidien :)).

Source: https://habr.com/ru/post/fr484378/


All Articles