# =============================================================================
# ~/.config/sway/config — Configuration Sway (Wayland)
# =============================================================================
# Sway est un gestionnaire de fenêtres en tuiles pour Wayland, compatible
# avec la syntaxe de configuration de i3.
#
# Documentation officielle : https://man.archlinux.org/man/sway.5
# Pour recharger la configuration sans redémarrer : Super + Maj + C
# Pour quitter Sway : Super + Maj + E
# =============================================================================


# =============================================================================
# 1. TOUCHE MODIFICATEUR (Super / Meta)
# =============================================================================
# $mod est la touche principale utilisée pour tous les raccourcis.
# Mod4 = touche Super (touche Windows / Commande)
# Mod1 = touche Alt (alternative si Super est indisponible)

set $mod Mod4


# =============================================================================
# 2. CLAVIER — DISPOSITION AZERTY FRANÇAISE
# =============================================================================
# Configurez ici votre clavier. Tous les paramètres sont optionnels.
#
# Options courantes pour `xkb_options` :
#   caps:escape         → Caps Lock fonctionne comme Échap
#   caps:ctrl_modifier  → Caps Lock fonctionne comme Ctrl
#   compose:ralt        → Alt droit = touche Compose (accents)
#   grp:alt_shift_toggle → Alt+Maj pour changer de disposition
#
# Délai et répétition (repeat_delay / repeat_rate) :
#   repeat_delay : temps en ms avant que la répétition commence (défaut : 600)
#   repeat_rate  : frappes par seconde en répétition (défaut : 25)

input "type:keyboard" {
    xkb_layout  fr
    xkb_variant azerty
    xkb_options caps:escape
    repeat_delay 300
    repeat_rate  40
}

# --- Claviers spécifiques (optionnel) ---
# Si vous avez plusieurs claviers et voulez des réglages différents,
# trouvez l'identifiant avec : swaymsg -t get_inputs
# Exemple :
# input "1:1:AT_Translated_Set_2_keyboard" {
#     xkb_layout fr
# }


# =============================================================================
# 3. SOURIS ET PAVÉ TACTILE
# =============================================================================
# Trouvez les identifiants de vos périphériques avec : swaymsg -t get_inputs

input "type:touchpad" {
    # Activer/désactiver le clic en tapant sur le pavé
    tap enabled
    # Désactiver le pavé tactile pendant la frappe
    dwt enabled
    # Défilement naturel (comme sur macOS) : disabled | enabled
    natural_scroll disabled
    # Accélération du pointeur : valeur entre -1.0 (lent) et 1.0 (rapide)
    pointer_accel 0.2
    # Mode d'accélération : adaptive | flat
    accel_profile adaptive
}

input "type:pointer" {
    # Désactiver l'accélération pour une souris (utile en jeu)
    # accel_profile flat
    pointer_accel 0.0
}


# =============================================================================
# 4. MONITEURS / ÉCRANS
# =============================================================================
# Configurez vos moniteurs ici.
# Listez les sorties disponibles avec : swaymsg -t get_outputs
#
# Syntaxe : output <NOM> <PARAMÈTRE> <VALEUR>
#
# Résolutions courantes : 1920x1080, 2560x1440, 3840x2160
# Fréquences courantes  : 60Hz, 75Hz, 144Hz, 165Hz
# Position (multi-écran): pos 0 0 (principal), pos 1920 0 (à droite), etc.
# Rotation              : transform normal | 90 | 180 | 270
# Mise à l'échelle HiDPI: scale 1.5 (pour les écrans 4K par exemple)

# Écran principal (adaptez le nom à votre matériel)
output * bg #1e1e2e solid_color

# Exemples de configurations d'écrans (décommentez et adaptez) :
#
# output HDMI-A-1 {
#     resolution 1920x1080
#     refresh    60
#     pos        0 0
#     transform  normal
#     scale      1
# }
#
# output DP-1 {
#     resolution 2560x1440
#     refresh    144
#     pos        1920 0
# }
#
# Désactiver un écran :
# output eDP-1 disable


# =============================================================================
# 5. POLICE D'AFFICHAGE
# =============================================================================
# Police utilisée pour les titres de fenêtres et la barre swaybar.
# Formats : pango:<Nom> <taille>
# Exemples : pango:monospace 10 | pango:Noto Sans 11 | pango:JetBrains Mono 10

font pango:monospace 10


# =============================================================================
# 6. APPARENCE DES FENÊTRES
# =============================================================================

# Épaisseur de la bordure des fenêtres (en pixels). 0 = sans bordure.
default_border pixel 2

# Taille des espaces entre les fenêtres en tuiles (gaps)
# inner = espace entre les fenêtres
# outer = espace entre les fenêtres et le bord de l'écran
gaps inner 6
gaps outer 4

# Masquer les bordures quand une seule fenêtre est visible
# none | smart | smart_no_gaps
smart_borders smart_no_gaps

# Couleurs des bordures
# Format : client.<état> <bordure> <fond> <texte> <indicateur> <bordure_enfant>
#
# États :
#   focused         → fenêtre active
#   unfocused       → fenêtre inactive
#   focused_inactive → fenêtre inactive d'un conteneur actif
#   urgent          → fenêtre avec une alerte

set $bleu    #89b4fa
set $surface #313244
set $fond    #1e1e2e
set $texte   #cdd6f4
set $urgence #f38ba8

client.focused          $bleu    $surface $texte   $bleu    $bleu
client.unfocused        $fond    $fond    $texte   $fond    $fond
client.focused_inactive $surface $surface $texte   $surface $surface
client.urgent           $urgence $urgence $texte   $urgence $urgence


# =============================================================================
# 7. APPLICATIONS PAR DÉFAUT
# =============================================================================
# Définissez ici vos applications favorites.
# Ces variables sont utilisées dans les raccourcis clavier ci-dessous.
#
# Terminal    : foot (léger, natif Wayland) | alacritty | kitty | wezterm
# Navigateur  : firefox | chromium | brave-browser | librewolf
# Explorateur : thunar | nautilus | nemo | dolphin
# Éditeur     : code | gedit | mousepad | kate
# Lanceur     : wofi --show drun | rofi -show drun (via XWayland)
# Messagerie  : telegram-desktop | signal-desktop | discord
# Mail        : thunderbird | evolution
# Musique     : spotify | rhythmbox | lollypop

set $terminal    foot
set $browser     firefox
set $displaymgr  nwg-displays
set $files       nemo
set $editor      idea
set $launcher    wofi --show drun --allow-markup --insensitive
set $screenshot  grim -g "$(slurp)" - | wl-copy
set $screenclip  grim ~/Images/capture-$(date +%Y%m%d-%H%M%S).png


# =============================================================================
# 8. RACCOURCIS CLAVIER — APPLICATIONS DIRECTES
# =============================================================================
# Principe : une touche = une application. Pas de cycling, pas de Alt+Tab.
# Chaque raccourci lance l'application ou y retourne si elle est déjà ouverte.
#
# Syntaxe : bindsym $mod+<touche> exec <commande>
#
# Sur AZERTY, les touches disponibles facilement avec Super :
#   Lettres  : a z e r t y u i o p q s d f g h j k l m w x c v b n
#   Chiffres : 1 2 3 4 5 6 7 8 9 0 (pour les espaces de travail)
#   Autres   : Return (Entrée), space (Espace), Tab, F1-F12
#
# Astuce : utilisez `xev` ou `wev` pour identifier le nom d'une touche

# --- Lanceur et terminal ---
bindsym $mod+Return      exec $terminal
bindsym $mod+space       exec $launcher

# --- Applications courantes (modifiez selon vos besoins) ---
bindsym $mod+b           exec $browser
bindsym $mod+e           exec $files
bindsym $mod+c           exec $editor
bindsym $mod+p           exec $displaymgr

# --- Capture d'écran ---
# Super + Impr       → capture d'une zone sélectionnée (copie dans le presse-papier)
# Super + Maj + Impr → capture de tout l'écran (sauvegarde dans ~/Images)
bindsym $mod+Print       exec $screenshot
bindsym $mod+Shift+Print exec $screenclip

# --- Applications supplémentaires (décommentez et adaptez) ---
# bindsym $mod+m           exec thunderbird
# bindsym $mod+s           exec spotify
# bindsym $mod+t           exec telegram-desktop
# bindsym $mod+n           exec $terminal -e nvim
# bindsym $mod+p           exec pavucontrol


# =============================================================================
# 9. RACCOURCIS CLAVIER — GESTION DES FENÊTRES
# =============================================================================

# --- Fermer la fenêtre active ---
bindsym $mod+q kill

# --- Recharger la configuration sans redémarrer ---
bindsym $mod+Shift+c reload

# --- Quitter Sway (déconnexion) ---
bindsym $mod+Shift+e exec swaynag \
    -t warning \
    -m 'Voulez-vous vraiment quitter Sway ?' \
    -b 'Oui, quitter' 'swaymsg exit'

# --- Déplacer le focus entre les fenêtres ---
# Avec les flèches directionnelles
bindsym $mod+Left        focus left
bindsym $mod+Down        focus down
bindsym $mod+Up          focus up
bindsym $mod+Right       focus right

# Avec les touches hjkl (style Vim) — optionnel
bindsym $mod+h           focus left
bindsym $mod+j           focus down
bindsym $mod+k           focus up
bindsym $mod+l           focus right

# --- Déplacer les fenêtres ---
bindsym $mod+Shift+Left  move left
bindsym $mod+Shift+Down  move down
bindsym $mod+Shift+Up    move up
bindsym $mod+Shift+Right move right

# --- Changer le mode de découpe (split) ---
# Horizontal : les nouvelles fenêtres s'ouvrent à droite
bindsym $mod+Shift+h     split h
# Vertical   : les nouvelles fenêtres s'ouvrent en bas
bindsym $mod+Shift+v     split v
# Alterner automatiquement selon la dimension du conteneur
bindsym $mod+Shift+t     split toggle

# --- Changer la disposition du conteneur actif ---
# stacking  : fenêtres empilées avec onglets en haut
# tabbed    : fenêtres en onglets
# toggle split : alterner horizontal/vertical
bindsym $mod+s           layout stacking
bindsym $mod+w           layout tabbed
bindsym $mod+z           layout toggle split

# --- Fenêtre en plein écran ---
bindsym $mod+f           fullscreen toggle

# --- Mode flottant ---
# Basculer la fenêtre active entre tuile et flottante
bindsym $mod+Shift+f     floating toggle
# Garder le focus sur les fenêtres tuiles même quand une flottante est présente
focus_follows_mouse no
# Passer le focus sur tuiles / flottantes
bindsym $mod+Shift+space focus mode_toggle

# Déplacer une fenêtre flottante avec Super + clic gauche
# Redimensionner une fenêtre flottante avec Super + clic droit
floating_modifier $mod normal


# =============================================================================
# 10. ESPACES DE TRAVAIL (BUREAUX VIRTUELS)
# =============================================================================
# Les espaces de travail permettent d'organiser vos fenêtres par thème.
# Exemple d'organisation :
#   1 → Terminal     2 → Navigateur     3 → Éditeur
#   4 → Messagerie   5 → Musique        6 → Fichiers

# Noms des espaces de travail (modifiez selon vos préférences)
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"

# --- Aller à un espace de travail ---
# Note AZERTY : les chiffres sont accessibles directement (pas besoin de Maj)
bindsym $mod+ampersand   workspace $ws1
bindsym $mod+eacute      workspace $ws2
bindsym $mod+quotedbl    workspace $ws3
bindsym $mod+apostrophe  workspace $ws4
bindsym $mod+parenleft   workspace $ws5
bindsym $mod+minus       workspace $ws6
bindsym $mod+egrave      workspace $ws7
bindsym $mod+underscore  workspace $ws8
bindsym $mod+ccedilla    workspace $ws9
bindsym $mod+agrave      workspace $ws10

# Variante avec les touches numériques directes (si les touches ci-dessus
# ne fonctionnent pas selon votre configuration) :
# bindsym $mod+1 workspace $ws1
# ...
# bindsym $mod+0 workspace $ws10

# --- Déplacer la fenêtre active vers un espace de travail ---
bindsym $mod+Shift+ampersand  move container to workspace $ws1
bindsym $mod+Shift+eacute     move container to workspace $ws2
bindsym $mod+Shift+quotedbl   move container to workspace $ws3
bindsym $mod+Shift+apostrophe move container to workspace $ws4
bindsym $mod+Shift+parenleft  move container to workspace $ws5
bindsym $mod+Shift+minus      move container to workspace $ws6
bindsym $mod+Shift+egrave     move container to workspace $ws7
bindsym $mod+Shift+underscore move container to workspace $ws8
bindsym $mod+Shift+ccedilla   move container to workspace $ws9
bindsym $mod+Shift+agrave     move container to workspace $ws10

# --- Navigation entre espaces de travail ---
# Aller à l'espace de travail précédent/suivant
bindsym $mod+Tab         workspace next
bindsym $mod+Shift+Tab   workspace prev

# Revenir à l'espace de travail précédemment actif
bindsym $mod+BackSpace   workspace back_and_forth

# --- Affecter des applications à des espaces de travail ---
# Trouvez le nom de classe avec : swaymsg -t get_tree | grep app_id
# Pour les apps XWayland, cherchez "class" au lieu de "app_id"
#
# assign [app_id="firefox"]          $ws2
# assign [app_id="org.gnome.Nautilus"] $ws6
# assign [class="code-oss"]          $ws3
# assign [app_id="thunderbird"]      $ws4
# assign [app_id="spotify"]          $ws5


# =============================================================================
# 11. MODE REDIMENSIONNEMENT
# =============================================================================
# Appuyez sur Super+R pour entrer en mode redimensionnement.
# Utilisez les flèches pour redimensionner, Échap ou Entrée pour sortir.

mode "resize" {
    bindsym Left  resize shrink width  40px
    bindsym Down  resize grow   height 40px
    bindsym Up    resize shrink height 40px
    bindsym Right resize grow   width  40px

    # Sorties du mode redimensionnement
    bindsym Return mode "default"
    bindsym Escape mode "default"
    bindsym $mod+r mode "default"
}

bindsym $mod+r mode "resize"


# =============================================================================
# 12. TOUCHES MULTIMÉDIA ET SYSTÈME
# =============================================================================

# --- Volume (PulseAudio / PipeWire) ---
bindsym XF86AudioRaiseVolume  exec pactl set-sink-volume @DEFAULT_SINK@ +5%
bindsym XF86AudioLowerVolume  exec pactl set-sink-volume @DEFAULT_SINK@ -5%
bindsym XF86AudioMute         exec pactl set-sink-mute   @DEFAULT_SINK@ toggle
bindsym XF86AudioMicMute      exec pactl set-source-mute @DEFAULT_SOURCE@ toggle

# --- Luminosité (nécessite brightnessctl) ---
bindsym XF86MonBrightnessUp   exec brightnessctl set +10%
bindsym XF86MonBrightnessDown exec brightnessctl set 10%-

# --- Contrôle multimédia (nécessite playerctl) ---
bindsym XF86AudioPlay  exec playerctl play-pause
bindsym XF86AudioNext  exec playerctl next
bindsym XF86AudioPrev  exec playerctl previous
bindsym XF86AudioStop  exec playerctl stop


# =============================================================================
# 13. VERROUILLAGE ET MISE EN VEILLE
# =============================================================================

# Verrouiller l'écran manuellement
bindsym Mod1+l exec swaylock --color 1e1e2e --inside-color 313244 \
    --ring-color 89b4fa --key-hl-color cdd6f4 --line-color 00000000 \
    --separator-color 00000000 --fade-in 0.2

# Mise en veille automatique avec swayidle :
#   - après 5 min sans activité → verrouillage
#   - après 10 min              → extinction de l'écran
#   - au retour                 → rallumage de l'écran
exec swayidle -w \
    timeout 300  'swaylock --color 1e1e2e' \
    timeout 600  'swaymsg "output * dpms off"' \
    resume       'swaymsg "output * dpms on"' \
    before-sleep 'swaylock --color 1e1e2e'


# =============================================================================
# 14. RÈGLES DE FENÊTRES (COMPORTEMENTS SPÉCIFIQUES)
# =============================================================================
# Vous pouvez forcer certaines fenêtres à être flottantes, à s'ouvrir
# sur un espace de travail particulier, ou à ne pas avoir de bordure.
#
# Trouvez app_id avec    : swaymsg -t get_tree | grep app_id
# Trouvez class avec     : swaymsg -t get_tree | grep '"class"'
# (class = apps XWayland comme certaines apps Electron)
#
# Paramètres disponibles :
#   floating enable/disable
#   border normal <taille> | pixel <taille> | none
#   move to workspace <nom>
#   inhibit_idle focus | visible | open | none

# Fenêtres flottantes par défaut (boîtes de dialogue, utilitaires)
for_window [window_role="dialog"]        floating enable
for_window [window_role="bubble"]        floating enable
for_window [window_role="pop-up"]        floating enable
for_window [window_type="dialog"]        floating enable
for_window [window_type="menu"]          floating enable
for_window [app_id="pavucontrol"]        floating enable, resize set 700 450
for_window [app_id="nm-connection-editor"] floating enable

# Exemples supplémentaires (décommentez selon vos besoins) :
# for_window [app_id="firefox" title="Téléchargements"]  floating enable
# for_window [app_id="mpv"]                              floating enable, border none
# for_window [class="Steam" title="Friends List"]        floating enable


# =============================================================================
# 15. BARRE D'ÉTAT
# =============================================================================
# Deux options :
#   A) swaybar (intégré, simple, recommandé pour débuter)
#   B) waybar  (externe, très personnalisable — voir ~/.config/waybar/)
#
# Pour utiliser waybar, commentez le bloc "bar { ... }" ci-dessous
# et décommentez la ligne "exec waybar".

# --- Option A : swaybar intégré ---
# bar {
#     # Position : top | bottom
#     position top
# 
#     # Commande de statut (status_command)
#     # swaybar-status : basique | i3status : plus d'infos | i3blocks : scripts
#     status_command while date +'%a %d %b  %H:%M:%S'; do sleep 1; done
# 
#     colors {
#         # Fond et texte de la barre
#         background #1e1e2e
#         statusline #cdd6f4
#         separator  #45475a
# 
#         # Couleurs des espaces de travail
#         # format : <bordure> <fond> <texte>
#         focused_workspace  #89b4fa #313244 #cdd6f4
#         active_workspace   #313244 #313244 #cdd6f4
#         inactive_workspace #1e1e2e #1e1e2e #585b70
#         urgent_workspace   #f38ba8 #f38ba8 #1e1e2e
#     }
# }

# --- Option B : waybar (décommentez pour activer) ---
exec_always pkill waybar; waybar


# =============================================================================
# 16. DÉMARRAGE AUTOMATIQUE DES APPLICATIONS
# =============================================================================
# `exec`        : lancé une seule fois au démarrage de Sway
# `exec_always` : lancé aussi à chaque rechargement de la configuration

exec dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=sway
exec systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP

# config écrans 
exec_always pkill kanshi; kanshi
# sync cloud boulot 
exec nextcloud
# Notifications
exec mako

# Gestionnaire d'authentification (nécessaire pour certaines apps graphiques)
exec /usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1
exec gnome-keyring-daemon --start --components=secrets,ssh,pkcs11

# Gestionnaire de réseau (barre système)
exec nm-applet --indicator

# Presse-papier persistant (optionnel — nécessite wl-paste)
exec wl-paste --watch cliphist store

# Démarrer des apps au lancement (décommentez selon vos besoins) :
exec firefox
exec mattermost-desktop


# =============================================================================
# FIN DE LA CONFIGURATION
# =============================================================================
# Pour tester les changements : Super + Maj + C  (recharge la config)
# Manuel complet              : man 5 sway
# Dépôt officiel              : https://github.com/swaywm/sway
