
Sommaire
-
Qu’est ce que i3 ?
-
Installer et configurer i3
-
Personnaliser i3
Si vous utilisez déjà i3 et que vous souhaitez seulement compléter votre configuration actuelle, ou que vous êtes curieux à propos de ma configuration, vous pouvez directement aller jeter un coup d’oeil à la configuration accessible ici : GitHub - Cr3upsy/I3-config
Qu’est ce que i3 ?
Si vous êtes un fervant utilisateur de systèmes d’exploitation de type Unix, particulièrement Linux, vous avez peut-être entendu parler d’un gestionnaire de fenêtres appelé i3. Alors, qu’est-ce qu’i3 et en quoi se distingue-t-il des gestionnaires de fenêtres traditionnels ?
La Magie de la Mosaïque
i3 rompt avec la tradition des fenêtres superposées que nous connaissons tous. Au lieu de cela, il opte pour une approche de disposition en mosaïque, où les fenêtres sont arrangées de manière non superposée. Imaginez une grille bien organisée qui maximise votre espace d’écran, permettant un affichage clair et ordonné.
Un Gestionnaire de fenêtres dynamique
L’une des fonctionnalités phares d’i3 est sa gestion dynamique des fenêtres. Il ajuste automatiquement la taille et la position des fenêtres en fonction de leurs besoins, garantissant une utilisation optimale de l’espace disponible.
Un contrôle au bout des doigts
Si vous êtes un amateur de raccourcis clavier, i3 est fait pour vous. Le gestionnaire de fenêtres est conçu pour être principalement contrôlé via le clavier. Configurez des raccourcis pour déplacer, redimensionner et organiser vos fenêtres avec une facilité déconcertante.
Une configuration simplifiée en texte Brut
i3 prône la simplicité avec une configuration basée sur un fichier texte brut. Pas besoin de plonger dans des menus complexes - personnalisez votre environnement en éditant simplement un fichier de configuration en texte clair.
Une grande légèreté
Si la légèreté et la réactivité sont des critères importants pour vous, i3 répond à ces exigences. Sa conception épurée en fait un choix idéal pour ceux qui recherchent un environnement de bureau minimaliste sans compromettre la puissance.
Un temps d’adaptation récompensé
Bien que l’utilisation d’i3 puisse demander un court temps d’adaptation, une fois que vous maîtrisez ses subtilités, i3 se révèle être un compagnon fiable et efficient, transformant votre expérience utilisateur.
En résumé, i3 n’est pas simplement un gestionnaire de fenêtres, c’est une approche différente pour organiser et contrôler votre espace de travail. Si vous êtes prêt à repenser la manière dont vous interagissez avec vos fenêtres, i3 pourrait bien être la clé pour une productivité accrue et une expérience utilisateur repensée.
Vous êtes convaincus ? Très bien alors nous pouvons maintenant nous lancer dans l’installation et la configuration de i3.
Astuce : I3 peut paraître un peu austèrer et compliqué à prendre en main au premier abord. Si vous avez peur d’être un peu perdu au début, je vous invite à garder environnement de travail natif en plus d’i3. Il vous sera comme cela possible de commencer à travailler sur i3, mais en cas de besoin de pouvoir switcher sur votre ancien environnement de travail natif, le temps de vous habituer et de terminer votre configuration de i3. Si vous êtes sur ubuntu, vous pouvez choisir sur quelle interface démarrer votre session en cliquant sur le bouton en bas à droite sur la mire d’authentfiication et de séléctionner l’option de votre choix (i3 ou ubuntu)
Installer et configurer i3
Je vais essayer de passer assez rapidement sur l’étape d’installation car il existe de nombreuses ressources en ligne qui décrivent cette partie là.
Si vous êtes sur ubuntu, vous pouvez simplement lancer la commande suivante :
sudo apt update && sudo apt install -y i3
Une fois que l’installation est terminée, vous pouvez à présent passer à la configuration de i3. Pour cela, déconnectez vous de votre session, puis connectez vous de nouveau en séléctionnant “i3 session” sur la fenêtre d’authentifcation.
Sur ubuntu une fois déconnecté cliquez sur la petite roue en bas à droite et séléctionnez “i3”

Une fois votre session ouverte, vous avez une petite fenetre sur un fond noir vous demandant de séléctionner la touche qui vous permettra d’utiliser tous vos raccourcis, soit la touche “Alt” soit “Win”. Personnellement j’ai une préférence pour la touche “Win”.
Une fois cela fait, vous vous retrouvez sur une session qui peut paraitre un peu austère au premier abord, pas d’icône, une barre de navigation très simpliste, et nul part ou cliquer.

Ne vous inquietez pas, nous allons vite changer ça. Avant toute chose, vous devez connaitre deux raccourcis indispensables pour poursuivre :
-
$mod + Enter: ouvrir un terminal ($modcorrespond à la touche que vous avez séléctionnée à l’étape précédente, soitWinsoitAlt) -
$mod + d: rechercher un programme
Cela devrait suffir pour débuter. Il nous faut maintenant savoir quels raccourcis sont utilisables, et de pouvoir les modifier si besoin.
La configuration i3 fonctionne sous forme d’un fichier de configuration. Par défaut ce dernier se trouve à la localisation suivante : ~/.config/i3/config
En analysant le contenu du fichier on note différentes parties :
exec --no-startup-id xss-lock --transfer-sleep-lock -- i3lock --nofork
[...]
set $ws1 "1"
[...]
bindsym $mod+ampersand workspace number $ws1
[...]
bar {
status_command i3status
}
-
Les lignes contenant la commande
execpermettent notament d’éxécuter des instruction ou commandes spécifiques lors du chargement de la session i3. -
les lignes
set $wsxindiquent comment nommer les différents workspaces dans lesquels nous allons pouvoir nous déplacer. iciset $ws1 "1"indique que le workspace 1 sera nommé ‘1’ dans notre bar de navigation. -
bindsympermet de définir des raccourci clavier, ici la lignebindsym $mod+ampersand workspace number ws1initialise un raccourci clavier permetant d’accèder au workspace ‘1’ defini précèdement avec la combinaison de touche$modet de la toucheampersandqui correspond à la touche&de notre clavier. -
Enfin
bar{}permet de definir les options de configuration de notre barre de navigation.
Il existe d’autres options et subtilités qui peuvent être utilisées dans ce fichier, mais pour l’instant nous nous cantonnerons à ces informations qui permettent de réaliser toutes les actions basiques sur i3.
A ce stade je vous invite à modifier / ajouter ou supprimer des raccourcis avec ceux qui pourraient le mieux vous correspondre.
Pour avoir une liste exaustive de binding possibles je vous invite à consulter la documentation i3 :
A partir de là, une infinité de modification sont possibles sur i3 pour obtenir un environnement qui nous convient le mieux. Mais je me souviens qu’à mes début j’ai passé énormément de temps à me perdre sur des dizaines de forums pour trouver des morceaux de code afin de perfectionner ma configuration, ce qui peut rapidement devenir chronophage.
Afin de vous épargner ce temps, ou du moins vous en faire gagner un peu, je vais vous détailler comment j’ai configuré mon environnement de travail i3 avec tous les plugins, et outils qui l’accompagne. Cela vous donnera une bonne idée sur les possibilités de personnalisation avec i3.
Personnaliser i3
Fichier de configuration i3
- Ajouter un fond d’écran
La gestion du fond d’écran peut être réalisé grâce au paquet feh :
sudo apt install feh
Une fois installé, nous pouvons ajouter la ligne suivante dans notre fichier config
#Background
exec_always feh --bg-scale <full_path_to_image>
Si vous souhaitez charger aléatoirement une image parmis plusieurs dans une galerie d’image, vous pouvez ajouter l’option --randomize :
#Background
exec_always feh --randomize --bg-scale <full_path_to_image_repository>/*
- Modifier la police de i3
#font pango:<police>
font pango:System San Francisco Display 13
- Modifier les couleurs
Pour modifier les couleurs des différent éléments i3 (bord, fenêtre, focus, etc), nous pouvons ajouter les lignes suivantes dans notre fichier de configuration i3 :
set $bg-color #102542
set $inactive-bg-color #2f343f
set $active-color #DEF6CA
set $text-color #f3f4f5
set $text-focus-color #102542
set $inactive-text-color #676E7D
set $urgent-bg-color #EFC3E6
# Set window colors into the matrix
# border background text indicator
client.focused $inactive-bg-color $inactive-bg-color $text-color #00ff00
client.unfocused $inactive-bg-color $inactive-bg-color $inactive-text-color #00ff00
client.focused_inactive $inactive-bg-color $inactive-bg-color $inactive-text-color #00ff00
client.urgent $urgent-bg-color $urgent-bg-color $text-color #00ff00
Un peu d’explication :
set $<varibale>permet de définir des variable pour les couleurs, c’est très pratique pour pouvoir appliquer nos couleurs à différents endroits.La deuxième partie représente une matrice permettant d’appliquer nos couleurs par exemple :
# border client.focused $bg-colorPermet d’attribuer la couleur
#102542aux bordures des fenetres lorsqu’on fait un ‘focus’ sur la fenetre (quand on passe notre souris dans la fenêtre par exemple)
Vous pouvez dans ce tableau appliquer vos propres couleurs en fonction de vos gouts.
Une fois i3 rechargé vos couleurs devraient être appliquées.
Module de recherche
On a vu précédement qu’avec mod + d on peut rechercher un programme sur l’ordinateur, c’est une fonctionnalité centrale de i3, nous alons donc commencer par modifier cette dernière afin de la rendre plus esthétique. Pour cela nous alons utiliser le programme rofi qui va remplacer notre barre de recherche par défaut dmenu.
Installons le paquet :
sudo apt-get update && sudo apt-get install rofi
Une fois installé, nous allons supprimer la ligne suivante dans le fichier de configuration i3 :
# start dmenu (a program launcher)
bindsym $mod+d exec --no-startup-id dmenu_run
Et décommenter cette ligne :
bindcode $mod+40 exec "rofi -modi drun,run -show drun"
Il faut ensuite recharger la configuration i3 :
i3-msg reload
Vous verrez à présent que si vous appuyer sur $mod + d un nouveau menu apparait pour rechercher une application. C’est mieux, mais ce n’est pas encore très esthetique.

Pour modifier la configuration de rofi, nous allons créer le fichier ~/.config/rofi/config.rasi.
Puis entrer les éléments de configuration suivante :
/*******************************************************************************
* MACOS SPOTLIGHT LIKE DARK THEME FOR ROFI
* User : LR-Tech EDITED
* Theme Repo : https://github.com/lr-tech/rofi-themes-collection
*******************************************************************************/
* {
font: "Montserrat 12";
bg0: #242424E6;
bg1: #7E7E7E80;
bg2: #0860f2E6;
fg0: #DEDEDE;
fg1: #FFFFFF;
fg2: #DEDEDE80;
background-color: transparent;
text-color: @fg0;
margin: 0;
padding: 0;
spacing: 0;
}
#window {
// Default font
font: "System San Francisco Display 18";
fullscreen: true;
transparency: "background";
fullscreen: true;
// Add dummy widgets on top and bottom so the sizing
// nicely centers hdum, independent of resolution.
children: [ dummy1, hdum, dummy2 ];
}
mainbox {
location: center;
width: 640;
border-radius: 8;
background-color: rgba(0, 0, 0, 0.8);
}
inputbar {
font: "Montserrat 20";
padding: 12px;
spacing: 12px;
children: [ icon-search, entry ];
}
icon-search {
expand: false;
filename: "search";
size: 28px;
}
icon-search, entry, element-icon, element-text {
vertical-align: 0.5;
}
entry {
font: inherit;
placeholder : "Search";
placeholder-color : @fg2;
}
message {
border: 2px 0 0;
border-color: @bg1;
background-color: @bg1;
}
textbox {
padding: 8px 24px;
}
listview {
lines: 10;
columns: 1;
fixed-height: false;
border: 1px 0 0;
border-color: @bg1;
}
element {
padding: 8px 16px;
spacing: 16px;
background-color: transparent;
}
element normal active {
text-color: @bg2;
}
element selected normal, element selected active {
background-color: @bg2;
text-color: @fg1;
}
element-icon {
size: 1em;
}
element-text {
text-color: inherit;
}
#hdum {
orientation: horizontal;
// Add dummy widgets on left and right so the sizing
// nicely centers mainbox, independent of resolution.
children: [ dummy3, mainbox, dummy4 ];
}
Pour réaliser ma configuration, je me suis beaucoup basé sur les thème de ce répértoire git : https://github.com/newmanls/rofi-themes-collection/tree/master
On retourne ensuite dans notre fichier de configuration i3, et nous modifions la ligne suivante :
bindcode $mod+40 exec "rofi -modi drun,run -show drun"
Par :
bindsym $mod+d exec rofi -show drun -show-icons -fullscreen -theme ~/.config/rofi/config.rasi
En rechargeant la configuration i3, lorsque vous appuyez sur mod+d votre beau menu devrait apparaitre.
Voilà une bonne base que vous pouvez compléter celon vos besoins :

Bar de navigation
Par défaut, i3 intègre une barre simpliste, qu’il est possible de modifier. Mais il existe d’autres barres que nous pouvons intégrer avec i3, la plus populaire étant Polybar. Pour ma part je préfère utiliser bumblebee bar.
Commençons par l’installation :
pip install --user bumblebee-status
# Il est aussi possible d'installer directement depuis le repertoire git
# https://github.com/tobi-wan-kenobi/bumblebee-status
Une fois installé il va nous falloir modifier les lignes suivantes dans le fichier de configuration i3 :
bar {
status_command i3status
}
Nous allons remplacer la barre par défaut par notre barre bumblebee, la synthaxe à utiliser est la suivante :
bar {
status_command <path to bumblebee-status/bumblebee-status> \
-m <list of modules> \
-p <list of module parameters> \
-t <theme>
}
Voici ma configuration :
bar {
position top
status_command ~/.local/bin/bumblebee-status -m memory nic bluetooth pasink battery time \
-p time.format="%H:%M" memory.format={used} nic.format='{intf} | {ip}' nic.include=enp4s0,wlp5s0 -t iceberg
colors {
background $bg-color
separator #757575
# border background text
focused_workspace #DEF6CA #DEF6CA $text-focus-color
inactive_workspace #102542 #102542 $in>
urgent_workspace $urgent-bg-color $urgent-bg-color $text-color
}
}
-
positionpermet de définir si nous souhaitons que la barre de navigation se situe en haut ou bas de notre écran -
Concernant le modules j’ai choisis parmis un de ceux que je préfère, mais vous pouvez les remplacer par d’autres que vous pourrez trouvez dans la documentation de la barre.
-
Pour les couleurs je défini quelles couleurs je souhaite appliquer pour les différents éléments de ma barre. Il se lit comme une matrice.
Après avoir enregistré puis rechargé la configuration i3 si vous voyez que des icônes dans la barre sont maquantes, verifer que le paquet font-awesome est installé :
sudo apt-get install -y fonts-font-awesome
Notons que la configuration de la barre est basée sur le thème iceberg, mais il existe d’autres thèmes, et il est même possible de personnaliser votre propre thème.
Cette etape n’est pas indispensable si vous trouvez que les thèmes par défaut vous conviennent
Nous allons personnaliser notre propre thème, pour cela, il nous faut créer le répértoire suivant :
mdkir ~/.config/bumblebee-status/themes
cd ~/.config/bumblebee-status/themes
touch custom.json
Nous éditons le fichier custom.json qui va contenir notre configuration :
{
"icons": [ "awesome-fonts" ],
"defaults": {
"separator-block-width": 0,
"separator": "",
"warning": {
"fg": "#102542",
"bg": "#446DF6"
},
"critical": {
"fg": "#102542",
"bg": "#EFC3E6"
},
"fg": "#c6c8d1",
"bg": "#102542"
},
"dnf": {
"good": {
"fg": "#0f1117",
"bg": "#b4be82"
}
},
"apt": {
"good": {
"fg": "#0f1117",
"bg": "#b4be82"
}
},
"pacman": {
"good": {
"fg": "#0f1117",
"bg": "#b4be82"
}
},
"battery": {
"charged": {
"fg": "#b4be82"
},
"charging": {
"fg": "#b4be82"
}
},
"pomodoro": {
"paused": {
"fg": "#0f1117",
"bg": "#e2a478"
},
"work": {
"fg": "#1d2021",
"bg": "#b8bb26"
},
"break": {
"fg": "#89b8c2",
"bg": "#161821"
}
}
}
Nous modifions ici juste quelques couleurs de certains éléments. Si vous souhaitez effectuer d’autres modification, je vous invite à consulter la documention pour plus de détails.
Il faut juste ensuite réouvrir notre fichier de configuration i3 et dans la partie bar que nous avons édité précedement, modifier iceberg par custom, puis recharger la configuration.

Ecran de vérouillage
Il existe différente programme pouvant permettre la gestion du vérouillage de l’écran sous i3. Personnellement j’utilise un fork du mécanisme intégré par défaut i3lock par i3lock-color.
Pour l’installer voici la procédure à suivre : GitHub - Raymo111/i3lock-color: The world's most popular non-default computer lockscreen.
La personnalisation du mécanisme de vérroullage de session est réalisé au travers du fichier de configuration ~/.config/i3/i3lock.sh
| Voici la documentation avec les différentes options associées : [i3lock man | Linux Command Library](https://linuxcommandlibrary.com/man/i3lock) |
Tout d’abord voici ce que nous pouvons ajouter dans notre fichier i3lock.sh si vous souhaitez avoir un simple module i3lock avec une image personnalisé en fond
#!/bin/bash
BLANK='#00000000'
CLEAR='ffffff22'
DEFAULT='#fffed6'
TEXT='#fffed6'
WRONG='#880000bb'
VERIFYING='#fffed6'
# Set the path to your image folder
IMAGE="<path to image>"
# suspend message display
pkill -u "$USER" -USR1 dunst
i3-msg bar mode invisible
i3lock \
--insidever-color=$CLEAR \
--ringver-color=$VERIFYING \
--insidewrong-color=$CLEAR \
--ringwrong-color=$WRONG \
--inside-color=$BLANK \
--ring-color=$DEFAULT \
--line-color=$BLANK \
--separator-color=$DEFAULT \
--verif-color=$TEXT \
--wrong-color=$TEXT \
--time-color=$TEXT \
--date-color=$TEXT \
--layout-color=$TEXT \
--keyhl-color=$WRONG \
--bshl-color=$WRONG \
--wrong-text="Try again" \
--clock \
--indicator \
--time-str="%H:%M:%S" \
--date-str="%A, %m %Y" \
--keylayout 1 \
--image $IMAGE
# resume message display
pkill -u "$USER" -USR2 dunst
i3-msg bar mode dock
Ici plusieurs options sont présentent :
-
La personalisation des couleurs ( de l’anneau, du texte, et de l’anneau en cas de mot de passe erroné)
-
l’ajout de la date et l’heure dans le cercle
-
la suspension des notification sur l’écran de vérouillage, afin d’éviter que des notification sensibles n’apparaissent sur cet écran
-
L’utilisation d’une image personnalisée en fond de l’écran de vérouillage
Vous pouvez adapter ce script pour modifier les couleurs ou options à votre gré.
N’oubliez pas de rendre executable le fichier :
chmod +x ~/.config/i3/i3lock.sh
Enfin, ajoutons un raccourci au fichier de configration i3 pour vérouiller notre session :
bindsym $mod+Shift+x exec /home/corentin/.config/i3/i3lock.sh
Pour aller plus loin
Nous avons là une bonne base, j’ai ensuite modifié un peu ce script de base pour rajouter avec le temps de nouvelles fonctionnalités :
#!/bin/bash
BLANK='#00000000'
CLEAR='ffffff22'
DEFAULT='#fffed6'
TEXT='#fffed6'
WRONG='#880000bb'
VERIFYING='#fffed6'
# Get the list of connected screens
#screens=$(xrandr --query | grep " connected" | cut -d" " -f1)
# Set the path to your image folder
IMAGE_FOLDER="/home/corentin/Documents/Background/i3lock"
# Get the screen dimensions
screen_dimensions=$(xdpyinfo | grep dimensions | sed -r 's/^[^0-9]*([0-9]+x[0-9]+).*$/\1/')
# Loop through all files in the folder
for image_path in "$IMAGE_FOLDER"/*; do
# Check if the image name contains "retouched"
if [[ "$image_path" == *"retouched"* ]]; then
echo "No processing is done on the image $image_path"
else
# Resize the image based on the screen dimensions&, maintaining proportions
convert "$image_path" -resize "$screen_dimensions^" -gravity center -extent "$screen_dimensions" "${image_path%.*}.${image_path##*.}"
echo "Processing applied to $image_path. New file: ${image_path%.*}_resized.${image_path##*.}"
# Get the dimensions of the image
read width height <<< $(identify -format "%w %h" "$image_path")
# Calculate the coordinates of the center of the image
center_x=$((width / 2))
center_y=$((height / 2))
# Set the size of the black square (300x300 pixels)
square_size="300"
# Set radius to square borders
radius="20"
# Set the transparency (60%)
transparency="0.8"
# Use ImageMagick to add a semi-transparent black square to the center of the image
convert "$image_path" -fill "rgba(0,0,0,$transparency)" -draw "roundrectangle $((center_x - square_size/2)),$((center_y - square_size/2)) $((center_x + square_size/2)),$((center_y + square_size/2)) $radius,$radius" "${image_path%.*}_retouched.${image_path##*.}"
echo "Processing applied to $image_path. New file: ${image_path%.*}_retouched.${image_path##*.}"
# Removing the original image
rm "${image_path%.*}.${image_path##*.}"
fi
done
# Check that only .png files are in the repository, i3lock doesn't accept other format.
# Get a random image from the folder
RANDOM_IMAGE=$(find "$IMAGE_FOLDER" -type f -name "*.png" | shuf -n 1)
# Set the name of the primary screen
primary_screen="eDP"
# Declare an associative array to store screen positions
declare -A screen_positions
# Declare an associative array to store workspaces
declare -A workspace_assignments
# Save the current positions of the screens and workspaces
connected_screens=$(xrandr | grep " connected" | awk '{ print $1 }')
# Run i3-msg command and store the output in a variable
i3_msg_output=$(i3-msg -t get_workspaces)
# Check if jq is available
if command -v jq > /dev/null; then
# Parse the JSON output and extract 'num' and 'output' values to store workspace location on monitors
mapfile -t workspace_array < <(echo "$i3_msg_output" | jq -c '.[] | {num: .num, output: .output}')
else
echo "jq is not installed. Please install jq to run this script."
fi
for screen in $connected_screens; do
if [ "$screen" != "$primary_screen" ]; then
# Extract the position from the 'xrandr' output using awk
position=$(xrandr --query | awk -v screen="$screen" '/\ connected/ && $1 == screen {print $3}' | awk -F'[+x]' '{print $(NF-1)"x"$NF}')
screen_positions["$screen"]=$position
xrandr --output $screen --off
elif [ "$screen" == "$primary_screen" ]; then
position=$(xrandr --query | awk -v screen="$screen" '/\ connected/ && $1 == screen {print $4}' | awk -F'[+x]' '{print $(NF-1)"x"$NF}')
screen_positions["$screen"]=$position
fi
done
# Create an array to store the keys and values
temp_array=()
for key in "${!screen_positions[@]}"; do
temp_array+=("$key ${screen_positions[$key]}")
done
# Sort the array by the second column (values)
IFS=$'\n' sorted_array=($(sort -k2n <<<"${temp_array[*]}"))
unset IFS
# Create an array to store the sorted keys
ordered_screens=()
for element in "${sorted_array[@]}"; do
key=${element%% *}
ordered_screens+=("$key")
done
# Suspend message display
pkill -u "$USER" -USR1 dunst
i3-msg bar mode invisible
i3lock -n \
--insidever-color=$CLEAR \
--ringver-color=$VERIFYING \
--insidewrong-color=$CLEAR \
--ringwrong-color=$WRONG \
\
--inside-color=$BLANK \
--ring-color=$DEFAULT \
--line-color=$BLANK \
--separator-color=$DEFAULT \
\
--verif-color=$TEXT \
--wrong-color=$TEXT \
--time-color=$TEXT \
--date-color=$TEXT \
--layout-color=$TEXT \
--keyhl-color=$WRONG \
--bshl-color=$WRONG \
--wrong-text="Try again" \
--clock \
--indicator \
--time-str="%H:%M:%S" \
--keylayout 1 \
--date-str="%A, %m %Y" \
--screen HDMI-A-0 \
--image $RANDOM_IMAGE
wait
# Resume message display
pkill -u "$USER" -USR2 dunst
i3-msg bar mode dock
# Restore the screen positions ordered by position
for screen in "${ordered_screens[@]}"; do
position=${screen_positions["$screen"]}
workspace=${workspace_assignments["$screen"]}
echo "Setting position for $screen to $position"
xrandr --output $screen --auto --pos $position
feh --randomize --bg-scale ~/Documents/Background/i3_home
done
# Loop through the array and print key-value pairs
for workspace in "${workspace_array[@]}"; do
num=$(jq -r '.num' <<< "$workspace")
output=$(jq -r '.output' <<< "$workspace")
echo "Restoring workspace $num, to output: $output"
i3-msg "[workspace=$num]" move workspace to output $output
done
Nous venons d’ajouter plusieurs fonctionnalités intérressantes :
-
Au lieu d’une seule image, le script choisi aléatoirement une image parmis toute celles présentent dans le répertoire
IMAGE_FOLDERlors de chaque vérouillage. -
Ensuite afin que l’image soit correctement proportionné, elle est redimensionnée en prenant en compte la taille de votre écran principal
-
Enfin on rajoute autour du cercle de dévérouillage un carré noir avec de la transparence pour que le cercle et les informations associées soient correctement lisibles en cas de fond d’écran très clair et lumineux.
-
Une gestion mutli écran. car j’avais pu noter que lors du vérouillage de la session avec avec plusieurs écrans le visuel était bien souvent cassé. Pour palier à ce probleme, nous éteignons tous les écrans secondaires durant le verouillage, et les restorons une fois que l’utilisateur dévérouille son écran
Important :
-
Gardez une copie de vos images dans un autre répertoires car celle ci vont être directement retouchées par le script.
-
Si vous avez beaucoup d’images dans votre répertoire, le premier verrouillage peut être un peu long le temps que le script convertisse toutes les images lors du premier lancement du script
-
I3Lock ne prend en charge que les images au format png, donc veillez à ne mettre dans le dossier image que ce format de fichier
Voici le rendu final :

Gestion des notifications
Plusieurs daemons de notification peuvent être utilisés pour la gestion des notification. L’un des plus connus et des utilisés sous i3 est Dunst. Il est léger et plutot simple à configurer.
Pour cela, il faut l’installer si ce n’est pas fait :
sudo apt install dunst
Ensuite la configuration des notification se fera dans un fichier dédié :
mkdir ~/.config/dunst
touch ~/.config/dunst/dunstrc
Dans le fichier dunstrc nous pouvons configurer la taille des fenêtres de notification, la couleur, la transparence, etc. Voici à quoi ressemble mon fichier de configuration :
[global]
monitor = 0
follow = mouse
geometry = "320x6-20+35"
indicate_hidden = yes
shrink = no
notification_height = 15
separator_height = 1
padding = 10
horizontal_padding = 10
frame_width = 0
frame_color = "#232323"
separator_color = frame
sort = yes
idle_threshold = 120
font = Microsoft YaHei 13
line_height = 0
markup = full
format = "<span><b>%s %p</b></span>\n%b"
alignment = left
show_age_threshold = 60
word_wrap = yes
ellipsize = middle
ignore_newline = no
stack_duplicates = true
hide_duplicate_count = false
show_indicators = yes
icon_position = left
max_icon_size = 48
icon_path=/usr/share/icons/Humanity-Dark/status/16:usr/share/icons/Humanity-Dark/status/22/:/usr/share/icons/Humanity-Dark/status/24/:/usr/share/icons/Humanity-Dark/status/48/:snap/gtk-common-themes/1535/share/icons/elementary-xfce/notifications/16:/snap/gtk-common-themes/1535/share/icons/elementary-xfce/notifications/22/:/snap/gtk-common-themes/1535/share/icons/elementary-xfce/notifications/24/:/snap/gtk-common-themes/1535/share/icons/elementary-xfce/notifications/48/
sticky_history = yes
history_length = 20
always_run_script = true
startup_notification = false
verbosity = mesg
corner_radius = 10
force_xinerama = false
mouse_left_click = do_action
mouse_middle_click = close_all
mouse_right_click = close_current
[shortcuts]
close = ctrl+space
history = ctrl+shift+space
context = ctrl+shift+period
[urgency_low]
# IMPORTANT: colors have to be defined in quotation marks.
# Otherwise the '#' and following would be interpreted as a comment.
background="#3a3a3a"
foreground="#f5f5f5"
timeout = 7
[urgency_normal]
background="#3a3a3a"
foreground="#f5f5f5"
timeout = 5
[urgency_critical]
background="#3a3a3a"
foreground="#f5f5f5"
timeout = 0
Pour en savoir plus sur les différentes options de personnalisation du fichier :
Vous devrez certainement modifier ligne icon path, cela permet de définir le chemin vers les icones de notification, cela dépendra de votre distribution et des icones que vous souhaitez utiliser.
Ensuite afin de lancer automatiquement dunst au démarrage, il suffit d’ajouter la ligne suivante dans le fichier de configuration i3 et de redémarrer i3 :
exec_always --no-startup-id dunst -config ~/.config/dunst/dunstrc
Astuce Dunst
Si vous rencontrez des soucis avec Dunst et notament pour le chargement des images. Afin de debbugger votre installation je vous invite à lancer la commande suivante permettant de stopper dunst et de le redémarrer :
killall dunst;dunst -config ~/.config/dunst/dunstrc
Puis dans une autre fenêtre de lancer la commande suivante :
notify-send "test" "hello" -u normal
Une notification devrait alors apparaitre sur votre écran. Si jamais des soucis ont été rencontrés durant le processus les erreurs apparaîtrons dans la sorite de la première commande :
#example
$dunst -config ~/.config/dunst/dunstrc
WARNING: No icon found in path: 'dialog-information'
Ici, Cela signigfie que dans le chemin icon_path fourni l’icone dialog-information n’a pas été trouvé dans ma confiugration.
Pour savoir ou se trouve cette icone sur notre machine nous pouvons utiliser la commande fzf -e :
![]()
On note plusieurs chemin où se trouve l’icone. Nous ajoutons le bon chemins dans notre fichier dunstrc à la suite des autres chemins dans la variable icon_path.
Pour aller plus loin
Par défaut aucune notification n’est présente lors de l’utilisation de raccourcis claviers permettant de gérer le volume et la luminosité de l’écran.
Il existe de nombreux scripts ou paquets disponibles sur internet afin de mener à bien ces tâches, mais bien souvent je trouve qu’ils sont plutot lourds et englobent de nombreuses fonctionnalités qui ne me sont pas utiles et alourdissent le système.
Nous allons donc ici créer un script pour la gestion du son, et un pour la gestion de la luminisoté qui sont simples mais efficaces.
Commençons pas le son. Nous allons créer le fichier ~/.config/dunst/volume-notification.sh.
Puis nous allons ajouter le code suivant :
#!/bin/bash
# Path to icons, edit path if you want to change icons used
Volume_icon_medium="/snap/gtk-common-themes/1535/share/icons/elementary-xfce/notifications/48/audio-volume-medium.png"
Volume_icon_low="/snap/gtk-common-themes/1535/share/icons/elementary-xfce/notifications/48/audio-volume-low.png"
Volume_icon_high="/snap/gtk-common-themes/1535/share/icons/elementary-xfce/notifications/48/audio-volume-high.png"
AudioMute_icon="/usr/share/icons/custom/diminuer-le-volume.png"
MicMute_icon="/usr/share/icons/custom/muet.png"
icon="$Volume_icon_medium"
# Modify icon used, depends of the volume level
check_volume() {
local value=$(echo "$1" | tr -cd '0-9')
icon=""
if ((value < 40)); then
icon="$Volume_icon_low"
elif ((value >= 40 && value <= 70)); then
icon="$Volume_icon_medium"
else
icon="$Volume_icon_high"
fi
echo "$icon"
}
if [ "$1" == "Up" ]; then
#Increase audio level
pactl set-sink-volume @DEFAULT_SINK@ +10%
# Get the current volume level
volume=$(pactl list sinks | grep "Volume:" -m 1 | awk '{print $5}')
# Create the notification message
notification="Volume: $volume"
icon=$(check_volume "$volume")
elif [ "$1" == "Down" ]; then
#Decrease audio level
pactl set-sink-volume @DEFAULT_SINK@ -10%
# Get the current volume level
volume=$(pactl list sinks | grep "Volume:" -m 1 | awk '{print $5}')
# Create the notification message
notification="Volume: $volume"
icon=$(check_volume "$volume")
echo "$icon"
elif [ "$1" == "AudioMute" ]; then
# Mute / unmute audio
pactl set-sink-mute @DEFAULT_SINK@ toggle
mute=$(pactl list sinks | awk '/Mute/ { lastMatch=$2 } END { print lastMatch }')
if [ "$mute" == "yes" ]; then
notification="Volume is muted"
icon="$AudioMute_icon"
else
notification="Volume is active"
fi
elif [ "$1" == "MicMute" ]; then
# Mute / unmute mic
pactl set-source-mute @DEFAULT_SOURCE@ toggle
mute=$(pactl list sources | awk '/Mute/ { lastMatch=$2 } END { print lastMatch }')
if [ "$mute" == "yes" ]; then
notification="Mic is muted"
icon="$MicMute_icon"
else
notification="Micro is active"
fi
else
echo "Invalid argument. Usage: $0 [Up|Down|MicMute|AudioMute]"
exit 1
fi
# Send the notification to Dunst
dunstify -t 2000 -r 9910 -u normal "$notification" -i "$icon"
Ce script est assez simple et permet de récupérer les valeurs correspondant au niveau du volume ou du micro, puis simplement d’envoyer une notification avec dunst qui nous avons configuré précedement.
Vous allez surement devoir modifier un peu le script si vous souhaitez que cela fonctionne :
-
Modifiez ou controllez les variable au début du fichier qui contiennet les chemins vers les différentes icones à afficher dans les notifications. Si les chemin n’existent pas sur votre machine attribuez les chemins appropriés.
-
Controllez que
pactlest bien installé sur votre machine -
pactlpermet d’intéragir avec le serveur de son PulseAudio, en fonction de la configuration de vos carte de son, il est possible que les regex permettant de récupérer le niveau du son / micro ne soient pas adapté à la configuration de votre PC. Testez dans un terminal que les commandespactlretournent bien les bon résultats et modifiez les regex si nécessaire.
Une fois que vous observez que le script fonctionne bien, localiser dans le fichier de configuration i3 les lignes débutant par bindsym XF86AudioRaiseVolume, et remplacez les par les lignes suivantes :
# Use pactl to adjust volume in PulseAudio.
set $refresh_i3status killall -SIGUSR1 i3status
bindsym XF86AudioRaiseVolume exec --no-startup-id ~/.config/dunst/volume-notification.sh Up && $refresh_i3status
bindsym XF86AudioLowerVolume exec --no-startup-id ~/.config/dunst/volume-notification.sh Down && $refresh_i3status
bindsym XF86AudioMute exec --no-startup-id ~/.config/dunst/volume-notification.sh AudioMute && $refresh_i3status
bindsym XF86AudioMicMute exec --no-startup-id ~/.config/dunst/volume-notification.sh MicMute && $refresh_i3status
Après avoir redémaré i3 la gestion des notifications pour le son devrait fonctionner parfaitement.

Ceci n’est qu’un example, le script est simple et pourrait être optimisé, vous pouvez dès lors le modifier à votre gré.
Occupons nous ensuite de la luminosité, ici ni notification, ni raccourci n’est de base présent dans la configuration i3 pour gérer cela.
Nous allons utiliser l’utilaire brightnessctl. Si il n’est pas présent sur le système, vous pouvez l’installer avec votre gestionnaire de paquet préféré.
Par défaut, des droits root sont nécesssaires pour executer ce programme, pour ajouter ces droits à l’utilsiateur courant voici les commandes à exécuter :
ls /sys/class/backlight/
sudo chown $USER:$USER /sys/class/backlight/<device_name>/brightness
Sur certians système les droits sur ce programme sont restaurés à l’état par défaut après le redémarrage du système, si c’est le cas il faudra créer un service qui executera la ligne ci-dessus au démarrage de la session de l’utilisateur
Vous pouvez ensuite tester que cela fonctionne avec la commande suivante :
brightnessctl set 10-
Si cela fonctionne, nous alons ensuite pouvoir passer à la création de notre script :
#!/bin/bash
# Path to icons, edit path if you want to change icons used
Brightness_icon_medium="/snap/gtk-common-themes/1535/share/icons/elementary-xfce/notifications/48/notification-display-brightness-medium.png"
Brightness_icon_low="/snap/gtk-common-themes/1535/share/icons/elementary-xfce/notifications/48/notification-display-brightness-low.png"
Brightness_icon_high="/snap/gtk-common-themes/1535/share/icons/elementary-xfce/notifications/48/notification-display-brightness-high.png"
icon="$Brightness_icon_medium"
# Modify icon used, depends of the brightness level
check_brightness() {
local value=$(echo "$1" | tr -cd '0-9')
icon=""
if ((value < 40)); then
icon="$Brightness_icon_low"
elif ((value >= 40 && value <= 70)); then
icon="$Brightness_icon_medium"
else
icon="$Brightness_icon_high"
fi
echo "$icon"
}
if [ "$1" == "Up" ]; then
#Increase brightness level
brightnessctl set +10
elif [ "$1" == "Down" ]; then
#Decrease brighness level
brightnessctl set 10-
else
echo "Invalid argument. Usage: $0 [Up|Down]"
exit 1
fi
# Get the current brightness level
brightness=$(brightnessctl i | grep "Current brightness:" -m 1 | awk -F '[(%]' '{print $2}')
icon=$(check_brightness "$brightness")
notification="Brightness: $brightness"
# Send the notification to Dunst
dunstify -t 2000 -r 9910 -u normal "$notification" -i "$icon"
Le script est très similaire à celui utilisé pour la gestion du volume.
N’oubliez pas de rendre executable le fichier :
chmod +x ~/.config/dunst/brightness-notification.sh
Il ne nous reste plus qu’à modifer le fichier de config i3 en ajoutant les lignes suivantes :
# Manage brightness
bindsym XF86MonBrightnessUp exec --no-startup-id ~/.config/dunst/brightness-notification.sh Up
bindsym XF86MonBrightnessDown exec --no-startup-id ~/.config/dunst/brightness-notification.sh Down

Les workspaces
Lors que nous naviguons entre nos différents workspaces mod + $<1-9> nous n’avons que des numéros qui apparaissents dans notre bar de navigation.
Il est possible de remplacer ces numéro par des icones plus esthétiques.
Si vous avez installé font awesome sur votre machine, vous pouvez utiliser le format unicode pour utiliser des icones, pour cela modifiez les lignes suivantes dans votre fichier i3 et remplacer cela :
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"
Par cela :
![]()
Pour ajouter une icone vous pouvez simpelement ouvrir le fichier i3 avec votre éditeur de text préféré (ça fonctionne plutot bien avec gedit), allez sur https://fontawesome.com/search pour trouver des icones adapté à ce que vous souhaitez, puis copier coller les icones depuis le site dans votre fichier de configuration :
![]()
Si vous rechargez votre configuration et que vous fermez vos workspaces, puis que vous les réouvrez, vos icones devraient apparaitre (ici je n’ai pas fermé et réouvert tout mes worspaces donc certaines icones ne sont pas à jour):
![]()
Ensuite, nous pouvons aussi attribuer certains programmes à des workspaces spécifiques. Par exemple si vous souhaitez que votre navigateur web soit par défaut lié au workspace 2, vous pouvez éditez le fichier de configuration i3 et ajouter la ligne suivante :
#assign [class=""] $ws1
assign [class="Mozilla Firefox"] $ws2
Veillez à bien noter le nom du programme dans la variable class sans erreur pour que cela fonctionne. Vous pouvez ajouter autant de lignes que vous le souhaitez les unes à la suites des autres, par exemple voici ma configuration :
#assign [class=""] $ws1
assign [class="firefox"] $ws2
assign [class="Google-chrome"] $ws2
assign [class="Gedit"] $ws3
assign [class="Marktext"] $ws3
assign [class="Cherrytree"] $ws3
assign [class="Sublime_text"] $ws3
assign [class="Shutter"] $ws4
assign [class="Org.gnome.Nautilus"] $ws5
assign [class="thunar"] $ws5
assign [class="Microsoft Teams - Preview"] $ws6
assign [class="keepassx"] $ws7
assign [class="VirtualBox Manager"] $ws8
#assign [class=""] $ws9
assign [class="Spotify"] $ws10
Nous avons ici couvert les parties les plus importantes pour débuter sur i3, n’hésitez pas à bien parcourir le fichier de configuration i3 afin de vous approprier les raccourcis, et d’ajouter / modifier vos propres raccourcis.
[ Bonus ] Terminal
Enfin, afin de terminer la configuration i3 et mon environnement de travail, voici en bonus le terminal que j’utilise dans mon environnement i3 ainsi que sa configuration :
- Terminal : alacritty
Si vous ne l’avez pas déjà installé :
sudo add-apt-repository ppa:aslatter/ppa -y
sudo apt install alacritty
Ensuite on modifie dans le fichier i3 le raccourci d’ouverture d’un terminal :
# start a terminal
bindsym $mod+Return exec alacritty
Puis, afin de modifier de gérer notre configuration ZSH nous utilisons le framework Oh-my-zsh.
Tout d’abord, il faut installer zsh si ce n’est pas déjà fait :
sudo apt install zsh -y
Puis installer oh-my-zsh :
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
La customization de oh-my-zsh se fait dans le fichier ~/.zshrc, voici les modication que j’ai fait dans ma configuration :
- Activer l’auto correction en décomentant la ligne :
# Uncomment the following line to enable command auto-correction.
# ENABLE_CORRECTION="true"
- Ajouter des plugins en modifiant la ligne suivante :
# Add wisely, as too many plugins slow down shell startup.
plugins=(git)
par :
plugins=(git encode64 command-not-found zsh-syntax-highlighting zsh-autosuggestions copyfile)
Je vous invite à vous reseigner sur le fonctionnement des différents plugins avant les ajouter : https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins
En parallèle vous devez installer les plugins zsh-syntax-highlighting zsh-autosuggestions comme suit :
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
Si vous ouvrez un nouveau terminal, cela devrait fonctionner.
Ensuite nous allons utiliser le thème powerlevel10k qui permet de personnaliser son terminal de manière interactive parmi un grand nombre d’options.
Pour l’installation :
git clone --depth=1 https://gitee.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
Puis remplacez la ligne suivante dans le fichier .zshrc :
ZSH_THEME="robbyrussell"
par :
ZSH_THEME="powerlevel10k/powerlevel10k"
Lors de l’ouverture d’un nouveau terminal, un menu interactif vous permettra alors de configurer votre terminal en fonction de vos préférences.
Une fois la configuration terminée, voici à quoi ressemble mon terminal :

Pour aller plus loin
Si nous souhaitons ajouter de la transparence à notre terminal, nous allons devoir utiliser le compositeur Picom : GitHub - yshui/picom: A lightweight compositor for X11
sudo apt install picom
Puis ajouter la ligne suivante dans notre fichier de configuration i3 :
exec picom --experimental-backends --backend glx
Ensuite si vous n’avez pas déjà crée de fichier de configuration pour alacritty, créer et ajouter les lignes suivantes dans le fichier ~/.config/alacritty/alacritty.toml :
[window]
#edit this value if you wnat to change the opacity
opacity = 0.9
decorations = "full"
Enfin, rédémarrez i3, et alacrity, vous obtenez alors un terminal avec de la transparence.

En parcourant divers forums, je suis tombé sur un script putôt utile que j’ai intégré dans ma configuration : Siddharth Saha | Tutorial: Key-binding to toggle Alacritty background opacity
Ce dernier permet d’aciver ou de désactiver l’opacité du terminal avec un raccourci ajouté dans i3. Je trouve ça très utile. Cependant l’article se base sur un ancien format de fichier déprécié pour la configuration de Alacritty (.yml au lieu de .toml)
Voici une version modifié :
- fichier
~/.local/bin/toggle_alacritty_opacity:
#!/usr/bin/env bash
## If alacritty.yml does not exist, raise an alert
[[ ! -f ~/.config/alacritty/alacritty.yml ]] && \
notify-send "alacritty.yml does not exist" && exit 0
## Fetch background_opacity from alacritty.yml
opacity=$(awk '$1 == "opacity" {print $3; exit}' \
~/.config/alacritty/alacritty.toml)
echo $opacity
## Assign toggle opacity value
case $opacity in
1)
toggle_opacity=0.9
;;
*)
toggle_opacity=1
;;
esac
## Replace opacity value in alacritty.yml
sed -i -- "s/opacity = $opacity/opacity = $toggle_opacity/" \
~/.config/alacritty/alacritty.toml
- fichier config i3 ajouter la raccourci :
# Toggling alacritty opacity in i3
bindsym $mod+Shift+b exec --no-startup-id ~/.local/bin/toggle_alacritty_opacity
Une fois i3 redémarré, cela devrait fonctionner, en alternant le raccourci $mod+Shift+b votre terminal devrait être transparent ou opaque.
Enfin pour terminer la configuration du terminal , nous pouvons de manière optionelle rajouter la commande neofetch à la fin du fichier .zshrc permettant à chaque ouverture d’un terminal d’afficher une bannière d’information.
#print neofetch banner
neofetch

Et voilà ! Il resterait encore beaucoup à dire sur le sujet, mais avec ces explications vous devriez partir sur de bonnes bases.
Vous pouvez retrouver l’ensemble de la configuration i3 ici : GitHub - Cr3upsy/I3-config