Compare commits
32 commits
f0d39800d6
...
7ed3f78c41
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7ed3f78c41 | ||
|
|
41a6c5df2e | ||
|
|
960faa2d60 | ||
|
|
890fe92bab | ||
|
|
c993c233fd | ||
|
|
4be37d6118 | ||
|
|
7c7093b9cd | ||
|
|
fad850b76d | ||
|
|
ed3b8cddf3 | ||
|
|
de1a669d79 | ||
|
|
2e85cf8d43 | ||
|
|
f5918e4151 | ||
|
|
c83c2201ec | ||
|
|
edd90f8003 | ||
|
|
a7b1b877eb | ||
|
|
6d843133e7 | ||
|
|
5cdda1e86c | ||
|
|
109ca4f677 | ||
|
|
e56585414d | ||
|
|
0542d1b08a | ||
|
|
49683dd970 | ||
|
|
fc76a6278f | ||
|
|
f85dea2ede | ||
|
|
50cdf05a7d | ||
|
|
95ce9f00f1 | ||
|
|
79f56f47f2 | ||
|
|
4bdcc16092 | ||
|
|
c5bef5dcd0 | ||
|
|
f2b0849175 | ||
|
|
7ab1abfb21 | ||
|
|
62ee5c6e85 | ||
|
|
e4e7c447cd |
115 changed files with 3122 additions and 2187 deletions
|
|
@ -1,16 +1,16 @@
|
|||
NetworkManager-dispatcher.service
|
||||
NetworkManager-wait-online.service
|
||||
NetworkManager.service
|
||||
avahi-daemon.service
|
||||
blueman-mechanism.service
|
||||
bluetooth.service
|
||||
cups.service
|
||||
getty@.service
|
||||
greetd.service
|
||||
grub-btrfsd.service
|
||||
libvirtd.service
|
||||
NetworkManager-dispatcher.service
|
||||
NetworkManager-wait-online.service
|
||||
NetworkManager.service
|
||||
nftables.service
|
||||
nginx.service
|
||||
sshd.service
|
||||
power-profiles-daemon.service
|
||||
seatd.service
|
||||
systemd-oomd.service
|
||||
systemd-resolved.service
|
||||
systemd-timesyncd.service
|
||||
tlp-pd.service
|
||||
tlp.service
|
||||
wg-quick@wg0.service
|
||||
|
|
|
|||
|
|
@ -1,7 +0,0 @@
|
|||
avahi-daemon.socket
|
||||
cups.path
|
||||
cups.socket
|
||||
fstrim.timer
|
||||
snapper-cleanup.timer
|
||||
snapper-timeline.timer
|
||||
systemd-userdbd.socket
|
||||
|
|
@ -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
|
||||
|
|
@ -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.
|
||||
|
|
@ -1,6 +1,18 @@
|
|||
[terminal]
|
||||
# The VT to run the greeter on. Can be "next", "current" or a number
|
||||
# designating the VT.
|
||||
vt = 1
|
||||
|
||||
# The default session, also known as the greeter.
|
||||
[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 = ""
|
||||
|
||||
|
||||
|
|
|
|||
60
.assets/greetd/regreet.toml
Normal file
60
.assets/greetd/regreet.toml
Normal 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
|
||||
14
.assets/greetd/sway-config
Normal file
14
.assets/greetd/sway-config
Normal 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
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -1,251 +1,202 @@
|
|||
7zip
|
||||
accountsservice
|
||||
acpi
|
||||
alsa-utils
|
||||
amd-ucode
|
||||
amdgpu_top
|
||||
android-file-transfer
|
||||
android-tools
|
||||
ansible
|
||||
atuin
|
||||
autotiling
|
||||
axel
|
||||
amass
|
||||
base
|
||||
base-devel
|
||||
bash-completion
|
||||
bat
|
||||
bat-extras
|
||||
bear
|
||||
bind
|
||||
blueman
|
||||
bluez
|
||||
bluez-utils
|
||||
brightnessctl
|
||||
broadcom-wl-dkms
|
||||
btop
|
||||
btrfs-progs
|
||||
ccache
|
||||
clang
|
||||
calcure
|
||||
catppuccin-cursors-mocha
|
||||
catppuccin-gtk-theme-mocha
|
||||
cliphist
|
||||
cloc
|
||||
cmake
|
||||
composer
|
||||
cowsay
|
||||
cppcheck
|
||||
cppdap
|
||||
cpupower
|
||||
cpio
|
||||
cups
|
||||
cups-pk-helper
|
||||
dmidecode
|
||||
dante
|
||||
deezer
|
||||
dgop
|
||||
dialog
|
||||
discord
|
||||
dnsmasq
|
||||
docker
|
||||
dosfstools
|
||||
ecryptfs-utils
|
||||
edk2-ovmf
|
||||
efibootmgr
|
||||
eigen
|
||||
evince
|
||||
evtest
|
||||
exfatprogs
|
||||
eza
|
||||
fastfetch
|
||||
fd
|
||||
ffmpegthumbnailer
|
||||
figlet
|
||||
file-roller
|
||||
firefox
|
||||
firefox-i18n-fr
|
||||
flatpak
|
||||
freecad
|
||||
foomatic-db
|
||||
foomatic-db-gutenprint-ppds
|
||||
foomatic-db-nonfree
|
||||
foomatic-db-nonfree-ppds
|
||||
foomatic-db-ppds
|
||||
fuse-overlayfs
|
||||
fuse2
|
||||
fzf
|
||||
ggml-vulkan
|
||||
gimp
|
||||
gimp-help-fr
|
||||
gammastep
|
||||
git
|
||||
github-cli
|
||||
gnome-keyring
|
||||
gnome-themes-extra
|
||||
gnu-free-fonts
|
||||
gphoto2
|
||||
gradle
|
||||
greetd-tuigreet
|
||||
gobuster
|
||||
google-chrome
|
||||
greetd-regreet
|
||||
grim
|
||||
grub
|
||||
grub-btrfs
|
||||
gst-libav
|
||||
gst-plugin-gtk4
|
||||
gst-plugin-pipewire
|
||||
gst-plugins-bad
|
||||
gst-plugins-base
|
||||
gst-plugins-good
|
||||
gtk4
|
||||
gtklock
|
||||
gtklock-playerctl-module
|
||||
gtklock-powerbar-module
|
||||
gtklock-userinfo-module
|
||||
gvfs
|
||||
heimdall
|
||||
gst-plugins-ugly
|
||||
gum
|
||||
hashcat
|
||||
hplip
|
||||
hunspell-en_us
|
||||
hunspell-fr
|
||||
i3status-rust
|
||||
ifuse
|
||||
imagemagick
|
||||
inotify-tools
|
||||
jadx
|
||||
jdk-openjdk
|
||||
jdk17-openjdk
|
||||
inter-font
|
||||
inxi
|
||||
john
|
||||
julia
|
||||
jq
|
||||
kitty
|
||||
less
|
||||
libgsf
|
||||
libheif
|
||||
libimobiledevice
|
||||
libjpeg-turbo
|
||||
libmtp
|
||||
libplist
|
||||
libpulse
|
||||
limine
|
||||
libspng
|
||||
libvirt
|
||||
linux
|
||||
linux-firmware
|
||||
linux-lts
|
||||
linux-lts-headers
|
||||
linux-zen
|
||||
linux-zen-headers
|
||||
llama-cpp
|
||||
luarocks
|
||||
mako
|
||||
linux-headers
|
||||
lsb-release
|
||||
lsd
|
||||
maim
|
||||
man-db
|
||||
man-pages
|
||||
man-pages-fr
|
||||
memtest86+
|
||||
memtest86+-efi
|
||||
mesa-utils
|
||||
meson
|
||||
mold
|
||||
mpv
|
||||
mtpfs
|
||||
mercurial
|
||||
mtools
|
||||
neovim
|
||||
networkmanager
|
||||
nextcloud-client
|
||||
nginx
|
||||
nikto
|
||||
nmsurf
|
||||
nodejs
|
||||
notcurses
|
||||
noto-fonts
|
||||
noto-fonts-cjk
|
||||
noto-fonts-emoji
|
||||
npm
|
||||
noto-fonts-extra
|
||||
nss-mdns
|
||||
ntfs-3g
|
||||
ntp
|
||||
nvme-cli
|
||||
openresolv
|
||||
openssh
|
||||
openbsd-netcat
|
||||
openvpn
|
||||
optipng
|
||||
os-prober
|
||||
otf-font-awesome
|
||||
pacman-contrib
|
||||
pavucontrol
|
||||
pamixer
|
||||
parallel
|
||||
pass
|
||||
perl-image-exiftool
|
||||
php
|
||||
pipewire
|
||||
pipewire-alsa
|
||||
pipewire-jack
|
||||
pipewire-libcamera
|
||||
pipewire-pulse
|
||||
podman
|
||||
powertop
|
||||
protonmail-bridge
|
||||
playerctl
|
||||
pnpm
|
||||
polkit-gnome
|
||||
power-profiles-daemon
|
||||
pyenv
|
||||
pyright
|
||||
python-gobject
|
||||
python-i3ipc
|
||||
python-jsonschema
|
||||
python-opencv
|
||||
python-pipenv
|
||||
python-psutil
|
||||
python-pynvim
|
||||
python-textual
|
||||
qt5-wayland
|
||||
python-jedi
|
||||
python-pip
|
||||
python-pipx
|
||||
python-pyamdgpuinfo
|
||||
python-pyquery
|
||||
python-utils
|
||||
qalculate-gtk
|
||||
qt5-quickcontrols2
|
||||
qt5ct
|
||||
qt6-wayland
|
||||
qt6ct
|
||||
radeontop
|
||||
rclone
|
||||
reflector
|
||||
renderdoc
|
||||
rhash
|
||||
ripgrep
|
||||
rocm-smi-lib
|
||||
rofi
|
||||
rsync
|
||||
ruby
|
||||
rustup
|
||||
samba
|
||||
rust
|
||||
sane
|
||||
sane-airscan
|
||||
sbctl
|
||||
sassc
|
||||
scrollmpris-git
|
||||
seat
|
||||
seatd
|
||||
seclists
|
||||
slop
|
||||
slurp
|
||||
smartmontools
|
||||
snap-pac
|
||||
snap-pac-grub
|
||||
snapper
|
||||
sof-firmware
|
||||
spirv-headers
|
||||
spotify-launcher
|
||||
sqlitebrowser
|
||||
starship
|
||||
stow
|
||||
strace
|
||||
sudo
|
||||
sway
|
||||
swaybg
|
||||
swayfx
|
||||
swayidle
|
||||
swaylock
|
||||
swayimg
|
||||
swaylock-effects
|
||||
swaync
|
||||
system-config-printer
|
||||
systemd-resolvconf
|
||||
tcpdump
|
||||
tea
|
||||
tela-circle-icon-theme-all
|
||||
terminus-font
|
||||
tesseract
|
||||
tesseract-data-eng
|
||||
tesseract-data-fra
|
||||
thunar
|
||||
thunar-archive-plugin
|
||||
thunar-volman
|
||||
thunderbird
|
||||
thunderbird-i18n-fr
|
||||
testdisk
|
||||
texinfo
|
||||
tlp
|
||||
tlp-pd
|
||||
tlp-rdw
|
||||
tmux
|
||||
traceroute
|
||||
transmission-cli
|
||||
transmission-gtk
|
||||
tree
|
||||
tree-sitter-cli
|
||||
ttf-bitstream-vera
|
||||
ttf-dejavu
|
||||
ttf-droid
|
||||
ttf-fantasque-nerd
|
||||
ttf-fira-code
|
||||
ttf-fira-sans
|
||||
ttf-firacode-nerd
|
||||
ttf-jetbrains-mono
|
||||
ttf-jetbrains-mono-nerd
|
||||
tumbler
|
||||
typst
|
||||
ttf-liberation
|
||||
ttf-nerd-fonts-symbols-mono
|
||||
ttf-noto-nerd
|
||||
ttf-victor-mono
|
||||
umockdev
|
||||
unrar
|
||||
unzip
|
||||
usbmuxd
|
||||
usbutils
|
||||
uwsm
|
||||
valgrind
|
||||
vcpkg
|
||||
vlc
|
||||
volk
|
||||
vulkan-headers
|
||||
vulkan-radeon
|
||||
vulkan-tools
|
||||
vulkan-utility-libraries
|
||||
vulkan-validation-layers
|
||||
waybar
|
||||
wayland-utils
|
||||
webp-pixbuf-loader
|
||||
wev
|
||||
vde2
|
||||
w3m
|
||||
wget
|
||||
whois
|
||||
wireguard-tools
|
||||
wireplumber
|
||||
wl-clipboard
|
||||
wlopm
|
||||
wlr-randr
|
||||
wl-clip-persist
|
||||
wlsunset
|
||||
wofi
|
||||
wpa_supplicant
|
||||
xdg-desktop-portal
|
||||
wttrbar
|
||||
xclip
|
||||
xdg-desktop-portal-gtk
|
||||
xdg-desktop-portal-wlr
|
||||
xf86-video-amdgpu
|
||||
xorg-xrdb
|
||||
xdg-user-dirs
|
||||
xf86-video-nouveau
|
||||
xmlstarlet
|
||||
xorg-xwayland
|
||||
xournalpp
|
||||
yarn
|
||||
yazi
|
||||
yt-dlp
|
||||
zip
|
||||
zoxide
|
||||
zram-generator
|
||||
zsh
|
||||
zsh-autocomplete
|
||||
zsh-autosuggestions
|
||||
zsh-completions
|
||||
zsh-history-substring-search
|
||||
zsh-syntax-highlighting
|
||||
|
|
|
|||
27
.gitignore
vendored
27
.gitignore
vendored
|
|
@ -1,29 +1,2 @@
|
|||
atuin/.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
12
.gitmodules
vendored
|
|
@ -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
352
README.md
|
|
@ -1,291 +1,161 @@
|
|||
<p align="center">
|
||||
<img src=".assets/screen.jpg" alt="ArchASP — Sway desktop" width="100%">
|
||||
</p>
|
||||
# Dotfiles ArchASP
|
||||
|
||||
<h1 align="center">ArchASP Dotfiles</h1>
|
||||
Configurations utilisateur de mon poste principal sous **Arch Linux**, avec un environnement **Wayland / Sway**.
|
||||
|
||||
<p align="center">
|
||||
Configuration utilisateur reproductible pour une station Arch Linux sous
|
||||
Wayland, déployée package par package avec GNU Stow.
|
||||
</p>
|
||||
Ce dépôt contient uniquement les fichiers liés à ma session utilisateur.
|
||||
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).
|
||||
|
||||
<p align="center">
|
||||
<code>Arch Linux</code> · <code>Sway</code> · <code>GNU Stow</code> ·
|
||||
<code>systemd --user</code> · <code>Zsh</code>
|
||||
</p>
|
||||
## Environnement
|
||||
|
||||
<p align="center">
|
||||
<a href="#overview">Overview</a> ·
|
||||
<a href="#desktop-stack">Desktop</a> ·
|
||||
<a href="#shell-stack">Shell</a> ·
|
||||
<a href="#repository-layout">Layout</a> ·
|
||||
<a href="#deployment">Deployment</a> ·
|
||||
<a href="#rebuilding-archasp">Rebuild</a>
|
||||
</p>
|
||||
- Arch Linux
|
||||
- Sway
|
||||
- Wayland
|
||||
- Kitty
|
||||
- Zsh
|
||||
- Neovim
|
||||
- PipeWire / WirePlumber
|
||||
- systemd utilisateur
|
||||
- GNU Stow pour le déploiement des fichiers
|
||||
|
||||
<a id="overview"></a>
|
||||
## Contenu
|
||||
|
||||
## ✦ Overview
|
||||
|
||||
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
|
||||
Le dépôt regroupe notamment :
|
||||
|
||||
```text
|
||||
greetd
|
||||
└─ tuigreet
|
||||
└─ UWSM
|
||||
└─ Sway
|
||||
├─ Swaybar ── i3status-rs
|
||||
├─ Mako notifications
|
||||
├─ Wofi launcher
|
||||
├─ Swaylock verrouillage
|
||||
├─ Cliphist historique du presse-papiers
|
||||
└─ Kitty terminal
|
||||
.config/
|
||||
├── kitty/
|
||||
├── nvim/
|
||||
├── sway/
|
||||
├── systemd/user/
|
||||
└── ...
|
||||
|
||||
.local/
|
||||
├── bin/
|
||||
└── share/
|
||||
|
||||
.zshrc
|
||||
```
|
||||
|
||||
| Fonction | Composant canonique |
|
||||
| --- | --- |
|
||||
| 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` |
|
||||
### Scripts utilisateur
|
||||
|
||||
`uwsm/.config/uwsm/default-id` sélectionne `sway.desktop`. La copie de
|
||||
référence de greetd se trouve dans `.assets/greetd/config.toml`; son
|
||||
installation sous `/etc/greetd` appartient à `arch-system`.
|
||||
Le dossier `~/.local/bin` contient plusieurs outils personnels, notamment :
|
||||
|
||||
<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
|
||||
Zsh
|
||||
├─ Starship
|
||||
├─ Atuin
|
||||
├─ FZF
|
||||
├─ Zoxide
|
||||
├─ Eza
|
||||
├─ Bat
|
||||
└─ Yazi
|
||||
```
|
||||
Les unités présentes dans `.config/systemd/user/` permettent notamment de gérer :
|
||||
|
||||
`.zprofile` démarre la session graphique via UWSM lorsque celui-ci autorise un
|
||||
démarrage. `.zshenv` publie le socket de l'agent SSH utilisateur. L'historique,
|
||||
les bases et la clé Atuin restent strictement locaux et hors Git.
|
||||
- les notifications de batterie ;
|
||||
- Cliphist ;
|
||||
- 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
|
||||
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
|
||||
Cloner le dépôt dans le dossier personnel :
|
||||
|
||||
```bash
|
||||
git clone --recurse-submodules \
|
||||
ssh://git@git.labfytools.com:2223/fy59/Dotfiles_ArchAP.git \
|
||||
"$HOME/.dotfiles"
|
||||
git clone \
|
||||
https://git.labfytools.com/fy59/Dotfiles_ArchAP.git \
|
||||
"$HOME/Dotfiles_ArchAP"
|
||||
|
||||
cd "$HOME/.dotfiles"
|
||||
git submodule update --init --recursive
|
||||
cd "$HOME/Dotfiles_ArchAP"
|
||||
```
|
||||
|
||||
### Dry-run Stow
|
||||
|
||||
Construire la liste des packages à partir des répertoires de premier niveau :
|
||||
Avant tout déploiement, vérifier les liens qui seraient créés :
|
||||
|
||||
```bash
|
||||
mapfile -t packages < <(
|
||||
find . -mindepth 1 -maxdepth 1 -type d \
|
||||
! -name .git ! -name .assets -printf '%f\n' | sort
|
||||
)
|
||||
|
||||
stow --no --verbose=2 --target="$HOME" "${packages[@]}"
|
||||
stow --no --verbose --target="$HOME" .
|
||||
```
|
||||
|
||||
Examiner tout conflit avant le déploiement réel :
|
||||
Puis appliquer les dotfiles :
|
||||
|
||||
```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
|
||||
> package : ne pas utiliser `stow .`.
|
||||
En cas de conflit avec des fichiers existants, les sauvegarder ou les comparer avant de les remplacer.
|
||||
|
||||
<a id="package-inventory"></a>
|
||||
## Recharger la configuration
|
||||
|
||||
## ✦ Package Inventory
|
||||
|
||||
| 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 :
|
||||
Après une modification des unités systemd utilisateur :
|
||||
|
||||
```bash
|
||||
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
|
||||
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`.
|
||||
Pour réactiver les unités voulues :
|
||||
|
||||
<a id="secrets"></a>
|
||||
|
||||
## ✦ Secrets
|
||||
|
||||
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│
|
||||
└──────────────────────────────────────────────────────┘
|
||||
```bash
|
||||
systemctl --user enable --now NOM.service
|
||||
systemctl --user enable --now NOM.timer
|
||||
```
|
||||
|
||||
Ordre de reconstruction recommandé :
|
||||
Pour recharger Sway :
|
||||
|
||||
1. restaurer la couche système avec `arch-system` ;
|
||||
2. installer Git et GNU Stow ;
|
||||
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.
|
||||
```bash
|
||||
swaymsg reload
|
||||
```
|
||||
|
||||
Le dépôt ne reconstruit pas seul les projets sous `Documents`, OpenMVS local,
|
||||
les helpers `/usr/local`, les secrets, les bases applicatives ou les réglages
|
||||
matériels propres à la machine.
|
||||
## Mise à jour du dépôt
|
||||
|
||||
<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 |
|
||||
| --- | --- | --- |
|
||||
| Upstream principal | Forgejo | `ssh://git@git.labfytools.com:2223/fy59/Dotfiles_ArchAP.git` |
|
||||
| Miroir public | GitHub | `https://github.com/labfytools/Dotfiles_ArchAP` |
|
||||
Les données sensibles ne doivent jamais être ajoutées au dépôt.
|
||||
|
||||
Le fetch d'`origin` reste attaché à Forgejo. Ses URLs de push publient vers
|
||||
Forgejo et GitHub afin qu'un `git push origin main` maintienne les deux copies.
|
||||
Sont notamment exclus :
|
||||
|
||||
<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.
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@
|
|||
|
||||
## which search mode to use
|
||||
## possible values: prefix, fulltext, fuzzy, skim
|
||||
search_mode = "prefix"
|
||||
# search_mode = "fuzzy"
|
||||
|
||||
## which filter mode to use by default
|
||||
## 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
|
||||
## the accepted values are identical to those of "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
|
||||
## possible values: auto, full, compact
|
||||
|
|
|
|||
BIN
bin/.local/bin/agy
Executable file
BIN
bin/.local/bin/agy
Executable file
Binary file not shown.
3
bin/.local/bin/appid
Executable file
3
bin/.local/bin/appid
Executable file
|
|
@ -0,0 +1,3 @@
|
|||
#!/bin/sh
|
||||
sleep 3
|
||||
mmsg -g -c | sed 's/^/title|appid: /'
|
||||
|
|
@ -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 "$@"
|
||||
|
|
@ -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
1
bin/.local/bin/llama-cli
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
/home/fy59/.local/src/llama.cpp/build/bin/llama-cli
|
||||
1
bin/.local/bin/llama-server
Symbolic link
1
bin/.local/bin/llama-server
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
/home/fy59/.local/src/llama.cpp/build/bin/llama-server
|
||||
2
bin/.local/bin/mango-screenshot-clipboard.sh
Executable file
2
bin/.local/bin/mango-screenshot-clipboard.sh
Executable file
|
|
@ -0,0 +1,2 @@
|
|||
#!/bin/sh
|
||||
grim -g "$(slurp)" - | wl-copy -t image/png
|
||||
3
bin/.local/bin/mango-session.sh
Executable file
3
bin/.local/bin/mango-session.sh
Executable file
|
|
@ -0,0 +1,3 @@
|
|||
#!/bin/sh
|
||||
systemctl --user start graphical-session.target || true
|
||||
exec mango
|
||||
|
|
@ -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"
|
||||
|
|
@ -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 "$@"
|
||||
|
|
@ -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"
|
||||
|
|
@ -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())
|
||||
|
|
@ -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
|
||||
4
bin/.local/bin/waybar-restart
Normal file
4
bin/.local/bin/waybar-restart
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
#!/bin/sh
|
||||
|
||||
pkill waybar
|
||||
waybar &
|
||||
139
calcure/.config/calcure/config.ini
Normal file
139
calcure/.config/calcure/config.ini
Normal 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 = ✉
|
||||
|
||||
1
calcure/.config/calcure/events.csv
Normal file
1
calcure/.config/calcure/events.csv
Normal file
|
|
@ -0,0 +1 @@
|
|||
1,2026,3,7,"ARP",1,once,normal
|
||||
|
1
calcure/.config/calcure/info.log
Normal file
1
calcure/.config/calcure/info.log
Normal file
|
|
@ -0,0 +1 @@
|
|||
[WARNING] Couldn't load birthdays. File. /home/fy59/.abook/addressbook does not exist.
|
||||
0
calcure/.config/calcure/tasks.csv
Normal file
0
calcure/.config/calcure/tasks.csv
Normal file
|
|
3
clangd/.config/clangd/config.yaml
Normal file
3
clangd/.config/clangd/config.yaml
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
CompileFlags:
|
||||
Add:
|
||||
- "-std=c17"
|
||||
|
|
@ -1 +0,0 @@
|
|||
max-items 50
|
||||
3
cliphist/.config/config
Normal file
3
cliphist/.config/config
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
max-items 50
|
||||
max-size 100000
|
||||
|
||||
|
|
@ -1,4 +1,3 @@
|
|||
file:///home/fy59/Documents/Lardon/lardon3d
|
||||
file:///home/fy59/Downloads
|
||||
file:///home/fy59/Ansible
|
||||
file:///home/fy59/Documents
|
||||
|
|
|
|||
3
gtk-3.0/.config/gtk-3.0/settings.ini.bak
Normal file
3
gtk-3.0/.config/gtk-3.0/settings.ini.bak
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
[Settings]
|
||||
gtk-theme-name=Adwaita-dark
|
||||
gtk-icon-theme-name = "Tela-dracula-dark"
|
||||
3
gtk-4.0/.config/gtk-4.0/settings.ini.bak
Normal file
3
gtk-4.0/.config/gtk-4.0/settings.ini.bak
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
[Settings]
|
||||
gtk-theme-name=Adwaita-dark
|
||||
gtk-icon-theme-name = "Tela-dracula-dark"
|
||||
1
hyprwhspr/.config/hyprwhspr/audio_level
Symbolic link
1
hyprwhspr/.config/hyprwhspr/audio_level
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
/run/user/1000/hyprwhspr/audio_level
|
||||
1
hyprwhspr/.config/hyprwhspr/recording_control
Symbolic link
1
hyprwhspr/.config/hyprwhspr/recording_control
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
/run/user/1000/hyprwhspr/recording_control
|
||||
1
hyprwhspr/.config/hyprwhspr/recording_status
Symbolic link
1
hyprwhspr/.config/hyprwhspr/recording_status
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
/run/user/1000/hyprwhspr/recording_status
|
||||
34
mango/.config/mango/autostart.conf
Normal file
34
mango/.config/mango/autostart.conf
Normal 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
|
||||
35
mango/.config/mango/bind_apps.conf
Normal file
35
mango/.config/mango/bind_apps.conf
Normal 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"
|
||||
|
||||
94
mango/.config/mango/bind_navigation.conf
Normal file
94
mango/.config/mango/bind_navigation.conf
Normal 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
|
||||
39
mango/.config/mango/bind_sys.conf
Normal file
39
mango/.config/mango/bind_sys.conf
Normal 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
|
||||
|
||||
42
mango/.config/mango/config.conf
Normal file
42
mango/.config/mango/config.conf
Normal 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
|
||||
|
||||
11
mango/.config/mango/gestures.conf
Normal file
11
mango/.config/mango/gestures.conf
Normal 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
|
||||
29
mango/.config/mango/input.conf
Normal file
29
mango/.config/mango/input.conf
Normal 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
|
||||
|
||||
33
mango/.config/mango/layout_settings.conf
Normal file
33
mango/.config/mango/layout_settings.conf
Normal 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
|
||||
|
||||
9
mango/.config/mango/output.conf
Normal file
9
mango/.config/mango/output.conf
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
##############################
|
||||
# #
|
||||
# Output #
|
||||
# #
|
||||
##############################
|
||||
|
||||
# monitor
|
||||
monitorrule=name:^eDP-1$,width:3200,height:2000,refresh:120,scale:1.5
|
||||
|
||||
41
mango/.config/mango/rules.conf
Normal file
41
mango/.config/mango/rules.conf
Normal 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
|
||||
60
mango/.config/mango/scripts/copypast
Executable file
60
mango/.config/mango/scripts/copypast
Executable 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
|
||||
9
mango/.config/mango/scripts/lock.sh
Executable file
9
mango/.config/mango/scripts/lock.sh
Executable 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
|
||||
2
mango/.config/mango/scripts/screenshot-clip.sh
Executable file
2
mango/.config/mango/scripts/screenshot-clip.sh
Executable file
|
|
@ -0,0 +1,2 @@
|
|||
#!/usr/bin/env bash
|
||||
grim -g "$(slurp)" - | wl-copy
|
||||
75
mango/.config/mango/style.conf
Normal file
75
mango/.config/mango/style.conf
Normal 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
|
||||
|
||||
|
|
@ -1,32 +1,33 @@
|
|||
{
|
||||
"LuaSnip": { "branch": "master", "commit": "0abc8f390b278c3b4aabc4c004ac8a088b65cf24" },
|
||||
"bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" },
|
||||
"catppuccin": { "branch": "main", "commit": "edefef779ab08ce1a4a404713e3012b0d202bd35" },
|
||||
"catppuccin": { "branch": "main", "commit": "c7c692a0ad3080710893abbae100171819a3e4be" },
|
||||
"cmp-buffer": { "branch": "main", "commit": "b74fab3656eea9de20a9b8116afa3cfc4ec09657" },
|
||||
"cmp-nvim-lsp": { "branch": "main", "commit": "cbc7b02bb99fae35cb42f514762b89b5126651ef" },
|
||||
"cmp-path": { "branch": "main", "commit": "c642487086dbd9a93160e1679a1327be111cbc25" },
|
||||
"cmp_luasnip": { "branch": "master", "commit": "98d9cb5c2c38532bd9bdb481067b20fea8f32e90" },
|
||||
"friendly-snippets": { "branch": "main", "commit": "b4d01b0fdf3c9a549961c2f9ffe8dc09be166219" },
|
||||
"friendly-snippets": { "branch": "main", "commit": "6cd7280adead7f586db6fccbd15d2cac7e2188b9" },
|
||||
"lazy.nvim": { "branch": "main", "commit": "306a05526ada86a7b30af95c5cc81ffba93fef97" },
|
||||
"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" },
|
||||
"mini.starter": { "branch": "main", "commit": "25de4998197d59673f1918968a8f4060195edca0" },
|
||||
"neo-tree.nvim": { "branch": "v3.x", "commit": "1a14083046d96e88e361d1da00761c40d45012f3" },
|
||||
"nui.nvim": { "branch": "main", "commit": "10fc361835c856ba4233ef5ea135b919bf3dce97" },
|
||||
"nvim-autopairs": { "branch": "master", "commit": "430522f95fe4fb7c511ec64f8c1a90cc6a66c05c" },
|
||||
"neo-tree.nvim": { "branch": "v3.x", "commit": "ebd66767191714e008ce73b769518a763ff31bdc" },
|
||||
"neowiki.nvim": { "branch": "main", "commit": "85dddf6057b07d4d6772b2f90e754a18e958a865" },
|
||||
"nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" },
|
||||
"nvim-autopairs": { "branch": "master", "commit": "7b9923abad60b903ece7c52940e1321d39eccc79" },
|
||||
"nvim-cmp": { "branch": "main", "commit": "2ffe79f1f021def8dd1fcd81deb16f1bb0d989f3" },
|
||||
"nvim-colorizer.lua": { "branch": "master", "commit": "72a05f62c52241bc7441c820eb53946f92b2e6a4" },
|
||||
"nvim-lsp-file-operations": { "branch": "master", "commit": "0b939aff068c859b6f8cdbc3b3e676d038e6e15d" },
|
||||
"nvim-lspconfig": { "branch": "master", "commit": "046b1a797af1effe8e0474b9af9657a3761ec58a" },
|
||||
"nvim-lsp-file-operations": { "branch": "master", "commit": "b9c795d3973e8eec22706af14959bc60c579e771" },
|
||||
"nvim-lspconfig": { "branch": "master", "commit": "d592c1e6ad9a0a01b3d5ed3f0345d68407167181" },
|
||||
"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-web-devicons": { "branch": "master", "commit": "58447c1fca354bbf184425e4a8d01deecbd6f3c4" },
|
||||
"nvim-web-devicons": { "branch": "master", "commit": "2ae6958df7ced50baac5035cec0c15799eedfbf7" },
|
||||
"nvim-window-picker": { "branch": "main", "commit": "6382540b2ae5de6c793d4aa2e3fe6dbb518505ec" },
|
||||
"outline.nvim": { "branch": "main", "commit": "2a132953b944561d45b52e4541ebfff71934a742" },
|
||||
"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" },
|
||||
"telescope-file-browser.nvim": { "branch": "master", "commit": "3610dc7dc91f06aa98b11dca5cc30dfa98626b7e" },
|
||||
"telescope.nvim": { "branch": "0.1.x", "commit": "a0bbec21143c7bc5f8bb02e0005fa0b982edc026" },
|
||||
|
|
|
|||
|
|
@ -31,36 +31,5 @@ require("lazy").setup({
|
|||
-- colorscheme that will be used when installing plugins.
|
||||
install = { colorscheme = { "habamax" } },
|
||||
-- automatically check for plugin updates
|
||||
checker = { enabled = false },
|
||||
})
|
||||
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,
|
||||
checker = { enabled = true },
|
||||
})
|
||||
|
|
|
|||
17
nvim/.config/nvim/lua/plugins/neowiki.lua
Normal file
17
nvim/.config/nvim/lua/plugins/neowiki.lua
Normal 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" },
|
||||
},
|
||||
}
|
||||
12
nvim/.config/nvim/lua/plugins/nvim-tree.lua.old
Normal file
12
nvim/.config/nvim/lua/plugins/nvim-tree.lua.old
Normal 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 },
|
||||
},
|
||||
}
|
||||
|
||||
|
|
@ -1,40 +1,46 @@
|
|||
return {
|
||||
{
|
||||
"nvim-mini/mini.starter",
|
||||
version = false,
|
||||
config = function()
|
||||
local starter = require("mini.starter")
|
||||
{
|
||||
"nvim-mini/mini.starter",
|
||||
version = false,
|
||||
config = function()
|
||||
local starter = require("mini.starter")
|
||||
|
||||
starter.setup({
|
||||
starter.setup({
|
||||
autoopen = true,
|
||||
header = table.concat({
|
||||
"███╗ ██╗███████╗ ██████╗ ██╗ ██╗██╗███╗ ███╗",
|
||||
"████╗ ██║██╔════╝██╔═══██╗██║ ██║██║████╗ ████║",
|
||||
"██╔██╗ ██║█████╗ ██║ ██║██║ ██║██║██╔████╔██║",
|
||||
"██║╚██╗██║██╔══╝ ██║ ██║╚██╗ ██╔╝██║██║╚██╔╝██║",
|
||||
"██║ ╚████║███████╗╚██████╔╝ ╚████╔╝ ██║██║ ╚═╝ ██║",
|
||||
"",
|
||||
"##############################################################",
|
||||
"#### FY59's nvim config ####",
|
||||
"##############################################################",
|
||||
"",
|
||||
"███╗ ██╗███████╗ ██████╗ ██╗ ██╗██╗███╗ ███╗",
|
||||
"████╗ ██║██╔════╝██╔═══██╗██║ ██║██║████╗ ████║",
|
||||
"██╔██╗ ██║█████╗ ██║ ██║██║ ██║██║██╔████╔██║",
|
||||
"██║╚██╗██║██╔══╝ ██║ ██║╚██╗ ██╔╝██║██║╚██╔╝██║",
|
||||
"██║ ╚████║███████╗╚██████╔╝ ╚████╔╝ ██║██║ ╚═╝ ██║",
|
||||
"",
|
||||
"##############################################################",
|
||||
"#### FY59's nvim config ####",
|
||||
"##############################################################",
|
||||
"",
|
||||
}, "\n"),
|
||||
items = {
|
||||
starter.sections.recent_files(8),
|
||||
starter.sections.telescope(),
|
||||
{
|
||||
name = "Open Nvim config",
|
||||
action = "edit ~/.config/nvim/init.lua",
|
||||
section = "Config",
|
||||
},
|
||||
{
|
||||
name = "Quit",
|
||||
action = "quit",
|
||||
section = "Actions",
|
||||
},
|
||||
},
|
||||
footer = "Happy editing – from FY59's config",
|
||||
})
|
||||
starter.sections.recent_files(8),
|
||||
{
|
||||
name = "Open Wiki",
|
||||
action = "edit ~/wiki/index.md", -- adapte le chemin
|
||||
section = " Wiki",
|
||||
},
|
||||
starter.sections.telescope(),
|
||||
{
|
||||
name = "Open Nvim config",
|
||||
action = "edit ~/.config/nvim/init.lua",
|
||||
section = " Config",
|
||||
},
|
||||
{
|
||||
name = "Quit",
|
||||
action = "quit",
|
||||
section = " Actions",
|
||||
},
|
||||
},
|
||||
footer = "Happy editing – from FY59's config",
|
||||
})
|
||||
end,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -29,7 +29,9 @@ Objectif : un setup léger, lisible, facile à maintenir et à hacker.
|
|||
│ ├── lsp.lua
|
||||
│ ├── mini-icons.lua
|
||||
│ ├── mini_map.lua
|
||||
│ ├── neowiki.lua
|
||||
│ ├── nvim-autopair.lua
|
||||
│ ├── nvim-tree.lua.old
|
||||
│ ├── outline.lua
|
||||
│ ├── render-markdown.lua
|
||||
│ ├── starter.lua
|
||||
|
|
@ -151,9 +153,16 @@ Keymaps personnalisés :
|
|||
- lewis6991/gitsigns.nvim pour les signes Git dans la marge.
|
||||
- tpope/vim-fugitive
|
||||
|
||||
9. starter
|
||||
9. Notes / Wiki
|
||||
- echaya/neowiki.nvim comme wiki moderne (successeur de Vimwiki).
|
||||
|
||||
10. 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
|
||||
|
||||
- folke/which-key.nvim
|
||||
|
|
@ -186,3 +195,4 @@ LSP
|
|||
- <leader>h : clear search.
|
||||
|
||||
En Visuel : Tab / Shift-Tab → indent/désindent la sélection.
|
||||
|
||||
|
|
|
|||
105
opencode/.config/opencode/opencode.json.pre-reset-
Normal file
105
opencode/.config/opencode/opencode.json.pre-reset-
Normal 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/**"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
@ -31,8 +31,6 @@ Personal SwayFX configuration, modular and lightweight, designed for everyday Wa
|
|||
- swayfx
|
||||
- swaylock
|
||||
- swayidle
|
||||
- tlp
|
||||
- tlp-pd
|
||||
|
||||
### Bar and status
|
||||
- i3status-rs
|
||||
|
|
@ -47,6 +45,8 @@ Personal SwayFX configuration, modular and lightweight, designed for everyday Wa
|
|||
- cliphist
|
||||
- wlsunset
|
||||
- brightnessctl
|
||||
- powerprofilesctl
|
||||
- swaync
|
||||
- nm-connection-editor
|
||||
- playerctl
|
||||
|
||||
|
|
@ -87,7 +87,7 @@ Example:
|
|||
|
||||
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,
|
||||
- focused window,
|
||||
- music,
|
||||
|
|
@ -103,8 +103,11 @@ The i3status-rust configuration includes:
|
|||
|
||||
## Autostart
|
||||
|
||||
On startup, Sway launches the inactive-window transparency helper, LiMusic and
|
||||
`autotiling`. Wlsunset, Cliphist and swayidle are owned by user systemd units.
|
||||
On startup, the config launches:
|
||||
- `wlsunset` for blue light reduction,
|
||||
- `wl-paste --watch cliphist store` for clipboard history,
|
||||
- `swayidle` for automatic locking and screen power management.
|
||||
- `swaync`
|
||||
|
||||
## Keybinds
|
||||
|
||||
|
|
@ -113,26 +116,25 @@ Some important shortcuts:
|
|||
- `Mod + q`: close the focused window.
|
||||
- `Mod + Shift + e`: exit Sway via `swaynag`.
|
||||
- `Mod + r`: resize mode.
|
||||
- `Mod + Ctrl + r`: reload the config.
|
||||
- `Mod + Alt + o`: lock the screen.
|
||||
- `Mod + Shift + c`: reload the config.
|
||||
- `Mod + Ctrl + l`: lock the screen.
|
||||
- `Print`: capture a selected area to the clipboard.
|
||||
- `Shift + Print`: capture the full screen to the clipboard.
|
||||
- `Mod + Alt + l`: launcher Wofi.
|
||||
- `Mod + Alt + v`: Cliphist via Wofi.
|
||||
- `Mod + F9`, `Mod + F10`, `Mod + F11`: TLP power profiles.
|
||||
- `Mod + Ctrl + e`: launcher wofi
|
||||
- `Mod + v`: wofi cliphist
|
||||
- `Mod + F9``Mod + F10``Mod + F11`: power profiles
|
||||
|
||||
## Power profiles
|
||||
|
||||
The bar displays the current TLP and platform profiles. The related keybinds
|
||||
use the unprivileged `tlpctl` interface provided by `tlp-pd`:
|
||||
The bar includes a `powerprofilesctl` block with:
|
||||
- `performance`,
|
||||
- `balanced`,
|
||||
- `power-saver`.
|
||||
|
||||
The related keybinds are:
|
||||
- `Mod + F9`: `tlpctl power-saver`.
|
||||
- `Mod + F10`: `tlpctl balanced`.
|
||||
- `Mod + F11`: `tlpctl performance`.
|
||||
- `Mod + F9`: power-saver.
|
||||
- `Mod + F10`: balanced.
|
||||
- `Mod + F11`: performance.
|
||||
|
||||
## Floating windows
|
||||
|
||||
|
|
|
|||
|
|
@ -12,11 +12,11 @@ exec python3 ~/.config/sway/scripts/inactive-windows-transparency.py
|
|||
# Règles d'assignation automatique
|
||||
# =================================================
|
||||
|
||||
assign [app_id="limusic-app"] workspace 10
|
||||
assign [class="Spotify"] workspace 10
|
||||
|
||||
# =================================================
|
||||
# Lancement des applications
|
||||
# =================================================
|
||||
|
||||
exec limusic-app
|
||||
exec spotify-launcher
|
||||
exec autotiling
|
||||
|
|
|
|||
60
sway/.config/sway/autostart.bak
Executable file
60
sway/.config/sway/autostart.bak
Executable 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'
|
||||
|
|
@ -17,7 +17,7 @@ set $term kitty
|
|||
bindsym $mod+Return exec $term
|
||||
|
||||
# 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.
|
||||
# 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+a exec AppFlowy
|
||||
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+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
|
||||
|
|
@ -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+w exec gtk-launch chrome-hnpfjngllnobngcgfapefoaidbinmjnm-Default
|
||||
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+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+c exec codex-desktop
|
||||
|
||||
###############################################
|
||||
#
|
||||
|
|
@ -239,6 +238,7 @@ bindsym Print exec grim -g "$(slurp)" - | wl-copy -t image/png
|
|||
# Power Daemon
|
||||
#
|
||||
###############################################
|
||||
bindsym $mod+F9 exec tlpctl power-saver
|
||||
bindsym $mod+F10 exec tlpctl balanced
|
||||
bindsym $mod+F11 exec tlpctl performance
|
||||
bindsym $mod+F9 exec powerprofilesctl set power-saver
|
||||
bindsym $mod+F10 exec powerprofilesctl set balanced
|
||||
bindsym $mod+F11 exec powerprofilesctl set performance
|
||||
|
||||
|
|
|
|||
|
|
@ -8,12 +8,3 @@
|
|||
|
||||
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
|
||||
|
||||
#=================================================
|
||||
# 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
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@
|
|||
exec_always {
|
||||
gsettings set $gnome-schema font-name 'jetbrains mono nerd font 12'
|
||||
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
|
||||
|
|
@ -40,5 +40,5 @@ seat seat0 xcursor_theme $cursor_theme $cursor_size
|
|||
|
||||
|
||||
# Set inner/outer gaps
|
||||
gaps inner 5
|
||||
gaps inner 8
|
||||
gaps outer 0
|
||||
|
|
|
|||
82
swaync/.config/swaync/config.json
Normal file
82
swaync/.config/swaync/config.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
swaync/.config/swaync/notification.ogg
Normal file
BIN
swaync/.config/swaync/notification.ogg
Normal file
Binary file not shown.
328
swaync/.config/swaync/style.css
Normal file
328
swaync/.config/swaync/style.css
Normal 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;
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
[Unit]
|
||||
Description=Arch Sentinel - relevé périodique
|
||||
|
||||
[Timer]
|
||||
OnBootSec=2min
|
||||
OnUnitActiveSec=5min
|
||||
AccuracySec=30s
|
||||
Persistent=true
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
|
|
@ -1 +1 @@
|
|||
../clean-makepkg.service
|
||||
/home/fy59/.config/systemd/user/clean-makepkg.service
|
||||
|
|
@ -1 +1 @@
|
|||
../gnome-keyring-daemon.service
|
||||
/home/fy59/.config/systemd/user/gnome-keyring-daemon.service
|
||||
|
|
@ -1 +1 @@
|
|||
../ssh-agent.service
|
||||
/home/fy59/.config/systemd/user/ssh-agent.service
|
||||
|
|
@ -1 +0,0 @@
|
|||
../trainlog-btd.service
|
||||
|
|
@ -1 +0,0 @@
|
|||
../trainlog-syncd.service
|
||||
|
|
@ -1 +0,0 @@
|
|||
../trainlog-web.service
|
||||
11
systemd/.config/systemd/user/gnome-keyring.service
Normal file
11
systemd/.config/systemd/user/gnome-keyring.service
Normal 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
|
||||
|
|
@ -1 +1 @@
|
|||
../cliphist-image.service
|
||||
/home/fy59/.config/systemd/user/cliphist-image.service
|
||||
|
|
@ -1 +1 @@
|
|||
../cliphist-text.service
|
||||
/home/fy59/.config/systemd/user/cliphist-text.service
|
||||
|
|
@ -0,0 +1 @@
|
|||
/home/fy59/.config/systemd/user/keyring.service
|
||||
|
|
@ -1 +1 @@
|
|||
../swayidle.service
|
||||
/home/fy59/.config/systemd/user/swayidle.service
|
||||
|
|
@ -1 +1 @@
|
|||
../wlsunset.service
|
||||
/home/fy59/.config/systemd/user/wlsunset.service
|
||||
11
systemd/.config/systemd/user/keyring.service
Normal file
11
systemd/.config/systemd/user/keyring.service
Normal 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
|
||||
|
|
@ -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
|
||||
|
|
@ -4,7 +4,7 @@ PartOf=graphical-session.target
|
|||
After=graphical-session.target
|
||||
|
||||
[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
|
||||
|
||||
[Install]
|
||||
|
|
|
|||
11
systemd/.config/systemd/user/swaync.service
Normal file
11
systemd/.config/systemd/user/swaync.service
Normal 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
|
||||
|
|
@ -1 +0,0 @@
|
|||
../arch-sentinel-sample.timer
|
||||
|
|
@ -1 +1 @@
|
|||
../battery-low-notify.timer
|
||||
/home/fy59/.config/systemd/user/battery-low-notify.timer
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
[Service]
|
||||
Environment=TRAINLOG_SYNC_GENERATION_CONFIG=/home/fy59/.config/trainlog/sync-generation-config-v1.json
|
||||
|
|
@ -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
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
[Service]
|
||||
Environment=TRAINLOG_SYNC_GENERATION_CONFIG=/home/fy59/.config/trainlog/sync-generation-config-v1.json
|
||||
|
|
@ -1 +0,0 @@
|
|||
sway.desktop
|
||||
178
waybar/.config/waybar/config.jsonc
Normal file
178
waybar/.config/waybar/config.jsonc
Normal 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
|
||||
}
|
||||
}
|
||||
12
waybar/.config/waybar/hyprwhspr-module.jsonc
Normal file
12
waybar/.config/waybar/hyprwhspr-module.jsonc
Normal 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
|
||||
}
|
||||
}
|
||||
26
waybar/.config/waybar/mocha.css
Normal file
26
waybar/.config/waybar/mocha.css
Normal 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;
|
||||
16
waybar/.config/waybar/scripts/active-window.sh
Executable file
16
waybar/.config/waybar/scripts/active-window.sh
Executable 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
Loading…
Reference in a new issue