SwayWM

Posted on sam. 22 mai 2021 in divers

Sway, c'est quoi?

SwayWM est un gestionnaire de fenêtre (sous Wayland) qui a pour but de remplacer i3 (x11).

La configuration est même compatible de i3 vers sway.

Sway organise les fenêtres par division de l'espace en éléments de plus petites tailles. La première fenêtre ouverte A occupera tout l'espace. Lorsqu'une nouvelle fenêtre B est créée, elle prendra la moitié de l'espace (horizontalement ou verticalement) réduisant donc la taille de A de moitié.

Si une nouvelle fenêtre C est créée, elle divisera encore l'espace d'une des deux autres fenêtres (selon le focus).

split des fenêtres

Sway permet également d'utiliser des workspaces, l'équivalent des Bureaux sous d'autres environnements (Gnome,KDE, etc), à la différence qu'ici un workspace utilise un écran et ne peut être étendu à d'autres écrans.

Wayland, le nouveau X11

Comme je le disait précédement, Sway utilise Wayland.

Il permet, entre autre, une meilleure sécurité que X11, un code plus moderne, mais moins mature.

Mais tout n'est pas rose, il y a quelques applications qui ne sont pas compatible (ou du moins en partie).

Mais les choses semblent aller de l'avant, exemple : OBS-studio a rendu, depuis peu, son logiciel compatbile Wayland.

Configuration

Tous se fait via le fichier de configuration ~/.config/sway/config. Il est extensible et peut donc être découpé au besoin.

La syntaxe est assez simple pour la plupart des usages et reste lisible.

J'ai personnellement choisi de versionner ce fichier dans mon Gitlab, ce qui me permet d'avoir la même configuration sur tous mes postes.

set $mod Mod4

xwayland enabled

default_border normal
default_floating_border normal
set $opacity 0.9

Ici, je crée une variable $mod avec Mod4 comme valeur.

Mod4 correspont à la touche Windows.

Ensuite, j'active Xwayland qui permet d'ouvrir des applications X11 sous wayland (en réalité, il ouvre un serveur X dans wayland)

Et je termine par la configuration des bordures et de l'opacité des fenêtres.

Ce fichier cherche à ouvrir config.local qui lui est spécifique au poste (Configuration éran, clavier, etc ...)

include ~/.config/sway/config.local

Gestion des écrans

Le double écran se configure aussi explicitement que le reste.

output HDMI1 pos 0 0 res 1920x1080
output eDP1 pos 1920 0 res 1600x900

L'écran HDMI1 est à gauche, avec une résolution de 1920x1080 et le seconde écran (eDP1) est à droit avec une résolution de 1600x900.

Pour déterminer le nom des écran, il suffit d'utiliser la commande suivante.

$ swaymsg -t get_outputs

Workspaces

Les workspaces sont donc l'équivalent des Bureaux sous Gnome/KDE/... on peut en configurer autant que l'on veut en leurs assignant simplement un raccourci clavier (voir plus bas).

Moi, je bascule d'un workspace à l'autre en utilisant la touche windows + le numéro du workspace (pour le workspace 4 : <Windows>+4)

Il y a également la possibilité de placer les workspaces sur un écran plutôt qu'un autre, et d'autres fonctions mais j'y reviendrais plus tard (via un MAJ de l'article).

Shortcuts : simplicité, efficacité

Les raccourcis clavier se configurent avec bindsym.

Ci-dessous, je configure mes raccourcis clavier pour les workspaces.

# switch to workspace
bindsym $mod+KP_1 workspace 1
bindsym $mod+KP_2 workspace 2
bindsym $mod+KP_3 workspace 3
bindsym $mod+KP_4 workspace 4
bindsym $mod+KP_5 workspace 5
bindsym $mod+KP_6 workspace 6
bindsym $mod+KP_7 workspace 7
bindsym $mod+KP_8 workspace 8
bindsym $mod+KP_9 workspace 9
bindsym $mod+KP_0 workspace 10

KP_1 correspond à la touche 1 du pavé numérique.

Mais bindsym peut également lancer des applications.

# start a terminal
bindsym $mod+t exec alacritty

Un autre de mes raccourcis que je trouve bien utile

# Reload the configuration file
bindsym $mod+Shift+c reload

Sway peut utiliser des "modes". Lorsque l'un de ces modes est activé, les raccourci claviers sont uniques à ce mode.

Par exemple, moi j'utilise principalement trois modes:

  • default : raccourcis claviers par défault

  • open : il me permet d'ouvrir les applications que j'utilise souvent

    mode "open" {
        bindsym e exec emoji-picker; mode "default"
        bindsym f exec firefox; mode "default"
        bindsym m exec thunderbird; mode "default"
        bindsym t exec alacritty; mode "default"
    
    
        # return to default mode
        bindsym Return mode "default"
        bindsym Escape mode "default"
    }
    bindsym $mod+o mode "open"
    
  • resize : il me permet de redimensionner les fenêtres

    mode "resize" {
        bindsym Left resize shrink width 10 px or 10 ppt
        bindsym Up resize grow height 10 px or 10 ppt
        bindsym Down resize shrink height 10 px or 10 ppt
        bindsym Right resize grow width 10 px or 10 ppt
    
        # return to default mode
        bindsym Return mode "default"
        bindsym Escape mode "default"
    }
    bindsym $mod+r mode "resize"
    

Autostart : rien de plus facile

Les applications lancées à l'ouverture de la session se font tout simplement dans le même fichier que le reste de la configuration.

exec mako
exec /path/to/some/executable

Mes Dotfiles à moi

Vous pouvez retrouver la totalité de mes Dotfiles Ici.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
include ~/.config/sway/config.local

set $mod Mod4

xwayland enabled

default_border normal
default_floating_border normal
set $opacity 0.9

#################
#               #
# windows rules #
#               #
#################

for_window [class=".*"] border pixel 4
for_window [title="."] border pixel 4

for_window [class=".*"] opacity $opacity
for_window [app_id=".*"] opacity $opacity
for_window [floating=".*"] opacity 1

for_window [app_id="firefox" title="^Incrustation vidéo$"] \
    floating enable, move position 477 450, sticky enable, opacity 1
for_window [app_id="emoji-picker"] \
    floating enable, move position 477 450, sticky enable, opacity 1
for_window [class="Steam" title="^Friends List$"] \
    floating enable, move position 1456, 43, sticky enable
for_window [class="Steam" title="^Steam - News.*"] \
    floating enable, move position 1456, 43, sticky enable

#################
#               #
#      Gaps     #
#               #
#################
gaps inner 10
gaps outer 4


##################
#                #
# windows colors #
#                #
##################

client.focused          #3a8b23 #3a8b23 #000000 #3a8b23   #3a8b23
client.focused_inactive #94b78a #94b78a #000000 #94b78a   #94b78a
client.unfocused        #505050 #505050 #000000 #ffffff   #505050
client.urgent           #ffffff #ffffff #000000 #ffffff   #ffffff
client.placeholder      #505050 #505050 #000000 #505050   #505050

###############
#             #
#  Wallpaper  #
#             #
###############

set $wallpapers_path $HOME/.config/wallpapers
output * bg `find $wallpapers_path -type f | shuf -n 1` fill

##############
#            #
# autostart  #
#            #
##############

exec mako
exec autotiling
exec --no-startup-id xsettingsd &
exec /opt/sway-alttab/target/release/sway-alttab
exec alacritty

#########################
#                       #
#  Let's play musique   #
#                       #
#########################

exec mount.sshfs 0w.tf:/data/Downloads/Musique ~/Musique
exec swayidle -w timeout 360 "~/.config/custom_scripts/swayloack.sh"
exec mpd && mpc add / && mpc random on

#####################
#                   #
#  Keyboard config  #
#                   #
#####################

input "type:keyboard" {
    xkb_layout fr
    xkb_variant ,nodeadkeys
    xkb_numlock enabled
}
input * xkb_model "logitech_g15"

################
#              #
#  Workspaces  #
#              #
################

# Define names for default workspaces for which we configure key bindings later on.
# We use variables to avoid repeating the names in multiple places.
set $ws1 "1"
set $ws2 "2"
set $ws3 "3"
set $ws4 "4"
set $ws5 "5"
set $ws6 "6"
set $ws7 "7"
set $ws8 "8"
set $ws9 "9"
set $ws10 "10"

#######################
#                     #
#  keyboard shortcut  #
#                     #
#######################


# Open generic soft with a key:

mode "open" {
    bindsym e exec emoji-picker; mode "default"
    bindsym f exec firefox; mode "default"
    bindsym m exec thunderbird; mode "default"
    bindsym n exec alacritty --config-file ~/.config/alacritty/sd-network.yml; mode "default"
    bindsym t exec alacritty; mode "default"


    # return to default mode
    bindsym Return mode "default"
    bindsym Escape mode "default"
}
bindsym $mod+o mode "open"

# Resizing containers:

mode "resize" {
    bindsym Left resize shrink width 10 px or 10 ppt
    bindsym Up resize grow height 10 px or 10 ppt
    bindsym Down resize shrink height 10 px or 10 ppt
    bindsym Right resize grow width 10 px or 10 ppt

    # return to default mode
    bindsym Return mode "default"
    bindsym Escape mode "default"
}
bindsym $mod+r mode "resize"

bindsym $mod+KP_Subtract resize shrink width 10 px or 10 ppt;resize shrink height 10 px or 10 ppt
bindsym $mod+KP_Add resize grow width 10 px or 10 ppt; resize grow height 10 px or 10 ppt

# Exec cmd like gnome/mate
bindsym Alt+F2 exec sgtk-dmenu -c -t 1 -w 700

# Use Mouse+$mod to drag floating windows to their wanted position
floating_modifier $mod

# start a terminal
bindsym $mod+t exec alacritty

# kill focused window
bindsym $mod+q kill

# screenshot
bindsym Print exec slurp | grim -g - $(xdg-user-dir PICTURES)/$(date +'screenshot_%Y-%m-%d-%H%M%S.png')

# change focus
bindsym $mod+Left focus left
bindsym $mod+Down focus down
bindsym $mod+Up focus up
bindsym $mod+Right focus right

# Move windows
bindsym $mod+Shift+Left move left
bindsym $mod+Shift+Down move down
bindsym $mod+Shift+Up move up
bindsym $mod+Shift+Right move right

# Enter fullscreen mode for the focused container
bindsym $mod+f fullscreen toggle

# change container layout (stacked, tabbed, toggle split)
#bindsym $mod+s layout stacking
#bindsym $mod+w layout tabbed
#bindsym $mod+e layout toggle split

# toggle tiling / floating
bindsym $mod+space floating toggle

# focus the parent container
bindsym $mod+a focus parent

# focus the child container
#bindsym $mod+d focus child


# switch to workspace
bindsym $mod+KP_1 workspace 1
bindsym $mod+KP_2 workspace 2
bindsym $mod+KP_3 workspace 3
bindsym $mod+KP_4 workspace 4
bindsym $mod+KP_5 workspace 5
bindsym $mod+KP_6 workspace 6
bindsym $mod+KP_7 workspace 7
bindsym $mod+KP_8 workspace 8
bindsym $mod+KP_9 workspace 9
bindsym $mod+KP_0 workspace 10

# switch to workspace
bindsym $mod+ampersand workspace 1
bindsym $mod+eacute workspace 2
bindsym $mod+quotedbl workspace 3
bindsym $mod+apostrophe workspace 4
bindsym $mod+parenleft workspace 5
bindsym $mod+minus workspace 6
bindsym $mod+egrave workspace 7
bindsym $mod+underscore workspace 8
bindsym $mod+ccedilla workspace 9
bindsym $mod+agrave workspace 10

# move focused container to workspace
bindsym $mod+Shift+ampersand move container to workspace 1; workspace 1
bindsym $mod+Shift+eacute move container to workspace 2; workspace 2
bindsym $mod+Shift+quotedbl move container to workspace 3; workspace 3
bindsym $mod+Shift+apostrophe move container to workspace 4; workspace 4
bindsym $mod+Shift+parenleft move container to workspace 5; workspace 5
bindsym $mod+Shift+minus move container to workspace 6; workspace 6
bindsym $mod+Shift+egrave move container to workspace 7; workspace 7
bindsym $mod+Shift+underscore move container to workspace 8; workspace 8
bindsym $mod+Shift+ccedilla move container to workspace 9; workspace 9
bindsym $mod+Shift+agrave move container to workspace 10; workspace 10
bindsym $mod+Shift+KP_1 move container to workspace 1 ;workspace 1
bindsym $mod+Shift+KP_2 move container to workspace 2 ;workspace 2
bindsym $mod+Shift+KP_3 move container to workspace 3 ;workspace 3
bindsym $mod+Shift+KP_4 move container to workspace 4 ;workspace 4
bindsym $mod+Shift+KP_5 move container to workspace 5 ;workspace 5
bindsym $mod+Shift+KP_6 move container to workspace 6 ;workspace 6
bindsym $mod+Shift+KP_7 move container to workspace 7 ;workspace 7
bindsym $mod+Shift+KP_8 move container to workspace 8 ;workspace 8
bindsym $mod+Shift+KP_9 move container to workspace 9 ;workspace 9
bindsym $mod+Shift+KP_0 move container to workspace 10;workspace 10

# volume control
bindsym XF86AudioRaiseVolume exec "amixer set Master 5%+ unmute"
bindsym XF86AudioLowerVolume exec "amixer set Master 5%- unmute"
bindsym XF86AudioMute exec "amixer -q sset Master,0 toggle"

# Brightness control
bindsym XF86MonBrightnessDown exec brightnessctl set 15%-
bindsym XF86MonBrightnessUp exec brightnessctl set +15%

# Media player controls
bindsym --locked XF86AudioPlay exec mpc toggle
bindsym --locked XF86AudioPause exec mpc toggle
bindsym --locked XF86AudioNext exec mpc next
bindsym --locked XF86AudioPrev exec mpc prev
bindsym --locked XF86AudioStop exec mpc stop

# Reload the configuration file
bindsym $mod+Shift+c reload

################
#              #
#  Font style  #
#              #
################

# Font for window titles. Will also be used by the bar unless a different font
# is used in the bar {} block below.

# This font is widely installed, provides lots of unicode glyphs, right-to-left
# text rendering and scalability on retina/hidpi displays (thanks to pango).
font pango:Hurmit NF 11

set $gnome-schema org.gnome.desktop.interface
exec_always {
    gsettings set $gnome-schema gtk-theme 'Material-Black-Lime-3.36'
    gsettings set $gnome-schema icon-theme 'Material-Black-Lime-Numix'
    gsettings set $gnome-schema font-name 'Hurmit NF 11'
}


############
#          #
#  Waybar  #
#          #
############

bar {
    swaybar_command waybar
}
include ~/.config/sway/config.local

Tools

J'utilise plein de petit "sous-programme" pour mon bureau, voici les plus utiles au quotidien.

Waybar : la barre à tout faire

Pour mon bureau, j'utilise Waybar. Il est comme Sway, il se configure très simplement par deux fichiers.

  • ~/.config/waybar/config
  • ~/.config/waybar/style.css
waybar

L'un permet de configurer les différents éléments de la barre et l'autre uniquement le style.

J'écrirai un autre article à ce sujet, il y a pas mal de choses sympa à dire.

gtk3-menu, c'est le pied!

gtk3-menu est juste un menu à la Gnome qui me permet d'ouvrir simplement quelques programmes dont je ne me souviens plus du nom via terminal. Il me permet également d'ouvrir rapidement un dossier présent dans mon $HOME.

gtk3 folder menu

L'écran de verrouillage : Swaylock

swaylock permet de verrouiller mon bureau afin que mes collègues ne s'en prennent pas à ma boite mail par exemple (merci les viennoiseries le lendemain ...).

Je vous conseille même l'excellent swaylock-effect qui permet de faire un screenshot, de le flouter et de l'avoir en fond d'écran.

swaylock

Capture écran

Pour la capture d'écran, j'utilise le combo slurp + grim.

Slurp permet de sélectionner une partie du bureau, et grim l'enregistre.

# screenshot
bindsym Print exec slurp | grim -g - $(xdg-user-dir PICTURES)/$(date +'screenshot_%Y-%m-%d-%H%M%S.png')

Mes capture d'écran se retrouvent automatiquement dans mon dossier Images avec date + heure dans le nom du fichier.

MPD/MPC

MPD (Music Player Daemon) est, comme son nom l'indique un lecteur de musique qui tourne en fond.

Il permet du coup d'être pilotable par de nombreux éléments externes comme MPC (Music Player Client).

Je l'utilise d'ailleurs directement dans ma waybar.

khal/vdirsyncer

Autre outil dans ma barre, le duo vdirsyncer + khal.

  • vdirsyncer permet d'interroger un serveur DavCal et d'enregistrer une copie en .ics
  • khal permet lui de lire ces fichier ics directement en ligne de commande. C'est lui qui est directement interrogé depuis waybar.