i3

Débuter sur i3.

Sommaire

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 :

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
}

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

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>/*
#font pango:<police>
font pango:System San Francisco Display 13

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-color 

Permet d’attribuer la couleur #102542 aux 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
       }
}

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 :

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 :

Important :

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 :

Dunst - ArchWiki

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 :

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 :

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 :

# Uncomment the following line to enable command auto-correction.
# ENABLE_CORRECTION="true"
# 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é :

#!/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
# 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