Compare commits

..

32 commits

Author SHA1 Message Date
grayTerminal-sh
7ed3f78c41 README.md 2026-07-26 23:40:30 +02:00
grayTerminal-sh
41a6c5df2e update 2026-07-26 23:34:14 +02:00
grayTerminal-sh
960faa2d60 update 2026-07-26 21:11:35 +02:00
grayTerminal-sh
890fe92bab update 2026-06-10 10:26:17 +02:00
grayTerminal-sh
c993c233fd modification autostart sway 2026-06-10 10:20:41 +02:00
grayTerminal-sh
4be37d6118 README.md 2026-06-06 08:56:02 +02:00
grayTerminal-sh
7c7093b9cd README.md 2026-06-06 08:50:52 +02:00
grayTerminal-sh
fad850b76d README.md 2026-06-06 08:47:54 +02:00
grayTerminal-sh
ed3b8cddf3 README.md 2026-06-06 08:44:55 +02:00
grayTerminal-sh
de1a669d79 screenshot README.md 2026-06-06 08:39:06 +02:00
grayTerminal-sh
2e85cf8d43 README.md 2026-06-06 08:29:42 +02:00
grayTerminal-sh
f5918e4151 README.md 2026-06-06 08:26:42 +02:00
grayTerminal-sh
c83c2201ec README.md 2026-06-06 08:23:05 +02:00
grayTerminal-sh
edd90f8003 README.md 2026-06-06 07:59:52 +02:00
grayTerminal-sh
a7b1b877eb README.md 2026-06-06 07:58:11 +02:00
grayTerminal-sh
6d843133e7 README.md 2026-06-06 07:54:09 +02:00
grayTerminal-sh
5cdda1e86c ajout .local/bin/batlimit 2026-06-05 13:01:27 +02:00
grayTerminal-sh
109ca4f677 update 2026-06-05 11:09:04 +02:00
grayTerminal-sh
e56585414d update 2026-06-05 10:03:55 +02:00
grayTerminal-sh
0542d1b08a Remove runtime data from repository 2026-06-05 09:43:42 +02:00
grayTerminal-sh
49683dd970 update 2026-06-05 09:39:39 +02:00
grayTerminal-sh
fc76a6278f update 2026-06-05 09:38:56 +02:00
grayTerminal-sh
f85dea2ede update hyprwisper and atuin 2026-06-05 09:37:01 +02:00
grayTerminal-sh
50cdf05a7d plugin heic yazi 2026-06-03 14:15:15 +02:00
grayTerminal-sh
95ce9f00f1 update 2026-05-30 22:24:26 +02:00
grayTerminal-sh
79f56f47f2 general 2026-05-30 09:35:14 +02:00
grayTerminal-sh
4bdcc16092 ajout atuin 2026-05-26 10:50:52 +02:00
grayTerminal-sh
c5bef5dcd0 config nvim + modif config mangowm 2026-05-24 00:48:17 +02:00
grayTerminal-sh
f2b0849175 rules mango 2026-05-21 18:01:45 +02:00
grayTerminal-sh
7ab1abfb21 README.md 2026-05-20 23:45:36 +02:00
grayTerminal-sh
62ee5c6e85 README.md 2026-05-20 23:43:21 +02:00
grayTerminal-sh
e4e7c447cd ajout whisper + modif binds MangoWM 2026-05-20 23:13:15 +02:00
115 changed files with 3122 additions and 2187 deletions

View file

@ -1,16 +1,16 @@
NetworkManager-dispatcher.service
NetworkManager-wait-online.service
NetworkManager.service
avahi-daemon.service avahi-daemon.service
blueman-mechanism.service
bluetooth.service bluetooth.service
cups.service cups.service
getty@.service getty@.service
greetd.service greetd.service
grub-btrfsd.service
libvirtd.service
NetworkManager-dispatcher.service
NetworkManager-wait-online.service
NetworkManager.service
nftables.service nftables.service
nginx.service power-profiles-daemon.service
sshd.service seatd.service
systemd-oomd.service
systemd-resolved.service
systemd-timesyncd.service systemd-timesyncd.service
tlp-pd.service
tlp.service
wg-quick@wg0.service

View file

@ -1,7 +0,0 @@
avahi-daemon.socket
cups.path
cups.socket
fstrim.timer
snapper-cleanup.timer
snapper-timeline.timer
systemd-userdbd.socket

View file

@ -1,6 +0,0 @@
arch-sentinel-sample.timer
battery-low-notify.timer
gnome-keyring-daemon.socket
p11-kit-server.socket
pipewire-pulse.socket
pipewire.socket

View file

@ -1,42 +0,0 @@
# Outils hors Pacman
Cet inventaire décrit les dépendances observées le 25 septembre 2026 qui ne
sont pas restaurées par `pkglist-pacman.txt` ou `pkglist-aur.txt`.
## Cargo
- `ytmusic-tui 0.2.1` (`cargo install ytmusic-tui`)
## npm utilisateur
Le préfixe actif est `~/.local/npm` et `.zshrc` l'ajoute à `PATH`.
- `@earendil-works/pi-coding-agent@0.84.3`
- `context-mode@1.0.169`
- `prettier@3.9.6`
## Builds et projets locaux
Ces éléments sont volontairement hors du dépôt de dotfiles. Les liens ou
unités du dépôt supposent leur présence à ces emplacements :
- `~/.local/src/arch-sentinel` fournit `~/.local/bin/arch-sentinel` ;
- `~/Documents/trainlog` fournit les exécutables et agents Trainlog ;
- `~/Documents/Lardon` fournit la session FreeCAD et ses outils ;
- `~/Documents/labfy-remote-ui` fournit `labfy-remote-ui` ;
- `~/Applications/openmvs-2.4.0` fournit OpenMVS au pipeline `scan3d` ;
- `~/.codex/packages/standalone/current` fournit le lien utilisateur `codex`.
## Helpers système locaux
Ces fichiers sous `/usr/local` ne sont possédés par aucun paquet. Ils relèvent
de la couche système `arch-system`, pas de ce dépôt utilisateur :
- `/usr/local/sbin/batlimit-set` ;
- `/usr/local/sbin/vmware-stack`.
## Problème système connu
`wg-quick@wg0.service` est activé mais échoue au démarrage car `resolvconf`
signale une divergence de signature pour `/etc/resolv.conf`. La correction
appartient à `arch-system` et n'est pas appliquée ici.

View file

@ -1,6 +1,18 @@
[terminal] [terminal]
# The VT to run the greeter on. Can be "next", "current" or a number
# designating the VT.
vt = 1 vt = 1
# The default session, also known as the greeter.
[default_session] [default_session]
command = "tuigreet --remember --asterisks --time --greeting 'Welcome to ArchASP' --theme 'container=brightblack;border=magenta;text=white;greet=brightmagenta;prompt=cyan;input=brightcyan;time=brightyellow;error=red;button=green;action=green' --cmd 'uwsm start default' --power-shutdown 'shutdown -h now' --power-reboot 'reboot'"
user = "greeter" # `agreety` is the bundled agetty/login-lookalike. You can replace `/bin/sh`
# with whatever you want started, such as `sway`.
command = "sway --config /etc/greetd/sway-config"
# The user to run the command as. The privileges this user must have depends
# on the greeter. A graphical greeter may for example require the user to be
# in the `video` group.
user = ""

View file

@ -0,0 +1,60 @@
# SPDX-FileCopyrightText: 2022 Harish Rajagopal <harish.rajagopals@gmail.com>
#
# SPDX-License-Identifier: GPL-3.0-or-later
[background]
# Path to the background image
path = "/home/fy59/Images/Wallpapers/sway.png"
# How the background image covers the screen if the aspect ratio doesn't match
# Available values: "Fill", "Contain", "Cover", "ScaleDown"
# Refer to: https://docs.gtk.org/gtk4/enum.ContentFit.html
# NOTE: This is ignored if ReGreet isn't compiled with GTK v4.8 support.
fit = "Cover"
[GTK]
# Whether to use the dark theme
application_prefer_dark_theme = true
# Cursor theme name
cursor_theme_name = "catppuccin-mocha-lavender-cursors"
# Whether to blink the cursor
cursor_blink = true
# Font name and size
font_name = "jetbrains mono nerd font 14"
# Icon theme name
icon_theme_name = "Tela-blue-dark"
# GTK theme name
theme_name = "catppuccin-mocha-lavender-standard+default"
[commands]
# The command used to reboot the system
reboot = ["systemctl", "reboot"]
# The command used to shut down the system
poweroff = ["systemctl", "poweroff"]
[appearance]
# The message that initially displays on startup
greeting_msg = "Welcome back!"
[widget.clock]
# strftime format argument
# See https://docs.rs/jiff/0.1.14/jiff/fmt/strtime/index.html#conversion-specifications
format = "%H:%M"
# How often to update the text
resolution = "500ms"
# Override system timezone (IANA Time Zone Database name, aka /etc/zoneinfo path)
# Remove to use the system time zone.
timezone = "Europe/Paris"
# Ask GTK to make the label at least this wide. This helps keeps the parent element layout and width consistent.
# Experiment with different widths, the interpretation of this value is entirely up to GTK.
label_width = 150

View file

@ -0,0 +1,14 @@
exec "regreet; swaymsg exit"
include /etc/sway/config.d/*
### Keyboard
input * {
xkb_layout fr
xkb_variant oss
}
### Touchpad
input "type:touchpad" {
tap enabled
tap_button_map lrm
}

View file

@ -1,17 +0,0 @@
appflowy-bin
bibata-cursor-theme
bridge-utils
colmap
colmap-debug
freeimage
go-mtpfs-git
hyprwhspr
jmtpfs
limine-snapper-sync
limusic-bin
meshlab-bin
mozjpeg-debug
proton-pass-bin
spicetify-marketplace-bin
vmware-workstation
yay

View file

@ -1,251 +1,202 @@
7zip 7zip
accountsservice
acpi
alsa-utils alsa-utils
amd-ucode amass
amdgpu_top
android-file-transfer
android-tools
ansible
atuin
autotiling
axel
base base
base-devel base-devel
bash-completion
bat bat
bat-extras
bear
bind
blueman blueman
bluez bluez
bluez-utils bluez-utils
brightnessctl brightnessctl
broadcom-wl-dkms
btop btop
btrfs-progs btrfs-progs
ccache calcure
clang catppuccin-cursors-mocha
catppuccin-gtk-theme-mocha
cliphist cliphist
cloc cpio
cmake
composer
cowsay
cppcheck
cppdap
cpupower
cups cups
cups-pk-helper dante
dmidecode deezer
dgop
dialog
discord
dnsmasq dnsmasq
docker
dosfstools dosfstools
ecryptfs-utils
edk2-ovmf
efibootmgr efibootmgr
eigen
evince
evtest evtest
exfatprogs exfatprogs
eza eza
fastfetch fastfetch
fd fd
ffmpegthumbnailer
figlet figlet
file-roller
firefox firefox
firefox-i18n-fr firefox-i18n-fr
flatpak foomatic-db
freecad foomatic-db-gutenprint-ppds
foomatic-db-nonfree
foomatic-db-nonfree-ppds
foomatic-db-ppds
fuse-overlayfs
fuse2
fzf fzf
ggml-vulkan gammastep
gimp
gimp-help-fr
git git
github-cli github-cli
gnome-keyring gnome-themes-extra
gnu-free-fonts gnu-free-fonts
gphoto2 gobuster
gradle google-chrome
greetd-tuigreet greetd-regreet
grim grim
grub grub
grub-btrfs
gst-libav gst-libav
gst-plugin-gtk4
gst-plugin-pipewire gst-plugin-pipewire
gst-plugins-bad
gst-plugins-base
gst-plugins-good gst-plugins-good
gtk4 gst-plugins-ugly
gtklock gum
gtklock-playerctl-module hashcat
gtklock-powerbar-module
gtklock-userinfo-module
gvfs
heimdall
hplip hplip
hunspell-en_us
hunspell-fr
i3status-rust i3status-rust
ifuse inter-font
imagemagick inxi
inotify-tools
jadx
jdk-openjdk
jdk17-openjdk
john john
julia jq
kitty kitty
less libspng
libgsf libvirt
libheif linux
libimobiledevice
libjpeg-turbo
libmtp
libplist
libpulse
limine
linux-firmware linux-firmware
linux-lts linux-headers
linux-lts-headers lsb-release
linux-zen lsd
linux-zen-headers maim
llama-cpp man-db
luarocks
mako
man-pages man-pages
man-pages-fr man-pages-fr
memtest86+ mercurial
memtest86+-efi mtools
mesa-utils
meson
mold
mpv
mtpfs
neovim neovim
networkmanager networkmanager
nextcloud-client nikto
nginx nmsurf
nodejs nodejs
notcurses noto-fonts
noto-fonts-cjk
noto-fonts-emoji noto-fonts-emoji
npm noto-fonts-extra
nss-mdns nss-mdns
ntfs-3g openbsd-netcat
ntp openvpn
nvme-cli optipng
openresolv os-prober
openssh otf-font-awesome
pacman-contrib pacman-contrib
pavucontrol pamixer
parallel
pass
perl-image-exiftool perl-image-exiftool
php
pipewire
pipewire-alsa pipewire-alsa
pipewire-jack pipewire-jack
pipewire-libcamera
pipewire-pulse pipewire-pulse
podman playerctl
powertop pnpm
protonmail-bridge polkit-gnome
power-profiles-daemon
pyenv pyenv
pyright python-gobject
python-i3ipc python-i3ipc
python-jsonschema python-jedi
python-opencv python-pip
python-pipenv python-pipx
python-psutil python-pyamdgpuinfo
python-pynvim python-pyquery
python-textual python-utils
qt5-wayland qalculate-gtk
qt5-quickcontrols2
qt5ct qt5ct
qt6-wayland
qt6ct qt6ct
radeontop
rclone
reflector reflector
renderdoc
rhash
ripgrep ripgrep
rocm-smi-lib rust
rofi
rsync
ruby
rustup
samba
sane sane
sane-airscan sane-airscan
sbctl sassc
scrollmpris-git
seat
seatd
seclists
slop
slurp slurp
smartmontools snap-pac-grub
snap-pac
snapper snapper
sof-firmware sof-firmware
spirv-headers
spotify-launcher
sqlitebrowser
starship starship
stow
strace strace
sudo
sway
swaybg swaybg
swayfx
swayidle swayidle
swaylock swayimg
swaylock-effects
swaync swaync
system-config-printer systemd-resolvconf
tcpdump tcpdump
tea testdisk
tela-circle-icon-theme-all texinfo
terminus-font
tesseract
tesseract-data-eng
tesseract-data-fra
thunar
thunar-archive-plugin
thunar-volman
thunderbird
thunderbird-i18n-fr
tlp tlp
tlp-pd
tlp-rdw
tmux
traceroute
transmission-cli
transmission-gtk
tree tree
tree-sitter-cli ttf-bitstream-vera
ttf-dejavu ttf-dejavu
ttf-droid
ttf-fantasque-nerd
ttf-fira-code ttf-fira-code
ttf-fira-sans
ttf-firacode-nerd
ttf-jetbrains-mono ttf-jetbrains-mono
ttf-jetbrains-mono-nerd ttf-liberation
tumbler ttf-nerd-fonts-symbols-mono
typst ttf-noto-nerd
ttf-victor-mono
umockdev
unrar unrar
unzip unzip
usbmuxd
usbutils usbutils
uwsm vde2
valgrind w3m
vcpkg
vlc
volk
vulkan-headers
vulkan-radeon
vulkan-tools
vulkan-utility-libraries
vulkan-validation-layers
waybar
wayland-utils
webp-pixbuf-loader
wev
wget wget
whois
wireguard-tools wireguard-tools
wireplumber wl-clip-persist
wl-clipboard
wlopm
wlr-randr
wlsunset wlsunset
wofi wofi
wpa_supplicant wttrbar
xdg-desktop-portal xclip
xdg-desktop-portal-gtk
xdg-desktop-portal-wlr xdg-desktop-portal-wlr
xf86-video-amdgpu xdg-user-dirs
xorg-xrdb xf86-video-nouveau
xmlstarlet
xorg-xwayland xorg-xwayland
xournalpp
yarn
yazi yazi
yt-dlp zip
zoxide zoxide
zram-generator zram-generator
zsh zsh
zsh-autocomplete
zsh-autosuggestions
zsh-completions zsh-completions
zsh-history-substring-search
zsh-syntax-highlighting

27
.gitignore vendored
View file

@ -1,29 +1,2 @@
atuin/.local/share/ atuin/.local/share/
hyprwhspr/.local/share/ hyprwhspr/.local/share/
# Generated language/package-manager data
**/__pycache__/
*.py[cod]
**/node_modules/
# Local editor/application backups
*.bak
*.old
# Hyprwhspr runtime endpoints are recreated below XDG_RUNTIME_DIR.
hyprwhspr/.config/hyprwhspr/audio_level
hyprwhspr/.config/hyprwhspr/recording_control
hyprwhspr/.config/hyprwhspr/recording_status
# Machine-local or project-owned launchers exposed through ~/.local/bin.
bin/.local/bin/agy
bin/.local/bin/android
bin/.local/bin/arch-sentinel
bin/.local/bin/codex
bin/.local/bin/goose
bin/.local/bin/labfy-remote-ui
bin/.local/bin/trainlog
bin/.local/bin/trainlog-bt-watch
bin/.local/bin/trainlog-btd
bin/.local/bin/trainlog-sync-once
bin/.local/bin/trainlog-syncd

12
.gitmodules vendored
View file

@ -1,12 +0,0 @@
[submodule "zsh/.zsh/plugins/fast-syntax-highlighting"]
path = zsh/.zsh/plugins/fast-syntax-highlighting
url = https://github.com/zdharma-continuum/fast-syntax-highlighting.git
[submodule "zsh/.zsh/plugins/fzf-tab"]
path = zsh/.zsh/plugins/fzf-tab
url = https://github.com/Aloxaf/fzf-tab.git
[submodule "zsh/.zsh/plugins/zsh-autosuggestions"]
path = zsh/.zsh/plugins/zsh-autosuggestions
url = https://github.com/zsh-users/zsh-autosuggestions.git
[submodule "tmux/.config/tmux/plugins/catppuccin/tmux"]
path = tmux/.config/tmux/plugins/catppuccin/tmux
url = https://github.com/catppuccin/tmux.git

352
README.md
View file

@ -1,291 +1,161 @@
<p align="center"> # Dotfiles ArchASP
<img src=".assets/screen.jpg" alt="ArchASP — Sway desktop" width="100%">
</p>
<h1 align="center">ArchASP Dotfiles</h1> Configurations utilisateur de mon poste principal sous **Arch Linux**, avec un environnement **Wayland / Sway**.
<p align="center"> Ce dépôt contient uniquement les fichiers liés à ma session utilisateur.
Configuration utilisateur reproductible pour une station Arch Linux sous Les configurations système, les paquets, Btrfs, Snapper, Limine, TLP, nftables et les outils nécessitant les droits root sont gérés séparément dans le dépôt [`arch-system`](https://git.labfytools.com/fy59/arch-system).
Wayland, déployée package par package avec GNU Stow.
</p>
<p align="center"> ## Environnement
<code>Arch Linux</code> · <code>Sway</code> · <code>GNU Stow</code> ·
<code>systemd --user</code> · <code>Zsh</code>
</p>
<p align="center"> - Arch Linux
<a href="#overview">Overview</a> · - Sway
<a href="#desktop-stack">Desktop</a> · - Wayland
<a href="#shell-stack">Shell</a> · - Kitty
<a href="#repository-layout">Layout</a> · - Zsh
<a href="#deployment">Deployment</a> · - Neovim
<a href="#rebuilding-archasp">Rebuild</a> - PipeWire / WirePlumber
</p> - systemd utilisateur
- GNU Stow pour le déploiement des fichiers
<a id="overview"></a> ## Contenu
## ✦ Overview Le dépôt regroupe notamment :
Ce dépôt contient la couche **utilisateur** d'ArchASP : session graphique,
applications terminal, shell, scripts personnels et unités systemd user. La
couche **système/root** est volontairement séparée.
| Dépôt | Responsabilité |
| --- | --- |
| **`.dotfiles`** | Sway, Kitty, Neovim, Zsh, scripts, thèmes et services utilisateur |
| **[`arch-system`](https://git.labfytools.com/fy59/arch-system)** | Installation Arch, boot, stockage, réseau, paquets, `/etc` et helpers root |
Cette séparation évite de mêler état personnel et administration système. Le
dépôt reste néanmoins spécifique à la machine : sorties Sway, périphériques,
chemins sous `/home/fy59` et projets externes doivent être relus avant un
déploiement ailleurs.
<a id="desktop-stack"></a>
## ✦ Desktop Stack
```text ```text
greetd .config/
└─ tuigreet ├── kitty/
└─ UWSM ├── nvim/
└─ Sway ├── sway/
├─ Swaybar ── i3status-rs ├── systemd/user/
├─ Mako notifications └── ...
├─ Wofi launcher
├─ Swaylock verrouillage .local/
├─ Cliphist historique du presse-papiers ├── bin/
└─ Kitty terminal └── share/
.zshrc
``` ```
| Fonction | Composant canonique | ### Scripts utilisateur
| --- | --- |
| Session | `greetd → tuigreet → uwsm start default → sway.desktop` |
| Compositor | Sway / SwayFX |
| Barre | Swaybar avec i3status-rs |
| Notifications | Mako |
| Launcher | Wofi |
| Verrouillage et idle | Swaylock + swayidle |
| Presse-papiers | wl-clipboard + Cliphist |
| Terminal | Kitty |
| Profils d'énergie | TLP via l'interface utilisateur `tlpctl` |
`uwsm/.config/uwsm/default-id` sélectionne `sway.desktop`. La copie de Le dossier `~/.local/bin` contient plusieurs outils personnels, notamment :
référence de greetd se trouve dans `.assets/greetd/config.toml`; son
installation sous `/etc/greetd` appartient à `arch-system`.
<a id="shell-stack"></a> - gestion temporaire du seuil de charge de la batterie ;
- synchronisation Nextcloud à la demande ;
- lancement conjoint de Thunderbird et Proton Mail Bridge ;
- démarrage et arrêt à la demande de VMware et Samba ;
- notifications de batterie faible ;
- outils de maintenance Arch et AUR ;
- scripts liés à Sway, au presse-papiers et à la session Wayland.
## ✦ Shell Stack ### Services systemd utilisateur
```text Les unités présentes dans `.config/systemd/user/` permettent notamment de gérer :
Zsh
├─ Starship
├─ Atuin
├─ FZF
├─ Zoxide
├─ Eza
├─ Bat
└─ Yazi
```
`.zprofile` démarre la session graphique via UWSM lorsque celui-ci autorise un - les notifications de batterie ;
démarrage. `.zshenv` publie le socket de l'agent SSH utilisateur. L'historique, - Cliphist ;
les bases et la clé Atuin restent strictement locaux et hors Git. - GNOME Keyring ;
- l’agent SSH ;
- Swayidle ;
- Wlsunset ;
- Proton Mail Bridge ;
- différents services propres à la session graphique.
<a id="repository-layout"></a> Les services lourds ou occasionnels ne sont pas démarrés en permanence.
## ✦ Repository Layout ## Installation
Chaque répertoire de premier niveau, hors `.assets` et `.git`, est un package Cloner le dépôt dans le dossier personnel :
GNU Stow indépendant. Son arborescence reproduit le chemin attendu depuis
`$HOME`.
```text
.dotfiles/
├── sway/.config/sway/ → ~/.config/sway/
├── i3status-rust/.config/ → ~/.config/i3status-rust/
├── kitty/.config/kitty/ → ~/.config/kitty/
├── nvim/.config/nvim/ → ~/.config/nvim/
├── systemd/.config/systemd/user/ → ~/.config/systemd/user/
├── bin/.local/bin/ → ~/.local/bin/
├── zsh/.zshrc → ~/.zshrc
├── zsh/.zprofile → ~/.zprofile
└── .assets/ inventaires et références, non déployés
```
### Packages principaux
| Groupe | Packages Stow |
| --- | --- |
| Desktop | `sway`, `swaylock`, `mako`, `wofi`, `cliphist`, `i3status-rust` |
| Terminal et shell | `kitty`, `zsh`, `starship`, `atuin`, `fzf`, `eza`, `bat`, `yazi` |
| Développement | `nvim`, `tmux`, `opencode`, `bin` |
| Services | `systemd`, `uwsm` |
| Apparence | `gtk-3.0`, `gtklock`, `qt5ct`, `qt6ct`, `themes`, `icons`, `wallpapers` |
| Outils | `btop`, `fastfetch`, `hyprwhspr`, `ytmusic-tui` |
Les thèmes, icônes et wallpapers sont volontairement versionnés. Les
exécutables issus de projets externes restent hors Git même lorsqu'un script
ou une unité user les utilise.
### Sous-modules
Les plugins Zsh et Tmux sont épinglés par Git :
| Intégration | Chemin |
| --- | --- |
| Fast Syntax Highlighting | `zsh/.zsh/plugins/fast-syntax-highlighting` |
| FZF Tab | `zsh/.zsh/plugins/fzf-tab` |
| Zsh Autosuggestions | `zsh/.zsh/plugins/zsh-autosuggestions` |
| Catppuccin Tmux | `tmux/.config/tmux/plugins/catppuccin/tmux` |
<a id="deployment"></a>
## ✦ Deployment
### Prérequis
- Git ;
- GNU Stow ;
- les paquets décrits dans `.assets` ;
- une sauvegarde des fichiers existants qui pourraient entrer en conflit.
### Clone
```bash ```bash
git clone --recurse-submodules \ git clone \
ssh://git@git.labfytools.com:2223/fy59/Dotfiles_ArchAP.git \ https://git.labfytools.com/fy59/Dotfiles_ArchAP.git \
"$HOME/.dotfiles" "$HOME/Dotfiles_ArchAP"
cd "$HOME/.dotfiles" cd "$HOME/Dotfiles_ArchAP"
git submodule update --init --recursive
``` ```
### Dry-run Stow Avant tout déploiement, vérifier les liens qui seraient créés :
Construire la liste des packages à partir des répertoires de premier niveau :
```bash ```bash
mapfile -t packages < <( stow --no --verbose --target="$HOME" .
find . -mindepth 1 -maxdepth 1 -type d \
! -name .git ! -name .assets -printf '%f\n' | sort
)
stow --no --verbose=2 --target="$HOME" "${packages[@]}"
``` ```
Examiner tout conflit avant le déploiement réel : Puis appliquer les dotfiles :
```bash ```bash
stow --verbose=2 --target="$HOME" "${packages[@]}" stow --verbose --target="$HOME" .
``` ```
> Stow reçoit les **noms des packages**. La racine du dépôt n'est pas un En cas de conflit avec des fichiers existants, les sauvegarder ou les comparer avant de les remplacer.
> package : ne pas utiliser `stow .`.
<a id="package-inventory"></a> ## Recharger la configuration
## ✦ Package Inventory Après une modification des unités systemd utilisateur :
| Fichier | Source | Contenu |
| --- | --- | --- |
| `.assets/pkglist-pacman.txt` | `pacman -Qqen` | Paquets officiels explicitement installés |
| `.assets/pkglist-aur.txt` | `pacman -Qqem` | Paquets foreign/AUR explicitement installés |
| `.assets/enabled-services.txt` | systemd système | Services système activés |
| `.assets/enabled-system-aux-units.txt` | systemd système | Timers, sockets et paths activés |
| `.assets/enabled-user-aux-units.txt` | systemd user | Timers, sockets et paths utilisateur activés |
| `.assets/external-tools.md` | inventaire manuel | Cargo, npm, builds locaux, projets et helpers `/usr/local` |
Ces fichiers sont des instantanés vérifiables, pas un installateur. Les paquets
AUR, outils Cargo/npm et builds locaux doivent être restaurés séparément.
<a id="services"></a>
## ✦ Services
Le package `systemd` contient les unités utilisateur ainsi que leurs liens
d'activation relatifs. Il couvre notamment Cliphist, swayidle, GNOME Keyring,
l'agent SSH, les notifications de batterie et les intégrations Trainlog,
Lardon et Arch Sentinel.
Après une modification :
```bash ```bash
systemctl --user daemon-reload systemctl --user daemon-reload
systemd-analyze --user verify ~/.config/systemd/user/*.service
``` ```
Certaines unités lancent du code externe au dépôt. Leurs chemins et Pour réactiver les unités voulues :
dépendances sont documentés dans `.assets/external-tools.md`. Les services
système et toute modification de `/etc` restent sous la responsabilité
d'`arch-system`.
<a id="secrets"></a> ```bash
systemctl --user enable --now NOM.service
## ✦ Secrets systemctl --user enable --now NOM.timer
Ce dépôt n'a pas vocation à contenir :
- clés SSH, GPG, WireGuard ou Atuin ;
- `.netrc`, mots de passe, tokens, cookies ou credentials ;
- configurations privées Rclone, GitHub CLI ou Nextcloud ;
- bases de données, historiques shell ou états applicatifs personnels.
Les ignorer dans le HEAD ne suffit pas : un secret déjà commité doit être
renouvelé, puis supprimé de tout l'historique avant publication.
<a id="rebuilding-archasp"></a>
## ✦ Rebuilding ArchASP
```text
┌──────────────────────────────────────────────────────┐
│ arch-system │
│ Arch · boot · stockage · réseau · paquets · /etc │
└──────────────────────────┬───────────────────────────┘
│ socle système prêt
▼
┌──────────────────────────────────────────────────────┐
│ .dotfiles │
│ Stow · session · shell · scripts · systemd user │
└──────────────────────────┬───────────────────────────┘
│ restaurations externes
▼
┌──────────────────────────────────────────────────────┐
│ AUR · Cargo/npm · projets locaux · secrets · données│
└──────────────────────────────────────────────────────┘
``` ```
Ordre de reconstruction recommandé : Pour recharger Sway :
1. restaurer la couche système avec `arch-system` ; ```bash
2. installer Git et GNU Stow ; swaymsg reload
3. cloner ce dépôt avec ses sous-modules ; ```
4. restaurer les paquets officiels puis examiner les paquets AUR ;
5. effectuer le dry-run et déployer les packages Stow ;
6. restaurer les outils Cargo/npm et les projets locaux nécessaires ;
7. restaurer les secrets et données applicatives depuis une sauvegarde sûre ;
8. valider puis activer les unités systemd voulues.
Le dépôt ne reconstruit pas seul les projets sous `Documents`, OpenMVS local, ## Mise à jour du dépôt
les helpers `/usr/local`, les secrets, les bases applicatives ou les réglages
matériels propres à la machine.
<a id="repository-mirrors"></a> Depuis le dépôt :
## ✦ Repository Mirrors ```bash
git status
git add -A
git commit -m "chore: update user configuration"
git push
```
| Rôle | Hébergement | URL | Les données sensibles ne doivent jamais être ajoutées au dépôt.
| --- | --- | --- |
| Upstream principal | Forgejo | `ssh://git@git.labfytools.com:2223/fy59/Dotfiles_ArchAP.git` |
| Miroir public | GitHub | `https://github.com/labfytools/Dotfiles_ArchAP` |
Le fetch d'`origin` reste attaché à Forgejo. Ses URLs de push publient vers Sont notamment exclus :
Forgejo et GitHub afin qu'un `git push origin main` maintienne les deux copies.
<a id="license"></a> - clés SSH ;
- mots de passe ;
- jetons d’accès ;
- fichiers `.netrc` ;
- mots de passe d’application ;
- clés WireGuard ;
- bases de données personnelles ;
- fichiers contenant des informations privées.
## ✦ License ## Séparation avec `arch-system`
Aucune licence n'est actuellement déclarée pour ce dépôt. | Dépôt | Responsabilité |
|---|---|
| [`Dotfiles_ArchAP`](https://git.labfytools.com/fy59/Dotfiles_ArchAP) | Configuration utilisateur, Sway, Neovim, Kitty, Zsh, scripts et unités systemd utilisateur |
| [`arch-system`](https://git.labfytools.com/fy59/arch-system) | Paquets, configuration système, Btrfs, Snapper, Limine, TLP, nftables, sudoers et helpers root |
Cette séparation évite de mélanger les fichiers personnels avec les éléments propres à l’installation du système.
## Avertissement
Ces fichiers correspondent à mon matériel, mon utilisateur et mon organisation personnelle.
Ils peuvent servir de référence, mais ne doivent pas être déployés tels quels sur une autre machine sans vérifier :
- les chemins ;
- le nom d’utilisateur ;
- les écrans et périphériques ;
- les commandes disponibles ;
- les unités systemd ;
- les dépendances installées.
## Licence
Configuration personnelle fournie sans garantie.

View file

@ -44,7 +44,7 @@
## which search mode to use ## which search mode to use
## possible values: prefix, fulltext, fuzzy, skim ## possible values: prefix, fulltext, fuzzy, skim
search_mode = "prefix" # search_mode = "fuzzy"
## which filter mode to use by default ## which filter mode to use by default
## possible values: "global", "host", "session", "session-preload", "directory", "workspace" ## possible values: "global", "host", "session", "session-preload", "directory", "workspace"
@ -67,7 +67,7 @@ filter_mode = "global"
## which search mode to use when atuin is invoked from a shell up-key binding ## which search mode to use when atuin is invoked from a shell up-key binding
## the accepted values are identical to those of "search_mode" ## the accepted values are identical to those of "search_mode"
## leave unspecified to use same mode set in "search_mode" ## leave unspecified to use same mode set in "search_mode"
search_mode_shell_up_key_binding = "prefix" # search_mode_shell_up_key_binding = "fuzzy"
## which style to use ## which style to use
## possible values: auto, full, compact ## possible values: auto, full, compact

BIN
bin/.local/bin/agy Executable file

Binary file not shown.

3
bin/.local/bin/appid Executable file
View file

@ -0,0 +1,3 @@
#!/bin/sh
sleep 3
mmsg -g -c | sed 's/^/title|appid: /'

View file

@ -1,10 +0,0 @@
#!/bin/sh
# Évite un rendu logiciel Mesa accidentel.
unset LIBGL_ALWAYS_SOFTWARE
unset MESA_LOADER_DRIVER_OVERRIDE
# Utilise Xwayland/GLX pour le contexte OpenGL de SIFTGPU.
export QT_QPA_PLATFORM=xcb
exec colmap "$@"

View file

@ -1,33 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
readonly PROFILE="$HOME/.mozilla/firefox-scribd"
readonly URL="${1:-https://fr.scribd.com/}"
case "$URL" in
http://scribd.com/*|https://scribd.com/*|\
http://*.scribd.com/*|https://*.scribd.com/*)
;;
*)
notify-send \
"Firefox Scribd" \
"URL refusée : ce lanceur accepte uniquement scribd.com"
exit 2
;;
esac
mkdir -p "$PROFILE"
exec systemd-run \
--user \
--scope \
--quiet \
--unit="firefox-scribd-$(date +%s)-$$" \
--slice=app-graphical.slice \
--property=MemoryMax=8G \
--property=MemorySwapMax=0 \
/usr/bin/firefox \
--no-remote \
--profile "$PROFILE" \
--new-window "$URL"

1
bin/.local/bin/llama-cli Symbolic link
View file

@ -0,0 +1 @@
/home/fy59/.local/src/llama.cpp/build/bin/llama-cli

1
bin/.local/bin/llama-server Symbolic link
View file

@ -0,0 +1 @@
/home/fy59/.local/src/llama.cpp/build/bin/llama-server

View file

@ -0,0 +1,2 @@
#!/bin/sh
grim -g "$(slurp)" - | wl-copy -t image/png

View file

@ -0,0 +1,3 @@
#!/bin/sh
systemctl --user start graphical-session.target || true
exec mango

View file

@ -1,108 +0,0 @@
#!/usr/bin/env bash
set -u
usage() {
printf '%s\n' 'usage: opencode-away [--check] [opencode arguments...]'
}
require_command() {
command -v "$1" >/dev/null 2>&1 || {
printf 'opencode-away: required command not found: %s\n' "$1" >&2
return 1
}
}
if [[ ${1-} == --help ]]; then
usage
exit 0
fi
check_only=0
if [[ ${1-} == --check ]]; then
check_only=1
shift
fi
require_command opencode || exit 127
require_command systemd-inhibit || exit 127
require_command git || exit 127
require_command ps || exit 127
require_command kill || exit 127
if [[ $(systemd-inhibit --help 2>&1) != *handle-lid-switch* ]]; then
printf '%s\n' 'opencode-away: systemd-inhibit lacks handle-lid-switch' >&2
exit 3
fi
if ! git rev-parse --show-toplevel >/dev/null 2>&1; then
printf '%s\n' 'opencode-away: run this command inside a Git worktree' >&2
exit 2
fi
if ((check_only)); then
printf '%s\n' 'OpenCode away mode check: OK'
printf 'repository: %s\n' "$(git rev-parse --show-toplevel)"
printf 'opencode: %s\n' "$(command -v opencode)"
printf 'systemd-inhibit: %s\n' "$(command -v systemd-inhibit)"
exit 0
fi
declare -a suspended_pids=()
cleanup_done=0
restore_swayidle() {
local pid
((cleanup_done)) && return 0
cleanup_done=1
for pid in "${suspended_pids[@]}"; do
if kill -0 "$pid" 2>/dev/null &&
[[ $(ps -o comm= -p "$pid" 2>/dev/null) == swayidle ]]; then
kill -CONT "$pid" 2>/dev/null || true
fi
done
if ((${#suspended_pids[@]})); then
printf '%s\n' 'swayidle restored'
fi
}
trap restore_swayidle EXIT
while read -r pid state; do
[[ $pid =~ ^[0-9]+$ ]] || continue
[[ $state == T* ]] && continue
if kill -STOP "$pid" 2>/dev/null; then
suspended_pids+=("$pid")
fi
done < <(ps -C swayidle -o pid=,stat= 2>/dev/null)
printf '%s\n' 'OpenCode away mode'
printf '%s\n' 'sleep inhibited'
printf '%s\n' 'lid switch inhibited'
if ((${#suspended_pids[@]})); then
printf 'swayidle suspended:'
printf ' %s' "${suspended_pids[@]}"
printf '\n'
else
printf '%s\n' 'swayidle suspended: none active'
fi
export LARDON_OPENCODE_LONG_RUN=1
if [[ -n ${OPENCODE_AWAY_COMMAND-} ]]; then
child_command=(bash -c "$OPENCODE_AWAY_COMMAND")
else
child_command=(opencode --auto "$@")
fi
systemd-inhibit \
--what=sleep:idle:handle-lid-switch \
--who='OpenCode Long Run' \
--why='Autonomous Lardon3D development ticket' \
--mode=block \
"${child_command[@]}"
child_status=$?
restore_swayidle
exit "$child_status"

View file

@ -1,91 +0,0 @@
#!/usr/bin/env bash
set -Eeuo pipefail
SWAYIDLE_MODE="none"
declare -a SWAYIDLE_CMD=()
cleanup() {
rc=$?
trap - EXIT INT TERM HUP
printf '\n[pi-dev] Arrêt de la session...\n'
# Restaurer swayidle exactement selon son mode d'origine.
case "$SWAYIDLE_MODE" in
systemd)
printf '[pi-dev] Redémarrage de swayidle.service...\n'
systemctl --user start swayidle.service || true
;;
process)
if ((${#SWAYIDLE_CMD[@]})); then
printf '[pi-dev] Redémarrage de swayidle...\n'
nohup "${SWAYIDLE_CMD[@]}" \
>/dev/null 2>&1 &
fi
;;
esac
printf '[pi-dev] Session restaurée.\n'
exit "$rc"
}
trap cleanup EXIT INT TERM HUP
#
# 1. Neutraliser swayidle
#
if systemctl --user is-active --quiet swayidle.service 2>/dev/null; then
SWAYIDLE_MODE="systemd"
printf '[pi-dev] Neutralisation de swayidle.service...\n'
systemctl --user stop swayidle.service
else
SWAYIDLE_PID="$(pgrep -xo swayidle || true)"
if [[ -n "$SWAYIDLE_PID" ]]; then
SWAYIDLE_MODE="process"
# Sauvegarder exactement argv avant d'arrêter swayidle.
mapfile -d '' SWAYIDLE_CMD \
< "/proc/$SWAYIDLE_PID/cmdline"
printf '[pi-dev] Neutralisation de swayidle (PID %s)...\n' \
"$SWAYIDLE_PID"
kill "$SWAYIDLE_PID"
# Attendre sa disparition.
for _ in {1..20}; do
kill -0 "$SWAYIDLE_PID" 2>/dev/null || break
sleep 0.05
done
fi
fi
#
# 2. Lancer Pi avec inhibition de la fermeture du capot
#
# L'inhibitor existe uniquement pendant que Pi tourne.
#
printf '[pi-dev] swayidle neutralisé.\n'
printf '[pi-dev] Veille fermeture du capot neutralisée.\n'
printf '[pi-dev] Lancement de Pi / OpenRouter.\n\n'
systemd-inhibit \
--what=handle-lid-switch \
--who="pi-dev" \
--why="Session de développement Pi / Lardon3D" \
--mode=block \
pi "$@"

View file

@ -1,697 +0,0 @@
#!/usr/bin/env bash
set -Eeuo pipefail
# scan3d
# Pipeline interactif :
# photos -> pré-tri -> COLMAP -> OpenMVS -> maillage texturé
#
# Les photos originales ne sont jamais déplacées ni supprimées.
# Le script s'arrête avant l'ouverture de MeshLab.
OPENMVS_BIN="${OPENMVS_BIN:-$HOME/Applications/openmvs-2.4.0/openmvs}"
OPENMVS_IMAGE="${OPENMVS_IMAGE:-localhost/openmvs:2.4.0}"
THREADS="${SCAN3D_THREADS:-4}"
SEQUENTIAL_OVERLAP="${SCAN3D_OVERLAP:-20}"
RESOLUTION_LEVEL="${SCAN3D_RESOLUTION_LEVEL:-3}"
NUMBER_VIEWS="${SCAN3D_NUMBER_VIEWS:-4}"
MIN_FREE_GIB="${SCAN3D_MIN_FREE_GIB:-45}"
USE_GPU=1
KEEP_DEPTHMAPS=0
RED=$'\e[31m'
GREEN=$'\e[32m'
YELLOW=$'\e[33m'
BLUE=$'\e[34m'
BOLD=$'\e[1m'
RESET=$'\e[0m'
log() {
printf '\n%s%s==>%s %s\n' "$BOLD" "$BLUE" "$RESET" "$*"
}
ok() {
printf '%s✓%s %s\n' "$GREEN" "$RESET" "$*"
}
warn() {
printf '%s⚠%s %s\n' "$YELLOW" "$RESET" "$*" >&2
}
die() {
printf '%sERREUR:%s %s\n' "$RED" "$RESET" "$*" >&2
exit 1
}
cleanup_on_error() {
local code=$?
if (( code != 0 )); then
printf '\n%sLe pipeline s’est arrêté avec le code %d.%s\n' \
"$RED" "$code" "$RESET" >&2
printf 'Relance simplement %sscan3d%s pour reprendre à la dernière étape validée.\n' \
"$BOLD" "$RESET" >&2
fi
}
trap cleanup_on_error EXIT
prompt_default() {
local prompt="$1"
local default="$2"
local answer
read -r -e -p "$prompt [$default] : " answer
printf '%s' "${answer:-$default}"
}
yes_no() {
local prompt="$1"
local default="${2:-n}"
local answer suffix
if [[ "$default" == "o" ]]; then
suffix="[O/n]"
else
suffix="[o/N]"
fi
while true; do
read -r -p "$prompt $suffix : " answer
answer="${answer:-$default}"
case "${answer,,}" in
o|oui|y|yes) return 0 ;;
n|non|no) return 1 ;;
*) printf 'Réponds par o ou n.\n' ;;
esac
done
}
require_command() {
command -v "$1" >/dev/null 2>&1 || die "commande introuvable : $1"
}
run_logged() {
local logfile="$1"
shift
mkdir -p "$(dirname "$logfile")"
"$@" 2>&1 | tee "$logfile"
}
natural_list() {
find "$@" -print0 | sort -zV
}
choose_source_dir() {
local default_dir="$PWD"
local entered
while true; do
entered="$(prompt_default 'Dossier contenant les photos' "$default_dir")"
entered="${entered/#\~/$HOME}"
entered="$(realpath -m "$entered")"
if [[ -d "$entered" ]]; then
RAW_DIR="$entered"
return
fi
warn "Le dossier n’existe pas : $entered"
done
}
choose_categories() {
printf '\n%sQuelles photos utiliser pour la reconstruction ?%s\n' "$BOLD" "$RESET"
printf ' 1) Bonnes uniquement — recommandé\n'
printf ' 2) Bonnes + suspectes — plus complet, plus risqué\n'
printf ' 3) Toutes, y compris mauvaises — déconseillé\n'
local choice
while true; do
read -r -p 'Choix [1] : ' choice
choice="${choice:-1}"
case "$choice" in
1)
SELECTED_CATEGORIES=("bonnes")
CATEGORY_LABEL="bonnes"
return
;;
2)
SELECTED_CATEGORIES=("bonnes" "suspectes")
CATEGORY_LABEL="bonnes-suspectes"
return
;;
3)
SELECTED_CATEGORIES=("bonnes" "suspectes" "mauvaises")
CATEGORY_LABEL="toutes"
return
;;
*)
printf 'Choisis 1, 2 ou 3.\n'
;;
esac
done
}
write_tri_script() {
cat > "$TRI_PY" <<'PY'
#!/usr/bin/env python3
from __future__ import annotations
import argparse
import csv
import re
import sys
from dataclasses import dataclass
from pathlib import Path
import cv2
import numpy as np
from PIL import Image
EXTENSIONS = {".jpg", ".jpeg", ".png", ".tif", ".tiff", ".webp"}
@dataclass
class Result:
path: Path
category: str
sharpness: float
white: float
black: float
brightness: float
reason: str
def natural_key(path: Path) -> list[object]:
return [
int(part) if part.isdigit() else part.lower()
for part in re.split(r"(\d+)", path.name)
]
def load_gray(path: Path) -> np.ndarray:
with Image.open(path) as source:
source = source.convert("L")
gray = np.asarray(source)
height, width = gray.shape
maximum_dimension = 1600
if max(width, height) > maximum_dimension:
scale = maximum_dimension / max(width, height)
gray = cv2.resize(
gray,
(
max(1, round(width * scale)),
max(1, round(height * scale)),
),
interpolation=cv2.INTER_AREA,
)
return gray
def analyze(path: Path) -> tuple[dict[str, float] | None, str]:
try:
gray = load_gray(path)
except Exception as error:
return None, f"illisible: {error}"
return {
"sharpness": float(cv2.Laplacian(gray, cv2.CV_64F).var()),
"white": float(np.count_nonzero(gray >= 250) / gray.size * 100),
"black": float(np.count_nonzero(gray <= 5) / gray.size * 100),
"brightness": float(gray.mean()),
}, ""
def classify(path: Path, metrics: dict[str, float] | None, error: str) -> Result:
if metrics is None:
return Result(path, "mauvaises", 0.0, 0.0, 0.0, 0.0, error)
sharpness = metrics["sharpness"]
white = metrics["white"]
black = metrics["black"]
brightness = metrics["brightness"]
reasons: list[str] = []
if sharpness < 100:
reasons.append("très floue")
elif sharpness < 170:
reasons.append("floue possible")
if white > 20:
reasons.append("très surexposée")
elif white > 8:
reasons.append("surexposition possible")
if black > 35:
reasons.append("très sombre")
elif black > 15:
reasons.append("ombres bouchées possibles")
if brightness > 225 or brightness < 25:
reasons.append("luminosité extrême")
severe = (
sharpness < 100
or white > 20
or black > 35
or brightness > 225
or brightness < 25
)
if severe:
category = "mauvaises"
elif reasons:
category = "suspectes"
else:
category = "bonnes"
return Result(
path,
category,
sharpness,
white,
black,
brightness,
"; ".join(reasons) or "ok",
)
def main() -> int:
parser = argparse.ArgumentParser()
parser.add_argument("images", type=Path)
parser.add_argument("--output", type=Path, required=True)
args = parser.parse_args()
images_dir = args.images.expanduser().resolve()
output_dir = args.output.expanduser().resolve()
excluded_roots = {
output_dir,
images_dir / "scan3d",
images_dir / "tri_resultat",
images_dir / "test_colmap",
images_dir / "colmap_complet",
}
images: list[Path] = []
for path in images_dir.rglob("*"):
if not path.is_file() or path.is_symlink():
continue
if path.suffix.lower() not in EXTENSIONS:
continue
if any(root == path or root in path.parents for root in excluded_roots):
continue
images.append(path)
images.sort(key=natural_key)
if not images:
print("Aucune image trouvée.", file=sys.stderr)
return 1
print(f"{len(images)} images trouvées.")
results: list[Result] = []
for index, path in enumerate(images, 1):
metrics, error = analyze(path)
results.append(classify(path, metrics, error))
print(
f"\rAnalyse {index}/{len(images)} : {path.name[:55]:55s}",
end="",
flush=True,
)
print()
output_dir.mkdir(parents=True, exist_ok=True)
for category in ("bonnes", "suspectes", "mauvaises"):
category_dir = output_dir / category
if category_dir.exists():
for child in category_dir.iterdir():
if child.is_symlink() or child.is_file():
child.unlink()
category_dir.mkdir(parents=True, exist_ok=True)
with (output_dir / "resultats.csv").open(
"w", encoding="utf-8", newline=""
) as csv_file:
writer = csv.writer(csv_file)
writer.writerow(
[
"fichier",
"categorie",
"netteté",
"blanc_pct",
"noir_pct",
"luminosité",
"raison",
]
)
counters = {"bonnes": 0, "suspectes": 0, "mauvaises": 0}
for result in results:
counters[result.category] += 1
link_name = f"{counters[result.category]:06d}_{result.path.name}"
link_path = output_dir / result.category / link_name
link_path.symlink_to(result.path.resolve())
writer.writerow(
[
str(result.path),
result.category,
f"{result.sharpness:.2f}",
f"{result.white:.2f}",
f"{result.black:.2f}",
f"{result.brightness:.2f}",
result.reason,
]
)
for category in ("bonnes", "suspectes", "mauvaises"):
count = sum(result.category == category for result in results)
print(f"{category}: {count}")
return 0
if __name__ == "__main__":
raise SystemExit(main())
PY
}
podman_openmvs() {
podman run --rm \
-v "$OPENMVS_BIN:/openmvs:ro,Z" \
-v "$WORK_DIR:/data:Z" \
-w /data/openmvs \
"$OPENMVS_IMAGE" \
"$@"
}
printf '%s\n' "${BOLD}scan3d — pipeline photogrammétrique COLMAP + OpenMVS${RESET}"
require_command colmap
require_command podman
require_command /usr/bin/python
require_command realpath
require_command sort
require_command find
require_command sqlite3
/usr/bin/python - <<'PY' >/dev/null 2>&1 || die \
"Modules Python manquants. Installe : sudo pacman -S python-opencv python-numpy python-pillow"
import cv2
import numpy
from PIL import Image
PY
[[ -x "$OPENMVS_BIN/InterfaceCOLMAP" ]] ||
die "OpenMVS introuvable dans : $OPENMVS_BIN"
[[ -x "$OPENMVS_BIN/DensifyPointCloud" ]] ||
die "DensifyPointCloud introuvable dans : $OPENMVS_BIN"
podman image exists "$OPENMVS_IMAGE" ||
die "Image Podman absente : $OPENMVS_IMAGE"
choose_source_dir
PROJECT_ROOT="$RAW_DIR/scan3d"
TRI_DIR="$PROJECT_ROOT/tri"
TRI_PY="$PROJECT_ROOT/tri_photos.py"
mkdir -p "$PROJECT_ROOT"
write_tri_script
if [[ -f "$TRI_DIR/resultats.csv" ]]; then
if yes_no "Un tri existe déjà. Le réutiliser ?" o; then
ok "Tri existant conservé."
else
log "Nouveau tri des photos"
rm -rf "$TRI_DIR"
/usr/bin/python "$TRI_PY" "$RAW_DIR" --output "$TRI_DIR"
fi
else
log "Tri des photos"
/usr/bin/python "$TRI_PY" "$RAW_DIR" --output "$TRI_DIR"
fi
printf '\nRésultat du tri :\n'
for category in bonnes suspectes mauvaises; do
count="$(find "$TRI_DIR/$category" -maxdepth 1 -type l 2>/dev/null | wc -l)"
printf ' %-11s : %s\n' "$category" "$count"
done
choose_categories
WORK_DIR="$PROJECT_ROOT/projet-$CATEGORY_LABEL"
if [[ -d "$WORK_DIR" ]] && find "$WORK_DIR" -mindepth 1 -print -quit | grep -q .; then
printf '\nUn projet existe déjà : %s\n' "$WORK_DIR"
printf ' 1) Reprendre là où il s’est arrêté\n'
printf ' 2) Tout effacer et recommencer\n'
printf ' 3) Annuler\n'
while true; do
read -r -p 'Choix [1] : ' resume_choice
resume_choice="${resume_choice:-1}"
case "$resume_choice" in
1) break ;;
2)
rm -rf "$WORK_DIR"
break
;;
3) exit 0 ;;
*) printf 'Choisis 1, 2 ou 3.\n' ;;
esac
done
fi
mkdir -p "$WORK_DIR"/{images,sparse,logs,openmvs}
free_gib="$(df -Pk "$WORK_DIR" | awk 'NR==2 {printf "%d", $4/1024/1024}')"
printf '\nEspace libre : %s Gio\n' "$free_gib"
if (( free_gib < MIN_FREE_GIB )); then
warn "Moins de ${MIN_FREE_GIB} Gio libres."
yes_no "Continuer malgré le risque de remplir le disque ?" n ||
exit 1
fi
if yes_no "Conserver les cartes de profondeur après le résultat final ?" n; then
KEEP_DEPTHMAPS=1
fi
if yes_no "Utiliser la Radeon via OpenGL pour l’extraction et le matching ?" o; then
USE_GPU=1
else
USE_GPU=0
fi
log "Préparation des images sélectionnées"
rm -rf "$WORK_DIR/images"
mkdir -p "$WORK_DIR/images"
index=1
for category in "${SELECTED_CATEGORIES[@]}"; do
while IFS= read -r -d '' image; do
target="$(readlink -f "$image")"
[[ -f "$target" ]] || continue
extension="${target##*.}"
extension="${extension,,}"
printf -v output_name 'img_%07d.%s' "$index" "$extension"
ln -s "$target" "$WORK_DIR/images/$output_name"
((index++))
done < <(
find "$TRI_DIR/$category" -maxdepth 1 -type l -print0 | sort -zV
)
done
IMAGE_COUNT="$(find "$WORK_DIR/images" -maxdepth 1 -type l | wc -l)"
(( IMAGE_COUNT > 0 )) || die "Aucune image sélectionnée."
ok "$IMAGE_COUNT images préparées."
DATABASE="$WORK_DIR/database.db"
if [[ ! -f "$WORK_DIR/.features.done" ]]; then
log "COLMAP — extraction des caractéristiques"
rm -f "$DATABASE"
run_logged "$WORK_DIR/logs/01-features.log" \
colmap feature_extractor \
--database_path "$DATABASE" \
--image_path "$WORK_DIR/images" \
--ImageReader.single_camera 1 \
--ImageReader.camera_model SIMPLE_RADIAL \
--FeatureExtraction.use_gpu "$USE_GPU"
touch "$WORK_DIR/.features.done"
else
ok "Extraction déjà terminée."
fi
if [[ ! -f "$WORK_DIR/.matching.done" ]]; then
log "COLMAP — matching séquentiel"
run_logged "$WORK_DIR/logs/02-matching.log" \
colmap sequential_matcher \
--database_path "$DATABASE" \
--FeatureMatching.use_gpu "$USE_GPU" \
--SequentialMatching.overlap "$SEQUENTIAL_OVERLAP"
touch "$WORK_DIR/.matching.done"
else
ok "Matching déjà terminé."
fi
if [[ ! -f "$WORK_DIR/.mapper.done" ]]; then
log "COLMAP — reconstruction clairsemée"
rm -rf "$WORK_DIR/sparse"
mkdir -p "$WORK_DIR/sparse"
run_logged "$WORK_DIR/logs/03-mapper.log" \
colmap mapper \
--database_path "$DATABASE" \
--image_path "$WORK_DIR/images" \
--output_path "$WORK_DIR/sparse"
touch "$WORK_DIR/.mapper.done"
else
ok "Reconstruction clairsemée déjà terminée."
fi
BEST_MODEL=""
BEST_REGISTERED=-1
while IFS= read -r model; do
analysis="$(colmap model_analyzer --path "$model" 2>&1 || true)"
registered="$(
awk -F': ' '/Registered images:/ {print $NF; exit}' <<<"$analysis" |
tr -dc '0-9'
)"
[[ -n "$registered" ]] || registered=0
printf '%s\n' "$analysis" > "$model/model-analysis.txt"
printf ' Modèle %-5s : %s images enregistrées\n' \
"$(basename "$model")" "$registered"
if (( registered > BEST_REGISTERED )); then
BEST_REGISTERED="$registered"
BEST_MODEL="$model"
fi
done < <(
find "$WORK_DIR/sparse" -mindepth 1 -maxdepth 1 -type d | sort -V
)
[[ -n "$BEST_MODEL" ]] || die "COLMAP n’a produit aucun modèle."
printf '%s\n' "$BEST_MODEL" > "$WORK_DIR/best-model.txt"
ok "Meilleur modèle : $BEST_REGISTERED/$IMAGE_COUNT images."
DENSE_DIR="$WORK_DIR/dense"
if [[ ! -f "$WORK_DIR/.undistort.done" ]]; then
log "COLMAP — correction des images"
rm -rf "$DENSE_DIR"
run_logged "$WORK_DIR/logs/04-undistort.log" \
colmap image_undistorter \
--image_path "$WORK_DIR/images" \
--input_path "$BEST_MODEL" \
--output_path "$DENSE_DIR" \
--output_type COLMAP
touch "$WORK_DIR/.undistort.done"
else
ok "Images déjà corrigées."
fi
if [[ ! -f "$WORK_DIR/openmvs/scene.mvs" ]]; then
log "OpenMVS — import du modèle COLMAP"
run_logged "$WORK_DIR/logs/05-interface-colmap.log" \
podman_openmvs \
/openmvs/InterfaceCOLMAP \
--input-file /data/dense \
--image-folder /data/dense/images \
--output-file /data/openmvs/scene.mvs \
--working-folder /data/openmvs \
--verbosity 1
else
ok "Projet OpenMVS déjà importé."
fi
if [[ ! -f "$WORK_DIR/openmvs/scene_dense.ply" ]]; then
log "OpenMVS — densification"
run_logged "$WORK_DIR/logs/06-densify.log" \
podman_openmvs \
/openmvs/DensifyPointCloud \
--input-file /data/openmvs/scene.mvs \
--output-file /data/openmvs/scene_dense.mvs \
--working-folder /data/openmvs \
--resolution-level "$RESOLUTION_LEVEL" \
--number-views "$NUMBER_VIEWS" \
--max-threads "$THREADS" \
--verbosity 1
else
ok "Nuage dense déjà généré."
fi
if [[ ! -f "$WORK_DIR/openmvs/scene_dense_mesh.ply" ]]; then
log "OpenMVS — reconstruction du maillage"
run_logged "$WORK_DIR/logs/07-reconstruct-mesh.log" \
podman_openmvs \
/openmvs/ReconstructMesh \
--input-file /data/openmvs/scene_dense.mvs \
--output-file /data/openmvs/scene_dense_mesh.mvs \
--working-folder /data/openmvs \
--max-threads "$THREADS" \
--min-point-distance 4 \
--verbosity 1
else
ok "Maillage déjà reconstruit."
fi
if [[ ! -f "$WORK_DIR/openmvs/scene_dense_mesh_refine.ply" ]]; then
log "OpenMVS — raffinement du maillage"
run_logged "$WORK_DIR/logs/08-refine-mesh.log" \
podman_openmvs \
/openmvs/RefineMesh \
--input-file /data/openmvs/scene_dense.mvs \
--mesh-file /data/openmvs/scene_dense_mesh.ply \
--output-file /data/openmvs/scene_dense_mesh_refine.mvs \
--working-folder /data/openmvs \
--resolution-level "$RESOLUTION_LEVEL" \
--max-threads "$THREADS" \
--verbosity 1
else
ok "Maillage déjà raffiné."
fi
if [[ ! -f "$WORK_DIR/openmvs/scene_dense_mesh_refine_texture.ply" ]]; then
log "OpenMVS — texturage"
run_logged "$WORK_DIR/logs/09-texture-mesh.log" \
podman_openmvs \
/openmvs/TextureMesh \
--input-file /data/openmvs/scene_dense.mvs \
--mesh-file /data/openmvs/scene_dense_mesh_refine.ply \
--output-file /data/openmvs/scene_dense_mesh_refine_texture.mvs \
--working-folder /data/openmvs \
--max-threads "$THREADS" \
--verbosity 1
else
ok "Maillage déjà texturé."
fi
if (( !KEEP_DEPTHMAPS )); then
log "Nettoyage des cartes de profondeur intermédiaires"
find "$WORK_DIR/openmvs" -maxdepth 1 -type f \
\( -name 'depth*.png' -o -name 'depth*.conf.png' \) \
-delete
fi
FINAL="$WORK_DIR/openmvs/scene_dense_mesh_refine_texture.ply"
[[ -f "$FINAL" ]] || die "Le modèle final est absent."
trap - EXIT
printf '\n%s%sSCAN 3D TERMINÉ%s\n' "$BOLD" "$GREEN" "$RESET"
printf 'Modèle texturé :\n %s\n' "$FINAL"
printf 'Images enregistrées : %s/%s\n' "$BEST_REGISTERED" "$IMAGE_COUNT"
printf 'Espace occupé : '
du -sh "$WORK_DIR" | awk '{print $1}'
printf '\nPour l’ouvrir manuellement :\n'
printf ' meshlab %q\n' "$FINAL"

View file

@ -1,430 +0,0 @@
#!/usr/bin/env python3
"""scan3d-watch — TUI Textual en lecture seule pour scan3d."""
from __future__ import annotations
import os
import re
import sys
from dataclasses import dataclass
from pathlib import Path
from time import monotonic
import psutil
from textual.app import App, ComposeResult
from textual.binding import Binding
from textual.containers import Horizontal, Vertical
from textual.widgets import Footer, Label, ProgressBar, Static
PROCESS_NAMES = {
"colmap",
"DensifyPointCloud",
"ReconstructMesh",
"RefineMesh",
"TextureMesh",
"InterfaceCOLMAP",
}
PROGRESS_PATTERNS = (
re.compile(r"Processing image \[(\d+)/(\d+)\]"),
re.compile(r"Estimated depth-maps (\d+) \((\d+)%"),
re.compile(r"Geometric-consistent estimated depth-maps (\d+) \((\d+)%"),
re.compile(r"Dense fused depth-maps (\d+) \((\d+)%"),
)
PHASES = (
("features", "Extraction"),
("sequential", "Matching séquentiel"),
("vocab", "Matching global"),
("transitive", "Matching transitif"),
("matching", "Matching"),
("mapper", "Mapper"),
("undistort", "Undistortion"),
("interface", "Import OpenMVS"),
("densify", "Densification"),
("reconstruct", "Maillage"),
("refine", "Raffinement"),
("texture", "Texturage"),
)
@dataclass
class Progress:
phase: str = "En attente"
current: int = 0
total: int = 0
percent: float = 0.0
message: str = ""
def human_bytes(value: int | float) -> str:
units = ("o", "Kio", "Mio", "Gio", "Tio")
number = float(value)
for unit in units:
if abs(number) < 1024 or unit == units[-1]:
return f"{number:.1f} {unit}"
number /= 1024
return f"{number:.1f} Tio"
def directory_size(path: Path) -> int:
total = 0
try:
for root, _dirs, files in os.walk(path):
for name in files:
try:
total += (Path(root) / name).stat().st_size
except OSError:
pass
except OSError:
pass
return total
def find_project(root: Path) -> Path:
scan3d = root / "scan3d"
return scan3d if scan3d.is_dir() else root
def latest_log(project: Path) -> Path | None:
logs: list[Path] = []
try:
logs = [path for path in project.rglob("*.log") if path.is_file()]
except OSError:
return None
return max(logs, key=lambda path: path.stat().st_mtime, default=None)
def read_tail(path: Path, lines: int = 12) -> list[str]:
try:
with path.open("rb") as file:
file.seek(0, os.SEEK_END)
size = file.tell()
block = 8192
data = b""
while size > 0 and data.count(b"\n") <= lines:
read_size = min(block, size)
size -= read_size
file.seek(size)
data = file.read(read_size) + data
return data.decode("utf-8", errors="replace").splitlines()[-lines:]
except OSError:
return []
def detect_progress(project: Path) -> Progress:
log = latest_log(project)
if log is None:
return Progress()
lower_name = log.name.lower()
phase = next(
(label for token, label in PHASES if token in lower_name),
log.stem,
)
result = Progress(phase=phase)
tail = read_tail(log, 120)
# COLMAP : extraction ou matching.
for line in reversed(tail):
match = re.search(r"Processing image \[(\d+)/(\d+)\]", line)
if match:
current = int(match.group(1))
total = int(match.group(2))
result.current = current
result.total = total
result.percent = current * 100 / total if total else 0
result.message = line.strip()
return result
# COLMAP Mapper : nombre d’images réellement enregistrées.
for line in reversed(tail):
match = re.search(r"num_reg_frames=(\d+)", line)
if not match:
continue
current = int(match.group(1))
# Le log est normalement dans projet-*/logs/.
work_dir = log.parent.parent
images_dir = work_dir / "images"
try:
total = sum(
1
for path in images_dir.iterdir()
if path.is_file() or path.is_symlink()
)
except OSError:
total = 0
result.current = current
result.total = total
result.percent = current * 100 / total if total else 0
result.message = line.strip()
return result
# OpenMVS : cartes de profondeur.
for line in reversed(tail):
match = re.search(
r"(?:Estimated|Geometric-consistent estimated|Dense fused) "
r"depth-maps (\d+) \((\d+)%",
line,
)
if match:
result.current = int(match.group(1))
result.percent = float(match.group(2))
result.message = line.strip()
return result
if tail:
result.message = tail[-1].strip()
return result
def amd_gpu() -> tuple[str, str, str]:
for card in sorted(Path("/sys/class/drm").glob("card[0-9]*")):
device = card / "device"
try:
if (device / "vendor").read_text().strip() != "0x1002":
continue
except OSError:
continue
busy = "?"
used = total = None
temperature = "?"
try:
busy = (device / "gpu_busy_percent").read_text().strip()
except OSError:
pass
try:
used = int((device / "mem_info_vram_used").read_text())
total = int((device / "mem_info_vram_total").read_text())
except (OSError, ValueError):
pass
for hwmon in (device / "hwmon").glob("hwmon*"):
try:
temperature = f"{int((hwmon / 'temp1_input').read_text()) / 1000:.0f}°C"
break
except (OSError, ValueError):
continue
vram = (
f"{human_bytes(used)}/{human_bytes(total)}"
if used is not None and total is not None
else "indisponible"
)
return f"{busy}%", vram, temperature
return "absent", "—", "—"
def active_process() -> str:
cpu_count = psutil.cpu_count(logical=True) or 1
rows: list[tuple[float, str]] = []
for process in psutil.process_iter(
["name", "cpu_percent", "memory_percent"]
):
try:
name = process.info["name"] or ""
if name not in PROCESS_NAMES:
continue
raw_cpu = float(process.info["cpu_percent"] or 0)
global_cpu = raw_cpu / cpu_count
memory = float(process.info["memory_percent"] or 0)
rows.append(
(
raw_cpu,
f"{name} CPU {global_cpu:.0f}% RAM {memory:.1f}%",
)
)
except (
psutil.NoSuchProcess,
psutil.AccessDenied,
TypeError,
):
continue
if not rows:
return "Aucun processus COLMAP/OpenMVS"
rows.sort(reverse=True)
return rows[0][1]
class Scan3DWatch(App[None]):
TITLE = "scan3d-watch"
SUB_TITLE = "lecture seule"
BINDINGS = [
Binding("q", "quit", "Quitter"),
Binding("r", "refresh_now", "Actualiser"),
Binding("l", "toggle_logs", "Logs"),
]
CSS = """
Screen {
layout: vertical;
background: #11111b;
color: #cdd6f4;
}
#title {
height: 1;
padding: 0 1;
background: #313244;
color: #cba6f7;
text-style: bold;
}
#phase {
height: 3;
padding: 0 1;
border: round #89b4fa;
}
ProgressBar {
height: 1;
margin: 0 1;
}
#stats {
height: 7;
padding: 0 1;
border: round #a6e3a1;
}
#project {
height: 5;
padding: 0 1;
border: round #f9e2af;
}
#logs {
height: 1fr;
min-height: 4;
padding: 0 1;
border: round #fab387;
overflow-y: hidden;
}
Footer {
height: 1;
}
.hidden {
display: none;
}
"""
def __init__(self, root: Path) -> None:
super().__init__()
self.root = root
self.project = find_project(root)
self.logs_visible = True
psutil.cpu_percent(interval=None)
def compose(self) -> ComposeResult:
yield Label("", id="title")
yield Static("", id="phase")
yield ProgressBar(total=100, show_eta=False, id="progress")
yield Static("", id="stats")
yield Static("", id="project")
yield Static("", id="logs")
yield Footer()
def on_mount(self) -> None:
self.refresh_data()
self.set_interval(1.0, self.refresh_data)
def action_refresh_now(self) -> None:
self.refresh_data()
def action_toggle_logs(self) -> None:
self.logs_visible = not self.logs_visible
logs = self.query_one("#logs")
logs.set_class(not self.logs_visible, "hidden")
def refresh_data(self) -> None:
progress = detect_progress(self.project)
memory = psutil.virtual_memory()
swap = psutil.swap_memory()
disk = psutil.disk_usage(self.root)
cpu = psutil.cpu_percent(interval=None)
gpu, vram, gpu_temp = amd_gpu()
self.query_one("#title", Label).update(
f"SCAN3D {self.root.name} • {self.project}"
)
progress_text = progress.phase
if progress.total:
progress_text += (
f"\n{progress.current}/{progress.total} "
f"({progress.percent:.1f}%)"
)
elif progress.percent:
progress_text += f"\n{progress.current} ({progress.percent:.1f}%)"
elif progress.message:
progress_text += "\nactivité détectée"
self.query_one("#phase", Static).update(progress_text)
self.query_one("#progress", ProgressBar).update(
total=100,
progress=max(0, min(100, progress.percent)),
)
self.query_one("#stats", Static).update(
"[b]Système[/b]\n"
f"CPU {cpu:.0f}% GPU {gpu} Temp GPU {gpu_temp}\n"
f"RAM {human_bytes(memory.used)}/{human_bytes(memory.total)} "
f"dispo {human_bytes(memory.available)}\n"
f"Swap {human_bytes(swap.used)}/{human_bytes(swap.total)} "
f"VRAM {vram}\n"
f"{active_process()}"
)
size = directory_size(self.project)
self.query_one("#project", Static).update(
"[b]Projet[/b]\n"
f"Taille {human_bytes(size)}\n"
f"Disque {human_bytes(disk.used)}/{human_bytes(disk.total)} "
f"libre {human_bytes(disk.free)}"
)
log = latest_log(self.project)
if log is None:
log_text = "[b]Logs[/b]\nAucun fichier .log trouvé"
else:
lines = read_tail(log, 8)
cleaned = [
re.sub(r"^[IWEF]\d+\s+\S+\s+\d+\s+", "", line)
for line in lines
]
log_text = f"[b]Logs — {log.name}[/b]\n" + "\n".join(cleaned)
self.query_one("#logs", Static).update(log_text)
def main() -> int:
root = Path(sys.argv[1] if len(sys.argv) > 1 else Path.cwd())
root = root.expanduser().resolve()
if not root.is_dir():
print(f"Dossier introuvable : {root}", file=sys.stderr)
return 1
Scan3DWatch(root).run()
return 0
if __name__ == "__main__":
raise SystemExit(main())

View file

@ -1,16 +0,0 @@
#!/usr/bin/env bash
app_id="$(
swaymsg -t get_tree |
jq -r '.. | objects | select(.focused? == true) |
(.app_id // .window_properties.class // "")'
)"
case "$app_id" in
limusic-app|LiMusic|limusic)
pkill -TERM -x limusic-app
;;
*)
swaymsg kill
;;
esac

View file

@ -0,0 +1,4 @@
#!/bin/sh
pkill waybar
waybar &

View file

@ -0,0 +1,139 @@
[Parameters]
folder_with_datafiles = ~/.config/calcure
calcurse_todo_file = ~/.local/share/calcurse/todo
calcurse_events_file = ~/.local/share/calcurse/apts
log_file = ~/.config/calcure/info.log
language = fr
default_view = calendar
default_calendar_view = monthly
birthdays_from_abook = Yes
show_keybindings = Yes
privacy_mode = No
show_weather = No
weather_city =
weather_metric_units = Yes
minimal_today_indicator = Yes
minimal_days_indicator = Yes
minimal_weekend_indicator = Yes
show_calendar_borders = No
show_moon_phases = No
cut_titles_by_cell_length = No
ask_confirmations = Yes
ask_confirmation_to_quit = Yes
use_unicode_icons = Yes
show_current_time = No
show_holidays = Yes
show_nothing_planned = Yes
one_timer_at_a_time = No
holiday_country = France
use_persian_calendar = No
start_week_day = 1
weekend_days = 6,7
refresh_interval = 1
data_reload_interval = 0
split_screen = Yes
right_pane_percentage = 25
journal_header = JOURNAL
event_icon = •
privacy_icon = •
today_icon = •
birthday_icon = ★
holiday_icon = ⛱
hidden_icon = ...
done_icon = ✔
todo_icon = •
important_icon = ‣
separator_icon = │
deadline_icon = ⚑
[Colors]
color_today = 2
color_events = 4
color_days = 7
color_day_names = 4
color_weekends = 1
color_weekend_names = 1
color_hints = 7
color_prompts = 7
color_confirmations = 1
color_birthdays = 1
color_holidays = 2
color_todo = 7
color_done = 6
color_title = 4
color_calendar_header = 4
color_important = 1
color_unimportant = 6
color_timer = 2
color_timer_paused = 7
color_time = 7
color_deadlines = 3
color_weather = 2
color_active_pane = 2
color_separator = 7
color_calendar_border = 7
color_ics_calendars = 2,3,1,7,4,5,2,3,1,7
color_background = -1
[Styles]
bold_today = No
bold_days = No
bold_day_names = No
bold_weekends = No
bold_weekend_names = No
bold_title = No
bold_active_pane = No
underlined_today = No
underlined_days = No
underlined_day_names = No
underlined_weekends = No
underlined_weekend_names = No
underlined_title = No
underlined_active_pane = No
strikethrough_done = No
[Event icons]
travel = ✈
plane = ✈
voyage = ✈
flight = ✈
airport = ✈
trip = 🏕
vacation = ⛱
holiday = ⛱
day-off = ⛱
hair = ✂
barber = ✂
beauty = ✂
nails = ✂
game = ♟
match = ♟
play = ♟
interview = 🎙️
conference = 🎙️
talk = 🎙️
dating = ♥
concert = ♪
dance = ♪
music = ♪
rehearsal = ♪
call = 🕻
zoom = 🕻
deadline = ⚑
over = ⚑
finish = ⚑
end = ⚑
doctor = ✚
dentist = ✚
medical = ✚
hospital = ✚
party = ☘
bar = ☘
museum = ⛬
meet = ⛬
sport = ⛷
gym = 🏋
training = ⛷
email = ✉
letter = ✉

View file

@ -0,0 +1 @@
1,2026,3,7,"ARP",1,once,normal
1 1 2026 3 7 ARP 1 once normal

View file

@ -0,0 +1 @@
[WARNING] Couldn't load birthdays. File. /home/fy59/.abook/addressbook does not exist.

View file

View file

@ -0,0 +1,3 @@
CompileFlags:
Add:
- "-std=c17"

View file

@ -1 +0,0 @@
max-items 50

3
cliphist/.config/config Normal file
View file

@ -0,0 +1,3 @@
max-items 50
max-size 100000

View file

@ -1,4 +1,3 @@
file:///home/fy59/Documents/Lardon/lardon3d
file:///home/fy59/Downloads file:///home/fy59/Downloads
file:///home/fy59/Ansible file:///home/fy59/Ansible
file:///home/fy59/Documents file:///home/fy59/Documents

View file

@ -0,0 +1,3 @@
[Settings]
gtk-theme-name=Adwaita-dark
gtk-icon-theme-name = "Tela-dracula-dark"

View file

@ -0,0 +1,3 @@
[Settings]
gtk-theme-name=Adwaita-dark
gtk-icon-theme-name = "Tela-dracula-dark"

View file

@ -0,0 +1 @@
/run/user/1000/hyprwhspr/audio_level

View file

@ -0,0 +1 @@
/run/user/1000/hyprwhspr/recording_control

View file

@ -0,0 +1 @@
/run/user/1000/hyprwhspr/recording_status

View file

@ -0,0 +1,34 @@
##############################
# #
# Autostart #
# #
##############################
# =================================================
# Filtre lumière bleue (wlsunset)
# Notifications (swaync)
# gnome-keyring-daemon
# Verrouillage auto (swayidle)
# protonmail-bridge
# cliphist
# proton-pass
# exec-once=swayidle -w timeout 300 '~/.config/mango/scripts/lock.sh' timeout 310 'wlopm --off "*"' resume 'wlopm --on "*"' before-sleep '~/.config/mango/scripts/lock.sh'
# Les outils précédent ont été ajouter à systemd --user
#
# =================================================
# Wallpapers
exec-once=swaybg -i ~/.wallpapers/arch_rainbow.jpg
# Lancement au démarrage
exec-once=kitty --class kitty-1
exec-once=kitty --class kitty-2
exec-once=kitty --class kitty-3
exec-once=kitty --class kitty-mon --directory $HOME
exec-once=chromium
exec-once=gtk-launch chrome-hnpfjngllnobngcgfapefoaidbinmjnm-Default
exec-once=gtk-launch
exec-once=thunderbird
exec-once=spotify-launcher
exec-once=waybar
exec-once=AppFlowy

View file

@ -0,0 +1,35 @@
##############################
# #
# Binds Applications #
# #
##############################
# Applications system
binds=SUPER,Return,spawn,kitty
binds=SUPER+CTRL,t,spawn,thunderbird
binds=SUPER+SHIFT,b,spawn,blueman-manager
binds=SUPER+SHIFT,p,spawn,proton-pass
binds=ALT,p,toggle_named_scratchpad,Proton Pass,none,proton-pass
binds=SUPER+SHIFT,m,spawn,protonmail-bridge
binds=SUPER+CTRL,l,spawn,swaylock
binds=SUPER+CTRL,e,spawn,wofi --cache-file=/dev/null -Dimage_size=26 -Dynamic_lines=true --location top --yoffset=10 --width=600 --height=300 --gtk-dark --show drun
binds=SUPER,v,spawn,~/.config/mango/scripts/copypast
binds=NONE,Print,spawn,~/.config/mango/scripts/screenshot-clip.sh
binds=SUPER+CTRL,f,spawn,AppFlowy
binds=SUPER+CTRL,g,spawn,gimp
# Browsers & net
binds=SUPER,b,spawn,chromium
binds=SUPER+SHIFT,f,spawn,firefox
binds=SUPER,t,spawn,thunderbird
# IA's
binds=SUPER,m,spawn,spotify-launcher
# Virtualisation
binds=SUPER+SHIFT,v,spawn,virt-manager
# Fichiers
binds=SUPER+SHIFT,t,spawn,thunar
binds=ALT,y,spawn,kitty --class kitty-yazi -- sh -c "yazi"

View file

@ -0,0 +1,94 @@
##############################
# #
# Navigation bindings #
# #
##############################
# switch window focus
binds=SUPER,Tab,focusstack,next
binds=SUPER,Left,focusdir,left
binds=SUPER,Right,focusdir,right
binds=SUPER,Up,focusdir,up
binds=SUPER,Down,focusdir,down
# swap window
binds=SUPER+SHIFT,Up,exchange_client,up
binds=SUPER+SHIFT,Down,exchange_client,down
binds=SUPER+SHIFT,Left,exchange_client,left
binds=SUPER+SHIFT,Right,exchange_client,right
# switch window status
binds=SUPER,g,toggleglobal,
binds=SUPER,Tab,toggleoverview,
binds=SUPER,backslash,togglefloating,
binds=SUPER,a,togglemaximizescreen,
binds=SUPER,f,togglefullscreen,
binds=SUPER+SHIFT,f,togglefakefullscreen,
binds=SUPER,i,minimized,
binds=SUPER,o,toggleoverlay,
binds=SUPER+SHIFT,I,restore_minimized
binds=SUPER,z,toggle_scratchpad
# tag switch
binds=ALT,Left,viewtoleft,0
binds=ALT+SHIFT,Left,viewtoleft_have_client,0
binds=ALT,Right,viewtoright,0
binds=ALT+SHIFT,Right,viewtoright_have_client,0
binds=ALT+SUPER,Left,tagtoleft,0
binds=ALT+SUPER,Right,tagtoright,0
binds=ALT,ampersand,view,1,0
binds=ALT,eacute,view,2,0
binds=ALT,quotedbl,view,3,0
binds=ALT,apostrophe,view,4,0
binds=ALT,parenleft,view,5,0
binds=ALT,minus,view,6,0
binds=ALT,egrave,view,7,0
binds=ALT,underscore,view,8,0
binds=ALT,ccedilla,view,9,0
# tag: move client to the tag and focus it
# tagsilent: move client to the tag and not focus it
# bind=ALT,1,tagsilent,1
binds=ALT+SUPER,ampersand,tag,1,0
binds=ALT+SUPER,eacute,tag,2,0
binds=ALT+SUPER,quotedbl,tag,3,0
binds=ALT+SUPER,apostrophe,tag,4,0
binds=ALT+SUPER,parenleft,tag,5,0
binds=ALT+SUPER,minus,tag,6,0
binds=ALT+SUPER,egrave,tag,7,0
binds=ALT+SUPER,underscore,tag,8,0
binds=ALT+SUPER,ccedilla,tag,9,0
# monitor switch
binds=CTRL+SHIFT,Left,focusmon,left
binds=CTRL+SHIFT,Right,focusmon,right
binds=CTRL+SUPER,Left,tagmon,left
binds=CTRL+SUPER,Right,tagmon,right
# gaps
binds=ALT+SHIFT,X,incgaps,1
binds=ALT+SHIFT,Z,incgaps,-1
binds=ALT+SHIFT,R,togglegaps
# movewin
# binds=CTRL+SHIFT,Up,movewin,+0,-50
# binds=CTRL+SHIFT,Down,movewin,+0,+50
# binds=CTRL+SHIFT,Left,movewin,-50,+0
# binds=CTRL+SHIFT,Right,movewin,+50,+0
# resizewin
binds=SUPER+CTRL,Up,resizewin,+0,-10
binds=SUPER+CTRL,Down,resizewin,+0,+10
binds=SUPER+CTRL,Left,resizewin,-10,+0
binds=SUPER+CTRL,Right,resizewin,+10,+0
# Mouse Button Bindings
# btn_left and btn_right can't bind none mod key
mousebind=SUPER,btn_left,moveresize,curmove
mousebind=NONE,btn_middle,togglemaximizescreen,0
mousebind=SUPER,btn_right,moveresize,curresize
# Axis Bindings
axisbind=SUPER,UP,viewtoleft_have_client
# axisbind=SUPER,DOWN,viewtoright_have_client

View file

@ -0,0 +1,39 @@
##############################
# #
# Binds sys #
# #
##############################
# Key Bindings
# key name refer to `xev` or `wev` command output,
# mod keys name: super,ctrl,alt,shift,none
# Layout Bindings
# scrolle5 layout
binds=ALT,e,set_proportion,0.5
binds=ALT+SHIFT,e,set_proportion,1
binds=SUPER,x,switch_proportion_preset,
# switch layou5
binds=SUPER,n,switch_layout
# reload config
binds=SUPER,r,reload_config
binds=SUPER+CTRL,w,~/.config/waybar/scripts/restartWaybar.sh
# exit
binds=SUPER+CTRL,q,quit
binds=SUPER,q,killclient
# Brightness
bind=NONE,XF86MonBrightnessUp,spawn,brightnessctl set +2%
bind=SHIFT,XF86MonBrightnessUp,spawn,brightnessctl set 100%
bind=NONE,XF86MonBrightnessDown,spawn,brightnessctl set 2%-
bind=SHIFT,XF86MonBrightnessDown,spawn,brightnessctl set 10%
# Volume
bind=NONE,XF86AudioRaiseVolume,spawn,wpctl set-volume @DEFAULT_SINK@ 2%+
bind=NONE,XF86AudioLowerVolume,spawn,wpctl set-volume @DEFAULT_SINK@ 2%-
bind=NONE,XF86AudioMute,spawn,wpctl set-mute @DEFAULT_SINK@ toggle
bind=SHIFT,XF86AudioMute,spawn,wpctl set-mute @DEFAULT_SOURCE@ toggle

View file

@ -0,0 +1,42 @@
##############################
# #
# Mango Config #
# #
##############################
# More option see https://github.com/DreamMaoMao/mango/wiki/
# Sources
source=~/.config/mango/rules.conf
source=~/.config/mango/style.conf
source=~/.config/mango/bind_apps.conf
source=~/.config/mango/bind_navigation.conf
source=~/.config/mango/bind_sys.conf
source=~/.config/mango/gestures.conf
source=~/.config/mango/layout_settings.conf
source=~/.config/mango/input.conf
source=~/.config/mango/output.conf
source=~/.config/mango/autostart.conf
# Overview Setting
hotarea_size=10
enable_hotarea=1
ov_tab_mode=0
overviewgappi=5
overviewgappo=30
# Misc
no_border_when_single=0
axis_bind_apply_timeout=100
focus_on_activate=1
idleinhibit_ignore_visible=0
sloppyfocus=1
warpcursor=1
focus_cross_monitor=0
focus_cross_tag=0
enable_floating_snap=0
snap_distance=30
cursor_size=24
drag_tile_to_tile=1
drag_tile_small=1

View file

@ -0,0 +1,11 @@
##############################
# #
# Gestures #
# #
##############################
# 3-finger: Window focus
gesturebind=none,left,3,focusdir,right
gesturebind=none,right,3,focusdir,left
gesturebind=none,up,3,focusdir,up
gesturebind=none,down,3,focusdir,down

View file

@ -0,0 +1,29 @@
##############################
# #
# Input #
# #
##############################
# keyboard
repeat_rate=25
repeat_delay=600
numlockon=1
xkb_rules_layout=fr
# Trackpad
# need relogin to make it apply
disable_trackpad=0
tap_to_click=1
tap_and_drag=1
drag_lock=1
trackpad_natural_scrolling=1
disable_while_typing=1
left_handed=0
middle_button_emulation=0
swipe_min_threshold=1
button_map=1
# mouse
# need relogin to make it apply
mouse_natural_scrolling=1

View file

@ -0,0 +1,33 @@
##############################
# #
# Layout settings #
# #
##############################
# layout support:
# tile,scroller,grid,deck,monocle,center_tile,vertical_tile,vertical_scroller
tagrule=id:1,layout_name:tile
tagrule=id:2,layout_name:scroller
tagrule=id:3,layout_name:scroller
tagrule=id:4,layout_name:scroller
tagrule=id:5,layout_name:scroller
tagrule=id:6,layout_name:scroller
tagrule=id:7,layout_name:scroller
tagrule=id:8,layout_name:scroller
tagrule=id:9,layout_name:scroller
# Scroller Layout Setting
scroller_structs=20
scroller_default_proportion=0.8
scroller_focus_center=0
scroller_prefer_center=0
edge_scroller_pointer_focus=1
scroller_default_proportion_single=1.0
scroller_proportion_preset=0.5,0.8,1.0
# Master-Stack Layout Setting
new_is_master=1
default_mfact=0.55
default_nmaster=1
smartgaps=0

View file

@ -0,0 +1,9 @@
##############################
# #
# Output #
# #
##############################
# monitor
monitorrule=name:^eDP-1$,width:3200,height:2000,refresh:120,scale:1.5

View file

@ -0,0 +1,41 @@
##############################
# #
# Rules #
# #
##############################
# Tag 1 : shell / terminaux / Perplexity
windowrule=tags:1,appid:kitty-1
windowrule=tags:1,appid:kitty-2
windowrule=tags:1,appid:kitty-3
# Tag 2 : web
windowrule=tags:2,scroller_proportion:1,appid:chromium
windowrule=tags:2,appid:firefox
# Tag 5 : web
windowrule=tags:5,scroller_proportion:1,appid:AppFlowy
# Tag 6 : web
windowrule=tags:6,scroller_proportion:1,appid:kitty-mon
# Tag 7 : web
windowrule=tags:7,scroller_proportion:1,appid:chrome-hnpfjngllnobngcgfapefoaidbinmjnm-Default
# Tag 8 : mail
windowrule=tags:8,scroller_proportion:0.5,appid:proton-bridge
windowrule=tags:8,scroller_proportion:1,appid:org.mozilla.Thunderbird
# Tag 9 : musique
# adapte la valeur d'appid à ce que ton script affiche pour Spotify
windowrule=tags:9,scroller_proportion:1,appid:Spotify
windowrule=isfloating:1,width:800,height:600,offsetx:0,offsety:0,appid:blueman-manager
windowrule=isnamedscratchpad:1,width:1000,height:700,appid:Proton Pass
# layer rule
layerrule=animation_type_open:slide,layer_name:wofi
layerrule=animation_type_close:slide,layer_name:wofi
# Specifics rules
windowrule=scroller_proportion:0.5,appid:kitty-yazi

View file

@ -0,0 +1,60 @@
#!/usr/bin/env bash
thumb_dir="${XDG_CACHE_HOME:-$HOME/.cache}/cliphist/thumbs"
mkdir -p "$thumb_dir"
clip_list="$(cliphist list)"
# Nettoyer les vignettes orphelines
for thumb in "$thumb_dir"/*; do
[ -e "$thumb" ] || continue
clip_id="${thumb##*/}"
clip_id="${clip_id%.*}"
if ! printf '%s\n' "$clip_list" | rg -q "^${clip_id}[[:space:]]"; then
rm -f "$thumb"
fi
done
read -r -d '' prog <<EOF
match(\$0, /^([0-9]+)[[:space:]]+\\[\\[ binary data .* (png|jpeg|jpg|bmp|webp) [0-9]+x[0-9]+ \\]\\]/, grp) {
id = grp[1]
ext = grp[2]
if (ext == "jpeg") ext = "jpg"
image = id "." ext
thumb = "$thumb_dir/" image
cmd = "[ -f '" thumb "' ] || printf '%s\\n' '" \$0 "' | cliphist decode | magick - -resize '256x256>' '" thumb "'"
system(cmd)
print "img:" thumb
next
}
1
EOF
choice=$(
gawk "$prog" <<< "$clip_list" |
wofi -I --dmenu --cache-file=/dev/null \
-Dimage_size=100 -Dynamic_lines=true \
--xoffset=600 --yoffset=20 --width=45% --height=45% --gtk-dark
)
[ -z "$choice" ] && exit 1
if [ "${choice:0:4}" = "img:" ]; then
thumb_file="${choice:4}"
clip_id="${thumb_file##*/}"
clip_id="${clip_id%.*}"
printf '%s\n' "$clip_list" |
rg "^${clip_id}[[:space:]]" |
head -n 1 |
cliphist decode |
wl-copy
else
printf '%s\n' "$choice" |
cliphist decode |
wl-copy
fi

View file

@ -0,0 +1,9 @@
#!/usr/bin/env bash
img="/tmp/gtklock-shot.png"
blur="/tmp/gtklock-blur.png"
grim "$img"
magick "$img" -blur 0x14 -brightness-contrast -8x-5 "$blur"
pidof gtklock || gtklock -d

View file

@ -0,0 +1,2 @@
#!/usr/bin/env bash
grim -g "$(slurp)" - | wl-copy

View file

@ -0,0 +1,75 @@
##############################
# #
# Style #
# #
##############################
# Window effect
blur=0
blur_layer=0
blur_optimized=1
blur_params_num_passes = 2
blur_params_radius = 5
blur_params_noise = 0.02
blur_params_brightness = 0.9
blur_params_contrast = 0.9
blur_params_saturation = 1.2
shadows = 0
layer_shadows = 0
shadow_only_floating = 1
shadows_size = 10
shadows_blur = 15
shadows_position_x = 0
shadows_position_y = 0
shadowscolor= 0x000000ff
border_radius=4
no_radius_when_single=0
focused_opacity=1.0
unfocused_opacity=0.8
# Animation Configuration(support type:zoom,slide)
# tag_animation_direction: 1-horizontal,0-vertical
animations=1
layer_animations=1
animation_type_open=slide
animation_type_close=slide
animation_fade_in=1
animation_fade_out=1
tag_animation_direction=1
zoom_initial_ratio=0.4
zoom_end_ratio=0.8
fadein_begin_opacity=0.5
fadeout_begin_opacity=0.8
animation_duration_move=250
animation_duration_open=220
animation_duration_tag=100
animation_duration_close=180
animation_duration_focus=0
animation_curve_open=0.46,1.0,0.29,1
animation_curve_move=0.46,1.0,0.29,1
animation_curve_tag=0.46,1.0,0.29,1
animation_curve_close=0.08,0.92,0,1
animation_curve_focus=0.46,1.0,0.29,1
animation_curve_opafadeout=0.5,0.5,0.5,0.5
animation_curve_opafadein=0.46,1.0,0.29,1
# Appearance
gappih=5
gappiv=5
gappoh=10
gappov=10
scratchpad_width_ratio=0.8
scratchpad_height_ratio=0.9
borderpx=2
rootcolor=0x201b14ff
bordercolor=0x444444ff
dropcolor=0x8FBA7C55
focuscolor=0xb4befeff
maximizescreencolor=0x89aa61ff
urgentcolor=0xad401fff
scratchpadcolor=0x516c93ff
globalcolor=0xb153a7ff
overlaycolor=0x14a57cff

View file

@ -1,32 +1,33 @@
{ {
"LuaSnip": { "branch": "master", "commit": "0abc8f390b278c3b4aabc4c004ac8a088b65cf24" }, "LuaSnip": { "branch": "master", "commit": "0abc8f390b278c3b4aabc4c004ac8a088b65cf24" },
"bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" }, "bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" },
"catppuccin": { "branch": "main", "commit": "edefef779ab08ce1a4a404713e3012b0d202bd35" }, "catppuccin": { "branch": "main", "commit": "c7c692a0ad3080710893abbae100171819a3e4be" },
"cmp-buffer": { "branch": "main", "commit": "b74fab3656eea9de20a9b8116afa3cfc4ec09657" }, "cmp-buffer": { "branch": "main", "commit": "b74fab3656eea9de20a9b8116afa3cfc4ec09657" },
"cmp-nvim-lsp": { "branch": "main", "commit": "cbc7b02bb99fae35cb42f514762b89b5126651ef" }, "cmp-nvim-lsp": { "branch": "main", "commit": "cbc7b02bb99fae35cb42f514762b89b5126651ef" },
"cmp-path": { "branch": "main", "commit": "c642487086dbd9a93160e1679a1327be111cbc25" }, "cmp-path": { "branch": "main", "commit": "c642487086dbd9a93160e1679a1327be111cbc25" },
"cmp_luasnip": { "branch": "master", "commit": "98d9cb5c2c38532bd9bdb481067b20fea8f32e90" }, "cmp_luasnip": { "branch": "master", "commit": "98d9cb5c2c38532bd9bdb481067b20fea8f32e90" },
"friendly-snippets": { "branch": "main", "commit": "b4d01b0fdf3c9a549961c2f9ffe8dc09be166219" }, "friendly-snippets": { "branch": "main", "commit": "6cd7280adead7f586db6fccbd15d2cac7e2188b9" },
"lazy.nvim": { "branch": "main", "commit": "306a05526ada86a7b30af95c5cc81ffba93fef97" }, "lazy.nvim": { "branch": "main", "commit": "306a05526ada86a7b30af95c5cc81ffba93fef97" },
"lualine.nvim": { "branch": "master", "commit": "221ce6b2d999187044529f49da6554a92f740a96" }, "lualine.nvim": { "branch": "master", "commit": "221ce6b2d999187044529f49da6554a92f740a96" },
"mason-lspconfig.nvim": { "branch": "main", "commit": "137bd0feba2c1885545b6934d36f5e5aa6adb486" }, "mason-lspconfig.nvim": { "branch": "main", "commit": "7adc933dabcc7c86ae6b07aff7ee68eac398491f" },
"mason.nvim": { "branch": "main", "commit": "2a6940af80375532e5e9e7c1f2fc6319a1b7a69d" }, "mason.nvim": { "branch": "main", "commit": "2a6940af80375532e5e9e7c1f2fc6319a1b7a69d" },
"mini.starter": { "branch": "main", "commit": "25de4998197d59673f1918968a8f4060195edca0" }, "mini.starter": { "branch": "main", "commit": "25de4998197d59673f1918968a8f4060195edca0" },
"neo-tree.nvim": { "branch": "v3.x", "commit": "1a14083046d96e88e361d1da00761c40d45012f3" }, "neo-tree.nvim": { "branch": "v3.x", "commit": "ebd66767191714e008ce73b769518a763ff31bdc" },
"nui.nvim": { "branch": "main", "commit": "10fc361835c856ba4233ef5ea135b919bf3dce97" }, "neowiki.nvim": { "branch": "main", "commit": "85dddf6057b07d4d6772b2f90e754a18e958a865" },
"nvim-autopairs": { "branch": "master", "commit": "430522f95fe4fb7c511ec64f8c1a90cc6a66c05c" }, "nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" },
"nvim-autopairs": { "branch": "master", "commit": "7b9923abad60b903ece7c52940e1321d39eccc79" },
"nvim-cmp": { "branch": "main", "commit": "2ffe79f1f021def8dd1fcd81deb16f1bb0d989f3" }, "nvim-cmp": { "branch": "main", "commit": "2ffe79f1f021def8dd1fcd81deb16f1bb0d989f3" },
"nvim-colorizer.lua": { "branch": "master", "commit": "72a05f62c52241bc7441c820eb53946f92b2e6a4" }, "nvim-colorizer.lua": { "branch": "master", "commit": "72a05f62c52241bc7441c820eb53946f92b2e6a4" },
"nvim-lsp-file-operations": { "branch": "master", "commit": "0b939aff068c859b6f8cdbc3b3e676d038e6e15d" }, "nvim-lsp-file-operations": { "branch": "master", "commit": "b9c795d3973e8eec22706af14959bc60c579e771" },
"nvim-lspconfig": { "branch": "master", "commit": "046b1a797af1effe8e0474b9af9657a3761ec58a" }, "nvim-lspconfig": { "branch": "master", "commit": "d592c1e6ad9a0a01b3d5ed3f0345d68407167181" },
"nvim-tcss": { "branch": "main", "commit": "bf9001416158f32fe7e92c42de94de3595aa13e5" }, "nvim-tcss": { "branch": "main", "commit": "bf9001416158f32fe7e92c42de94de3595aa13e5" },
"nvim-treesitter": { "branch": "main", "commit": "f603a2f4da48728f80257fb5fbb90145fd1dc173" }, "nvim-treesitter": { "branch": "main", "commit": "a45a920ec04cda5624f6dea0ff6454c81c3ad2d5" },
"nvim-ts-autotag": { "branch": "main", "commit": "88c1453db4ba7dd24131086fe51fdf74e587d275" }, "nvim-ts-autotag": { "branch": "main", "commit": "88c1453db4ba7dd24131086fe51fdf74e587d275" },
"nvim-web-devicons": { "branch": "master", "commit": "58447c1fca354bbf184425e4a8d01deecbd6f3c4" }, "nvim-web-devicons": { "branch": "master", "commit": "2ae6958df7ced50baac5035cec0c15799eedfbf7" },
"nvim-window-picker": { "branch": "main", "commit": "6382540b2ae5de6c793d4aa2e3fe6dbb518505ec" }, "nvim-window-picker": { "branch": "main", "commit": "6382540b2ae5de6c793d4aa2e3fe6dbb518505ec" },
"outline.nvim": { "branch": "main", "commit": "2a132953b944561d45b52e4541ebfff71934a742" }, "outline.nvim": { "branch": "main", "commit": "2a132953b944561d45b52e4541ebfff71934a742" },
"plenary.nvim": { "branch": "master", "commit": "74b06c6c75e4eeb3108ec01852001636d85a932b" }, "plenary.nvim": { "branch": "master", "commit": "74b06c6c75e4eeb3108ec01852001636d85a932b" },
"render-markdown.nvim": { "branch": "main", "commit": "640a3ec6d538bad17c328be373c7cad0293d9589" }, "render-markdown.nvim": { "branch": "main", "commit": "f422cb5c6855f150e2ddcfaf44e7157b98b34f6a" },
"rustaceanvim": { "branch": "main", "commit": "e9c5aaba16fead831379d5f44617547a90b913c7" }, "rustaceanvim": { "branch": "main", "commit": "e9c5aaba16fead831379d5f44617547a90b913c7" },
"telescope-file-browser.nvim": { "branch": "master", "commit": "3610dc7dc91f06aa98b11dca5cc30dfa98626b7e" }, "telescope-file-browser.nvim": { "branch": "master", "commit": "3610dc7dc91f06aa98b11dca5cc30dfa98626b7e" },
"telescope.nvim": { "branch": "0.1.x", "commit": "a0bbec21143c7bc5f8bb02e0005fa0b982edc026" }, "telescope.nvim": { "branch": "0.1.x", "commit": "a0bbec21143c7bc5f8bb02e0005fa0b982edc026" },

View file

@ -31,36 +31,5 @@ require("lazy").setup({
-- colorscheme that will be used when installing plugins. -- colorscheme that will be used when installing plugins.
install = { colorscheme = { "habamax" } }, install = { colorscheme = { "habamax" } },
-- automatically check for plugin updates -- automatically check for plugin updates
checker = { enabled = false }, checker = { enabled = true },
})
local lazy_update_group =
vim.api.nvim_create_augroup("LazyAutoUpdate", { clear = true })
-- Fermer l'interface lorsque la mise à jour est terminée
vim.api.nvim_create_autocmd("User", {
group = lazy_update_group,
pattern = "LazyUpdate",
once = true,
callback = function()
vim.schedule(function()
local ok, view = pcall(require, "lazy.view")
if ok and view.view and view.visible() then
view.view:close()
end
end)
end,
})
-- Lancer la mise à jour à l'ouverture de Neovim
vim.api.nvim_create_autocmd("VimEnter", {
group = lazy_update_group,
once = true,
callback = function()
vim.schedule(function()
require("lazy").update({
show = true,
})
end)
end,
}) })

View file

@ -0,0 +1,17 @@
return {
"echaya/neowiki.nvim",
opts = {
wiki_dirs = {
-- neowiki.nvim supports both absolute and tilde-expanded paths
{ name = "Pentest", path = "~/.dotfiles/wiki/Wiki/pentest/" },
{ name = "Osint", path = "~/.dotfiles/wiki/Wiki/osint/" },
{ name = "Python", path = "~/.dotfiles/wiki/Wiki/python/" },
{ name = "ArchASP", path = "~/.dotfiles/wiki/Wiki/archasp/" },
},
},
keys = {
{ "<leader>ww", "<cmd>lua require('neowiki').open_wiki()<cr>", desc = "Open Wiki" },
{ "<leader>wW", "<cmd>lua require('neowiki').open_wiki_floating()<cr>", desc = "Open Wiki in Floating Window" },
{ "<leader>wT", "<cmd>lua require('neowiki').open_wiki_new_tab()<cr>", desc = "Open Wiki in Tab" },
},
}

View file

@ -0,0 +1,12 @@
return {
"nvim-tree/nvim-tree.lua",
dependencies = { "nvim-tree/nvim-web-devicons" },
opts = {
hijack_netrw = true,
sync_root_with_cwd = true,
view = { width = 30 },
renderer = { group_empty = true },
filters = { dotfiles = false },
},
}

View file

@ -21,16 +21,21 @@ return {
}, "\n"), }, "\n"),
items = { items = {
starter.sections.recent_files(8), starter.sections.recent_files(8),
{
name = "Open Wiki",
action = "edit ~/wiki/index.md", -- adapte le chemin
section = "󰖬 Wiki",
},
starter.sections.telescope(), starter.sections.telescope(),
{ {
name = "Open Nvim config", name = "Open Nvim config",
action = "edit ~/.config/nvim/init.lua", action = "edit ~/.config/nvim/init.lua",
section = "Config", section = "Config",
}, },
{ {
name = "Quit", name = "Quit",
action = "quit", action = "quit",
section = "Actions", section = "󰈆 Actions",
}, },
}, },
footer = "Happy editing – from FY59's config", footer = "Happy editing – from FY59's config",
@ -38,3 +43,4 @@ return {
end, end,
}, },
} }

View file

@ -29,7 +29,9 @@ Objectif : un setup léger, lisible, facile à maintenir et à hacker.
│   ├── lsp.lua │   ├── lsp.lua
│   ├── mini-icons.lua │   ├── mini-icons.lua
│   ├── mini_map.lua │   ├── mini_map.lua
│   ├── neowiki.lua
│   ├── nvim-autopair.lua │   ├── nvim-autopair.lua
│   ├── nvim-tree.lua.old
│   ├── outline.lua │   ├── outline.lua
│   ├── render-markdown.lua │   ├── render-markdown.lua
│   ├── starter.lua │   ├── starter.lua
@ -151,9 +153,16 @@ Keymaps personnalisés :
- lewis6991/gitsigns.nvim pour les signes Git dans la marge. - lewis6991/gitsigns.nvim pour les signes Git dans la marge.
- tpope/vim-fugitive - tpope/vim-fugitive
9. starter 9. Notes / Wiki
- echaya/neowiki.nvim comme wiki moderne (successeur de Vimwiki).
10. starter
- nvim-mini/mini.starter - nvim-mini/mini.starter
Support Markdown + Treesitter, GTD, multiple wikis.
Mappings typiques (configurable) : <leader>ww pour ouvrir le wiki, navigation entre pages, tâches, etc.
## Keymaps principaux ## Keymaps principaux
- folke/which-key.nvim - folke/which-key.nvim
@ -186,3 +195,4 @@ LSP
- <leader>h : clear search. - <leader>h : clear search.
En Visuel : Tab / Shift-Tab → indent/désindent la sélection. En Visuel : Tab / Shift-Tab → indent/désindent la sélection.

View file

@ -0,0 +1,105 @@
{
"$schema": "https://opencode.ai/config.json",
"autoupdate": false,
"enabled_providers": [
"ollama"
],
"model": "ollama/labfy-coder:latest",
"provider": {
"ollama": {
"npm": "@ai-sdk/openai-compatible",
"name": "Ollama local",
"options": {
"baseURL": "http://127.0.0.1:11434/v1",
"timeout": 600000,
"chunkTimeout": 120000
},
"models": {
"labfy-coder:latest": {
"name": "Labfy Coder",
"limit": {
"context": 6144,
"output": 1024
}
}
}
}
},
"permission": {
"*": "ask",
"read": {
"*": "allow",
"*.env": "deny",
"*.env.*": "deny",
"Enquete.sqlite": "deny",
"**/Enquete.sqlite": "deny"
},
"glob": "allow",
"grep": "allow",
"lsp": "allow",
"question": "allow",
"edit": {
"*": "ask",
"Enquete.sqlite": "deny",
"**/Enquete.sqlite": "deny"
},
"bash": {
"*": "ask",
"git status*": "allow",
"git diff*": "allow",
"git log*": "allow",
"git branch --show-current": "allow",
"git grep*": "allow",
"rg *": "allow",
"grep *": "allow",
"git commit*": "deny",
"git push*": "deny",
"git reset*": "deny",
"git clean*": "deny",
"rm *": "deny",
"sudo *": "deny",
"doas *": "deny",
"curl *": "deny",
"wget *": "deny",
"ssh *": "deny",
"scp *": "deny",
"rsync *": "deny"
},
"external_directory": "deny",
"websearch": "allow",
"webfetch": "ask",
"websearch": "deny",
"task": "deny",
"skill": "deny",
"doom_loop": "deny"
},
"compaction": {
"auto": true,
"prune": true,
"reserved": 2048
},
"watcher": {
"ignore": [
".git/**",
"build/**",
"*.o",
"tests/tmp/**"
]
}
}

View file

@ -31,8 +31,6 @@ Personal SwayFX configuration, modular and lightweight, designed for everyday Wa
- swayfx - swayfx
- swaylock - swaylock
- swayidle - swayidle
- tlp
- tlp-pd
### Bar and status ### Bar and status
- i3status-rs - i3status-rs
@ -47,6 +45,8 @@ Personal SwayFX configuration, modular and lightweight, designed for everyday Wa
- cliphist - cliphist
- wlsunset - wlsunset
- brightnessctl - brightnessctl
- powerprofilesctl
- swaync
- nm-connection-editor - nm-connection-editor
- playerctl - playerctl
@ -87,7 +87,7 @@ Example:
The Sway bar is placed at the top and uses `i3status-rs` as its backend. The Sway bar is placed at the top and uses `i3status-rs` as its backend.
The i3status-rust configuration includes: The `i3status.toml` file includes:
- workspaces, - workspaces,
- focused window, - focused window,
- music, - music,
@ -103,8 +103,11 @@ The i3status-rust configuration includes:
## Autostart ## Autostart
On startup, Sway launches the inactive-window transparency helper, LiMusic and On startup, the config launches:
`autotiling`. Wlsunset, Cliphist and swayidle are owned by user systemd units. - `wlsunset` for blue light reduction,
- `wl-paste --watch cliphist store` for clipboard history,
- `swayidle` for automatic locking and screen power management.
- `swaync`
## Keybinds ## Keybinds
@ -113,26 +116,25 @@ Some important shortcuts:
- `Mod + q`: close the focused window. - `Mod + q`: close the focused window.
- `Mod + Shift + e`: exit Sway via `swaynag`. - `Mod + Shift + e`: exit Sway via `swaynag`.
- `Mod + r`: resize mode. - `Mod + r`: resize mode.
- `Mod + Ctrl + r`: reload the config. - `Mod + Shift + c`: reload the config.
- `Mod + Alt + o`: lock the screen. - `Mod + Ctrl + l`: lock the screen.
- `Print`: capture a selected area to the clipboard. - `Print`: capture a selected area to the clipboard.
- `Shift + Print`: capture the full screen to the clipboard. - `Shift + Print`: capture the full screen to the clipboard.
- `Mod + Alt + l`: launcher Wofi. - `Mod + Ctrl + e`: launcher wofi
- `Mod + Alt + v`: Cliphist via Wofi. - `Mod + v`: wofi cliphist
- `Mod + F9`, `Mod + F10`, `Mod + F11`: TLP power profiles. - `Mod + F9``Mod + F10``Mod + F11`: power profiles
## Power profiles ## Power profiles
The bar displays the current TLP and platform profiles. The related keybinds The bar includes a `powerprofilesctl` block with:
use the unprivileged `tlpctl` interface provided by `tlp-pd`:
- `performance`, - `performance`,
- `balanced`, - `balanced`,
- `power-saver`. - `power-saver`.
The related keybinds are: The related keybinds are:
- `Mod + F9`: `tlpctl power-saver`. - `Mod + F9`: power-saver.
- `Mod + F10`: `tlpctl balanced`. - `Mod + F10`: balanced.
- `Mod + F11`: `tlpctl performance`. - `Mod + F11`: performance.
## Floating windows ## Floating windows

View file

@ -12,11 +12,11 @@ exec python3 ~/.config/sway/scripts/inactive-windows-transparency.py
# Règles d'assignation automatique # Règles d'assignation automatique
# ================================================= # =================================================
assign [app_id="limusic-app"] workspace 10 assign [class="Spotify"] workspace 10
# ================================================= # =================================================
# Lancement des applications # Lancement des applications
# ================================================= # =================================================
exec limusic-app exec spotify-launcher
exec autotiling exec autotiling

60
sway/.config/sway/autostart.bak Executable file
View file

@ -0,0 +1,60 @@
# =========== #
# Autostart #
# =========== #
# =================================================
# Filtre lumière bleue (wlsunset)
# Notifications (swaync)
# gnome-keyring-daemon
# protonmail-bridge
#
# Les outils précédent ont été ajouter à systemd --user
#
# =================================================
# =================================================
# Transparence
# =================================================
exec python3 ~/.config/sway/scripts/inactive-windows-transparency.py
# =================================================
# Règles d'assignation automatique
# =================================================
assign [app_id="kitty-1"] workspace 1
assign [app_id="chromium"] workspace 2
assign [app_id="firefox"] workspace 3
assign [app_id="AppFlowy"] workspace 5
assign [app_id="org.mozilla.Thunderbird"] workspace 9
assign [class="Spotify"] workspace 10
assign [app_id="proton-bridge"] workspace 11
# =================================================
# Lancement des applications
# =================================================
exec kitty --class kitty-1 --directory $HOME
exec chromium
exec thunderbird
exec spotify-launcher
exec AppFlowy
# move to systemctl --user
# exec gnome-keyring-daemon --components=pkcs11,secrets,ssh --start
# exec proton-pass
# exec protonmail-bridge
# =================================================
# Presse-papier
# =================================================
# move to systemctl --user
# exec wl-paste --watch cliphist store
# exec wl-paste --type image/png --watch cliphist store
# =================================================
# Verrouillage auto (swayidle)
# =================================================
# move to systemctl --user
# exec swayidle -w timeout 300 'swaylock -f -c 000000' timeout 360 'swaymsg "output * power off"' resume 'swaymsg "output * power on"' before-sleep 'playerctl pause; swaylock -f -c 000000'

View file

@ -17,7 +17,7 @@ set $term kitty
bindsym $mod+Return exec $term bindsym $mod+Return exec $term
# Kill focused window # Kill focused window
bindsym $mod+q exec ~/.local/bin/sway-close bindsym $mod+q kill
# Drag floating windows by holding down $mod and left mouse button. # Drag floating windows by holding down $mod and left mouse button.
# Resize them with right mouse button + $mod. # Resize them with right mouse button + $mod.
@ -204,7 +204,7 @@ bindsym $mod+Alt+i exec ~/.local/bin/vmware-on-demand
bindsym $mod+Alt+f exec firefox bindsym $mod+Alt+f exec firefox
bindsym $mod+Alt+a exec AppFlowy bindsym $mod+Alt+a exec AppFlowy
bindsym $mod+Alt+g exec gimp bindsym $mod+Alt+g exec gimp
bindsym $mod+Alt+m exec limusic-app bindsym $mod+Alt+m exec spotify-launcher
bindsym $mod+Alt+b exec blueman-manager bindsym $mod+Alt+b exec blueman-manager
bindsym $mod+Alt+o exec swaylock bindsym $mod+Alt+o exec swaylock
bindsym $mod+Alt+l exec wofi --cache-file=/dev/null -Dimage_size=26 -Dynamic_lines=true --location top --yoffset=10 --width=600 --height=300 --gtk-dark --show drun bindsym $mod+Alt+l exec wofi --cache-file=/dev/null -Dimage_size=26 -Dynamic_lines=true --location top --yoffset=10 --width=600 --height=300 --gtk-dark --show drun
@ -213,11 +213,10 @@ bindsym $mod+Alt+t exec ~/.local/bin/thunderbird-proton
bindsym $mod+Alt+y exec kitty -- sh -c "yazi" bindsym $mod+Alt+y exec kitty -- sh -c "yazi"
bindsym $mod+Alt+w exec gtk-launch chrome-hnpfjngllnobngcgfapefoaidbinmjnm-Default bindsym $mod+Alt+w exec gtk-launch chrome-hnpfjngllnobngcgfapefoaidbinmjnm-Default
bindsym $mod+Alt+v exec ~/.config/sway/scripts/copypast bindsym $mod+Alt+v exec ~/.config/sway/scripts/copypast
bindsym $mod+Alt+c exec --no-startup-id kitty --app-id=lardon-freecad-log --title="Lardon · FreeCAD autopush" --directory=/home/fy59/Documents/Lardon /home/fy59/Documents/Lardon/tools/lardon-freecad-launcher bindsym $mod+Alt+c exec freecad
bindsym $mod+Alt+s exec sqlitebrowser bindsym $mod+Alt+s exec sqlitebrowser
bindsym $mod+Alt+e exec sh -c 'cd /home/fy59/Documents/Enquetes/Template/labfy-investigation && exec ./labfy-investigation' bindsym $mod+Alt+e exec sh -c 'cd /home/fy59/Documents/Enquetes/Template/labfy-investigation && exec ./labfy-investigation'
bindsym $mod+Alt+n exec ~/.local/bin/nextcloud-sync bindsym $mod+Alt+n exec ~/.local/bin/nextcloud-sync
bindsym $mod+c exec codex-desktop
############################################### ###############################################
# #
@ -239,6 +238,7 @@ bindsym Print exec grim -g "$(slurp)" - | wl-copy -t image/png
# Power Daemon # Power Daemon
# #
############################################### ###############################################
bindsym $mod+F9 exec tlpctl power-saver bindsym $mod+F9 exec powerprofilesctl set power-saver
bindsym $mod+F10 exec tlpctl balanced bindsym $mod+F10 exec powerprofilesctl set balanced
bindsym $mod+F11 exec tlpctl performance bindsym $mod+F11 exec powerprofilesctl set performance

View file

@ -8,12 +8,3 @@
for_window [app_id="blueman-manager"] floating enable, resize set 40ppt 40ppt, move position center for_window [app_id="blueman-manager"] floating enable, resize set 40ppt 40ppt, move position center
for_window [app_id="Proton Pass"] floating enable, resize set 40ppt 40ppt, move position right top for_window [app_id="Proton Pass"] floating enable, resize set 40ppt 40ppt, move position right top
#=================================================
# Lardon
#=================================================
for_window [app_id="lardon-freecad-log"] floating enable
for_window [app_id="lardon-freecad-log"] resize set width 850 px height 360 px
for_window [app_id="lardon-freecad-log"] move position center
for_window [app_id="lardon-freecad-log"] border pixel 2

View file

@ -24,7 +24,7 @@
exec_always { exec_always {
gsettings set $gnome-schema font-name 'jetbrains mono nerd font 12' gsettings set $gnome-schema font-name 'jetbrains mono nerd font 12'
gsettings set $gnome-schema color-scheme 'prefer-dark' gsettings set $gnome-schema color-scheme 'prefer-dark'
gsettings set $gnome-schema icon-theme 'Tela-circle-blue' gsettings get $gnome-schema icon-theme 'Tela-circle-blue'
} }
set $cursor_theme Bibata-Modern-Classic set $cursor_theme Bibata-Modern-Classic
@ -40,5 +40,5 @@ seat seat0 xcursor_theme $cursor_theme $cursor_size
# Set inner/outer gaps # Set inner/outer gaps
gaps inner 5 gaps inner 8
gaps outer 0 gaps outer 0

View file

@ -0,0 +1,82 @@
{
"$schema": "/etc/xdg/swaync/configSchema.json",
"ignore-gtk-theme": false,
"positionX": "right",
"positionY": "top",
"control-center-margin-top": 10,
"control-center-margin-bottom": 10,
"control-center-margin-right": 10,
"notification-body-image-height": 100,
"notification-body-image-width": 200,
"cssPriority": "user",
"timeout": 10,
"timeout-low": 5,
"timeout-critical": 0,
"fit-to-screen": false,
"control-center-width": 500,
"control-center-height": 1035,
"notification-window-width": 500,
"keyboard-shortcuts": true,
"image-visibility": "when-available",
"transition-time": 200,
"hide-on-clear": false,
"hide-on-action": true,
"script-fail-notify": true,
"text-empty": "No Notification",
"widgets": [
"title",
"dnd",
"inhibitors",
"mpris",
"buttons-grid",
"notifications"
],
"widget-config": {
"notifications": {
"group-by-app": true,
"sort": "time"
},
"title": {
"text": "Notification Center",
"clear-all-button": true,
"button-text": "󰆴 Clear All"
},
"mpris": {
"blacklist": ["playerctl"],
"autohide": false,
"show-album-art": "always",
"loop-carousel": false
},
"volume": {
"label": "󰕾"
},
"backlight": {
"label": "󰃟"
},
"buttons-grid": {
"actions": [
{
"label": "󰆴",
"command": "swaync-client -C"
},
{
"label": "󰕾",
"command": "pactl set-sink-mute @DEFAULT_SINK@ toggle",
"type": "toggle"
},
{
"label": "󰖩",
"command": "nm-connection-editor"
},
{
"label": "󰂯",
"command": "blueman-manager"
},
{
"label": "",
"command": "kooha"
}
]
}
}
}

Binary file not shown.

View file

@ -0,0 +1,328 @@
* {
all: unset;
font-size: 14px;
font-family: "Ubuntu Nerd Font";
transition: 200ms;
}
trough highlight {
background: #cdd6f4;
}
scale {
margin: 0 7px;
}
scale trough {
margin: 0rem 1rem;
min-height: 8px;
min-width: 70px;
border-radius: 12.6px;
}
trough slider {
margin: -10px;
border-radius: 12.6px;
box-shadow: 0 0 2px rgba(0, 0, 0, 0.8);
transition: all 0.2s ease;
background-color: #89b4fa;
}
trough slider:hover {
box-shadow: 0 0 2px rgba(0, 0, 0, 0.8), 0 0 8px #89b4fa;
}
trough {
background-color: #313244;
}
/* notifications */
.notification-background {
box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.8), inset 0 0 0 1px #45475a;
border-radius: 12.6px;
margin: 18px;
background: #181825;
color: #cdd6f4;
padding: 0;
}
.notification-background .notification {
padding: 7px;
border-radius: 12.6px;
}
.notification-background .notification.critical {
box-shadow: inset 0 0 7px 0 #f38ba8;
}
.notification .notification-content {
margin: 7px;
}
.notification .notification-content overlay {
/* icons */
margin: 4px;
}
.notification-content .summary {
color: #cdd6f4;
}
.notification-content .time {
color: #a6adc8;
}
.notification-content .body {
color: #bac2de;
}
.notification > *:last-child > * {
min-height: 3.4em;
}
.notification-background .close-button {
margin: 7px;
padding: 2px;
border-radius: 6.3px;
color: #1e1e2e;
background-color: #f38ba8;
}
.notification-background .close-button:hover {
background-color: #eba0ac;
}
.notification-background .close-button:active {
background-color: #f5c2e7;
}
.notification .notification-action {
border-radius: 7px;
color: #cdd6f4;
box-shadow: inset 0 0 0 1px #45475a;
margin: 4px;
padding: 8px;
font-size: 0.2rem; /* controls the button size not text size*/
}
.notification .notification-action {
background-color: #313244;
}
.notification .notification-action:hover {
background-color: #45475a;
}
.notification .notification-action:active {
background-color: #585b70;
}
.notification.critical progress {
background-color: #f38ba8;
}
.notification.low progress,
.notification.normal progress {
background-color: #89b4fa;
}
.notification progress,
.notification trough,
.notification progressbar {
border-radius: 12.6px;
padding: 3px 0;
}
/* control center */
.control-center {
box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.8), inset 0 0 0 1px #313244;
border-radius: 12.6px;
background-color: #1e1e2e;
color: #cdd6f4;
padding: 14px;
}
.control-center .notification-background {
border-radius: 7px;
box-shadow: inset 0 0 0 1px #45475a;
margin: 4px 10px;
}
.control-center .notification-background .notification {
border-radius: 7px;
}
.control-center .notification-background .notification.low {
opacity: 0.8;
}
.control-center .widget-title > label {
color: #cdd6f4;
font-size: 1.3em;
}
.control-center .widget-title button {
border-radius: 7px;
color: #cdd6f4;
background-color: #313244;
box-shadow: inset 0 0 0 1px #45475a;
padding: 8px;
}
.control-center .widget-title button:hover {
background-color: #45475a;
}
.control-center .widget-title button:active {
background-color: #585b70;
}
.control-center .notification-group {
margin-top: 10px;
}
.control-center .notification-group:focus .notification-background {
background-color: #313244;
}
scrollbar slider {
margin: -3px;
opacity: 0.8;
}
scrollbar trough {
margin: 2px 0;
}
/* dnd */
.widget-dnd {
margin-top: 5px;
border-radius: 8px;
font-size: 1.1rem;
}
.widget-dnd > switch {
font-size: initial;
border-radius: 8px;
background: #313244;
box-shadow: none;
}
.widget-dnd > switch:checked {
background: #89b4fa;
}
.widget-dnd > switch slider {
background: #45475a;
border-radius: 8px;
}
/* mpris */
.widget-mpris-player {
background: #313244;
border-radius: 12.6px;
color: #cdd6f4;
}
.mpris-overlay {
background-color: #313244;
opacity: 0.9;
padding: 15px 10px;
}
.widget-mpris-album-art {
-gtk-icon-size: 100px;
border-radius: 12.6px;
margin: 0 10px;
}
.widget-mpris-title {
font-size: 1.2rem;
color: #cdd6f4;
}
.widget-mpris-subtitle {
font-size: 1rem;
color: #bac2de;
}
.widget-mpris button {
border-radius: 12.6px;
color: #cdd6f4;
margin: 0 5px;
padding: 2px;
}
.widget-mpris button image {
-gtk-icon-size: 1.8rem;
}
.widget-mpris button:hover {
background-color: #313244;
}
.widget-mpris button:active {
background-color: #45475a;
}
.widget-mpris button:disabled {
opacity: 0.5;
}
.widget-menubar > box > .menu-button-bar > button > label {
font-size: 3rem;
padding: 0.5rem 2rem;
}
.widget-menubar > box > .menu-button-bar > :last-child {
color: #f38ba8;
}
.power-buttons button:hover,
.powermode-buttons button:hover,
.screenshot-buttons button:hover {
background: #313244;
}
.control-center .widget-label > label {
color: #cdd6f4;
font-size: 2rem;
}
.widget-buttons-grid {
padding-top: 1rem;
}
.widget-buttons-grid > flowbox > flowboxchild > button label {
font-size: 2.5rem;
}
.widget-volume {
padding: 1rem 0;
}
.widget-volume label {
color: #74c7ec;
padding: 0 1rem;
}
.widget-volume trough highlight {
background: #74c7ec;
}
.widget-backlight trough highlight {
background: #f9e2af;
}
.widget-backlight label {
font-size: 1.5rem;
color: #f9e2af;
}
.widget-backlight .KB {
padding-bottom: 1rem;
}
.image {
padding-right: 0.5rem;
}

View file

@ -1,16 +0,0 @@
[Unit]
Description=Arch Sentinel - collecte légère
[Service]
Type=oneshot
ExecStart=%h/.local/bin/arch-sentinel sample
Nice=10
IOSchedulingClass=idle
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=strict
ProtectHome=read-only
ReadWritePaths=%h/.local/share/arch-sentinel
RestrictAddressFamilies=AF_UNIX
LockPersonality=yes
MemoryDenyWriteExecute=yes

View file

@ -1,11 +0,0 @@
[Unit]
Description=Arch Sentinel - relevé périodique
[Timer]
OnBootSec=2min
OnUnitActiveSec=5min
AccuracySec=30s
Persistent=true
[Install]
WantedBy=timers.target

View file

@ -1 +1 @@
../clean-makepkg.service /home/fy59/.config/systemd/user/clean-makepkg.service

View file

@ -1 +1 @@
../gnome-keyring-daemon.service /home/fy59/.config/systemd/user/gnome-keyring-daemon.service

View file

@ -1 +1 @@
../ssh-agent.service /home/fy59/.config/systemd/user/ssh-agent.service

View file

@ -1 +0,0 @@
../trainlog-btd.service

View file

@ -1 +0,0 @@
../trainlog-syncd.service

View file

@ -1 +0,0 @@
../trainlog-web.service

View file

@ -0,0 +1,11 @@
[Unit]
Description=GNOME keyring daemon
PartOf=graphical-session.target
After=graphical-session.target
[Service]
ExecStart=/usr/bin/gnome-keyring-daemon --components=pkcs11,secrets,ssh --start
Restart=on-failure
[Install]
WantedBy=graphical-session.target

View file

@ -1 +1 @@
../cliphist-image.service /home/fy59/.config/systemd/user/cliphist-image.service

View file

@ -1 +1 @@
../cliphist-text.service /home/fy59/.config/systemd/user/cliphist-text.service

View file

@ -0,0 +1 @@
/home/fy59/.config/systemd/user/keyring.service

View file

@ -1 +1 @@
../swayidle.service /home/fy59/.config/systemd/user/swayidle.service

View file

@ -1 +1 @@
../wlsunset.service /home/fy59/.config/systemd/user/wlsunset.service

View file

@ -0,0 +1,11 @@
[Unit]
Description=Wayland color temperature (wlsunset)
PartOf=graphical-session.target
After=graphical-session.target
[Service]
ExecStart=/usr/bin/gnome-keyring-daemon --components=pkcs11,secrets,ssh --start
Restart=on-failure
[Install]
WantedBy=graphical-session.target

View file

@ -1,16 +0,0 @@
[Unit]
Description=Session FreeCAD Lardon avec autopush
Documentation=file://%h/Documents/Lardon/README.md
ConditionPathExists=%h/Documents/Lardon/FreeCAD/Lardon_Master.FCStd
ConditionFileIsExecutable=%h/Documents/Lardon/tools/freecad-autopush
ConditionFileIsExecutable=%h/Documents/Lardon/tools/lardon-freecad-session
[Service]
Type=exec
WorkingDirectory=%h/Documents/Lardon
ExecStart=%h/Documents/Lardon/tools/lardon-freecad-session
KillMode=control-group
TimeoutStopSec=15s
Restart=no

View file

@ -4,7 +4,7 @@ PartOf=graphical-session.target
After=graphical-session.target After=graphical-session.target
[Service] [Service]
ExecStart=/usr/bin/swayidle -w timeout 300 'swaylock -f -c 000000' timeout 360 'swaymsg "output * power off"' resume 'swaymsg "output * power on"' timeout 420 'playerctl -a pause 2>/dev/null || true' idlehint 420 before-sleep 'playerctl -a pause 2>/dev/null || true; swaylock -f -c 000000' ExecStart=/usr/bin/swayidle -w timeout 300 'swaylock -f -c 000000' timeout 360 'swaymsg "output * power off"' resume 'swaymsg "output * power on"' before-sleep 'playerctl pause; swaylock -f -c 000000'
Restart=on-failure Restart=on-failure
[Install] [Install]

View file

@ -0,0 +1,11 @@
[Unit]
Description=Wayland notification daemon
PartOf=graphical-session.target
After=graphical-session.target
[Service]
ExecStart=/usr/bin/swaync
Restart=on-failure
[Install]
WantedBy=graphical-session.target

View file

@ -1 +0,0 @@
../arch-sentinel-sample.timer

View file

@ -1 +1 @@
../battery-low-notify.timer /home/fy59/.config/systemd/user/battery-low-notify.timer

View file

@ -1,13 +0,0 @@
[Unit]
Description=Trainlog Bluetooth RFCOMM agent
ConditionPathExists=/home/fy59/.config/trainlog/sync-generation-config-v1.json
[Service]
Type=simple
ExecCondition=/usr/bin/grep -Eq '"bluetooth_enabled"[[:space:]]*:[[:space:]]*true' "/home/fy59/.config/trainlog/sync-generation-config-v1.json"
ExecStart=/usr/bin/python3 "/home/fy59/Documents/trainlog/tools/trainlog_bt_agent.py" --config "/home/fy59/.config/trainlog/sync-generation-config-v1.json"
Restart=on-failure
RestartSec=2
[Install]
WantedBy=default.target

View file

@ -1,13 +0,0 @@
[Unit]
Description=Trainlog automatic synchronization agent
[Service]
Type=simple
Environment=TRAINLOG_SYNC_BT_ADAPTER=/home/fy59/Documents/trainlog/tools/trainlog_generation_bt_adapter.py
Environment=TRAINLOG_SYNC_MTP_ADAPTER=/home/fy59/Documents/trainlog/build/tui/trainlog-generation-mtp-adapter
ExecStart=/usr/bin/python3 "/home/fy59/Documents/trainlog/tools/trainlog_syncd.py" --sync-once "/home/fy59/Documents/trainlog/build/tui/trainlog-sync-once" --bt-adapter "/home/fy59/Documents/trainlog/tools/trainlog_generation_bt_adapter.py" --mtp-adapter "/home/fy59/Documents/trainlog/build/tui/trainlog-generation-mtp-adapter" --interval 3
Restart=on-failure
RestartSec=2
[Install]
WantedBy=default.target

View file

@ -1,2 +0,0 @@
[Service]
Environment=TRAINLOG_SYNC_GENERATION_CONFIG=/home/fy59/.config/trainlog/sync-generation-config-v1.json

View file

@ -1,35 +0,0 @@
[Unit]
Description=Trainlog Web local user service
Documentation=https://github.com/labfytools/trainlog
After=default.target
# WHY: A persistent bind failure (notably an occupied 127.0.0.1:8080) must not
# become an aggressive restart loop in the user's session.
StartLimitIntervalSec=60
StartLimitBurst=3
[Service]
Type=simple
# CONTRACT: The user-managed executable is the canonical manual and service
# entry point; the repository/build location must not leak into this unit.
ExecStart=%h/.local/bin/trainlog -w
# INVARIANT: Trainlog stays in the foreground, owns its ordered SIGTERM
# shutdown, and always keeps the frozen loopback address and port contract.
KillSignal=SIGTERM
TimeoutStopSec=20
Restart=on-failure
RestartSec=10
# These protections do not isolate the home directory: Trainlog must retain
# access to its SQLite data and configuration below ~/.local/share and ~/.config.
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectControlGroups=true
ProtectKernelModules=true
ProtectKernelTunables=true
RestrictSUIDSGID=true
LockPersonality=true
SystemCallArchitectures=native
[Install]
WantedBy=default.target

View file

@ -1,2 +0,0 @@
[Service]
Environment=TRAINLOG_SYNC_GENERATION_CONFIG=/home/fy59/.config/trainlog/sync-generation-config-v1.json

View file

@ -1 +0,0 @@
sway.desktop

View file

@ -0,0 +1,178 @@
{
"modules-left": [
"ext/workspaces",
"custom/hyprwhspr"
],
"modules-right": [
"mpris",
"bluetooth",
"network",
"wireplumber",
"backlight",
"custom/updates",
"systemd-failed-units",
"custom/tlp",
"group/hardware",
"clock",
"custom/power",
"tray"
],
"group/hardware": {
"orientation": "horizontal",
"drawer": {
"transition-duration": 200,
"children-class": "hardware-item"
},
"modules": [
"battery",
"cpu",
"memory",
"disk"
]
},
"tray": {
"icon-size": 18,
"spacing": 8
},
"custom/tlp": {
"format": "{}",
"exec": "~/.config/waybar/scripts/tlp-profile.sh",
"interval": 20,
"return-type": "json",
},
"custom/power": {
"format": "⏻",
"tooltip": false,
"on-click": "wlogout --protocol layer-shell"
},
"backlight": {
"device": "amdgpu_bl0",
"format": "{icon} {percent}%",
"format-icons": ["", ""],
"reverse-scrolling": true,
"on-scroll-up": "brightnessctl set +2%",
"on-scroll-down": "brightnessctl set 2%-"
},
"systemd-failed-units": {
"hide-on-ok": false, // Do not hide if there is zero failed units.
"format": "✗ {nr_failed}",
"format-ok": "✓",
"system": true, // Monitor failed systemwide units.
"user": false // Ignore failed user units.
},
"disk": {
"interval": 30,
"format": "Only {percentage_free}% remaining on {path}",
"path": "/"
},
"memory": {
"interval": 5,
"format": "{used:0.1f}G/{total:0.1f}G "
},
"cpu": {
"format": "{icon0} {icon1} {icon2} {icon3} {icon4} {icon5} {icon6} {icon7}",
"format-icons": ["▁", "▂", "▃", "▄", "▅", "▆", "▇", "█"]
},
"ext/workspaces": {
"format": "{icon}",
"ignore-hidden": true,
"on-click": "activate",
"on-click-right": "deactivate",
"sort-by-id": true
},
"battery": {
"bat": "BAT1",
"interval": 15,
"format": "{capacity}% {icon}",
"format-icons": {
"default": ["󰂎", "󰁺", "󰁻", "󰁼", "󰁽", "󰁾", "󰁿", "󰂀", "󰂁", "󰂂", "󰁹"],
"charging": ["󰢟", "󰢜", "󰂆", "󰂇", "󰂈", "󰢝", "󰂉", "󰢞", "󰂊", "󰂋", "󰂅"]
}
},
"wireplumber": {
"format": "{volume}% {icon}",
"format-muted": "",
"format-icons": ["", "", ""],
"reverse-scrolling": true,
"max-volume": 100,
"scroll-step": 0.05
},
"clock": {
"interval": 60,
"format": "{:%H:%M}",
"max-length": 25
},
"mpris": {
"player": "playerctld",
"format": "{status_icon} {dynamic}",
"format-paused": "{status_icon} {dynamic}",
"format-stopped": "",
"tooltip-format": "{player}\n{title}\n{artist}",
"on-click": "playerctl play-pause",
"on-click-middle": "playerctl previous",
"on-click-right": "playerctl next",
"dynamic-order": ["title", "artist"],
"dynamic-separator": " - ",
"dynamic-len": 24,
"title-len": 20,
"artist-len": 0,
"album-len": 0,
"player-icons": {
"default": "",
"mpv": "",
"firefox": "󰈹",
"spotify": "",
"vlc": "󰕼"
},
"status-icons": {
"playing": "",
"paused": "",
"stopped": ""
}
},
"bluetooth": {
"format": " {status}",
"format-connected": " {device_alias}",
"format-connected-battery": " {device_alias} {device_battery_percentage}%",
// "format-device-preference": [ "device1", "device2" ], // preference list deciding the displayed device
"tooltip-format": "{controller_alias}\t{controller_address}\n\n{num_connections} connected",
"tooltip-format-connected": "{controller_alias}\t{controller_address}\n\n{num_connections} connected\n\n{device_enumerate}",
"tooltip-format-enumerate-connected": "{device_alias}\t{device_address}",
"tooltip-format-enumerate-connected-battery": "{device_alias}\t{device_address}\t{device_battery_percentage}%",
"on-click": "blueman-manager"
},
"network": {
"interface": "wlp1s0",
"format": "{ifname}",
"format-wifi": "{essid} ({signalStrength}%) ",
"format-ethernet": "{ipaddr}/{cidr} 󰊗",
"format-disconnected": "", //An empty format will hide the module.
"tooltip-format": "{ifname} via {gwaddr} 󰊗",
"tooltip-format-wifi": "{essid} ({signalStrength}%) ",
"tooltip-format-ethernet": "{ifname} ",
"tooltip-format-disconnected": "Disconnected",
"max-length": 50
},
"custom/updates": {
"format": "{} {icon}",
"return-type": "json",
"format-icons": {
"has-updates": "󱍷",
"updated": ""
},
"exec-if": "which waybar-module-pacman-updates",
"exec": "waybar-module-pacman-updates --no-zero-output"
},
"custom/hyprwhspr": {
"format": "{}",
"exec": "/usr/lib/hyprwhspr/config/hyprland/hyprwhspr-tray.sh status",
"interval": 1,
"return-type": "json",
"exec-on-event": true,
"on-click": "/usr/lib/hyprwhspr/config/hyprland/hyprwhspr-tray.sh record",
"on-click-right": "/usr/lib/hyprwhspr/config/hyprland/hyprwhspr-tray.sh restart",
"tooltip": true
}
}

View file

@ -0,0 +1,12 @@
{
"custom/hyprwhspr": {
"format": "{}",
"exec": "/usr/lib/hyprwhspr/config/hyprland/hyprwhspr-tray.sh status",
"interval": 1,
"return-type": "json",
"exec-on-event": true,
"on-click": "/usr/lib/hyprwhspr/config/hyprland/hyprwhspr-tray.sh record",
"on-click-right": "/usr/lib/hyprwhspr/config/hyprland/hyprwhspr-tray.sh restart",
"tooltip": true
}
}

View file

@ -0,0 +1,26 @@
@define-color rosewater #f5e0dc;
@define-color flamingo #f2cdcd;
@define-color pink #f5c2e7;
@define-color mauve #cba6f7;
@define-color red #f38ba8;
@define-color maroon #eba0ac;
@define-color peach #fab387;
@define-color yellow #f9e2af;
@define-color green #a6e3a1;
@define-color teal #94e2d5;
@define-color sky #89dceb;
@define-color sapphire #74c7ec;
@define-color blue #89b4fa;
@define-color lavender #b4befe;
@define-color text #cdd6f4;
@define-color subtext1 #bac2de;
@define-color subtext0 #a6adc8;
@define-color overlay2 #9399b2;
@define-color overlay1 #7f849c;
@define-color overlay0 #6c7086;
@define-color surface2 #585b70;
@define-color surface1 #45475a;
@define-color surface0 #313244;
@define-color base #1e1e2e;
@define-color mantle #181825;
@define-color crust #11111b;

View file

@ -0,0 +1,16 @@
#!/usr/bin/env bash
title="$(mango-msg -t get_tree 2>/dev/null | jq -r '
recurse(.nodes[]?, .floating_nodes[]?)
| select(.focused == true)
| .name // empty
' | head -n1)"
if [ -z "$title" ]; then
title="Bureau"
fi
short="$(printf '%s' "$title" | cut -c1-60)"
jq -cn --arg text "$short" --arg tooltip "$title" \
'{text:$text, tooltip:$tooltip}'

Some files were not shown because too many files have changed in this diff Show more