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
|
avahi-daemon.service
|
||||||
blueman-mechanism.service
|
|
||||||
bluetooth.service
|
bluetooth.service
|
||||||
cups.service
|
cups.service
|
||||||
getty@.service
|
getty@.service
|
||||||
greetd.service
|
greetd.service
|
||||||
|
grub-btrfsd.service
|
||||||
|
libvirtd.service
|
||||||
|
NetworkManager-dispatcher.service
|
||||||
|
NetworkManager-wait-online.service
|
||||||
|
NetworkManager.service
|
||||||
nftables.service
|
nftables.service
|
||||||
nginx.service
|
power-profiles-daemon.service
|
||||||
sshd.service
|
seatd.service
|
||||||
|
systemd-oomd.service
|
||||||
|
systemd-resolved.service
|
||||||
systemd-timesyncd.service
|
systemd-timesyncd.service
|
||||||
tlp-pd.service
|
|
||||||
tlp.service
|
|
||||||
wg-quick@wg0.service
|
|
||||||
|
|
|
||||||
|
|
@ -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]
|
[terminal]
|
||||||
|
# The VT to run the greeter on. Can be "next", "current" or a number
|
||||||
|
# designating the VT.
|
||||||
vt = 1
|
vt = 1
|
||||||
|
|
||||||
|
# The default session, also known as the greeter.
|
||||||
[default_session]
|
[default_session]
|
||||||
command = "tuigreet --remember --asterisks --time --greeting 'Welcome to ArchASP' --theme 'container=brightblack;border=magenta;text=white;greet=brightmagenta;prompt=cyan;input=brightcyan;time=brightyellow;error=red;button=green;action=green' --cmd 'uwsm start default' --power-shutdown 'shutdown -h now' --power-reboot 'reboot'"
|
|
||||||
user = "greeter"
|
# `agreety` is the bundled agetty/login-lookalike. You can replace `/bin/sh`
|
||||||
|
# with whatever you want started, such as `sway`.
|
||||||
|
command = "sway --config /etc/greetd/sway-config"
|
||||||
|
|
||||||
|
# The user to run the command as. The privileges this user must have depends
|
||||||
|
# on the greeter. A graphical greeter may for example require the user to be
|
||||||
|
# in the `video` group.
|
||||||
|
user = ""
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
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
|
7zip
|
||||||
|
accountsservice
|
||||||
|
acpi
|
||||||
alsa-utils
|
alsa-utils
|
||||||
amd-ucode
|
amass
|
||||||
amdgpu_top
|
|
||||||
android-file-transfer
|
|
||||||
android-tools
|
|
||||||
ansible
|
|
||||||
atuin
|
|
||||||
autotiling
|
|
||||||
axel
|
|
||||||
base
|
base
|
||||||
base-devel
|
base-devel
|
||||||
|
bash-completion
|
||||||
bat
|
bat
|
||||||
bat-extras
|
|
||||||
bear
|
|
||||||
bind
|
|
||||||
blueman
|
blueman
|
||||||
bluez
|
bluez
|
||||||
bluez-utils
|
bluez-utils
|
||||||
brightnessctl
|
brightnessctl
|
||||||
|
broadcom-wl-dkms
|
||||||
btop
|
btop
|
||||||
btrfs-progs
|
btrfs-progs
|
||||||
ccache
|
calcure
|
||||||
clang
|
catppuccin-cursors-mocha
|
||||||
|
catppuccin-gtk-theme-mocha
|
||||||
cliphist
|
cliphist
|
||||||
cloc
|
cpio
|
||||||
cmake
|
|
||||||
composer
|
|
||||||
cowsay
|
|
||||||
cppcheck
|
|
||||||
cppdap
|
|
||||||
cpupower
|
|
||||||
cups
|
cups
|
||||||
cups-pk-helper
|
dante
|
||||||
dmidecode
|
deezer
|
||||||
|
dgop
|
||||||
|
dialog
|
||||||
|
discord
|
||||||
dnsmasq
|
dnsmasq
|
||||||
docker
|
|
||||||
dosfstools
|
dosfstools
|
||||||
|
ecryptfs-utils
|
||||||
|
edk2-ovmf
|
||||||
efibootmgr
|
efibootmgr
|
||||||
eigen
|
|
||||||
evince
|
|
||||||
evtest
|
evtest
|
||||||
exfatprogs
|
exfatprogs
|
||||||
eza
|
eza
|
||||||
fastfetch
|
fastfetch
|
||||||
fd
|
fd
|
||||||
ffmpegthumbnailer
|
|
||||||
figlet
|
figlet
|
||||||
|
file-roller
|
||||||
firefox
|
firefox
|
||||||
firefox-i18n-fr
|
firefox-i18n-fr
|
||||||
flatpak
|
foomatic-db
|
||||||
freecad
|
foomatic-db-gutenprint-ppds
|
||||||
|
foomatic-db-nonfree
|
||||||
|
foomatic-db-nonfree-ppds
|
||||||
|
foomatic-db-ppds
|
||||||
|
fuse-overlayfs
|
||||||
|
fuse2
|
||||||
fzf
|
fzf
|
||||||
ggml-vulkan
|
gammastep
|
||||||
gimp
|
|
||||||
gimp-help-fr
|
|
||||||
git
|
git
|
||||||
github-cli
|
github-cli
|
||||||
gnome-keyring
|
gnome-themes-extra
|
||||||
gnu-free-fonts
|
gnu-free-fonts
|
||||||
gphoto2
|
gobuster
|
||||||
gradle
|
google-chrome
|
||||||
greetd-tuigreet
|
greetd-regreet
|
||||||
grim
|
grim
|
||||||
grub
|
grub
|
||||||
|
grub-btrfs
|
||||||
gst-libav
|
gst-libav
|
||||||
gst-plugin-gtk4
|
|
||||||
gst-plugin-pipewire
|
gst-plugin-pipewire
|
||||||
|
gst-plugins-bad
|
||||||
|
gst-plugins-base
|
||||||
gst-plugins-good
|
gst-plugins-good
|
||||||
gtk4
|
gst-plugins-ugly
|
||||||
gtklock
|
gum
|
||||||
gtklock-playerctl-module
|
hashcat
|
||||||
gtklock-powerbar-module
|
|
||||||
gtklock-userinfo-module
|
|
||||||
gvfs
|
|
||||||
heimdall
|
|
||||||
hplip
|
hplip
|
||||||
|
hunspell-en_us
|
||||||
|
hunspell-fr
|
||||||
i3status-rust
|
i3status-rust
|
||||||
ifuse
|
inter-font
|
||||||
imagemagick
|
inxi
|
||||||
inotify-tools
|
|
||||||
jadx
|
|
||||||
jdk-openjdk
|
|
||||||
jdk17-openjdk
|
|
||||||
john
|
john
|
||||||
julia
|
jq
|
||||||
kitty
|
kitty
|
||||||
less
|
libspng
|
||||||
libgsf
|
libvirt
|
||||||
libheif
|
linux
|
||||||
libimobiledevice
|
|
||||||
libjpeg-turbo
|
|
||||||
libmtp
|
|
||||||
libplist
|
|
||||||
libpulse
|
|
||||||
limine
|
|
||||||
linux-firmware
|
linux-firmware
|
||||||
linux-lts
|
linux-headers
|
||||||
linux-lts-headers
|
lsb-release
|
||||||
linux-zen
|
lsd
|
||||||
linux-zen-headers
|
maim
|
||||||
llama-cpp
|
man-db
|
||||||
luarocks
|
|
||||||
mako
|
|
||||||
man-pages
|
man-pages
|
||||||
man-pages-fr
|
man-pages-fr
|
||||||
memtest86+
|
mercurial
|
||||||
memtest86+-efi
|
mtools
|
||||||
mesa-utils
|
|
||||||
meson
|
|
||||||
mold
|
|
||||||
mpv
|
|
||||||
mtpfs
|
|
||||||
neovim
|
neovim
|
||||||
networkmanager
|
networkmanager
|
||||||
nextcloud-client
|
nikto
|
||||||
nginx
|
nmsurf
|
||||||
nodejs
|
nodejs
|
||||||
notcurses
|
noto-fonts
|
||||||
|
noto-fonts-cjk
|
||||||
noto-fonts-emoji
|
noto-fonts-emoji
|
||||||
npm
|
noto-fonts-extra
|
||||||
nss-mdns
|
nss-mdns
|
||||||
ntfs-3g
|
openbsd-netcat
|
||||||
ntp
|
openvpn
|
||||||
nvme-cli
|
optipng
|
||||||
openresolv
|
os-prober
|
||||||
openssh
|
otf-font-awesome
|
||||||
pacman-contrib
|
pacman-contrib
|
||||||
pavucontrol
|
pamixer
|
||||||
|
parallel
|
||||||
|
pass
|
||||||
perl-image-exiftool
|
perl-image-exiftool
|
||||||
php
|
|
||||||
pipewire
|
|
||||||
pipewire-alsa
|
pipewire-alsa
|
||||||
pipewire-jack
|
pipewire-jack
|
||||||
pipewire-libcamera
|
|
||||||
pipewire-pulse
|
pipewire-pulse
|
||||||
podman
|
playerctl
|
||||||
powertop
|
pnpm
|
||||||
protonmail-bridge
|
polkit-gnome
|
||||||
|
power-profiles-daemon
|
||||||
pyenv
|
pyenv
|
||||||
pyright
|
python-gobject
|
||||||
python-i3ipc
|
python-i3ipc
|
||||||
python-jsonschema
|
python-jedi
|
||||||
python-opencv
|
python-pip
|
||||||
python-pipenv
|
python-pipx
|
||||||
python-psutil
|
python-pyamdgpuinfo
|
||||||
python-pynvim
|
python-pyquery
|
||||||
python-textual
|
python-utils
|
||||||
qt5-wayland
|
qalculate-gtk
|
||||||
|
qt5-quickcontrols2
|
||||||
qt5ct
|
qt5ct
|
||||||
qt6-wayland
|
|
||||||
qt6ct
|
qt6ct
|
||||||
radeontop
|
|
||||||
rclone
|
|
||||||
reflector
|
reflector
|
||||||
renderdoc
|
|
||||||
rhash
|
|
||||||
ripgrep
|
ripgrep
|
||||||
rocm-smi-lib
|
rust
|
||||||
rofi
|
|
||||||
rsync
|
|
||||||
ruby
|
|
||||||
rustup
|
|
||||||
samba
|
|
||||||
sane
|
sane
|
||||||
sane-airscan
|
sane-airscan
|
||||||
sbctl
|
sassc
|
||||||
|
scrollmpris-git
|
||||||
|
seat
|
||||||
|
seatd
|
||||||
|
seclists
|
||||||
|
slop
|
||||||
slurp
|
slurp
|
||||||
smartmontools
|
snap-pac-grub
|
||||||
snap-pac
|
|
||||||
snapper
|
snapper
|
||||||
sof-firmware
|
sof-firmware
|
||||||
spirv-headers
|
|
||||||
spotify-launcher
|
|
||||||
sqlitebrowser
|
|
||||||
starship
|
starship
|
||||||
stow
|
|
||||||
strace
|
strace
|
||||||
sudo
|
|
||||||
sway
|
|
||||||
swaybg
|
swaybg
|
||||||
|
swayfx
|
||||||
swayidle
|
swayidle
|
||||||
swaylock
|
swayimg
|
||||||
|
swaylock-effects
|
||||||
swaync
|
swaync
|
||||||
system-config-printer
|
systemd-resolvconf
|
||||||
tcpdump
|
tcpdump
|
||||||
tea
|
testdisk
|
||||||
tela-circle-icon-theme-all
|
texinfo
|
||||||
terminus-font
|
|
||||||
tesseract
|
|
||||||
tesseract-data-eng
|
|
||||||
tesseract-data-fra
|
|
||||||
thunar
|
|
||||||
thunar-archive-plugin
|
|
||||||
thunar-volman
|
|
||||||
thunderbird
|
|
||||||
thunderbird-i18n-fr
|
|
||||||
tlp
|
tlp
|
||||||
tlp-pd
|
|
||||||
tlp-rdw
|
|
||||||
tmux
|
|
||||||
traceroute
|
|
||||||
transmission-cli
|
|
||||||
transmission-gtk
|
|
||||||
tree
|
tree
|
||||||
tree-sitter-cli
|
ttf-bitstream-vera
|
||||||
ttf-dejavu
|
ttf-dejavu
|
||||||
|
ttf-droid
|
||||||
|
ttf-fantasque-nerd
|
||||||
ttf-fira-code
|
ttf-fira-code
|
||||||
|
ttf-fira-sans
|
||||||
|
ttf-firacode-nerd
|
||||||
ttf-jetbrains-mono
|
ttf-jetbrains-mono
|
||||||
ttf-jetbrains-mono-nerd
|
ttf-liberation
|
||||||
tumbler
|
ttf-nerd-fonts-symbols-mono
|
||||||
typst
|
ttf-noto-nerd
|
||||||
|
ttf-victor-mono
|
||||||
|
umockdev
|
||||||
unrar
|
unrar
|
||||||
unzip
|
unzip
|
||||||
usbmuxd
|
|
||||||
usbutils
|
usbutils
|
||||||
uwsm
|
vde2
|
||||||
valgrind
|
w3m
|
||||||
vcpkg
|
|
||||||
vlc
|
|
||||||
volk
|
|
||||||
vulkan-headers
|
|
||||||
vulkan-radeon
|
|
||||||
vulkan-tools
|
|
||||||
vulkan-utility-libraries
|
|
||||||
vulkan-validation-layers
|
|
||||||
waybar
|
|
||||||
wayland-utils
|
|
||||||
webp-pixbuf-loader
|
|
||||||
wev
|
|
||||||
wget
|
wget
|
||||||
whois
|
|
||||||
wireguard-tools
|
wireguard-tools
|
||||||
wireplumber
|
wl-clip-persist
|
||||||
wl-clipboard
|
|
||||||
wlopm
|
|
||||||
wlr-randr
|
|
||||||
wlsunset
|
wlsunset
|
||||||
wofi
|
wofi
|
||||||
wpa_supplicant
|
wttrbar
|
||||||
xdg-desktop-portal
|
xclip
|
||||||
|
xdg-desktop-portal-gtk
|
||||||
xdg-desktop-portal-wlr
|
xdg-desktop-portal-wlr
|
||||||
xf86-video-amdgpu
|
xdg-user-dirs
|
||||||
xorg-xrdb
|
xf86-video-nouveau
|
||||||
|
xmlstarlet
|
||||||
xorg-xwayland
|
xorg-xwayland
|
||||||
|
xournalpp
|
||||||
|
yarn
|
||||||
yazi
|
yazi
|
||||||
yt-dlp
|
zip
|
||||||
zoxide
|
zoxide
|
||||||
zram-generator
|
zram-generator
|
||||||
zsh
|
zsh
|
||||||
|
zsh-autocomplete
|
||||||
|
zsh-autosuggestions
|
||||||
zsh-completions
|
zsh-completions
|
||||||
|
zsh-history-substring-search
|
||||||
|
zsh-syntax-highlighting
|
||||||
|
|
|
||||||
27
.gitignore
vendored
27
.gitignore
vendored
|
|
@ -1,29 +1,2 @@
|
||||||
atuin/.local/share/
|
atuin/.local/share/
|
||||||
hyprwhspr/.local/share/
|
hyprwhspr/.local/share/
|
||||||
|
|
||||||
# Generated language/package-manager data
|
|
||||||
**/__pycache__/
|
|
||||||
*.py[cod]
|
|
||||||
**/node_modules/
|
|
||||||
|
|
||||||
# Local editor/application backups
|
|
||||||
*.bak
|
|
||||||
*.old
|
|
||||||
|
|
||||||
# Hyprwhspr runtime endpoints are recreated below XDG_RUNTIME_DIR.
|
|
||||||
hyprwhspr/.config/hyprwhspr/audio_level
|
|
||||||
hyprwhspr/.config/hyprwhspr/recording_control
|
|
||||||
hyprwhspr/.config/hyprwhspr/recording_status
|
|
||||||
|
|
||||||
# Machine-local or project-owned launchers exposed through ~/.local/bin.
|
|
||||||
bin/.local/bin/agy
|
|
||||||
bin/.local/bin/android
|
|
||||||
bin/.local/bin/arch-sentinel
|
|
||||||
bin/.local/bin/codex
|
|
||||||
bin/.local/bin/goose
|
|
||||||
bin/.local/bin/labfy-remote-ui
|
|
||||||
bin/.local/bin/trainlog
|
|
||||||
bin/.local/bin/trainlog-bt-watch
|
|
||||||
bin/.local/bin/trainlog-btd
|
|
||||||
bin/.local/bin/trainlog-sync-once
|
|
||||||
bin/.local/bin/trainlog-syncd
|
|
||||||
|
|
|
||||||
12
.gitmodules
vendored
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">
|
# Dotfiles ArchASP
|
||||||
<img src=".assets/screen.jpg" alt="ArchASP — Sway desktop" width="100%">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h1 align="center">ArchASP Dotfiles</h1>
|
Configurations utilisateur de mon poste principal sous **Arch Linux**, avec un environnement **Wayland / Sway**.
|
||||||
|
|
||||||
<p align="center">
|
Ce dépôt contient uniquement les fichiers liés à ma session utilisateur.
|
||||||
Configuration utilisateur reproductible pour une station Arch Linux sous
|
Les configurations système, les paquets, Btrfs, Snapper, Limine, TLP, nftables et les outils nécessitant les droits root sont gérés séparément dans le dépôt [`arch-system`](https://git.labfytools.com/fy59/arch-system).
|
||||||
Wayland, déployée package par package avec GNU Stow.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p align="center">
|
## Environnement
|
||||||
<code>Arch Linux</code> · <code>Sway</code> · <code>GNU Stow</code> ·
|
|
||||||
<code>systemd --user</code> · <code>Zsh</code>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p align="center">
|
- Arch Linux
|
||||||
<a href="#overview">Overview</a> ·
|
- Sway
|
||||||
<a href="#desktop-stack">Desktop</a> ·
|
- Wayland
|
||||||
<a href="#shell-stack">Shell</a> ·
|
- Kitty
|
||||||
<a href="#repository-layout">Layout</a> ·
|
- Zsh
|
||||||
<a href="#deployment">Deployment</a> ·
|
- Neovim
|
||||||
<a href="#rebuilding-archasp">Rebuild</a>
|
- PipeWire / WirePlumber
|
||||||
</p>
|
- systemd utilisateur
|
||||||
|
- GNU Stow pour le déploiement des fichiers
|
||||||
|
|
||||||
<a id="overview"></a>
|
## Contenu
|
||||||
|
|
||||||
## ✦ Overview
|
Le dépôt regroupe notamment :
|
||||||
|
|
||||||
Ce dépôt contient la couche **utilisateur** d'ArchASP : session graphique,
|
|
||||||
applications terminal, shell, scripts personnels et unités systemd user. La
|
|
||||||
couche **système/root** est volontairement séparée.
|
|
||||||
|
|
||||||
| Dépôt | Responsabilité |
|
|
||||||
| --- | --- |
|
|
||||||
| **`.dotfiles`** | Sway, Kitty, Neovim, Zsh, scripts, thèmes et services utilisateur |
|
|
||||||
| **[`arch-system`](https://git.labfytools.com/fy59/arch-system)** | Installation Arch, boot, stockage, réseau, paquets, `/etc` et helpers root |
|
|
||||||
|
|
||||||
Cette séparation évite de mêler état personnel et administration système. Le
|
|
||||||
dépôt reste néanmoins spécifique à la machine : sorties Sway, périphériques,
|
|
||||||
chemins sous `/home/fy59` et projets externes doivent être relus avant un
|
|
||||||
déploiement ailleurs.
|
|
||||||
|
|
||||||
<a id="desktop-stack"></a>
|
|
||||||
|
|
||||||
## ✦ Desktop Stack
|
|
||||||
|
|
||||||
```text
|
```text
|
||||||
greetd
|
.config/
|
||||||
└─ tuigreet
|
├── kitty/
|
||||||
└─ UWSM
|
├── nvim/
|
||||||
└─ Sway
|
├── sway/
|
||||||
├─ Swaybar ── i3status-rs
|
├── systemd/user/
|
||||||
├─ Mako notifications
|
└── ...
|
||||||
├─ Wofi launcher
|
|
||||||
├─ Swaylock verrouillage
|
.local/
|
||||||
├─ Cliphist historique du presse-papiers
|
├── bin/
|
||||||
└─ Kitty terminal
|
└── share/
|
||||||
|
|
||||||
|
.zshrc
|
||||||
```
|
```
|
||||||
|
|
||||||
| Fonction | Composant canonique |
|
### Scripts utilisateur
|
||||||
| --- | --- |
|
|
||||||
| Session | `greetd → tuigreet → uwsm start default → sway.desktop` |
|
|
||||||
| Compositor | Sway / SwayFX |
|
|
||||||
| Barre | Swaybar avec i3status-rs |
|
|
||||||
| Notifications | Mako |
|
|
||||||
| Launcher | Wofi |
|
|
||||||
| Verrouillage et idle | Swaylock + swayidle |
|
|
||||||
| Presse-papiers | wl-clipboard + Cliphist |
|
|
||||||
| Terminal | Kitty |
|
|
||||||
| Profils d'énergie | TLP via l'interface utilisateur `tlpctl` |
|
|
||||||
|
|
||||||
`uwsm/.config/uwsm/default-id` sélectionne `sway.desktop`. La copie de
|
Le dossier `~/.local/bin` contient plusieurs outils personnels, notamment :
|
||||||
référence de greetd se trouve dans `.assets/greetd/config.toml`; son
|
|
||||||
installation sous `/etc/greetd` appartient à `arch-system`.
|
|
||||||
|
|
||||||
<a id="shell-stack"></a>
|
- gestion temporaire du seuil de charge de la batterie ;
|
||||||
|
- synchronisation Nextcloud à la demande ;
|
||||||
|
- lancement conjoint de Thunderbird et Proton Mail Bridge ;
|
||||||
|
- démarrage et arrêt à la demande de VMware et Samba ;
|
||||||
|
- notifications de batterie faible ;
|
||||||
|
- outils de maintenance Arch et AUR ;
|
||||||
|
- scripts liés à Sway, au presse-papiers et à la session Wayland.
|
||||||
|
|
||||||
## ✦ Shell Stack
|
### Services systemd utilisateur
|
||||||
|
|
||||||
```text
|
Les unités présentes dans `.config/systemd/user/` permettent notamment de gérer :
|
||||||
Zsh
|
|
||||||
├─ Starship
|
|
||||||
├─ Atuin
|
|
||||||
├─ FZF
|
|
||||||
├─ Zoxide
|
|
||||||
├─ Eza
|
|
||||||
├─ Bat
|
|
||||||
└─ Yazi
|
|
||||||
```
|
|
||||||
|
|
||||||
`.zprofile` démarre la session graphique via UWSM lorsque celui-ci autorise un
|
- les notifications de batterie ;
|
||||||
démarrage. `.zshenv` publie le socket de l'agent SSH utilisateur. L'historique,
|
- Cliphist ;
|
||||||
les bases et la clé Atuin restent strictement locaux et hors Git.
|
- GNOME Keyring ;
|
||||||
|
- l’agent SSH ;
|
||||||
|
- Swayidle ;
|
||||||
|
- Wlsunset ;
|
||||||
|
- Proton Mail Bridge ;
|
||||||
|
- différents services propres à la session graphique.
|
||||||
|
|
||||||
<a id="repository-layout"></a>
|
Les services lourds ou occasionnels ne sont pas démarrés en permanence.
|
||||||
|
|
||||||
## ✦ Repository Layout
|
## Installation
|
||||||
|
|
||||||
Chaque répertoire de premier niveau, hors `.assets` et `.git`, est un package
|
Cloner le dépôt dans le dossier personnel :
|
||||||
GNU Stow indépendant. Son arborescence reproduit le chemin attendu depuis
|
|
||||||
`$HOME`.
|
|
||||||
|
|
||||||
```text
|
|
||||||
.dotfiles/
|
|
||||||
├── sway/.config/sway/ → ~/.config/sway/
|
|
||||||
├── i3status-rust/.config/ → ~/.config/i3status-rust/
|
|
||||||
├── kitty/.config/kitty/ → ~/.config/kitty/
|
|
||||||
├── nvim/.config/nvim/ → ~/.config/nvim/
|
|
||||||
├── systemd/.config/systemd/user/ → ~/.config/systemd/user/
|
|
||||||
├── bin/.local/bin/ → ~/.local/bin/
|
|
||||||
├── zsh/.zshrc → ~/.zshrc
|
|
||||||
├── zsh/.zprofile → ~/.zprofile
|
|
||||||
└── .assets/ inventaires et références, non déployés
|
|
||||||
```
|
|
||||||
|
|
||||||
### Packages principaux
|
|
||||||
|
|
||||||
| Groupe | Packages Stow |
|
|
||||||
| --- | --- |
|
|
||||||
| Desktop | `sway`, `swaylock`, `mako`, `wofi`, `cliphist`, `i3status-rust` |
|
|
||||||
| Terminal et shell | `kitty`, `zsh`, `starship`, `atuin`, `fzf`, `eza`, `bat`, `yazi` |
|
|
||||||
| Développement | `nvim`, `tmux`, `opencode`, `bin` |
|
|
||||||
| Services | `systemd`, `uwsm` |
|
|
||||||
| Apparence | `gtk-3.0`, `gtklock`, `qt5ct`, `qt6ct`, `themes`, `icons`, `wallpapers` |
|
|
||||||
| Outils | `btop`, `fastfetch`, `hyprwhspr`, `ytmusic-tui` |
|
|
||||||
|
|
||||||
Les thèmes, icônes et wallpapers sont volontairement versionnés. Les
|
|
||||||
exécutables issus de projets externes restent hors Git même lorsqu'un script
|
|
||||||
ou une unité user les utilise.
|
|
||||||
|
|
||||||
### Sous-modules
|
|
||||||
|
|
||||||
Les plugins Zsh et Tmux sont épinglés par Git :
|
|
||||||
|
|
||||||
| Intégration | Chemin |
|
|
||||||
| --- | --- |
|
|
||||||
| Fast Syntax Highlighting | `zsh/.zsh/plugins/fast-syntax-highlighting` |
|
|
||||||
| FZF Tab | `zsh/.zsh/plugins/fzf-tab` |
|
|
||||||
| Zsh Autosuggestions | `zsh/.zsh/plugins/zsh-autosuggestions` |
|
|
||||||
| Catppuccin Tmux | `tmux/.config/tmux/plugins/catppuccin/tmux` |
|
|
||||||
|
|
||||||
<a id="deployment"></a>
|
|
||||||
|
|
||||||
## ✦ Deployment
|
|
||||||
|
|
||||||
### Prérequis
|
|
||||||
|
|
||||||
- Git ;
|
|
||||||
- GNU Stow ;
|
|
||||||
- les paquets décrits dans `.assets` ;
|
|
||||||
- une sauvegarde des fichiers existants qui pourraient entrer en conflit.
|
|
||||||
|
|
||||||
### Clone
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone --recurse-submodules \
|
git clone \
|
||||||
ssh://git@git.labfytools.com:2223/fy59/Dotfiles_ArchAP.git \
|
https://git.labfytools.com/fy59/Dotfiles_ArchAP.git \
|
||||||
"$HOME/.dotfiles"
|
"$HOME/Dotfiles_ArchAP"
|
||||||
|
|
||||||
cd "$HOME/.dotfiles"
|
cd "$HOME/Dotfiles_ArchAP"
|
||||||
git submodule update --init --recursive
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Dry-run Stow
|
Avant tout déploiement, vérifier les liens qui seraient créés :
|
||||||
|
|
||||||
Construire la liste des packages à partir des répertoires de premier niveau :
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
mapfile -t packages < <(
|
stow --no --verbose --target="$HOME" .
|
||||||
find . -mindepth 1 -maxdepth 1 -type d \
|
|
||||||
! -name .git ! -name .assets -printf '%f\n' | sort
|
|
||||||
)
|
|
||||||
|
|
||||||
stow --no --verbose=2 --target="$HOME" "${packages[@]}"
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Examiner tout conflit avant le déploiement réel :
|
Puis appliquer les dotfiles :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
stow --verbose=2 --target="$HOME" "${packages[@]}"
|
stow --verbose --target="$HOME" .
|
||||||
```
|
```
|
||||||
|
|
||||||
> Stow reçoit les **noms des packages**. La racine du dépôt n'est pas un
|
En cas de conflit avec des fichiers existants, les sauvegarder ou les comparer avant de les remplacer.
|
||||||
> package : ne pas utiliser `stow .`.
|
|
||||||
|
|
||||||
<a id="package-inventory"></a>
|
## Recharger la configuration
|
||||||
|
|
||||||
## ✦ Package Inventory
|
Après une modification des unités systemd utilisateur :
|
||||||
|
|
||||||
| Fichier | Source | Contenu |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| `.assets/pkglist-pacman.txt` | `pacman -Qqen` | Paquets officiels explicitement installés |
|
|
||||||
| `.assets/pkglist-aur.txt` | `pacman -Qqem` | Paquets foreign/AUR explicitement installés |
|
|
||||||
| `.assets/enabled-services.txt` | systemd système | Services système activés |
|
|
||||||
| `.assets/enabled-system-aux-units.txt` | systemd système | Timers, sockets et paths activés |
|
|
||||||
| `.assets/enabled-user-aux-units.txt` | systemd user | Timers, sockets et paths utilisateur activés |
|
|
||||||
| `.assets/external-tools.md` | inventaire manuel | Cargo, npm, builds locaux, projets et helpers `/usr/local` |
|
|
||||||
|
|
||||||
Ces fichiers sont des instantanés vérifiables, pas un installateur. Les paquets
|
|
||||||
AUR, outils Cargo/npm et builds locaux doivent être restaurés séparément.
|
|
||||||
|
|
||||||
<a id="services"></a>
|
|
||||||
|
|
||||||
## ✦ Services
|
|
||||||
|
|
||||||
Le package `systemd` contient les unités utilisateur ainsi que leurs liens
|
|
||||||
d'activation relatifs. Il couvre notamment Cliphist, swayidle, GNOME Keyring,
|
|
||||||
l'agent SSH, les notifications de batterie et les intégrations Trainlog,
|
|
||||||
Lardon et Arch Sentinel.
|
|
||||||
|
|
||||||
Après une modification :
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
systemctl --user daemon-reload
|
systemctl --user daemon-reload
|
||||||
systemd-analyze --user verify ~/.config/systemd/user/*.service
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Certaines unités lancent du code externe au dépôt. Leurs chemins et
|
Pour réactiver les unités voulues :
|
||||||
dépendances sont documentés dans `.assets/external-tools.md`. Les services
|
|
||||||
système et toute modification de `/etc` restent sous la responsabilité
|
|
||||||
d'`arch-system`.
|
|
||||||
|
|
||||||
<a id="secrets"></a>
|
```bash
|
||||||
|
systemctl --user enable --now NOM.service
|
||||||
## ✦ Secrets
|
systemctl --user enable --now NOM.timer
|
||||||
|
|
||||||
Ce dépôt n'a pas vocation à contenir :
|
|
||||||
|
|
||||||
- clés SSH, GPG, WireGuard ou Atuin ;
|
|
||||||
- `.netrc`, mots de passe, tokens, cookies ou credentials ;
|
|
||||||
- configurations privées Rclone, GitHub CLI ou Nextcloud ;
|
|
||||||
- bases de données, historiques shell ou états applicatifs personnels.
|
|
||||||
|
|
||||||
Les ignorer dans le HEAD ne suffit pas : un secret déjà commité doit être
|
|
||||||
renouvelé, puis supprimé de tout l'historique avant publication.
|
|
||||||
|
|
||||||
<a id="rebuilding-archasp"></a>
|
|
||||||
|
|
||||||
## ✦ Rebuilding ArchASP
|
|
||||||
|
|
||||||
```text
|
|
||||||
┌──────────────────────────────────────────────────────┐
|
|
||||||
│ arch-system │
|
|
||||||
│ Arch · boot · stockage · réseau · paquets · /etc │
|
|
||||||
└──────────────────────────┬───────────────────────────┘
|
|
||||||
│ socle système prêt
|
|
||||||
▼
|
|
||||||
┌──────────────────────────────────────────────────────┐
|
|
||||||
│ .dotfiles │
|
|
||||||
│ Stow · session · shell · scripts · systemd user │
|
|
||||||
└──────────────────────────┬───────────────────────────┘
|
|
||||||
│ restaurations externes
|
|
||||||
▼
|
|
||||||
┌──────────────────────────────────────────────────────┐
|
|
||||||
│ AUR · Cargo/npm · projets locaux · secrets · données│
|
|
||||||
└──────────────────────────────────────────────────────┘
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Ordre de reconstruction recommandé :
|
Pour recharger Sway :
|
||||||
|
|
||||||
1. restaurer la couche système avec `arch-system` ;
|
```bash
|
||||||
2. installer Git et GNU Stow ;
|
swaymsg reload
|
||||||
3. cloner ce dépôt avec ses sous-modules ;
|
```
|
||||||
4. restaurer les paquets officiels puis examiner les paquets AUR ;
|
|
||||||
5. effectuer le dry-run et déployer les packages Stow ;
|
|
||||||
6. restaurer les outils Cargo/npm et les projets locaux nécessaires ;
|
|
||||||
7. restaurer les secrets et données applicatives depuis une sauvegarde sûre ;
|
|
||||||
8. valider puis activer les unités systemd voulues.
|
|
||||||
|
|
||||||
Le dépôt ne reconstruit pas seul les projets sous `Documents`, OpenMVS local,
|
## Mise à jour du dépôt
|
||||||
les helpers `/usr/local`, les secrets, les bases applicatives ou les réglages
|
|
||||||
matériels propres à la machine.
|
|
||||||
|
|
||||||
<a id="repository-mirrors"></a>
|
Depuis le dépôt :
|
||||||
|
|
||||||
## ✦ Repository Mirrors
|
```bash
|
||||||
|
git status
|
||||||
|
git add -A
|
||||||
|
git commit -m "chore: update user configuration"
|
||||||
|
git push
|
||||||
|
```
|
||||||
|
|
||||||
| Rôle | Hébergement | URL |
|
Les données sensibles ne doivent jamais être ajoutées au dépôt.
|
||||||
| --- | --- | --- |
|
|
||||||
| Upstream principal | Forgejo | `ssh://git@git.labfytools.com:2223/fy59/Dotfiles_ArchAP.git` |
|
|
||||||
| Miroir public | GitHub | `https://github.com/labfytools/Dotfiles_ArchAP` |
|
|
||||||
|
|
||||||
Le fetch d'`origin` reste attaché à Forgejo. Ses URLs de push publient vers
|
Sont notamment exclus :
|
||||||
Forgejo et GitHub afin qu'un `git push origin main` maintienne les deux copies.
|
|
||||||
|
|
||||||
<a id="license"></a>
|
- clés SSH ;
|
||||||
|
- mots de passe ;
|
||||||
|
- jetons d’accès ;
|
||||||
|
- fichiers `.netrc` ;
|
||||||
|
- mots de passe d’application ;
|
||||||
|
- clés WireGuard ;
|
||||||
|
- bases de données personnelles ;
|
||||||
|
- fichiers contenant des informations privées.
|
||||||
|
|
||||||
## ✦ License
|
## Séparation avec `arch-system`
|
||||||
|
|
||||||
Aucune licence n'est actuellement déclarée pour ce dépôt.
|
| Dépôt | Responsabilité |
|
||||||
|
|---|---|
|
||||||
|
| [`Dotfiles_ArchAP`](https://git.labfytools.com/fy59/Dotfiles_ArchAP) | Configuration utilisateur, Sway, Neovim, Kitty, Zsh, scripts et unités systemd utilisateur |
|
||||||
|
| [`arch-system`](https://git.labfytools.com/fy59/arch-system) | Paquets, configuration système, Btrfs, Snapper, Limine, TLP, nftables, sudoers et helpers root |
|
||||||
|
|
||||||
|
Cette séparation évite de mélanger les fichiers personnels avec les éléments propres à l’installation du système.
|
||||||
|
|
||||||
|
## Avertissement
|
||||||
|
|
||||||
|
Ces fichiers correspondent à mon matériel, mon utilisateur et mon organisation personnelle.
|
||||||
|
|
||||||
|
Ils peuvent servir de référence, mais ne doivent pas être déployés tels quels sur une autre machine sans vérifier :
|
||||||
|
|
||||||
|
- les chemins ;
|
||||||
|
- le nom d’utilisateur ;
|
||||||
|
- les écrans et périphériques ;
|
||||||
|
- les commandes disponibles ;
|
||||||
|
- les unités systemd ;
|
||||||
|
- les dépendances installées.
|
||||||
|
|
||||||
|
## Licence
|
||||||
|
|
||||||
|
Configuration personnelle fournie sans garantie.
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@
|
||||||
|
|
||||||
## which search mode to use
|
## which search mode to use
|
||||||
## possible values: prefix, fulltext, fuzzy, skim
|
## possible values: prefix, fulltext, fuzzy, skim
|
||||||
search_mode = "prefix"
|
# search_mode = "fuzzy"
|
||||||
|
|
||||||
## which filter mode to use by default
|
## which filter mode to use by default
|
||||||
## possible values: "global", "host", "session", "session-preload", "directory", "workspace"
|
## possible values: "global", "host", "session", "session-preload", "directory", "workspace"
|
||||||
|
|
@ -67,7 +67,7 @@ filter_mode = "global"
|
||||||
## which search mode to use when atuin is invoked from a shell up-key binding
|
## which search mode to use when atuin is invoked from a shell up-key binding
|
||||||
## the accepted values are identical to those of "search_mode"
|
## the accepted values are identical to those of "search_mode"
|
||||||
## leave unspecified to use same mode set in "search_mode"
|
## leave unspecified to use same mode set in "search_mode"
|
||||||
search_mode_shell_up_key_binding = "prefix"
|
# search_mode_shell_up_key_binding = "fuzzy"
|
||||||
|
|
||||||
## which style to use
|
## which style to use
|
||||||
## possible values: auto, full, compact
|
## possible values: auto, full, compact
|
||||||
|
|
|
||||||
BIN
bin/.local/bin/agy
Executable file
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/Downloads
|
||||||
file:///home/fy59/Ansible
|
file:///home/fy59/Ansible
|
||||||
file:///home/fy59/Documents
|
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" },
|
"LuaSnip": { "branch": "master", "commit": "0abc8f390b278c3b4aabc4c004ac8a088b65cf24" },
|
||||||
"bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" },
|
"bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" },
|
||||||
"catppuccin": { "branch": "main", "commit": "edefef779ab08ce1a4a404713e3012b0d202bd35" },
|
"catppuccin": { "branch": "main", "commit": "c7c692a0ad3080710893abbae100171819a3e4be" },
|
||||||
"cmp-buffer": { "branch": "main", "commit": "b74fab3656eea9de20a9b8116afa3cfc4ec09657" },
|
"cmp-buffer": { "branch": "main", "commit": "b74fab3656eea9de20a9b8116afa3cfc4ec09657" },
|
||||||
"cmp-nvim-lsp": { "branch": "main", "commit": "cbc7b02bb99fae35cb42f514762b89b5126651ef" },
|
"cmp-nvim-lsp": { "branch": "main", "commit": "cbc7b02bb99fae35cb42f514762b89b5126651ef" },
|
||||||
"cmp-path": { "branch": "main", "commit": "c642487086dbd9a93160e1679a1327be111cbc25" },
|
"cmp-path": { "branch": "main", "commit": "c642487086dbd9a93160e1679a1327be111cbc25" },
|
||||||
"cmp_luasnip": { "branch": "master", "commit": "98d9cb5c2c38532bd9bdb481067b20fea8f32e90" },
|
"cmp_luasnip": { "branch": "master", "commit": "98d9cb5c2c38532bd9bdb481067b20fea8f32e90" },
|
||||||
"friendly-snippets": { "branch": "main", "commit": "b4d01b0fdf3c9a549961c2f9ffe8dc09be166219" },
|
"friendly-snippets": { "branch": "main", "commit": "6cd7280adead7f586db6fccbd15d2cac7e2188b9" },
|
||||||
"lazy.nvim": { "branch": "main", "commit": "306a05526ada86a7b30af95c5cc81ffba93fef97" },
|
"lazy.nvim": { "branch": "main", "commit": "306a05526ada86a7b30af95c5cc81ffba93fef97" },
|
||||||
"lualine.nvim": { "branch": "master", "commit": "221ce6b2d999187044529f49da6554a92f740a96" },
|
"lualine.nvim": { "branch": "master", "commit": "221ce6b2d999187044529f49da6554a92f740a96" },
|
||||||
"mason-lspconfig.nvim": { "branch": "main", "commit": "137bd0feba2c1885545b6934d36f5e5aa6adb486" },
|
"mason-lspconfig.nvim": { "branch": "main", "commit": "7adc933dabcc7c86ae6b07aff7ee68eac398491f" },
|
||||||
"mason.nvim": { "branch": "main", "commit": "2a6940af80375532e5e9e7c1f2fc6319a1b7a69d" },
|
"mason.nvim": { "branch": "main", "commit": "2a6940af80375532e5e9e7c1f2fc6319a1b7a69d" },
|
||||||
"mini.starter": { "branch": "main", "commit": "25de4998197d59673f1918968a8f4060195edca0" },
|
"mini.starter": { "branch": "main", "commit": "25de4998197d59673f1918968a8f4060195edca0" },
|
||||||
"neo-tree.nvim": { "branch": "v3.x", "commit": "1a14083046d96e88e361d1da00761c40d45012f3" },
|
"neo-tree.nvim": { "branch": "v3.x", "commit": "ebd66767191714e008ce73b769518a763ff31bdc" },
|
||||||
"nui.nvim": { "branch": "main", "commit": "10fc361835c856ba4233ef5ea135b919bf3dce97" },
|
"neowiki.nvim": { "branch": "main", "commit": "85dddf6057b07d4d6772b2f90e754a18e958a865" },
|
||||||
"nvim-autopairs": { "branch": "master", "commit": "430522f95fe4fb7c511ec64f8c1a90cc6a66c05c" },
|
"nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" },
|
||||||
|
"nvim-autopairs": { "branch": "master", "commit": "7b9923abad60b903ece7c52940e1321d39eccc79" },
|
||||||
"nvim-cmp": { "branch": "main", "commit": "2ffe79f1f021def8dd1fcd81deb16f1bb0d989f3" },
|
"nvim-cmp": { "branch": "main", "commit": "2ffe79f1f021def8dd1fcd81deb16f1bb0d989f3" },
|
||||||
"nvim-colorizer.lua": { "branch": "master", "commit": "72a05f62c52241bc7441c820eb53946f92b2e6a4" },
|
"nvim-colorizer.lua": { "branch": "master", "commit": "72a05f62c52241bc7441c820eb53946f92b2e6a4" },
|
||||||
"nvim-lsp-file-operations": { "branch": "master", "commit": "0b939aff068c859b6f8cdbc3b3e676d038e6e15d" },
|
"nvim-lsp-file-operations": { "branch": "master", "commit": "b9c795d3973e8eec22706af14959bc60c579e771" },
|
||||||
"nvim-lspconfig": { "branch": "master", "commit": "046b1a797af1effe8e0474b9af9657a3761ec58a" },
|
"nvim-lspconfig": { "branch": "master", "commit": "d592c1e6ad9a0a01b3d5ed3f0345d68407167181" },
|
||||||
"nvim-tcss": { "branch": "main", "commit": "bf9001416158f32fe7e92c42de94de3595aa13e5" },
|
"nvim-tcss": { "branch": "main", "commit": "bf9001416158f32fe7e92c42de94de3595aa13e5" },
|
||||||
"nvim-treesitter": { "branch": "main", "commit": "f603a2f4da48728f80257fb5fbb90145fd1dc173" },
|
"nvim-treesitter": { "branch": "main", "commit": "a45a920ec04cda5624f6dea0ff6454c81c3ad2d5" },
|
||||||
"nvim-ts-autotag": { "branch": "main", "commit": "88c1453db4ba7dd24131086fe51fdf74e587d275" },
|
"nvim-ts-autotag": { "branch": "main", "commit": "88c1453db4ba7dd24131086fe51fdf74e587d275" },
|
||||||
"nvim-web-devicons": { "branch": "master", "commit": "58447c1fca354bbf184425e4a8d01deecbd6f3c4" },
|
"nvim-web-devicons": { "branch": "master", "commit": "2ae6958df7ced50baac5035cec0c15799eedfbf7" },
|
||||||
"nvim-window-picker": { "branch": "main", "commit": "6382540b2ae5de6c793d4aa2e3fe6dbb518505ec" },
|
"nvim-window-picker": { "branch": "main", "commit": "6382540b2ae5de6c793d4aa2e3fe6dbb518505ec" },
|
||||||
"outline.nvim": { "branch": "main", "commit": "2a132953b944561d45b52e4541ebfff71934a742" },
|
"outline.nvim": { "branch": "main", "commit": "2a132953b944561d45b52e4541ebfff71934a742" },
|
||||||
"plenary.nvim": { "branch": "master", "commit": "74b06c6c75e4eeb3108ec01852001636d85a932b" },
|
"plenary.nvim": { "branch": "master", "commit": "74b06c6c75e4eeb3108ec01852001636d85a932b" },
|
||||||
"render-markdown.nvim": { "branch": "main", "commit": "640a3ec6d538bad17c328be373c7cad0293d9589" },
|
"render-markdown.nvim": { "branch": "main", "commit": "f422cb5c6855f150e2ddcfaf44e7157b98b34f6a" },
|
||||||
"rustaceanvim": { "branch": "main", "commit": "e9c5aaba16fead831379d5f44617547a90b913c7" },
|
"rustaceanvim": { "branch": "main", "commit": "e9c5aaba16fead831379d5f44617547a90b913c7" },
|
||||||
"telescope-file-browser.nvim": { "branch": "master", "commit": "3610dc7dc91f06aa98b11dca5cc30dfa98626b7e" },
|
"telescope-file-browser.nvim": { "branch": "master", "commit": "3610dc7dc91f06aa98b11dca5cc30dfa98626b7e" },
|
||||||
"telescope.nvim": { "branch": "0.1.x", "commit": "a0bbec21143c7bc5f8bb02e0005fa0b982edc026" },
|
"telescope.nvim": { "branch": "0.1.x", "commit": "a0bbec21143c7bc5f8bb02e0005fa0b982edc026" },
|
||||||
|
|
|
||||||
|
|
@ -31,36 +31,5 @@ require("lazy").setup({
|
||||||
-- colorscheme that will be used when installing plugins.
|
-- colorscheme that will be used when installing plugins.
|
||||||
install = { colorscheme = { "habamax" } },
|
install = { colorscheme = { "habamax" } },
|
||||||
-- automatically check for plugin updates
|
-- automatically check for plugin updates
|
||||||
checker = { enabled = false },
|
checker = { enabled = true },
|
||||||
})
|
|
||||||
local lazy_update_group =
|
|
||||||
vim.api.nvim_create_augroup("LazyAutoUpdate", { clear = true })
|
|
||||||
|
|
||||||
-- Fermer l'interface lorsque la mise à jour est terminée
|
|
||||||
vim.api.nvim_create_autocmd("User", {
|
|
||||||
group = lazy_update_group,
|
|
||||||
pattern = "LazyUpdate",
|
|
||||||
once = true,
|
|
||||||
callback = function()
|
|
||||||
vim.schedule(function()
|
|
||||||
local ok, view = pcall(require, "lazy.view")
|
|
||||||
|
|
||||||
if ok and view.view and view.visible() then
|
|
||||||
view.view:close()
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
||||||
-- Lancer la mise à jour à l'ouverture de Neovim
|
|
||||||
vim.api.nvim_create_autocmd("VimEnter", {
|
|
||||||
group = lazy_update_group,
|
|
||||||
once = true,
|
|
||||||
callback = function()
|
|
||||||
vim.schedule(function()
|
|
||||||
require("lazy").update({
|
|
||||||
show = true,
|
|
||||||
})
|
|
||||||
end)
|
|
||||||
end,
|
|
||||||
})
|
})
|
||||||
|
|
|
||||||
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 },
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -21,16 +21,21 @@ return {
|
||||||
}, "\n"),
|
}, "\n"),
|
||||||
items = {
|
items = {
|
||||||
starter.sections.recent_files(8),
|
starter.sections.recent_files(8),
|
||||||
|
{
|
||||||
|
name = "Open Wiki",
|
||||||
|
action = "edit ~/wiki/index.md", -- adapte le chemin
|
||||||
|
section = " Wiki",
|
||||||
|
},
|
||||||
starter.sections.telescope(),
|
starter.sections.telescope(),
|
||||||
{
|
{
|
||||||
name = "Open Nvim config",
|
name = "Open Nvim config",
|
||||||
action = "edit ~/.config/nvim/init.lua",
|
action = "edit ~/.config/nvim/init.lua",
|
||||||
section = "Config",
|
section = " Config",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name = "Quit",
|
name = "Quit",
|
||||||
action = "quit",
|
action = "quit",
|
||||||
section = "Actions",
|
section = " Actions",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
footer = "Happy editing – from FY59's config",
|
footer = "Happy editing – from FY59's config",
|
||||||
|
|
@ -38,3 +43,4 @@ return {
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,9 @@ Objectif : un setup léger, lisible, facile à maintenir et à hacker.
|
||||||
│ ├── lsp.lua
|
│ ├── lsp.lua
|
||||||
│ ├── mini-icons.lua
|
│ ├── mini-icons.lua
|
||||||
│ ├── mini_map.lua
|
│ ├── mini_map.lua
|
||||||
|
│ ├── neowiki.lua
|
||||||
│ ├── nvim-autopair.lua
|
│ ├── nvim-autopair.lua
|
||||||
|
│ ├── nvim-tree.lua.old
|
||||||
│ ├── outline.lua
|
│ ├── outline.lua
|
||||||
│ ├── render-markdown.lua
|
│ ├── render-markdown.lua
|
||||||
│ ├── starter.lua
|
│ ├── starter.lua
|
||||||
|
|
@ -151,9 +153,16 @@ Keymaps personnalisés :
|
||||||
- lewis6991/gitsigns.nvim pour les signes Git dans la marge.
|
- lewis6991/gitsigns.nvim pour les signes Git dans la marge.
|
||||||
- tpope/vim-fugitive
|
- tpope/vim-fugitive
|
||||||
|
|
||||||
9. starter
|
9. Notes / Wiki
|
||||||
|
- echaya/neowiki.nvim comme wiki moderne (successeur de Vimwiki).
|
||||||
|
|
||||||
|
10. starter
|
||||||
- nvim-mini/mini.starter
|
- nvim-mini/mini.starter
|
||||||
|
|
||||||
|
Support Markdown + Treesitter, GTD, multiple wikis.
|
||||||
|
|
||||||
|
Mappings typiques (configurable) : <leader>ww pour ouvrir le wiki, navigation entre pages, tâches, etc.
|
||||||
|
|
||||||
## Keymaps principaux
|
## Keymaps principaux
|
||||||
|
|
||||||
- folke/which-key.nvim
|
- folke/which-key.nvim
|
||||||
|
|
@ -186,3 +195,4 @@ LSP
|
||||||
- <leader>h : clear search.
|
- <leader>h : clear search.
|
||||||
|
|
||||||
En Visuel : Tab / Shift-Tab → indent/désindent la sélection.
|
En Visuel : Tab / Shift-Tab → indent/désindent la sélection.
|
||||||
|
|
||||||
|
|
|
||||||
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
|
- swayfx
|
||||||
- swaylock
|
- swaylock
|
||||||
- swayidle
|
- swayidle
|
||||||
- tlp
|
|
||||||
- tlp-pd
|
|
||||||
|
|
||||||
### Bar and status
|
### Bar and status
|
||||||
- i3status-rs
|
- i3status-rs
|
||||||
|
|
@ -47,6 +45,8 @@ Personal SwayFX configuration, modular and lightweight, designed for everyday Wa
|
||||||
- cliphist
|
- cliphist
|
||||||
- wlsunset
|
- wlsunset
|
||||||
- brightnessctl
|
- brightnessctl
|
||||||
|
- powerprofilesctl
|
||||||
|
- swaync
|
||||||
- nm-connection-editor
|
- nm-connection-editor
|
||||||
- playerctl
|
- playerctl
|
||||||
|
|
||||||
|
|
@ -87,7 +87,7 @@ Example:
|
||||||
|
|
||||||
The Sway bar is placed at the top and uses `i3status-rs` as its backend.
|
The Sway bar is placed at the top and uses `i3status-rs` as its backend.
|
||||||
|
|
||||||
The i3status-rust configuration includes:
|
The `i3status.toml` file includes:
|
||||||
- workspaces,
|
- workspaces,
|
||||||
- focused window,
|
- focused window,
|
||||||
- music,
|
- music,
|
||||||
|
|
@ -103,8 +103,11 @@ The i3status-rust configuration includes:
|
||||||
|
|
||||||
## Autostart
|
## Autostart
|
||||||
|
|
||||||
On startup, Sway launches the inactive-window transparency helper, LiMusic and
|
On startup, the config launches:
|
||||||
`autotiling`. Wlsunset, Cliphist and swayidle are owned by user systemd units.
|
- `wlsunset` for blue light reduction,
|
||||||
|
- `wl-paste --watch cliphist store` for clipboard history,
|
||||||
|
- `swayidle` for automatic locking and screen power management.
|
||||||
|
- `swaync`
|
||||||
|
|
||||||
## Keybinds
|
## Keybinds
|
||||||
|
|
||||||
|
|
@ -113,26 +116,25 @@ Some important shortcuts:
|
||||||
- `Mod + q`: close the focused window.
|
- `Mod + q`: close the focused window.
|
||||||
- `Mod + Shift + e`: exit Sway via `swaynag`.
|
- `Mod + Shift + e`: exit Sway via `swaynag`.
|
||||||
- `Mod + r`: resize mode.
|
- `Mod + r`: resize mode.
|
||||||
- `Mod + Ctrl + r`: reload the config.
|
- `Mod + Shift + c`: reload the config.
|
||||||
- `Mod + Alt + o`: lock the screen.
|
- `Mod + Ctrl + l`: lock the screen.
|
||||||
- `Print`: capture a selected area to the clipboard.
|
- `Print`: capture a selected area to the clipboard.
|
||||||
- `Shift + Print`: capture the full screen to the clipboard.
|
- `Shift + Print`: capture the full screen to the clipboard.
|
||||||
- `Mod + Alt + l`: launcher Wofi.
|
- `Mod + Ctrl + e`: launcher wofi
|
||||||
- `Mod + Alt + v`: Cliphist via Wofi.
|
- `Mod + v`: wofi cliphist
|
||||||
- `Mod + F9`, `Mod + F10`, `Mod + F11`: TLP power profiles.
|
- `Mod + F9``Mod + F10``Mod + F11`: power profiles
|
||||||
|
|
||||||
## Power profiles
|
## Power profiles
|
||||||
|
|
||||||
The bar displays the current TLP and platform profiles. The related keybinds
|
The bar includes a `powerprofilesctl` block with:
|
||||||
use the unprivileged `tlpctl` interface provided by `tlp-pd`:
|
|
||||||
- `performance`,
|
- `performance`,
|
||||||
- `balanced`,
|
- `balanced`,
|
||||||
- `power-saver`.
|
- `power-saver`.
|
||||||
|
|
||||||
The related keybinds are:
|
The related keybinds are:
|
||||||
- `Mod + F9`: `tlpctl power-saver`.
|
- `Mod + F9`: power-saver.
|
||||||
- `Mod + F10`: `tlpctl balanced`.
|
- `Mod + F10`: balanced.
|
||||||
- `Mod + F11`: `tlpctl performance`.
|
- `Mod + F11`: performance.
|
||||||
|
|
||||||
## Floating windows
|
## Floating windows
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,11 +12,11 @@ exec python3 ~/.config/sway/scripts/inactive-windows-transparency.py
|
||||||
# Règles d'assignation automatique
|
# Règles d'assignation automatique
|
||||||
# =================================================
|
# =================================================
|
||||||
|
|
||||||
assign [app_id="limusic-app"] workspace 10
|
assign [class="Spotify"] workspace 10
|
||||||
|
|
||||||
# =================================================
|
# =================================================
|
||||||
# Lancement des applications
|
# Lancement des applications
|
||||||
# =================================================
|
# =================================================
|
||||||
|
|
||||||
exec limusic-app
|
exec spotify-launcher
|
||||||
exec autotiling
|
exec autotiling
|
||||||
|
|
|
||||||
60
sway/.config/sway/autostart.bak
Executable file
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
|
bindsym $mod+Return exec $term
|
||||||
|
|
||||||
# Kill focused window
|
# Kill focused window
|
||||||
bindsym $mod+q exec ~/.local/bin/sway-close
|
bindsym $mod+q kill
|
||||||
|
|
||||||
# Drag floating windows by holding down $mod and left mouse button.
|
# Drag floating windows by holding down $mod and left mouse button.
|
||||||
# Resize them with right mouse button + $mod.
|
# Resize them with right mouse button + $mod.
|
||||||
|
|
@ -204,7 +204,7 @@ bindsym $mod+Alt+i exec ~/.local/bin/vmware-on-demand
|
||||||
bindsym $mod+Alt+f exec firefox
|
bindsym $mod+Alt+f exec firefox
|
||||||
bindsym $mod+Alt+a exec AppFlowy
|
bindsym $mod+Alt+a exec AppFlowy
|
||||||
bindsym $mod+Alt+g exec gimp
|
bindsym $mod+Alt+g exec gimp
|
||||||
bindsym $mod+Alt+m exec limusic-app
|
bindsym $mod+Alt+m exec spotify-launcher
|
||||||
bindsym $mod+Alt+b exec blueman-manager
|
bindsym $mod+Alt+b exec blueman-manager
|
||||||
bindsym $mod+Alt+o exec swaylock
|
bindsym $mod+Alt+o exec swaylock
|
||||||
bindsym $mod+Alt+l exec wofi --cache-file=/dev/null -Dimage_size=26 -Dynamic_lines=true --location top --yoffset=10 --width=600 --height=300 --gtk-dark --show drun
|
bindsym $mod+Alt+l exec wofi --cache-file=/dev/null -Dimage_size=26 -Dynamic_lines=true --location top --yoffset=10 --width=600 --height=300 --gtk-dark --show drun
|
||||||
|
|
@ -213,11 +213,10 @@ bindsym $mod+Alt+t exec ~/.local/bin/thunderbird-proton
|
||||||
bindsym $mod+Alt+y exec kitty -- sh -c "yazi"
|
bindsym $mod+Alt+y exec kitty -- sh -c "yazi"
|
||||||
bindsym $mod+Alt+w exec gtk-launch chrome-hnpfjngllnobngcgfapefoaidbinmjnm-Default
|
bindsym $mod+Alt+w exec gtk-launch chrome-hnpfjngllnobngcgfapefoaidbinmjnm-Default
|
||||||
bindsym $mod+Alt+v exec ~/.config/sway/scripts/copypast
|
bindsym $mod+Alt+v exec ~/.config/sway/scripts/copypast
|
||||||
bindsym $mod+Alt+c exec --no-startup-id kitty --app-id=lardon-freecad-log --title="Lardon · FreeCAD autopush" --directory=/home/fy59/Documents/Lardon /home/fy59/Documents/Lardon/tools/lardon-freecad-launcher
|
bindsym $mod+Alt+c exec freecad
|
||||||
bindsym $mod+Alt+s exec sqlitebrowser
|
bindsym $mod+Alt+s exec sqlitebrowser
|
||||||
bindsym $mod+Alt+e exec sh -c 'cd /home/fy59/Documents/Enquetes/Template/labfy-investigation && exec ./labfy-investigation'
|
bindsym $mod+Alt+e exec sh -c 'cd /home/fy59/Documents/Enquetes/Template/labfy-investigation && exec ./labfy-investigation'
|
||||||
bindsym $mod+Alt+n exec ~/.local/bin/nextcloud-sync
|
bindsym $mod+Alt+n exec ~/.local/bin/nextcloud-sync
|
||||||
bindsym $mod+c exec codex-desktop
|
|
||||||
|
|
||||||
###############################################
|
###############################################
|
||||||
#
|
#
|
||||||
|
|
@ -239,6 +238,7 @@ bindsym Print exec grim -g "$(slurp)" - | wl-copy -t image/png
|
||||||
# Power Daemon
|
# Power Daemon
|
||||||
#
|
#
|
||||||
###############################################
|
###############################################
|
||||||
bindsym $mod+F9 exec tlpctl power-saver
|
bindsym $mod+F9 exec powerprofilesctl set power-saver
|
||||||
bindsym $mod+F10 exec tlpctl balanced
|
bindsym $mod+F10 exec powerprofilesctl set balanced
|
||||||
bindsym $mod+F11 exec tlpctl performance
|
bindsym $mod+F11 exec powerprofilesctl set performance
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,12 +8,3 @@
|
||||||
|
|
||||||
for_window [app_id="blueman-manager"] floating enable, resize set 40ppt 40ppt, move position center
|
for_window [app_id="blueman-manager"] floating enable, resize set 40ppt 40ppt, move position center
|
||||||
for_window [app_id="Proton Pass"] floating enable, resize set 40ppt 40ppt, move position right top
|
for_window [app_id="Proton Pass"] floating enable, resize set 40ppt 40ppt, move position right top
|
||||||
|
|
||||||
#=================================================
|
|
||||||
# Lardon
|
|
||||||
#=================================================
|
|
||||||
|
|
||||||
for_window [app_id="lardon-freecad-log"] floating enable
|
|
||||||
for_window [app_id="lardon-freecad-log"] resize set width 850 px height 360 px
|
|
||||||
for_window [app_id="lardon-freecad-log"] move position center
|
|
||||||
for_window [app_id="lardon-freecad-log"] border pixel 2
|
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@
|
||||||
exec_always {
|
exec_always {
|
||||||
gsettings set $gnome-schema font-name 'jetbrains mono nerd font 12'
|
gsettings set $gnome-schema font-name 'jetbrains mono nerd font 12'
|
||||||
gsettings set $gnome-schema color-scheme 'prefer-dark'
|
gsettings set $gnome-schema color-scheme 'prefer-dark'
|
||||||
gsettings set $gnome-schema icon-theme 'Tela-circle-blue'
|
gsettings get $gnome-schema icon-theme 'Tela-circle-blue'
|
||||||
}
|
}
|
||||||
|
|
||||||
set $cursor_theme Bibata-Modern-Classic
|
set $cursor_theme Bibata-Modern-Classic
|
||||||
|
|
@ -40,5 +40,5 @@ seat seat0 xcursor_theme $cursor_theme $cursor_size
|
||||||
|
|
||||||
|
|
||||||
# Set inner/outer gaps
|
# Set inner/outer gaps
|
||||||
gaps inner 5
|
gaps inner 8
|
||||||
gaps outer 0
|
gaps outer 0
|
||||||
|
|
|
||||||
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
|
After=graphical-session.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
ExecStart=/usr/bin/swayidle -w timeout 300 'swaylock -f -c 000000' timeout 360 'swaymsg "output * power off"' resume 'swaymsg "output * power on"' timeout 420 'playerctl -a pause 2>/dev/null || true' idlehint 420 before-sleep 'playerctl -a pause 2>/dev/null || true; swaylock -f -c 000000'
|
ExecStart=/usr/bin/swayidle -w timeout 300 'swaylock -f -c 000000' timeout 360 'swaymsg "output * power off"' resume 'swaymsg "output * power on"' before-sleep 'playerctl pause; swaylock -f -c 000000'
|
||||||
Restart=on-failure
|
Restart=on-failure
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
|
|
|
||||||
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