Compare commits

..

No commits in common. "master" and "34d5596a67de2400f5a2347f89365b1bd41bf399" have entirely different histories.

68 changed files with 8450 additions and 1838 deletions

View File

@ -1,11 +0,0 @@
!*dpi is used by i3WM
!See https://i3wm.org/docs/userguide.html#xresources
*dpi: 100
Xft.dpi: 100
Xft.autohint: 0
Xft.lcdfilter: lcddefault
Xft.hintstyle: hintfull
Xft.hinting: 1
Xft.antialias: 1
Xft.rgba: rgb

1
.Xresources 120000
View File

@ -0,0 +1 @@
/home/.Xresources.desk

7
.Xresources.desk 100644
View File

@ -0,0 +1,7 @@
Xft.autohint: 0
Xft.lcdfilter: lcddefault
Xft.hintstyle: hintfull
Xft.hinting: 1
Xft.antialias: 1
Xft.rgba: rgb

View File

@ -0,0 +1,8 @@
Xft.dpi: 170
Xft.autohint: 0
Xft.lcdfilter: lcddefault
Xft.hintstyle: hintfull
Xft.hinting: 1
Xft.antialias: 1
Xft.rgba: rgb

View File

@ -1,13 +0,0 @@
alias ap='ansible-playbook'
# Upgrade without prompt
alias yey='yay -Syu --noconfirm'
# Avoid losing stuff
alias rm='rmtrash'
alias rrm='/usr/bin/rm'
# cp is rsync
alias cp='cpv'
alias vim='nvim'
alias ls='eza'
alias cat='bat'
# zsh function, not binary, cf zoxide
alias cd='z'

View File

@ -1 +0,0 @@
/etc/NetworkManager/conf.d

View File

@ -1,2 +0,0 @@
[device]
wifi.backend=iwd

View File

@ -1,12 +0,0 @@
# current machine's name, optional; it can be used to filter settings or in the commit message
hostname: ""
# more details at https://github.com/zokugun/vscode-sync-settings/blob/master/docs/hostname.md
# selected profile, required
profile: main
# repository to sync the settings with, required
repository:
# repository's type, required (dummy: no sync)
type: git
path: ~/.config/codium-settings
branch: main

View File

@ -0,0 +1,3 @@
hamster-time-tracker
realtime-privileges
zita-ajbridge

View File

@ -0,0 +1,53 @@
arc-gtk-theme
arc-icon-theme
autojump
cadence
docker
dunst
feh
firefox
flameshot
i3-wm
i3lock-color
jq
libusb-compat
maim
mlocate
nemo
neofetch
network-manager-applet
networkmanager
noto-fonts-emoji
obsidian
oh-my-zsh-git
pacman-contrib
pass
picom
playerctl
polybar
powerline-fonts
python-pip
python-pygments
rofi
rsync
signal-desktop
telegram-desktop
terminator
thunderbird
ttf-dejavu
ttf-font-awesome-5
ttf-material-icons-git
ttf-symbola
ttf-weather-icons
usb_modeswitch
vim
vscodium-bin
wget
xautolock
xdg-user-dirs
xdotool
xorg-server
xorg-xinit
xsel
yay-bin
zsh

View File

@ -1 +0,0 @@
gddccontrol

View File

@ -1,134 +1,54 @@
android-file-transfer
ansible
ansible-lint
arc-gtk-theme arc-gtk-theme
arc-icon-theme arc-icon-theme
bat autojump
bat-extras cadence
blueman
bluez
bluez-utils
bluetooth-autoconnect
bind
catppuccin-cursors-macchiato
catppuccin-gtk-theme-macchiato
chafa
chromium
cups
dhcpcd
dialog
docker docker
dosfstools
dkms
dunst dunst
evince
eza
feh feh
ffmpeg
ffmpegthumbnailer
firefox firefox
flameshot flameshot
fzf
gcr
git-delta
gthumb
helvum
hplip
htop
i3-wm i3-wm
i3lock-color i3lock-color
ifplugd
imagemagick
jq jq
kwayland5
lesspipe
libreoffice-fresh
libusb-compat libusb-compat
less
lshw
lxappearance-gtk3
maim maim
man-db
man-pages
musescore
mlocate mlocate
nmap
nemo nemo
neofetch neofetch
netctl network-manager-applet
neovim networkmanager
noto-fonts-emoji noto-fonts-emoji
numlockx numlockx
obsidian obsidian
oh-my-posh
oh-my-zsh-git oh-my-zsh-git
p7zip
pacman-contrib pacman-contrib
pavucontrol
papirus-icon-theme
papirus-folders-catppuccin-git
pass pass
perl-file-homedir
perl-yaml-tiny
picom picom
pipewire
pipewire-audio
pipewire-alsa
pipewire-pulse
pipewire-jack
playerctl playerctl
polybar polybar
python-dbus powerline-fonts
python-gobject
python-pip python-pip
python-pygments python-pygments
python-pyperclip
python-requests
qbittorrent
realtime-privileges
restic
ripgrep
rmtrash
rofi rofi
rofimoji
rsync rsync
scaleway-cli
signal-desktop signal-desktop
stylua
telegram-desktop telegram-desktop
texlive-binextra
tectonic
terminator terminator
thunderbird thunderbird
torbrowser-launcher
trash-cli
ttf-dejavu ttf-dejavu
ttf-font-awesome ttf-font-awesome-5
ttf-jetbrains-mono-nerd
ttf-material-icons-git ttf-material-icons-git
ttf-symbola ttf-symbola
ttf-weather-icons ttf-weather-icons
ttf-meslo-nerd
unzip
usbutils
usb_modeswitch usb_modeswitch
vim vim
vlc
vscodium-bin vscodium-bin
wget wget
wpa_supplicant
xautolock xautolock
xclip
xdg-user-dirs xdg-user-dirs
xdotool xdotool
xorg-server xorg-server
xorg-xev
xorg-xinit xorg-xinit
xorg-xinput
xorg-xrandr
xsel xsel
yay-bin yay-bin
zenity
zip
zoxide
zsh zsh

View File

@ -1,56 +0,0 @@
#!/usr/bin/env bash
# ${1} : environment (see README.md)
module_names=''
echo -e "* Auto-create wired profil, autoconnect service for netctl and polybar module..."
for i in `ip -br l | awk '$1 !~ "lo|vir|br|wl" { print $1}'`; do
echo -e "~ ${i}..."
module_name="network-${i}"
module_names+=" ${module_name}"
cat <<- EOF | sudo tee /etc/netctl/${i} >/dev/null
Interface=${i}
Connection=ethernet
IP=dhcp
EOF
cat <<- EOF | tee ~/.config/polybar/config.d/${i}.${1} >/dev/null
[module/${module_name}]
type = internal/network
interface = ${i}
ping-interval = 3
label-connected = \${env:BAR_WIRED_CONNECTED}
label-disconnected =
label-disconnected-foreground = \${colors.text}
; Consider an 'UNKNOWN' interface state as up.
; Some devices like USB network adapters have
; an unknown state, even when they're running
; Default: false
unknown-as-up = true
EOF
sudo systemctl enable --now netctl-ifplugd@${i}
# In case some old config stays....
sudo systemctl restart netctl-ifplugd@${i}
done
echo -e "* Autoconnect to wireless profiles..."
for i in `ip -br l | awk '$1 ~ "wl" { print $1}'`; do
module_name="network-${i}"
module_names+=" ${module_name}"
echo -e "~ ${i}..."
cat <<- EOF | tee ~/.config/polybar/config.d/${i}.${1} >/dev/null
[module/${module_name}]
type = internal/network
interface = ${i}
ping-interval = 3
label-connected = \${env:BAR_WIFI_CONNECTED}
label-disconnected =
label-disconnected-foreground = \${colors.text}
EOF
sudo systemctl enable --now netctl-auto@${i}
done
echo -e "* Create an override polybar file to add all discovered networks..."
cat << EOF | tee ~/.config/polybar/config.d/bottom_center.${1} >/dev/null
[variables]
bottom_center = updates-arch-combined ${module_names}
EOF
# https://man.archlinux.org/man/netctl.special.7
echo -e "* Ensure connections are back when PC is resumed..."
sudo systemctl enable netctl-sleep

View File

@ -19,7 +19,7 @@
width = (0, 400) width = (0, 400)
height = 100 height = 100
offset = 30x40 offset = 15x15
# Show how many messages are currently hidden (because of geometry). # Show how many messages are currently hidden (because of geometry).
indicate_hidden = true indicate_hidden = true
@ -45,7 +45,7 @@
frame_width = 3 frame_width = 3
# Defines color of the frame around the notification window. # Defines color of the frame around the notification window.
frame_color = "#8AADF4" frame_color = "#8EC07C"
# Define a color for the separator. # Define a color for the separator.
# possible values are: # possible values are:
@ -185,16 +185,18 @@
# Ignore the dbus closeNotification message. This is useful to enforce the timeout set by dunst configuration. # Ignore the dbus closeNotification message. This is useful to enforce the timeout set by dunst configuration.
ignore_dbusclose = true ignore_dbusclose = true
[urgency_low] [urgency_low]
background = "#24273A" frame_color = "#3B7C87"
foreground = "#CAD3F5" foreground = "#3B7C87"
background = "#191311"
timeout = 5
[urgency_normal] [urgency_normal]
background = "#24273A" frame_color = "#5B8234"
foreground = "#CAD3F5" foreground = "#5B8234"
background = "#191311"
timeout = 20
[urgency_critical] [urgency_critical]
background = "#24273A" frame_color = "#B7472A"
foreground = "#CAD3F5" foreground = "#B7472A"
frame_color = "#F5A97F" background = "#191311"
timeout = 0

View File

@ -1,16 +1,6 @@
[Settings] [Settings]
gtk-icon-theme-name=Papirus-Dark gtk-icon-theme-name = Arc
gtk-theme-name=Catppuccin-Macchiato-Standard-Flamingo-Dark gtk-theme-name = Arc-Dark
gtk-font-name = Noto Sans 11 gtk-font-name = Noto Sans 11
gtk-application-prefer-dark-theme = true
gtk-can-change-accels = 1 gtk-can-change-accels = 1
gtk-cursor-theme-name=Catppuccin-Macchiato-Flamingo-Cursors
gtk-cursor-theme-size=0
gtk-toolbar-style=GTK_TOOLBAR_ICONS
gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR
gtk-button-images=0
gtk-menu-images=0
gtk-enable-event-sounds=1
gtk-enable-input-feedback-sounds=1
gtk-xft-antialias=1
gtk-xft-hinting=1
gtk-xft-hintstyle=hintmedium

View File

@ -4,33 +4,50 @@
# alterning workspace between each screen # alterning workspace between each screen
workspace 1 output DVI-I-1 workspace 1 output DVI-I-1
workspace 2 output HDMI-1 workspace 2 output HDMI-0
workspace 3 output DVI-I-1 workspace 3 output DVI-I-1
workspace 4 output HDMI-1 workspace 4 output HDMI-0
workspace 5 output DVI-I-1 workspace 5 output DVI-I-1
workspace 6 output DVI-I-1 workspace 6 output DVI-I-1
workspace 7 output DVI-I-1 workspace 7 output DVI-I-1
workspace 8 output DVI-I-1 workspace 8 output DVI-I-1
workspace 9 output DVI-I-1 workspace 9 output DVI-I-1
# ALSA key binding # ALSA key binding (media keys do not even have keycode...)
bindsym XF86AudioRaiseVolume exec --no-startup-id amixer -D hw:PCH -M sset Master 2%+
bindsym XF86AudioLowerVolume exec --no-startup-id amixer -D hw:PCH -M sset Master 2%-
bindsym XF86AudioMute exec --no-startup-id amixer -D hw:PCH -M sset Master toggle
bindsym XF86AudioPlay exec --no-startup-id playerctl play-pause bindsym XF86AudioPlay exec --no-startup-id playerctl play-pause
bindsym XF86AudioPrev exec --no-startup-id playerctl previous bindsym XF86AudioPrev exec --no-startup-id playerctl previous
bindsym XF86AudioNext exec --no-startup-id playerctl next bindsym XF86AudioNext exec --no-startup-id playerctl next
bindsym Shift+XF86AudioPrev exec --no-startup-id playerctl position 3-
bindsym Shift+XF86AudioNext exec --no-startup-id playerctl position 3+
##################################
# PROGRAMS STARTED AUTOMATICALLY
##################################
# Time tracking
exec hamster
# cadence will take care of all we need :
# - Config tells Cadence to start LADISH, export MIDI hw and start A2J ;
# - LADISH implies JACK starts, then it will starts needed apps (e.g. Non-Mixer)
exec --no-startup-id cadence-session-start --start
exec --no-startup-id catia
# automate port mapping for applications
exec --no-startup-id jack-matchmaker -p ~/.config/jack-matchmaker/patterns
# Start ALSA/Jack bridge for RODE mic
exec_always --no-startup-id zita-a2j -d hw:Mini -j Rode -c 1
# Set front and headphones to 100%, let master alone change with bindsyms
exec --no-startup-id amixer -D hw:PCH -M sset Front 100%
exec --no-startup-id amixer -D hw:PCH -M sset Headphone 100%
################################## ##################################
# BINDINGS FOR STARTING PROGRAMS # BINDINGS FOR STARTING PROGRAMS
################################## ##################################
bindsym $mod+b exec --no-startup-id ~/.config/i3/scripts/brightness.sh
# auto-connect to available and trusted bluetooth devices
# bound to a special button of my mouse that's the trick
bindsym Pause exec --no-startup-id bluetooth-autoconnect
################################## ##################################
# BINDINGS FOR STANDARD OPERATIONS # BINDINGS FOR STANDARD OPERATIONS
################################## ##################################
@ -40,5 +57,15 @@ bindsym Pause exec --no-startup-id bluetooth-autoconnect
################################## ##################################
# Scratchpad # Scratchpad
for_window [class="Pianoteq STAGE"] floating enable, move position center ## For Hamster, moving to SP automatically is problematic. Do it only by hand.
assign [class="Pianoteq STAGE"] → number 6 for_window [class="Hamster" window_type="normal"] floating enable, move scratchpad
for_window [class="Non-Mixer"] mark "mixer", move scratchpad
for_window [class="Catia*"] mark "jack", move scratchpad
bindsym $mod+Shift+j [con_mark="jack"] scratchpad show, move position center
bindsym $mod+Shift+v [con_mark="mixer"] scratchpad show, move position center
bindsym $mod+Shift+p [class="Hamster" window_type="normal"] scratchpad show, move position center
for_window [class="thunderbird" window_type="normal"] resize set 1600 850
for_window [class="Signal"] resize set 1600 850
for_window [class="Hamster" window_type="normal"] resize set 1600 850
for_window [class="Telegram"] resize set 1600 850

View File

@ -2,30 +2,28 @@
# STARTING CONFIGURATION # STARTING CONFIGURATION
################################## ##################################
# Luminosity on laptop # ALSA keybinding
bindsym XF86MonBrightnessDown exec --no-startup-id brightnessctl set 5%- bindsym XF86AudioRaiseVolume exec --no-startup-id amixer -D hw:PCH -M sset Master 5%+
bindsym XF86MonBrightnessUp exec --no-startup-id brightnessctl set +5% bindsym XF86AudioLowerVolume exec --no-startup-id aimxer -D hw:PCH -M sset Master 5%-
bindsym XF86KbdBrightnessDown exec --no-startup-id brightnessctl -d asus::kbd_backlight set +5% bindsym XF86AudioMute exec --no-startup-id amixer -D hw:PCH -M sset 'Master' toggle
bindsym XF86KbdBrightnessUp exec --no-startup-id brightnessctl -d asus::kbd_backlight set 5%-
# Get chosen DPI from Xresources, default 120 # Luminosity on laptop (not xorg-xbacklight but the compatible and working acpilight)
set_from_resource $dpi i3wm.dpi 120 bindsym XF86MonBrightnessDown exec --no-startup-id xbacklight -dec 10 -steps 200
# Only dunst seems to care about this setting bindsym XF86MonBrightnessUp exec --no-startup-id xbacklight -inc 10 -steps 200
exec xrandr --dpi $dpi bindsym XF86KbdBrightnessDown exec --no-startup-id xbacklight -ctrl asus::kbd_backlight -dec 30
bindsym XF86KbdBrightnessUp exec --no-startup-id xbacklight -ctrl asus::kbd_backlight -inc 30
# set DPI along with .Xresources
exec xrandr --dpi 160
################################## ##################################
# PROGRAMS STARTED AUTOMATICALLY # PROGRAMS STARTED AUTOMATICALLY
################################## ##################################
# set mouse acceleration for various types of devices so it works on multiple laptops # set mouse acceleration
exec --no-startup-id xinput set-prop 'FocalTechPS/2 FocalTech Touchpad' 'libinput Accel Speed' 0.8 exec --no-startup-id xinput set-prop 'FocalTechPS/2 FocalTech Touchpad' 'libinput Accel Speed' 0.8
exec --no-startup-id xinput set-prop 'Microsoft Microsoft 3-Button Mouse with IntelliEye(TM)' 'libinput Accel Speed' 0.8 exec --no-startup-id xinput set-prop 'Microsoft Microsoft 3-Button Mouse with IntelliEye(TM)' 'libinput Accel Speed' 0.8
exec --no-startup-id xinput set-prop "Asus TouchPad" "libinput Accel Speed" 0.65
# That one supports tapping but is disabled by default!
exec --no-startup-id xinput set-prop "Asus TouchPad" "libinput Tapping Enabled" 1
# GUI for PulseAudio
exec pavucontrol
################################## ##################################
# BINDINGS FOR STARTING PROGRAMS # BINDINGS FOR STARTING PROGRAMS
@ -39,4 +37,7 @@ exec pavucontrol
# OPERATIONS FOR SPECIFIC WINDOWS # OPERATIONS FOR SPECIFIC WINDOWS
################################## ##################################
# Larger Thunderbird floating window
for_window [class="thunderbird" window_type="normal"] resize set 2500 1500
for_window [class="Signal"] resize set 2500 1500
for_window [class="Telegram"] resize set 2500 1500

View File

@ -1,41 +1,5 @@
# i3 config file (v4) # i3 config file (v4)
# Catppuccin Macchiato : https://github.com/catppuccin/i3/blob/main/themes/catppuccin-macchiato
set $rosewater #f4dbd6
set $flamingo #f0c6c6
set $pink #f5bde6
set $mauve #c6a0f6
set $red #ed8796
set $maroon #ee99a0
set $peach #f5a97f
set $yellow #eed49f
set $green #a6da95
set $teal #8bd5ca
set $sky #91d7e3
set $sapphire #7dc4e4
set $blue #8aadf4
set $lavender #b7bdf8
set $text #cad3f5
set $subtext1 #b8c0e0
set $subtext0 #a5adcb
set $overlay2 #939ab7
set $overlay1 #8087a2
set $overlay0 #6e738d
set $surface2 #5b6078
set $surface1 #494d64
set $surface0 #363a4f
set $base #24273a
set $mantle #1e2030
set $crust #181926i
# target title bg text indicator border
client.focused $lavender $base $text $rosewater $lavender
client.focused_inactive $overlay0 $base $text $rosewater $overlay0
client.unfocused $overlay0 $base $text $rosewater $overlay0
client.urgent $peach $base $peach $overlay0 $peach
client.placeholder $overlay0 $base $text $overlay0 $overlay0
client.background $base
################################## ##################################
# STARTING CONFIGURATION # STARTING CONFIGURATION
################################## ##################################
@ -53,8 +17,6 @@ floating_modifier $mod
# no border nor title # no border nor title
new_window none new_window none
default_border pixel 0
default_floating_border pixel 5
# hide borders when touching edges # hide borders when touching edges
hide_edge_borders both hide_edge_borders both
@ -80,9 +42,6 @@ smart_gaps on
# PROGRAMS STARTED AUTOMATICALLY # PROGRAMS STARTED AUTOMATICALLY
################################## ##################################
# Load Xresources
exec --no-startup-id xrdb -merge ~/.Xresources
# Start compositor # Start compositor
exec --no-startup-id picom --config ~/.config/picom.conf exec --no-startup-id picom --config ~/.config/picom.conf
@ -114,10 +73,6 @@ exec thunderbird
exec signal-desktop exec signal-desktop
exec telegram-desktop exec telegram-desktop
exec obsidian exec obsidian
exec --no-startup-id redshift-gtk
exec qbittorrent
exec pavucontrol
exec helvum
# fetch keys from HSM # fetch keys from HSM
exec --no-startup-id gpg --card-status exec --no-startup-id gpg --card-status
@ -131,14 +86,14 @@ exec --no-startup-id setxkbmap fr
bindsym $mod+Return exec --no-startup-id i3-sensible-terminal bindsym $mod+Return exec --no-startup-id i3-sensible-terminal
# start rofi (a program launcher) # start rofi (a program launcher)
bindsym $mod+d exec rofi -show run bindsym $mod+d exec rofi -show run -theme sidebar
bindsym $mod+Shift+d exec rofimoji bindsym $mod+Shift+d exec ~/.config/rofi/emoji-picker.py
# just lock the screen # just lock the screen
bindsym $mod+l exec --no-startup-id $Locker && sleep 1 bindsym $mod+l exec --no-startup-id $Locker && sleep 1
# lock and suspend to SWAP # lock and suspend to SWAP
bindsym $mod+Shift+l exec --no-startup-id $Locker && systemctl suspend bindsym $mod+Shift+l exec --no-startup-id $Locker && systemctl hibernate
# open Explorer # open Explorer
bindsym $mod+e exec --no-startup-id nemo bindsym $mod+e exec --no-startup-id nemo
@ -237,17 +192,11 @@ mode "$resize_mode" {
bindsym $mod+r mode "$resize_mode" bindsym $mod+r mode "$resize_mode"
# ALSA keybinding (won't work with some keyboards... scroll in polybar in that case)
bindsym XF86AudioRaiseVolume exec --no-startup-id amixer -D pulse -M sset Master 5%+
bindsym XF86AudioLowerVolume exec --no-startup-id aimxer -D pulse -M sset Master 5%-
bindsym XF86AudioMute exec --no-startup-id amixer -D pulse -M sset 'Master' toggle
################################## ##################################
# BINDINGS FOR NOTIFICATIONS # BINDINGS FOR NOTIFICATIONS
################################## ##################################
bindsym Ctrl+Shift+space exec dunstctl close-all bindsym Ctrl+Shift+BackSpace exec dunstctl close-all
bindsym Ctrl+$mod+space exec dunstctl history-pop bindsym Ctrl+$mod+space exec dunstctl history-pop
bindsym Shift+BackSpace exec dunstctl close bindsym Shift+BackSpace exec dunstctl close
@ -266,40 +215,22 @@ for_window [title="Preferences$"] floating enable
for_window [class="Telegram"] floating enable for_window [class="Telegram"] floating enable
for_window [class="(?i)Thunderbird"] move position center for_window [class="(?i)Thunderbird"] move position center
for_window [window_role="GtkFileChooserDialog"] move position center
# === Scratchpad === # scratchpad
# Make the currently focused window a scratchpad # Make the currently focused window a scratchpad
bindsym $mod+Shift+BackSpace move scratchpad bindsym $mod+Shift+BackSpace move scratchpad
for_window [class="Signal" window_type="normal"] move scratchpad for_window [class="Signal" window_type="normal"] move scratchpad
for_window [class="Telegram"] move scratchpad for_window [class="Telegram"] move scratchpad
# we don't use class="Thunderbird" to not move windows like "MsgCompose" to scratchpad : only the main window will be in scratchpad # we don't use class="Thunderbird" to not move windows like "MsgCompose" to scratchpad : only the main window will be in scratchpad
for_window [instance="Mail"] move scratchpad for_window [instance="Mail"] move scratchpad
for_window [instance="helvum"] floating enable, move scratchpad
for_window [instance="pavucontrol"] floating enable, move scratchpad
# only target main window
for_window [title="qBittorrent v*"] move scratchpad
bindsym $mod+Shift+m [instance="Mail"] scratchpad show, move position center bindsym $mod+Shift+m [instance="Mail"] scratchpad show, move position center
bindsym $mod+Shift+s [class="Signal"] scratchpad show, move position center bindsym $mod+Shift+s [class="Signal"] scratchpad show, move position center
bindsym $mod+Shift+e [title="qBittorrent v*"] scratchpad show, move position center
bindsym $mod+Shift+t [class="Telegram"] scratchpad show, move position center bindsym $mod+Shift+t [class="Telegram"] scratchpad show, move position center
bindsym Mod4+ampersand [title="(?i)perso.*obsidian"] scratchpad show, move container to workspace 4, workspace 4, floating disable bindsym Mod4+ampersand [title="(?i)perso.*obsidian"] scratchpad show, move container to workspace 4, workspace 4, floating disable
bindsym Mod4+eacute [title="(?i)tech.*obsidian"] scratchpad show, move container to workspace 4, workspace 4, floating disable bindsym Mod4+eacute [title="(?i)tech.*obsidian"] scratchpad show, move container to workspace 4, workspace 4, floating disable
bindsym Mod4+quotedbl [title="(?i)notes.*obsidian"] scratchpad show, move container to workspace 4, workspace 4, floating disable
# Thanks to this epic discussion, with an unexpected ending, I am happily
# able to resize floating windows by percentage of the screen width/height,
# making it compatible with the shared configuration
# https://github.com/i3/i3/issues/2816
for_window [instance="Mail" window_type="normal"] resize set 90 ppt 85 ppt
for_window [class="Signal"] resize set 90 ppt 85 ppt
for_window [class="Telegram"] resize set 90 ppt 85 ppt
# automatic workspace # automatic workspace
assign [class="(?i)Obsidian"] → number 4 assign [class="(?i)Obsidian"] → number 4
assign [class="(?i)Tor Browser"] → number 5 assign [class="(?i)Tor Browser"] → number 5
assign [class="(?i)Firefox" window_role="browser"] → number 3 assign [class="(?i)Firefox"] → number 3
assign [class="(?i)VSCodium"] → number 2 assign [class="(?i)VSCodium"] → number 2
bindsym $mod+j [instance="pavucontrol"] scratchpad show, move position center
bindsym $mod+Shift+j [instance="helvum"] scratchpad show, move position center

View File

@ -1,9 +0,0 @@
#!/bin/bash
MONITORS='0 9'
BRIGHT=`zenity --entry --width 40 --text="Brightness:"`
for m in ${MONITORS}; do
ddccontrol dev:/dev/i2c-${m} -r 0x10 -w ${BRIGHT}
done

View File

@ -90,7 +90,7 @@ def upload_image(client, album_id, binary_img, img_format):
return client.add_photo(binary_img, str(uuid.uuid4()) + '.' + img_format, album_id) return client.add_photo(binary_img, str(uuid.uuid4()) + '.' + img_format, album_id)
def get_image_direct_link(client, image_id): def get_image_direct_link(client, image_id):
return 'https://pic.chosto.me' + '/' + client.get_photo(image_id)['size_variants']['original']['url'] return SCREENSHOT_CONFIG['base_url'] + '/' + client.get_photo(image_id)['url']
def main(argv): def main(argv):
upload, save, path = read_args(argv) upload, save, path = read_args(argv)
@ -108,8 +108,8 @@ def main(argv):
if upload: if upload:
s = login() s = login()
album_id = get_album_id(s, SCREENSHOT_CONFIG['album_name']) album_id = get_album_id(s, SCREENSHOT_CONFIG['album_name'])
image_info = upload_image(s, album_id, img, img_format) image_id = upload_image(s, album_id, img, img_format)
image_link = get_image_direct_link(s, image_info['id']) image_link = get_image_direct_link(s, image_id)
pyperclip.copy(image_link) pyperclip.copy(image_link)
subprocess.run(['notify-send', '-u', 'low', '-i', 'Info', '-a', 'Screenchost', 'Screenshot uploaded', 'Link copied to clipboard!']) subprocess.run(['notify-send', '-u', 'low', '-i', 'Info', '-a', 'Screenchost', 'Screenshot uploaded', 'Link copied to clipboard!'])
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError as e:

View File

@ -4,7 +4,7 @@ JACK settings, as persisted by D-Bus object.
You probably don't want to edit this because You probably don't want to edit this because
it will be overwritten next time jackdbus saves. it will be overwritten next time jackdbus saves.
--> -->
<!-- Fri Feb 2 18:39:25 2024 --> <!-- Sat Feb 18 21:25:33 2023 -->
<jack> <jack>
<engine> <engine>
<option name="driver">alsa</option> <option name="driver">alsa</option>
@ -12,13 +12,10 @@ it will be overwritten next time jackdbus saves.
</engine> </engine>
<drivers> <drivers>
<driver name="alsa"> <driver name="alsa">
<option name="capture">hw:iD14,0</option> <option name="capture">hw:PCH,0</option>
<option name="playback">hw:iD14,0</option> <option name="playback">hw:PCH,0</option>
<option name="rate">44100</option> <option name="inchannels">2</option>
<option name="period">2048</option> <option name="outchannels">2</option>
<option name="inchannels">12</option>
<option name="outchannels">6</option>
<option name="midi-driver">seq</option>
</driver> </driver>
<driver name="alsarawmidi"> <driver name="alsarawmidi">
</driver> </driver>

View File

@ -1 +0,0 @@
/etc

View File

@ -1,2 +0,0 @@
LANG=en_US.UTF-8
LC_TIME=fr_FR.UTF-8

View File

@ -1,117 +0,0 @@
vim.opt.number = true
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
vim.fn.system({
"git",
"clone",
"--filter=blob:none",
"https://github.com/folke/lazy.nvim.git",
"--branch=stable", -- latest stable release
lazypath,
})
end
vim.opt.rtp:prepend(lazypath)
require("lazy").setup({ { "catppuccin/nvim", name = "catppuccin", priority = 1000 }, { "mhartington/formatter.nvim" } })
require("catppuccin").setup({
flavour = "mocha", -- latte, frappe, macchiato, mocha
background = { -- :h background
light = "latte",
dark = "mocha",
},
transparent_background = true, -- disables setting the background color.
show_end_of_buffer = false, -- shows the '~' characters after the end of buffers
term_colors = false, -- sets terminal colors (e.g. `g:terminal_color_0`)
dim_inactive = {
enabled = false, -- dims the background color of inactive window
shade = "dark",
percentage = 0.15, -- percentage of the shade to apply to the inactive window
},
no_italic = false, -- Force no italic
no_bold = false, -- Force no bold
no_underline = false, -- Force no underline
styles = { -- Handles the styles of general hi groups (see `:h highlight-args`):
comments = { "italic" }, -- Change the style of comments
conditionals = { "italic" },
loops = {},
functions = {},
keywords = {},
strings = {},
variables = {},
numbers = {},
booleans = {},
properties = {},
types = {},
operators = {},
},
color_overrides = {},
custom_highlights = {},
integrations = {
cmp = true,
gitsigns = true,
nvimtree = true,
treesitter = true,
notify = false,
mini = {
enabled = true,
indentscope_color = "",
},
-- For more plugins integrations please scroll down (https://github.com/catppuccin/nvim#integrations)
},
})
-- Utilities for creating configurations
local util = require("formatter.util")
-- Provides the Format, FormatWrite, FormatLock, and FormatWriteLock commands
require("formatter").setup({
-- Enable or disable logging
logging = true,
-- Set the log level
log_level = vim.log.levels.WARN,
-- All formatter configurations are opt-in
filetype = {
-- Formatter configurations for filetype "lua" go here
-- and will be executed in order
lua = {
-- "formatter.filetypes.lua" defines default configurations for the
-- "lua" filetype
require("formatter.filetypes.lua").stylua,
-- You can also define your own configuration
function()
-- Supports conditional formatting
if util.get_current_buffer_file_name() == "special.lua" then
return nil
end
-- Full specification of configurations is down below and in Vim help
-- files
return {
exe = "stylua",
args = {
"--search-parent-directories",
"--stdin-filepath",
util.escape_path(util.get_current_buffer_file_path()),
"--",
"-",
},
stdin = true,
}
end,
},
-- Use the special "*" filetype for defining formatter configurations on
-- any filetype
["*"] = {
-- "formatter.filetypes.any" defines default configurations for any
-- filetype
require("formatter.filetypes.any").remove_trailing_whitespace,
},
},
})
require("format-lua")
vim.cmd.colorscheme("catppuccin-macchiato")
vim.api.nvim_set_keymap("n", "<leader>f", ":Format<CR>", { noremap = true, silent = true })

View File

@ -1,5 +0,0 @@
{
"catppuccin": { "branch": "main", "commit": "c2034f7b549152e5cc757820426341ea5000bc7a" },
"formatter.nvim": { "branch": "master", "commit": "cb4778b8432f1ae86dae4634c0b611cb269a4c2f" },
"lazy.nvim": { "branch": "main", "commit": "bef521ac89c8d423f9d092e37b58e8af0c099309" }
}

View File

@ -1,41 +0,0 @@
local M = {}
local util = require "formatter.util"
function M.luaformatter()
return {
exe = "luaformatter",
}
end
function M.luafmt()
return {
exe = "luafmt",
args = { "--stdin" },
stdin = true,
}
end
function M.luaformat()
return {
exe = "lua-format",
args = {util.escape_path(util.get_current_buffer_file_path())},
stdin = true
}
end
function M.stylua()
return {
exe = "stylua",
args = {
"--search-parent-directories",
"--stdin-filepath",
util.escape_path(util.get_current_buffer_file_path()),
"--",
"-",
},
stdin = true,
}
end
return M

View File

@ -89,8 +89,8 @@ Include = /etc/pacman.d/mirrorlist
#[multilib-testing] #[multilib-testing]
#Include = /etc/pacman.d/mirrorlist #Include = /etc/pacman.d/mirrorlist
[multilib] #[multilib]
Include = /etc/pacman.d/mirrorlist #Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for # An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories. # tips on creating your own repositories.

View File

@ -8,8 +8,7 @@
# unless explicitly requested using the wintypes option. # unless explicitly requested using the wintypes option.
# #
# shadow = false # shadow = false
# Get rid of shadow behind corners shadow = true;
shadow = false;
# The blur radius for shadows, in pixels. (defaults to 12) # The blur radius for shadows, in pixels. (defaults to 12)
# shadow-radius = 12 # shadow-radius = 12
@ -157,14 +156,6 @@ focus-exclude = [ "class_g = 'Cairo-clock'" ];
################################# #################################
blur: {
method = "dual_kawase";
strength = 1;
background = true;
background-frame = true;
background-fixed = true;
}
# Parameters for background blurring, see the *BLUR* section for more information. # Parameters for background blurring, see the *BLUR* section for more information.
# blur-method = # blur-method =
# blur-size = 12 # blur-size = 12
@ -216,8 +207,7 @@ blur-background-exclude = [
# `xrender` is the default one. # `xrender` is the default one.
# #
# backend = 'glx' # backend = 'glx'
# With xrender there is black in place of rounded corners backend = "xrender";
backend = "glx";
# Enable/disable VSync. # Enable/disable VSync.
# vsync = false # vsync = false
@ -242,7 +232,6 @@ mark-ovredir-focused = true;
# detect-rounded-corners = false # detect-rounded-corners = false
detect-rounded-corners = true; detect-rounded-corners = true;
corner-radius = 7.0
# Detect '_NET_WM_OPACITY' on client windows, useful for window managers # Detect '_NET_WM_OPACITY' on client windows, useful for window managers
# not passing '_NET_WM_OPACITY' of client windows to frame windows. # not passing '_NET_WM_OPACITY' of client windows to frame windows.
# #

View File

@ -1,35 +0,0 @@
# See https://github.com/polybar/polybar/wiki/Formatting#format-tags-inside-polybar-config
# Only way to use format tags with variables in polybar for now
export MOCHA_TEXT="#cdd6fa"
export MOCHA_MAROON="#eba0ac"
export MOCHA_PEACH="#fab387"
export MOCHA_LAVENDER="#b4befe"
export MOCHA_BLUE="#89b4fa"
export MOCHA_SKY="#89dceb"
export MOCHA_YELLOW="#f9e2af"
export MOCHA_GREEN="#a6e3a1"
export MOCHA_SAPPHIRE="#74c7ec"
export MOCHA_PINK="#f5c2e7"
export MOCHA_ROSEWATER="#f2cdcd"
export MOCHA_MAUVE="#ca9ee6"
export MOCHA_TEAL="#81c8be"
export BAR_WINDOW="%{F$MOCHA_TEXT}%title%"
export BAR_WIFI_CONNECTED="%{F$MOCHA_TEXT}%essid% %{F$MOCHA_YELLOW}%{F$MOCHA_TEXT} %local_ip% %{F$MOCHA_YELLOW}%{F$MOCHA_TEXT} %downspeed% %{F$MOCHA_YELLOW}%{F$MOCHA_TEXT} %upspeed%"
export BAR_WIRED_CONNECTED="%{F$MOCHA_TEXT}%ifname% %{F$MOCHA_YELLOW}%{F$MOCHA_TEXT} %local_ip% %{F$MOCHA_YELLOW}%{F$MOCHA_TEXT} %downspeed% %{F$MOCHA_YELLOW}%{F$MOCHA_TEXT} %upspeed%"
export BAR_CPU="%{F$MOCHA_MAUVE} "
export BAR_TEMP_OK="%{F$MOCHA_MAUVE} %{F-} %temperature-c%"
export BAR_TEMP_WARN="%{F$MOCHA_PEACH} %{F-} %temperature-c%"
export BAR_MENU_OPEN="%{F$MOCHA_MAUVE}%{F$MOCHA_TEXT}"
export BAR_MENU_CLOSE="%{F$MOCHA_MAUVE}%{F$MOCHA_TEXT}"
export BAR_BACKLIGHT="%{F$MOCHA_SKY}☀️%{F$MOCHA_TEXT} %percentage%%"
export BAR_BATTERY_FULL="%{F$MOCHA_SAPPHIRE} %{F$MOCHA_TEXT}%percentage%%"
export BAR_BATTERY_CHARGING="%{F$MOCHA_LAVENDER} %{F$MOCHA_TEXT}%percentage%%"
export BAR_BATTERY_DISCHARGING="%{F$MOCHA_PEACH} %{F$MOCHA_TEXT}%percentage%%"
export BAR_MEMORY_DESKTOP="%{F$MOCHA_MAUVE}"
export BAR_MEMORY_LAPTOP="%{F$MOCHA_MAUVE} %{F$MOCHA_TEXT}%percentage_used%%"
export BAR_MEMORY_LAPTOP_WARN="%{F$MOCHA_PEACH} %percentage_used%%"
export BAR_DATE="%{F$MOCHA_MAUVE}🕓%{F$MOCHA_TEXT} %date% · %time%"
export BAR_LOW_VOL="%{F$MOCHA_MAUVE}🔈%{F$MOCHA_TEXT}"
export BAR_MED_VOL="%{F$MOCHA_MAUVE}🔉%{F$MOCHA_TEXT}"
export BAR_HIGH_VOL="%{F$MOCHA_MAUVE}🔊%{F$MOCHA_TEXT}"
export BAR_HEAD_VOL="%{F$MOCHA_MAUVE}%%{F$MOCHA_TEXT}"

View File

@ -0,0 +1,6 @@
[variables]
dpi = 90
height = 27
top_left = powermenu system-uptime-pretty
top_center = xwindow
top_right = system-usb-udev alsa date

View File

@ -0,0 +1,6 @@
[variables]
dpi = 150
height = 54
top_left = powermenu system-uptime-pretty battery
top_center = xwindow
top_right = system-usb-udev backlight pulseaudio date

View File

@ -1,31 +0,0 @@
[variables]
dpi = 90
height = 30
top_left = powermenu system-uptime-pretty
top_center = player-mpris
;top_center = xwindow
top_right = pulseaudio system-usb-udev date
bottom_left = i3
bottom_right = temperature cpu memory filesystem-custom
[module/memory]
type = internal/memory
interval = 0.2
format = <label> <bar-used>
label = ${env:BAR_MEMORY_DESKTOP}
bar-used-width = 50
bar-used-gradient = true
bar-used-foreground-0 = ${colors.sapphire}
bar-used-foreground-1 = ${colors.sapphire}
bar-used-foreground-2 = ${colors.peach}
bar-used-foreground-3 = ${colors.red}
bar-used-indicator =
bar-used-indicator-font = 2
bar-used-indicator-foreground = ${colors.sapphire}
bar-used-fill =▐
bar-used-fill-font = 2
bar-used-empty =▐
bar-used-empty-font = 2
bar-used-empty-foreground = ${colors.overlay2}

View File

@ -1,18 +0,0 @@
[variables]
dpi = 110
height = 40
top_left = powermenu system-uptime-pretty battery
top_center = player-mpris
;top_center = xwindow
top_right = system-usb-udev backlight pulseaudio date
bottom_left = i3
bottom_right = temperature cpu memory filesystem-custom
[module/memory]
type = internal/memory
interval = 0.2
format = <label>
format-warn = <label-warn>
warn-percentage = 60
label = ${env:BAR_MEMORY_LAPTOP}
label-warn = ${env:BAR_MEMORY_LAPTOP_WARN}

View File

@ -1,42 +1,50 @@
[colors]
; First two letter of background are for transparency
background = #cc2f343f
foreground = #eee
foreground-alt = #555
secondary = #e60053
alert = #bd2c40
accent = #fba922
[global/wm] [global/wm]
margin-top=50 margin-top=50
include-file = $HOME/.config/polybar/macchiato.ini
; Common to top and bottom bars ; Common to top and bottom bars
[bar/common] [bar/common]
width = 100% width = 100%
dpi = ${variables.dpi} dpi = ${variables.dpi:90}
enable-ipc = true enable-ipc = true
height = ${variables.height} height = ${variables.height:30}
foreground = ${colors.text} foreground = ${colors.foreground}
background = ${colors.surface0} background = ${colors.background}
line-size = 3 line-size = 3
line-color = ${colors.base} line-color = #f00
locale = fr_FR.UTF-8 locale = fr_FR.UTF-8
monitor = ${env:MONITOR:HDMI-0} monitor = ${env:MONITOR:HDMI-0}
[bar/chostytopbar] [bar/chostytopbar]
inherit = bar/common inherit = bar/common
font-0 = NotoSans-Regular:size=10;1 font-0 = NotoSans-Regular:size=10;2
font-1 = MaterialIcons-Regular:size=11;4 font-1 = MaterialIcons-Regular:size=11;4
font-2 = Symbola:size=10;2 font-2 = Symbola:size=10;2
font-3 = Weather Icons:size=10;3 font-3 = Weather Icons:size=10;3
overline-size = 10 overline-size = 10
underline-size = 10 underline-size = 10
overline-color = ${colors.mauve} overline-color = ${self.background}
underline-color = ${colors.mauve} underline-color = ${self.background}
border-bottom-size = 1 border-bottom-size = 1
border-bottom-color = ${colors.base} border-bottom-color = #333
padding-left = 2 padding-left = 2
padding-right = 10 padding-right = 10
module-margin-left = 4 module-margin-left = 4
module-margin-right = 4 module-margin-right = 4
modules-left = ${variables.top_left} modules-left = ${variables.top_left:powermenu system-uptime-pretty}
modules-center = ${variables.top_center} modules-center = ${variables.top_center:xwindow}
modules-right = ${variables.top_right} modules-right = ${variables.top_right:system-usb-udev alsa date}
tray-position = right tray-position = right
@ -45,9 +53,9 @@ inherit = bar/common
bottom = true bottom = true
overline-size = 3 overline-size = 3
overline-color = ${colors.mauve} overline-color = ${colors.accent}
underline-size = 3 underline-size = 3
underline-color = ${colors.mauve} underline-color = ${colors.accent}
spacing = 3 spacing = 3
padding-left = 0 padding-left = 0
@ -55,27 +63,38 @@ padding-right = 5
module-margin-left = 6 module-margin-left = 6
module-margin-right = 6 module-margin-right = 6
font-0 = NotoSans-Regular:size=10;1 font-0 = Roboto:size=10;2
font-1 = Symbola:size=4;2 font-1 = Symbola:size=4;1
font-2 = Symbola:size=5;2 font-2 = Symbola:size=5;1
;MaterialIcons are the ones used for i3 icons
font-3 = MaterialIcons-Regular:size=11;4 font-3 = MaterialIcons-Regular:size=11;4
font-4 = Font Awesome 5 Free:style=solid:size=10;2 font-4 = Font Awesome 5 Free:style=solid:size=10;2
modules-left = ${variables.bottom_left} modules-left = i3
modules-center = ${variables.bottom_center} ;modules-center =
modules-right = ${variables.bottom_right} modules-right = wired-network wireless-network updates-arch-combined temperature cpu memory filesystem-custom
[module/player-mpris]
type = custom/script
exec = python ~/.config/polybar/scripts/player-mpris.py -f '🎝 {artist} - {title} %{A1:python ~/.config/polybar/scripts/player-mpris.py previous:} ⏮ %{A} %{A1:python ~/.config/polybar/scripts/player-mpris.py play-pause:} {icon-reversed} %{A} %{A1:python ~/.config/polybar/scripts/player-mpris.py next:} ⏭ %{A}'
tail = true
[module/xwindow] [module/xwindow]
type = internal/xwindow type = internal/xwindow
label = ${env:BAR_WINDOW} label = %{F#ddd}%title%
label-maxlen=100 label-maxlen=100
[module/wireless-network]
type = internal/network
interface-type = wireless
interval = 1
label-connected = %{F#ddd}%essid%  %local_ip% %{F#77dd77}%{F-} %downspeed% %{F#dd7777}%{F-} %upspeed%
label-disconnected = Wireless disconnected
label-disconnected-foreground = #66
[module/wired-network]
type = internal/network
interface =
interface-type = wired
interval = 1
label-connected = %{F#ddd}%ifname%  %local_ip% %{F#77dd77}%{F-} %downspeed% %{F#dd7777}%{F-} %upspeed%
label-disconnected = Ethernet disconnected
label-disconnected-foreground = #66
[module/i3] [module/i3]
type = internal/i3 type = internal/i3
format = <label-state> <label-mode> format = <label-state> <label-mode>
@ -87,33 +106,30 @@ ws-icon-1 = 2;
ws-icon-2 = 3; ws-icon-2 = 3;
ws-icon-3 = 4; ws-icon-3 = 4;
ws-icon-4 = 5; ws-icon-4 = 5;
ws-icon-5 = 6;
label-dimmed-underline = ${root.background}
label-separator = | label-separator = |
label-mode-underline = ${colors.surface0}
label-focused = %icon% %name% label-focused = %icon% %name%
label-focused-foreground = ${colors.text} label-focused-foreground = #f3f3f3
label-focused-underline = ${colors.mauve} ;label-focused-underline = #${colors.accent}
label-focused-underline = #9f78e1
label-focused-font = 0 label-focused-font = 0
label-focused-padding = 4 label-focused-padding = 4
label-unfocused = %icon% %name% label-unfocused = %icon% %name%
label-unfocused-underline = ${colors.surface0} label-unfocused-underline = #555555
label-unfocused-font = 0 label-unfocused-font = 0
label-unfocused-padding = 4 label-unfocused-padding = 4
label-urgent = %icon% %name% label-urgent = %icon% %name%
label-urgent-foreground = ${colors.base} label-urgent-foreground = #000000
label-urgent-background = ${colors.red} label-urgent-background = #bd2c40
label-urgent-underline = ${colors.mauve} label-urgent-underline = #9b0a20
label-urgent-font = 0 label-urgent-font = 0
label-urgent-padding = 4 label-urgent-padding = 4
label-visible = %icon% %name% label-visible = %icon% %name%
label-visible-foreground = ${colors.text} label-visible-foreground = #55ffffff
label-visible-underline = ${colors.surface0}
label-visible-font = 0 label-visible-font = 0
label-visible-padding = 4 label-visible-padding = 4
@ -123,39 +139,64 @@ interval = 0.5
format = <label> <ramp-coreload> format = <label> <ramp-coreload>
label = ${env:BAR_CPU} label = %{F#fba922} 
ramp-coreload-0 = ▁ ramp-coreload-0 = ▁
ramp-coreload-0-font = 3 ramp-coreload-0-font = 3
ramp-coreload-0-foreground = ${colors.sapphire} ramp-coreload-0-foreground = #aaff77
ramp-coreload-1 = ▂ ramp-coreload-1 = ▂
ramp-coreload-1-font = 3 ramp-coreload-1-font = 3
ramp-coreload-1-foreground = ${colors.sapphire} ramp-coreload-1-foreground = #aaff77
ramp-coreload-2 = ▃ ramp-coreload-2 = ▃
ramp-coreload-2-font = 3 ramp-coreload-2-font = 3
ramp-coreload-2-foreground = ${colors.sapphire} ramp-coreload-2-foreground = #aaff77
ramp-coreload-3 = ▄ ramp-coreload-3 = ▄
ramp-coreload-3-font = 3 ramp-coreload-3-font = 3
ramp-coreload-3-foreground = ${colors.sapphire} ramp-coreload-3-foreground = #aaff77
ramp-coreload-4 = ▅ ramp-coreload-4 = ▅
ramp-coreload-4-font = 3 ramp-coreload-4-font = 3
ramp-coreload-4-foreground = ${colors.peach} ramp-coreload-4-foreground = #fba922
ramp-coreload-5 = ▆ ramp-coreload-5 = ▆
ramp-coreload-5-font = 3 ramp-coreload-5-font = 3
ramp-coreload-5-foreground = ${colors.peach} ramp-coreload-5-foreground = #fba922
ramp-coreload-6 = ▇ ramp-coreload-6 = ▇
ramp-coreload-6-font = 3 ramp-coreload-6-font = 3
ramp-coreload-6-foreground = ${colors.maroon} ramp-coreload-6-foreground = #ff5555
ramp-coreload-7 = █ ramp-coreload-7 = █
ramp-coreload-7-font = 3 ramp-coreload-7-font = 3
ramp-coreload-7-foreground = ${colors.red} ramp-coreload-7-foreground = #ff5555
[module/memory]
type = internal/memory
interval = 0.2
format = <label> <bar-used>
label = %{F#fba922}
bar-used-width = 50
bar-used-gradient = true
bar-used-foreground-0 = #55aa55
bar-used-foreground-1 = #557755
bar-used-foreground-2 = #f5a70a
bar-used-foreground-3 = #ff5555
bar-used-indicator =
bar-used-indicator-font = 2
bar-used-indicator-foreground = #fff
bar-used-fill =▐
bar-used-fill-font = 2
bar-used-empty =▐
bar-used-empty-font = 2
bar-used-empty-foreground = #444444
[module/date] [module/date]
type = internal/date type = internal/date
interval = 1.0 interval = 1.0
date = " %A %d %B %Y" date = " %A %d %B %Y"
time = %H:%M:%S time = %H:%M:%S
label = ${env:BAR_DATE}
label = %{F#ddd} %date%  %time%
[module/temperature] [module/temperature]
type = internal/temperature type = internal/temperature
@ -163,42 +204,49 @@ thermal-zone = 0
warn-temperature = 60 warn-temperature = 60
interval = 0.5 interval = 0.5
format = <label> format = <ramp> <label>
format-warn = <label-warn> format-warn = <ramp> <label-warn>
label = ${env:BAR_TEMP_OK} label = %{F#77dd77} %{F-} %temperature-c%
label-warn = ${env:BAR_TEMP_WARN} label-warn = %{F#dd7777} %{F-} %temperature-c%
label-warn-foreground = ${colors.text} label-warn-foreground = #dd7777
ramp-0 =
ramp-1 =
ramp-2 =
ramp-foreground = ${colors.foreground-alt}
[module/powermenu] [module/powermenu]
type = custom/menu type = custom/menu
format-padding = 3 format-padding = 3
label-open = ${env:BAR_MENU_OPEN}
label-close = ${env:BAR_MENU_CLOSE} label-open = %{F#dd7777}%{F#ddd}
label-close = %{F#dd7777}%{F#ddd}
label-separator = " · " label-separator = " · "
menu-0-0 = Exit i3 menu-0-0 = Exit i3
menu-0-0-foreground = ${colors.text} menu-0-0-foreground = ${colors.accent}
menu-0-0-exec = i3-msg exit menu-0-0-exec = i3-msg exit
menu-0-1 = Reboot menu-0-1 = Reboot
menu-0-1-foreground = ${colors.text} menu-0-1-foreground = ${colors.accent}
menu-0-1-exec = menu-open-1 menu-0-1-exec = menu-open-1
menu-0-2 = Power off menu-0-2 = Power off
menu-0-2-foreground = ${colors.text} menu-0-2-foreground = ${colors.accent}
menu-0-2-exec = menu-open-2 menu-0-2-exec = menu-open-2
menu-1-0 = Cancel menu-1-0 = Cancel
menu-1-0-foreground = ${colors.mauve} menu-1-0-foreground = ${colors.accent}
menu-1-0-exec = menu-open-0 menu-1-0-exec = menu-open-0
menu-1-1 = Reboot menu-1-1 = Reboot
menu-1-1-foreground = ${colors.mauve} menu-1-1-foreground = ${colors.accent}
menu-1-1-exec = systemctl reboot -i menu-1-1-exec = systemctl reboot -i
menu-2-0 = Cancel menu-2-0 = Cancel
menu-2-0-foreground = ${colors.mauve} menu-2-0-foreground = ${colors.accent}
menu-2-0-exec = menu-open-0 menu-2-0-exec = menu-open-0
menu-2-1 = Power off menu-2-1 = Power off
menu-2-1-foreground = ${colors.mauve} menu-2-1-foreground = ${colors.accent}
menu-2-1-exec = systemctl poweroff menu-2-1-exec = systemctl poweroff
[module/system-usb-udev] [module/system-usb-udev]
@ -226,12 +274,11 @@ interval = 30
[module/backlight] [module/backlight]
type = internal/backlight type = internal/backlight
card = intel_backlight card = intel_backlight
label = ${env:BAR_BACKLIGHT} label = %{F#77dd77}☀️%{F#ddd} %percentage%%
bar-width = 10 bar-width = 10
bar-indicator = | bar-indicator = |
bar-fill = ─ bar-fill = ─
bar-empty = ─ bar-empty = ─
enable-scroll = true
[module/pulseaudio] [module/pulseaudio]
type = internal/pulseaudio type = internal/pulseaudio
@ -239,7 +286,7 @@ interval = 5
format-volume = <ramp-volume> <label-volume> format-volume = <ramp-volume> <label-volume>
label-muted = 🔇 muted label-muted = 🔇 muted
label-muted-foreground = ${colors.rosewater} label-muted-foreground = #666
ramp-volume-0 = 🔈 ramp-volume-0 = 🔈
ramp-volume-1 = 🔉 ramp-volume-1 = 🔉
@ -257,9 +304,9 @@ poll-interval = 5
format-charging = <label-charging> format-charging = <label-charging>
format-discharging = <label-discharging> format-discharging = <label-discharging>
format-full = <label-full> format-full = <label-full>
label-charging = ${env:BAR_BATTERY_CHARGING} label-charging =  %percentage%%
label-discharging = ${env:BAR_BATTERY_DISCHARGING} label-discharging =  %percentage%%
label-full = ${env:BAR_BATTERY_FULL} label-full = %{F#77dd77}
[module/alsa] [module/alsa]
type = internal/alsa type = internal/alsa
@ -272,13 +319,13 @@ master-mixer = Master
format-volume = <ramp-volume> <label-volume> format-volume = <ramp-volume> <label-volume>
label-muted = 🔇 muted label-muted = 🔇 muted
label-muted-foreground = ${colors.rosewater} label-muted-foreground = #66
ramp-volume-0 = ${env:BAR_LOW_VOL} ramp-volume-0 = 🔈
ramp-volume-1 = ${env:BAR_MED_VOL} ramp-volume-1 = 🔉
ramp-volume-2 = ${env:BAR_HIGH_VOL} ramp-volume-2 = 🔊
ramp-headphones-0 = ${env:BAR_HEAD_VOL} ramp-headphones-0 =
ramp-headphones-1 = ${env:BAR_HEAD_VOL} ramp-headphones-1 =
interval = 3 interval = 3

View File

@ -1,8 +1,6 @@
#/bin/sh #/bin/sh
source $(dirname $0)/../.env
source $(dirname $0)/filesystem.data source $(dirname $0)/filesystem.data
output="" output=""
for i in "${!parts[@]}"; do for i in "${!parts[@]}"; do
avail=$(df -h ${parts[$i]} | tail -1 | tr -s ' ' | cut -d' ' -f4) avail=$(df -h ${parts[$i]} | tail -1 | tr -s ' ' | cut -d' ' -f4)
@ -10,13 +8,13 @@ for i in "${!parts[@]}"; do
num=$(echo ${used} | cut -d'%' -f1) num=$(echo ${used} | cut -d'%' -f1)
if [ "$num" -gt 80 ] ; then if [ "$num" -gt 80 ] ; then
color="$MOCHA_RED" color="#dd7777"
elif [ "$num" -gt 50 ] ; then elif [ "$num" -gt 50 ] ; then
color="$MOCHA_PEACH" color="#fba922"
else else
color="$MOCHA_MAUVE" color="#77dd77"
fi fi
output=$output"%{F${color}}${icons[$i]} $used%{F$MOCHA_TEXT} · $avail" output=$output"%{F${color}}${icons[$i]} $used%{F#555} · $avail%{F-}"
if [ $(($i + 1)) -ne "${#parts[@]}" ] ; then if [ $(($i + 1)) -ne "${#parts[@]}" ] ; then
output=$output" " output=$output" "
fi fi

View File

@ -1,5 +1,5 @@
#!/usr/bin/env bash #!/usr/bin/env bash
source ~/.config/polybar/.env
names=("chostybottombar" "chostytopbar") names=("chostybottombar" "chostytopbar")
killall -q polybar killall -q polybar
while pgrep -u $UID -x polybar >/dev/null; do sleep 1; done while pgrep -u $UID -x polybar >/dev/null; do sleep 1; done

View File

@ -1,555 +0,0 @@
#!/usr/bin/env python3
# Taken from https://github.com/polybar/polybar-scripts/tree/master/polybar-scripts/player-mpris-tail
import sys
import dbus
import os
from operator import itemgetter
import argparse
import re
from urllib.parse import unquote
import time
from dbus.mainloop.glib import DBusGMainLoop
from gi.repository import GLib
DBusGMainLoop(set_as_default=True)
FORMAT_STRING = '{icon} {artist} - {title}'
FORMAT_REGEX = re.compile(r'(\{:(?P<tag>.*?)(:(?P<format>[wt])(?P<formatlen>\d+))?:(?P<text>.*?):\})', re.I)
FORMAT_TAG_REGEX = re.compile(r'(?P<format>[wt])(?P<formatlen>\d+)')
SAFE_TAG_REGEX = re.compile(r'[{}]')
class PlayerManager:
def __init__(self, filter_list, block_mode = True, connect = True):
self.filter_list = filter_list
self.block_mode = block_mode
self._connect = connect
self._session_bus = dbus.SessionBus()
self.players = {}
self.print_queue = []
self.connected = False
self.player_states = {}
self.refreshPlayerList()
if self._connect:
self.connect()
loop = GLib.MainLoop()
try:
loop.run()
except KeyboardInterrupt:
print("interrupt received, stopping…")
def connect(self):
self._session_bus.add_signal_receiver(self.onOwnerChangedName, 'NameOwnerChanged')
self._session_bus.add_signal_receiver(self.onChangedProperties, 'PropertiesChanged',
path = '/org/mpris/MediaPlayer2',
sender_keyword='sender')
def onChangedProperties(self, interface, properties, signature, sender = None):
if sender in self.players:
player = self.players[sender]
# If we know this player, but haven't been able to set up a signal handler
if 'properties_changed' not in player._signals:
# Then trigger the signal handler manually
player.onPropertiesChanged(interface, properties, signature)
else:
# If we don't know this player, get its name and add it
bus_name = self.getBusNameFromOwner(sender)
if bus_name is None:
return
self.addPlayer(bus_name, sender)
player = self.players[sender]
player.onPropertiesChanged(interface, properties, signature)
def onOwnerChangedName(self, bus_name, old_owner, new_owner):
if self.busNameIsAPlayer(bus_name):
if new_owner and not old_owner:
self.addPlayer(bus_name, new_owner)
elif old_owner and not new_owner:
self.removePlayer(old_owner)
else:
self.changePlayerOwner(bus_name, old_owner, new_owner)
def getBusNameFromOwner(self, owner):
player_bus_names = [ bus_name for bus_name in self._session_bus.list_names() if self.busNameIsAPlayer(bus_name) ]
for player_bus_name in player_bus_names:
player_bus_owner = self._session_bus.get_name_owner(player_bus_name)
if owner == player_bus_owner:
return player_bus_name
def busNameIsAPlayer(self, bus_name):
if bus_name.startswith('org.mpris.MediaPlayer2') is False:
return False
name = bus_name.split('.')[3]
if self.block_mode is True:
return name not in self.filter_list
return name in self.filter_list
def refreshPlayerList(self):
player_bus_names = [ bus_name for bus_name in self._session_bus.list_names() if self.busNameIsAPlayer(bus_name) ]
for player_bus_name in player_bus_names:
self.addPlayer(player_bus_name)
if self.connected != True:
self.connected = True
self.printQueue()
def addPlayer(self, bus_name, owner = None):
player = Player(self._session_bus, bus_name, owner = owner, connect = self._connect, _print = self.print)
self.players[player.owner] = player
def removePlayer(self, owner):
if owner in self.players:
self.players[owner].disconnect()
del self.players[owner]
# If there are no more players, clear the output
if len(self.players) == 0:
_printFlush(ICON_NONE)
# Else, print the output of the next active player
else:
players = self.getSortedPlayerOwnerList()
if len(players) > 0:
self.players[players[0]].printStatus()
def changePlayerOwner(self, bus_name, old_owner, new_owner):
player = Player(self._session_bus, bus_name, owner = new_owner, connect = self._connect, _print = self.print)
self.players[new_owner] = player
del self.players[old_owner]
# Get a list of player owners sorted by current status and age
def getSortedPlayerOwnerList(self):
players = [
{
'number': int(owner.split('.')[-1]),
'status': 2 if player.status == 'playing' else 1 if player.status == 'paused' else 0,
'owner': owner
}
for owner, player in self.players.items()
]
return [ info['owner'] for info in reversed(sorted(players, key=itemgetter('status', 'number'))) ]
# Get latest player that's currently playing
def getCurrentPlayer(self):
playing_players = [
player_owner for player_owner in self.getSortedPlayerOwnerList()
if
self.players[player_owner].status == 'playing' or
self.players[player_owner].status == 'paused'
]
return self.players[playing_players[0]] if playing_players else None
def print(self, status, player):
self.player_states[player.bus_name] = status
if self.connected:
current_player = self.getCurrentPlayer()
if current_player != None:
_printFlush(self.player_states[current_player.bus_name])
else:
_printFlush(ICON_STOPPED)
else:
self.print_queue.append([status, player])
def printQueue(self):
for args in self.print_queue:
self.print(args[0], args[1])
self.print_queue.clear()
class Player:
def __init__(self, session_bus, bus_name, owner = None, connect = True, _print = None):
self._session_bus = session_bus
self.bus_name = bus_name
self._disconnecting = False
self.__print = _print
self.metadata = {
'artist' : '',
'album' : '',
'title' : '',
'track' : 0
}
self._rate = 1.
self._positionAtLastUpdate = 0.
self._timeAtLastUpdate = time.time()
self._positionTimerRunning = False
self._metadata = None
self.status = 'stopped'
self.icon = ICON_NONE
self.icon_reversed = ICON_PLAYING
if owner is not None:
self.owner = owner
else:
self.owner = self._session_bus.get_name_owner(bus_name)
self._obj = self._session_bus.get_object(self.bus_name, '/org/mpris/MediaPlayer2')
self._properties_interface = dbus.Interface(self._obj, dbus_interface='org.freedesktop.DBus.Properties')
self._introspect_interface = dbus.Interface(self._obj, dbus_interface='org.freedesktop.DBus.Introspectable')
self._media_interface = dbus.Interface(self._obj, dbus_interface='org.mpris.MediaPlayer2')
self._player_interface = dbus.Interface(self._obj, dbus_interface='org.mpris.MediaPlayer2.Player')
self._introspect = self._introspect_interface.get_dbus_method('Introspect', dbus_interface=None)
self._getProperty = self._properties_interface.get_dbus_method('Get', dbus_interface=None)
self._playerPlay = self._player_interface.get_dbus_method('Play', dbus_interface=None)
self._playerPause = self._player_interface.get_dbus_method('Pause', dbus_interface=None)
self._playerPlayPause = self._player_interface.get_dbus_method('PlayPause', dbus_interface=None)
self._playerStop = self._player_interface.get_dbus_method('Stop', dbus_interface=None)
self._playerPrevious = self._player_interface.get_dbus_method('Previous', dbus_interface=None)
self._playerNext = self._player_interface.get_dbus_method('Next', dbus_interface=None)
self._playerRaise = self._media_interface.get_dbus_method('Raise', dbus_interface=None)
self._signals = {}
self.refreshPosition()
self.refreshStatus()
self.refreshMetadata()
if connect:
self.printStatus()
self.connect()
def play(self):
self._playerPlay()
def pause(self):
self._playerPause()
def playpause(self):
self._playerPlayPause()
def stop(self):
self._playerStop()
def previous(self):
self._playerPrevious()
def next(self):
self._playerNext()
def raisePlayer(self):
self._playerRaise()
def connect(self):
if self._disconnecting is not True:
introspect_xml = self._introspect(self.bus_name, '/')
if 'TrackMetadataChanged' in introspect_xml:
self._signals['track_metadata_changed'] = self._session_bus.add_signal_receiver(self.onMetadataChanged, 'TrackMetadataChanged', self.bus_name)
self._signals['seeked'] = self._player_interface.connect_to_signal('Seeked', self.onSeeked)
self._signals['properties_changed'] = self._properties_interface.connect_to_signal('PropertiesChanged', self.onPropertiesChanged)
def disconnect(self):
self._disconnecting = True
for signal_name, signal_handler in list(self._signals.items()):
signal_handler.remove()
del self._signals[signal_name]
def refreshStatus(self):
# Some clients (VLC) will momentarily create a new player before removing it again
# so we can't be sure the interface still exists
try:
self.status = str(self._getProperty('org.mpris.MediaPlayer2.Player', 'PlaybackStatus')).lower()
self.updateIcon()
self.checkPositionTimer()
except dbus.exceptions.DBusException:
self.disconnect()
def refreshMetadata(self):
# Some clients (VLC) will momentarily create a new player before removing it again
# so we can't be sure the interface still exists
try:
self._metadata = self._getProperty('org.mpris.MediaPlayer2.Player', 'Metadata')
self._parseMetadata()
except dbus.exceptions.DBusException:
self.disconnect()
def updateIcon(self):
self.icon = (
ICON_PLAYING if self.status == 'playing' else
ICON_PAUSED if self.status == 'paused' else
ICON_STOPPED if self.status == 'stopped' else
ICON_NONE
)
self.icon_reversed = (
ICON_PAUSED if self.status == 'playing' else
ICON_PLAYING
)
def _print(self, status):
self.__print(status, self)
def _parseMetadata(self):
if self._metadata != None:
# Obtain properties from _metadata
_artist = _getProperty(self._metadata, 'xesam:artist', [''])
_album = _getProperty(self._metadata, 'xesam:album', '')
_title = _getProperty(self._metadata, 'xesam:title', '')
_track = _getProperty(self._metadata, 'xesam:trackNumber', '')
_genre = _getProperty(self._metadata, 'xesam:genre', [''])
_disc = _getProperty(self._metadata, 'xesam:discNumber', '')
_length = _getProperty(self._metadata, 'xesam:length', 0) or _getProperty(self._metadata, 'mpris:length', 0)
_length_int = _length if type(_length) is int else int(float(_length))
_fmt_length = ( # Formats using h:mm:ss if length > 1 hour, else m:ss
f'{_length_int/1e6//60:.0f}:{_length_int/1e6%60:02.0f}'
if _length_int < 3600*1e6 else
f'{_length_int/1e6//3600:.0f}:{_length_int/1e6%3600//60:02.0f}:{_length_int/1e6%60:02.0f}'
)
_date = _getProperty(self._metadata, 'xesam:contentCreated', '')
_year = _date[0:4] if len(_date) else ''
_url = _getProperty(self._metadata, 'xesam:url', '')
_cover = _getProperty(self._metadata, 'xesam:artUrl', '') or _getProperty(self._metadata, 'mpris:artUrl', '')
_duration = _getDuration(_length_int)
# Update metadata
self.metadata['artist'] = re.sub(SAFE_TAG_REGEX, """\1\1""", _metadataGetFirstItem(_artist))
self.metadata['album'] = re.sub(SAFE_TAG_REGEX, """\1\1""", _metadataGetFirstItem(_album))
self.metadata['title'] = re.sub(SAFE_TAG_REGEX, """\1\1""", _metadataGetFirstItem(_title))
self.metadata['track'] = _track
self.metadata['genre'] = re.sub(SAFE_TAG_REGEX, """\1\1""", _metadataGetFirstItem(_genre))
self.metadata['disc'] = _disc
self.metadata['date'] = re.sub(SAFE_TAG_REGEX, """\1\1""", _date)
self.metadata['year'] = re.sub(SAFE_TAG_REGEX, """\1\1""", _year)
self.metadata['url'] = _url
self.metadata['filename'] = os.path.basename(_url)
self.metadata['length'] = _length_int
self.metadata['fmt-length'] = _fmt_length
self.metadata['cover'] = re.sub(SAFE_TAG_REGEX, """\1\1""", _metadataGetFirstItem(_cover))
self.metadata['duration'] = _duration
def onMetadataChanged(self, track_id, metadata):
self.refreshMetadata()
self.printStatus()
def onPropertiesChanged(self, interface, properties, signature):
updated = False
if dbus.String('Metadata') in properties:
_metadata = properties[dbus.String('Metadata')]
if _metadata != self._metadata:
self._metadata = _metadata
self._parseMetadata()
updated = True
if dbus.String('PlaybackStatus') in properties:
status = str(properties[dbus.String('PlaybackStatus')]).lower()
if status != self.status:
self.status = status
self.checkPositionTimer()
self.updateIcon()
updated = True
if dbus.String('Rate') in properties and dbus.String('PlaybackStatus') not in properties:
self.refreshStatus()
if NEEDS_POSITION and dbus.String('Rate') in properties:
rate = properties[dbus.String('Rate')]
if rate != self._rate:
self._rate = rate
self.refreshPosition()
if updated:
self.refreshPosition()
self.printStatus()
def checkPositionTimer(self):
if NEEDS_POSITION and self.status == 'playing' and not self._positionTimerRunning:
self._positionTimerRunning = True
GLib.timeout_add_seconds(1, self._positionTimer)
def onSeeked(self, position):
self.refreshPosition()
self.printStatus()
def _positionTimer(self):
self.printStatus()
self._positionTimerRunning = self.status == 'playing'
return self._positionTimerRunning
def refreshPosition(self):
try:
time_us = self._getProperty('org.mpris.MediaPlayer2.Player', 'Position')
except dbus.exceptions.DBusException:
time_us = 0
self._timeAtLastUpdate = time.time()
self._positionAtLastUpdate = time_us / 1000000
def _getPosition(self):
if self.status == 'playing':
return self._positionAtLastUpdate + self._rate * (time.time() - self._timeAtLastUpdate)
else:
return self._positionAtLastUpdate
def _statusReplace(self, match, metadata):
tag = match.group('tag')
format = match.group('format')
formatlen = match.group('formatlen')
text = match.group('text')
tag_found = False
reversed_tag = False
if tag.startswith('-'):
tag = tag[1:]
reversed_tag = True
if format is None:
tag_is_format_match = re.match(FORMAT_TAG_REGEX, tag)
if tag_is_format_match:
format = tag_is_format_match.group('format')
formatlen = tag_is_format_match.group('formatlen')
tag_found = True
if format is not None:
text = text.format_map(CleanSafeDict(**metadata))
if format == 'w':
formatlen = int(formatlen)
text = text[:formatlen]
elif format == 't':
formatlen = int(formatlen)
if len(text) > formatlen:
text = text[:max(formatlen - len(TRUNCATE_STRING), 0)] + TRUNCATE_STRING
if tag_found is False and tag in metadata and len(metadata[tag]):
tag_found = True
if reversed_tag:
tag_found = not tag_found
if tag_found:
return text
else:
return ''
def printStatus(self):
if self.status in [ 'playing', 'paused' ]:
metadata = { **self.metadata, 'icon': self.icon, 'icon-reversed': self.icon_reversed }
if NEEDS_POSITION:
metadata['position'] = time.strftime("%M:%S", time.gmtime(self._getPosition()))
# replace metadata tags in text
text = re.sub(FORMAT_REGEX, lambda match: self._statusReplace(match, metadata), FORMAT_STRING)
# restore polybar tag formatting and replace any remaining metadata tags after that
try:
text = re.sub(r'􏿿p􏿿(.*?)􏿿p􏿿(.*?)􏿿p􏿿(.*?)􏿿p􏿿', r'%{\1}\2%{\3}', text.format_map(CleanSafeDict(**metadata)))
except:
print("Invalid format string")
self._print(text)
else:
self._print(ICON_STOPPED)
def _dbusValueToPython(value):
if isinstance(value, dbus.Dictionary):
return {_dbusValueToPython(key): _dbusValueToPython(value) for key, value in value.items()}
elif isinstance(value, dbus.Array):
return [ _dbusValueToPython(item) for item in value ]
elif isinstance(value, dbus.Boolean):
return int(value) == 1
elif (
isinstance(value, dbus.Byte) or
isinstance(value, dbus.Int16) or
isinstance(value, dbus.UInt16) or
isinstance(value, dbus.Int32) or
isinstance(value, dbus.UInt32) or
isinstance(value, dbus.Int64) or
isinstance(value, dbus.UInt64)
):
return int(value)
elif isinstance(value, dbus.Double):
return float(value)
elif (
isinstance(value, dbus.ObjectPath) or
isinstance(value, dbus.Signature) or
isinstance(value, dbus.String)
):
return unquote(str(value))
def _getProperty(properties, property, default = None):
value = default
if not isinstance(property, dbus.String):
property = dbus.String(property)
if property in properties:
value = properties[property]
return _dbusValueToPython(value)
else:
return value
def _getDuration(t: int):
seconds = t / 1000000
return time.strftime("%M:%S", time.gmtime(seconds))
def _metadataGetFirstItem(_value):
if type(_value) is list:
# Returns the string representation of the first item on _value if it has at least one item.
# Returns an empty string if _value is empty.
return str(_value[0]) if len(_value) else ''
else:
# If _value isn't a list just return the string representation of _value.
return str(_value)
class CleanSafeDict(dict):
def __missing__(self, key):
return '{{{}}}'.format(key)
"""
Seems to assure print() actually prints when no terminal is connected
"""
_last_status = ''
def _printFlush(status, **kwargs):
global _last_status
if status != _last_status:
print(status, **kwargs)
sys.stdout.flush()
_last_status = status
parser = argparse.ArgumentParser()
parser.add_argument('command', help="send the given command to the active player",
choices=[ 'play', 'pause', 'play-pause', 'stop', 'previous', 'next', 'status', 'list', 'current', 'metadata', 'raise' ],
default=None,
nargs='?')
parser.add_argument('-b', '--blacklist', help="ignore a player by it's bus name. Can be given multiple times (e.g. -b vlc -b audacious)",
action='append',
metavar="BUS_NAME",
default=[])
parser.add_argument('-w', '--whitelist', help="permit a player by it's bus name like --blacklist. will block --blacklist if given",
action='append',
metavar="BUS_NAME",
default=[])
parser.add_argument('-f', '--format', default='{icon} {:artist:{artist} - :}{:title:{title}:}{:-title:{filename}:}')
parser.add_argument('--truncate-text', default='')
parser.add_argument('--icon-playing', default='')
parser.add_argument('--icon-paused', default='')
parser.add_argument('--icon-stopped', default='')
parser.add_argument('--icon-none', default='')
args = parser.parse_args()
FORMAT_STRING = re.sub(r'%\{(.*?)\}(.*?)%\{(.*?)\}', r'􏿿p􏿿\1􏿿p􏿿\2􏿿p􏿿\3􏿿p􏿿', args.format)
NEEDS_POSITION = "{position}" in FORMAT_STRING
TRUNCATE_STRING = args.truncate_text
ICON_PLAYING = args.icon_playing
ICON_PAUSED = args.icon_paused
ICON_STOPPED = args.icon_stopped
ICON_NONE = args.icon_none
block_mode = len(args.whitelist) == 0
filter_list = args.blacklist if block_mode else args.whitelist
if args.command is None:
PlayerManager(filter_list = filter_list, block_mode = block_mode)
else:
player_manager = PlayerManager(filter_list = filter_list, block_mode = block_mode, connect = False)
current_player = player_manager.getCurrentPlayer()
if args.command == 'play' and current_player:
current_player.play()
elif args.command == 'pause' and current_player:
current_player.pause()
elif args.command == 'play-pause' and current_player:
current_player.playpause()
elif args.command == 'stop' and current_player:
current_player.stop()
elif args.command == 'previous' and current_player:
current_player.previous()
elif args.command == 'next' and current_player:
current_player.next()
elif args.command == 'status' and current_player:
current_player.printStatus()
elif args.command == 'list':
print("\n".join(sorted([
"{} : {}".format(player.bus_name.split('.')[3], player.status)
for player in player_manager.players.values() ])))
elif args.command == 'current' and current_player:
print("{} : {}".format(current_player.bus_name.split('.')[3], current_player.status))
elif args.command == 'metadata' and current_player:
print(_dbusValueToPython(current_player._metadata))
elif args.command == 'raise' and current_player:
current_player.raisePlayer()

View File

@ -1,3 +1,3 @@
#!/bin/sh #!/bin/sh
source $(dirname $0)/../.env
echo "%{F$MOCHA_MAUVE}%{F$MOCHA_TEXT} " $(uptime --pretty | sed 's/up //') echo "%{F#77dd77}%{F#ddd} " $(uptime --pretty | sed 's/up //')

View File

@ -1,6 +1,5 @@
#!/bin/sh #!/bin/sh
source $(dirname $0)/../.env
# Dependencies : jq ; udisks2 # Dependencies : jq ; udisks2
# Some updates by Quentin Duchemin on 18/03/07 # Some updates by Quentin Duchemin on 18/03/07
# - Add label in lsblk selection # - Add label in lsblk selection
@ -42,7 +41,7 @@ usb_print() {
output="$output$space$mounted" output="$output$space$mounted"
done done
echo "%{F$MOCHA_TEXT}$output" echo "%{F#ddd}$output"
} }
usb_update() { usb_update() {

View File

@ -1,17 +1,15 @@
#!/bin/sh #!/bin/sh
# Wait for connection
sleep 5 connect=$(ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` &> /dev/null)
source $(dirname $0)/../.env
connect=$(ping -q -w 1 -c 1 8.8.8.8 &> /dev/null)
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
updates_arch=$(/usr/bin/checkupdates | wc -l) updates_arch=$(/usr/bin/checkupdates | wc -l)
# a restricts to AUR packages # a restricts to AUR packages
updates_aur=$(yay -Qua | wc -l) updates_aur=$(yay -Qua | wc -l)
updates=$(("$updates_arch" + "$updates_aur")) updates=$(("$updates_arch" + "$updates_aur"))
if [ "$updates" -gt 0 ]; then if [ "$updates" -gt 0 ]; then
echo "%{F$MOCHA_MAUVE}%{F$MOCHA_TEXT} $updates_arch | $updates_aur" echo "%{F#dd7777}%{F#ddd} $updates_arch | $updates_aur"
else else
echo "%{F$MOCHA_GREEN}%{F$MOCHA_TEXT} 0" echo "%{F#77dd77}%{F#ddd} 0"
fi fi
else else
echo "%{F#77dd77}%{F#ddd} Offline" echo "%{F#77dd77}%{F#ddd} Offline"

View File

@ -1,3 +0,0 @@
@realtime - rtprio 99
@realtime - memlock unlimited
@realtime - nice unlimited

View File

@ -1 +0,0 @@
/etc/security/limits.d

View File

@ -1,14 +0,0 @@
[redshift]
temp-day=5700
temp-night=3500
brightness=1.0
gamma=0.8
; Brutal
fade=0
location-provider=manual
; This is Compiegne
[manual]
lat=49.41794
lon=2.82606

View File

@ -1,112 +0,0 @@
* {
bg-col: #1e1e2e;
bg-col-light: #1e1e2e;
border-col: #1e1e2e;
selected-col: #1e1e2e;
blue: #89b4fa;
fg-col: #cdd6f4;
fg-col2: #f38ba8;
grey: #6c7086;
width: 600;
font: "JetBrainsMono Nerd Font 14";
}
element-text, element-icon , mode-switcher {
background-color: inherit;
text-color: inherit;
}
window {
height: 360px;
border: 3px;
border-color: @border-col;
background-color: @bg-col;
}
mainbox {
background-color: @bg-col;
}
inputbar {
children: [prompt,entry];
background-color: @bg-col;
border-radius: 5px;
padding: 2px;
}
prompt {
background-color: @blue;
padding: 6px;
text-color: @bg-col;
border-radius: 3px;
margin: 20px 0px 0px 20px;
}
textbox-prompt-colon {
expand: false;
str: ":";
}
entry {
padding: 6px;
margin: 20px 0px 0px 10px;
text-color: @fg-col;
background-color: @bg-col;
}
listview {
border: 0px 0px 0px;
padding: 6px 0px 0px;
margin: 10px 0px 0px 20px;
columns: 2;
lines: 5;
background-color: @bg-col;
}
element {
padding: 5px;
background-color: @bg-col;
text-color: @fg-col ;
}
element-icon {
size: 25px;
}
element selected {
background-color: @selected-col ;
text-color: @fg-col2 ;
}
mode-switcher {
spacing: 0;
}
button {
padding: 10px;
background-color: @bg-col-light;
text-color: @grey;
vertical-align: 0.5;
horizontal-align: 0.5;
}
button selected {
background-color: @bg-col;
text-color: @blue;
}
message {
background-color: @bg-col-light;
margin: 2px;
padding: 2px;
border-radius: 5px;
}
textbox {
padding: 6px;
margin: 20px 0px 0px 20px;
text-color: @blue;
background-color: @bg-col-light;
}

View File

@ -1,18 +0,0 @@
configuration{
modi: "run,drun,window";
icon-theme: "JetBrainsMono Nerd Font";
show-icons: true;
terminal: "terminator";
drun-display-format: "{icon} {name}";
location: 0;
disable-history: false;
hide-scrollbar: true;
display-drun: "  Apps ";
display-run: "  Run ";
display-window: "  Window";
display-Network: " 󰤨 Network";
sidebar-mode: true;
}
@theme "catppuccin-mocha"

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,131 @@
/**
* User: deadguy
* Copyright: deadguy
*/
configuration {
display-drun: "Activate";
display-run: "Execute";
display-window: "Window";
show-icons: true;
sidebar-mode: true;
}
* {
background-color: #080808;
text-color: #d3d7cf;
selbg: #215d9c;
actbg: #262626;
urgbg: #e53935;
winbg: #26c6da;
selected-normal-foreground: @winbg;
normal-foreground: @text-color;
selected-normal-background: @actbg;
normal-background: @background-color;
selected-urgent-foreground: @background-color;
urgent-foreground: @text-color;
selected-urgent-background: @urgbg;
urgent-background: @background-color;
selected-active-foreground: @winbg;
active-foreground: @text-color;
selected-active-background: @actbg;
active-background: @selbg;
line-margin: 2;
line-padding: 2;
separator-style: "none";
hide-scrollbar: "true";
margin: 0;
padding: 0;
}
window {
location: west;
anchor: west;
height: 100%;
width: 22%;
orientation: horizontal;
children: [mainbox];
}
mainbox {
spacing: 0.8em;
children: [ entry,listview,sidebar ];
}
button { padding: 15px 5px; }
button selected {
background-color: @active-background;
text-color: @background-color;
}
inputbar {
padding: 5px;
spacing: 5px;
}
listview {
spacing: 0.5em;
dynamic: false;
cycle: true;
}
element { padding: 10px; }
entry {
expand: false;
text-color: @normal-foreground;
vertical-align: 1;
padding: 5px;
}
element normal.normal {
background-color: @normal-background;
text-color: @normal-foreground;
}
element normal.urgent {
background-color: @urgent-background;
text-color: @urgent-foreground;
}
element normal.active {
background-color: @active-background;
text-color: @active-foreground;
}
element selected.normal {
background-color: @selected-normal-background;
text-color: @selected-normal-foreground;
border: 0 5px solid 0 0;
border-color: @active-background;
}
element selected.urgent {
background-color: @selected-urgent-background;
text-color: @selected-urgent-foreground;
}
element selected.active {
background-color: @selected-active-background;
text-color: @selected-active-foreground;
}
element alternate.normal {
background-color: @normal-background;
text-color: @normal-foreground;
}
element alternate.urgent {
background-color: @urgent-background;
text-color: @urgent-foreground;
}
element alternate.active {
background-color: @active-background;
text-color: @active-foreground;
}

View File

@ -1,7 +0,0 @@
# Instead of "typing" the character, which does not
# works in some apps, paste through the clipboard
# and restore previous content. Works better
# in most cases, use alt+t instead to use
# defaut behaviour.
action = clipboard
skin-tone = neutral

View File

@ -0,0 +1,11 @@
[Unit]
Description=Back up chosty's documents
OnFailure=notify-backup-failure.service
[Service]
Type=oneshot
# Cannot use -a as FAT32 does not support permission. Also don't use -g and -l (FAT32 does not support groups and symlinks)
# Do not use full path and relax timestamp, otherwise all files are copied over
# For some reason, exclude should be relative path (cf man), but this does not work for the first command. Dunno why
ExecStart=/usr/bin/rsync -vCRErtm --delete --delete-excluded --modify-window=10 --include="/home/chosty/.config" --exclude="/home/chosty/.*" --exclude="/home/chosty/aur" --exclude="/home/chosty/git" /home/chosty /mnt/backup/Linux
ExecStart=/usr/bin/rsync -vCErtm --delete --delete-excluded --modify-window=10 --exclude="/Documents/Jeux" /mnt/data/Documents /mnt/data/Images /mnt/data/Vidéos /mnt/backup/Data/

View File

@ -0,0 +1,9 @@
[Unit]
Description=Run backup daily
[Timer]
OnCalendar=weekly
Persistent=true
[Install]
WantedBy=timers.target

View File

@ -2,10 +2,8 @@
borderless = True borderless = True
use_custom_url_handler = True use_custom_url_handler = True
custom_url_handler = firefox custom_url_handler = firefox
enabled_plugins = ActivityWatch, InactivityWatch, LaunchpadBugURLHandler, LaunchpadCodeURLHandler, APTURLHandler, TerminalShot, TerminatorThemes enabled_plugins = TerminalShot, LaunchpadCodeURLHandler, APTURLHandler, LaunchpadBugURLHandler
ask_before_closing = never suppress_multiple_term_dialog = True
always_split_with_profile = True
putty_paste_style_source_clipboard = True
[keybindings] [keybindings]
go_next = <Primary><Shift>n go_next = <Primary><Shift>n
go_prev = <Primary><Shift>p go_prev = <Primary><Shift>p
@ -27,35 +25,12 @@
[profiles] [profiles]
[[default]] [[default]]
icon_bell = False icon_bell = False
background_color = "#282828" background_darkness = 0.87
background_darkness = 1.0
cursor_fg_color = "#000000"
cursor_bg_color = "#aaaaaa"
font = DejaVu Sans Mono 11
foreground_color = "#ebdbb2"
scrollbar_position = hidden
scrollback_infinite = True
use_system_font = False
use_theme_colors = True
bold_is_bright = True
title_transmit_fg_color = "#000000"
title_transmit_bg_color = "#ffffff"
[[Catppuccin_Mocha]]
icon_bell = False
background_color = "#282828"
background_darkness = 0.7
background_type = transparent background_type = transparent
cursor_fg_color = "#000000" font = DejaVu Sans Mono 11
cursor_bg_color = "#f5e0dc"
font = MesloLGM Nerd Font 11
foreground_color = "#ebdbb2"
show_titlebar = False
scrollbar_position = hidden scrollbar_position = hidden
scrollback_infinite = True scrollback_infinite = True
palette = "#45475a:#f38ba8:#a6e3a1:#f9e2af:#89b4fa:#f5c2e7:#94e2d5:#bac2de:#585b70:#f38ba8:#a6e3a1:#f9e2af:#89b4fa:#f5c2e7:#94e2d5:#a6adc8"
use_system_font = False use_system_font = False
bold_is_bright = True
title_hide_sizetext = True
title_transmit_fg_color = "#000000" title_transmit_fg_color = "#000000"
title_transmit_bg_color = "#ffffff" title_transmit_bg_color = "#ffffff"
[layouts] [layouts]
@ -73,6 +48,6 @@
type = Terminal type = Terminal
parent = child0 parent = child0
order = 0 order = 0
profile = Catppuccin_Mocha profile = default
uuid = 498cd758-0193-4b69-b40a-9743e0b080a7 uuid = 498cd758-0193-4b69-b40a-9743e0b080a7
[plugins] [plugins]

View File

@ -1,136 +0,0 @@
{
"$schema": "https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/main/themes/schema.json",
"palette": {
"ahead": "#54433a",
"blue": "#8aadf4",
"darktext": "#6e738d",
"green": "#a6da95",
"grey": "#e4e4e4",
"lavender": "#b7bdf8",
"maroon": "#ee99a0",
"mauve": "#c6a0f6",
"text": "#ffffff"
},
"blocks": [
{
"type": "prompt",
"alignment": "left",
"segments": [
{
"properties": {
"alpine": "\uf300",
"arch": "\uf303",
"centos": "\uf304",
"debian": "\uf306",
"elementary": "\uf309",
"fedora": "\uf30a",
"gentoo": "\uf30d",
"linux": "\ue712",
"macos": "\ue711",
"manjaro": "\uf312",
"mint": "\uf30f",
"opensuse": "\uf314",
"raspbian": "\uf315",
"ubuntu": "\uf31c",
"windows": "\ue70f"
},
"style": "diamond",
"leading_diamond": "\u256d\u2500\ue0b2",
"template": " {{ .Icon }} ",
"foreground": "p:text",
"background": "p:mauve",
"type": "os"
},
{
"style": "powerline",
"template": " {{ .UserName }} ",
"foreground": "p:darktext",
"powerline_symbol": "\ue0b0",
"background": "p:grey",
"type": "session"
},
{
"properties": {
"folder_icon": "\u2026",
"folder_separator_icon": " <transparent>\ue0b1</> ",
"max_depth": 3,
"style": "agnoster_short"
},
"style": "powerline",
"template": " {{ .Path }} ",
"foreground": "p:text",
"powerline_symbol": "\ue0b0",
"background": "p:blue",
"type": "path"
},
{
"properties": {
"branch_gone_icon": "\ueab8",
"branch_icon": "\uf418 ",
"branch_identical_icon": "\uf444",
"branch_max_length": 25,
"fetch_stash_count": true,
"fetch_status": true
},
"style": "diamond",
"leading_diamond": "<transparent,background>\ue0b0</>",
"trailing_diamond": "\ue0b0",
"template": " {{ .HEAD }}{{if .BranchStatus }} {{ .BranchStatus }}{{ end }}{{ if .Working.Changed }} <transparent>\ue0b1</> <#121318>\uf044 {{ .Working.String }}</>{{ end }}{{ if .Staging.Changed }} <transparent>\ue0b1</> <#121318>\uf046 {{ .Staging.String }}</>{{ end }}{{ if gt .StashCount 0 }} <transparent>\ue0b1</> <#121318>\ueb4b {{ .StashCount }}</>{{ end }} ",
"foreground": "p:text",
"background": "p:green",
"type": "git",
"background_templates": [
"{{ if or (.Working.Changed) (.Staging.Changed) }}p:maroon{{ end }}"
]
}
],
"newline": true
},
{
"type": "prompt",
"alignment": "right",
"segments": [
{
"properties": {
"always_enabled": true,
"style": "austin"
},
"style": "powerline",
"template": " \ueba2 {{ .FormattedMs }} ",
"foreground": "p:darktext",
"powerline_symbol": "\ue0b2",
"background": "p:grey",
"type": "executiontime",
"invert_powerline": true
},
{
"properties": {
"time_format": "15:04:05"
},
"style": "diamond",
"trailing_diamond": "\ue0b0",
"template": " \uf073 {{ .CurrentDate | date .Format }} ",
"foreground": "p:text",
"background": "p:mauve",
"type": "time",
"invert_powerline": true
}
]
},
{
"type": "prompt",
"alignment": "left",
"segments": [
{
"style": "plain",
"template": "\u2570\u2500 {{ if .Root }}#{{else}}${{end}}",
"foreground": "p:mauve",
"type": "text"
}
],
"newline": true
}
],
"version": 3,
"final_space": true
}

View File

@ -1 +0,0 @@
ACTION=="add", SUBSYSTEM=="backlight", RUN+="/bin/chgrp video $sys$devpath/brightness", RUN+="/bin/chmod g+w $sys$devpath/brightness"

View File

@ -1 +0,0 @@
/etc/udev/rules.d

View File

@ -0,0 +1 @@
/etc/systemd/system/updatedb.timer.d/

View File

@ -5,11 +5,11 @@
# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an # homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an
# absolute path. No other format is supported. # absolute path. No other format is supported.
# #
XDG_DESKTOP_DIR="$HOME/" XDG_DESKTOP_DIR="$HOME/documents/xdg/desktop"
XDG_DOWNLOAD_DIR="$HOME/downloads" XDG_DOWNLOAD_DIR="$HOME/downloads"
XDG_TEMPLATES_DIR="$HOME/" XDG_TEMPLATES_DIR="$HOME/documents/xdg/templates"
XDG_PUBLICSHARE_DIR="$HOME/" XDG_PUBLICSHARE_DIR="$HOME/documents/xdg/public"
XDG_DOCUMENTS_DIR="$HOME/documents" XDG_DOCUMENTS_DIR="$HOME/documents"
XDG_MUSIC_DIR="$HOME/" XDG_MUSIC_DIR="$HOME/music"
XDG_PICTURES_DIR="$HOME/images" XDG_PICTURES_DIR="$HOME/images"
XDG_VIDEOS_DIR="$HOME/videos" XDG_VIDEOS_DIR="$HOME/videos"

13
.env
View File

@ -1,13 +0,0 @@
export SCENARI_SSH_USER='qduchemin'
export SCENARI_SSH_KEY_PATH="/home/.ssh/id_gpg.pub"
export PICASOFT_SSH_USER='qduchemi'
export PICASOFT_SSH_KEY_PATH='/home/.ssh/id_gpg.pub'
export PATH="$PATH:/home/go/bin:/usr/local/.local/bin:~/node_modules/.bin"
# trash-cli supports top-level trash (see https://specifications.freedesktop.org/trash-spec/trashspec-latest.html)
# gio, which is otherwise used by default, wants to write to ~/.local/share/Trash, which is on my
# system on another partition than user data, so that copying between partitions is denied by gio.
# another solution is to link $XDG_DATA_HOME/Trash somewhere on the same partition as user data
export ELECTRON_TRASH="trash-cli"
export ZSH_COLORIZE_TOOL="pygmentize"
export ZSH_COLORIZE_STYLE="catppuccin-macchiato"
export LESSOPEN="|lesspipe.sh %s"

View File

@ -1,26 +0,0 @@
[core]
pager = delta
[interactive]
diffFilter = delta --color-only
[delta]
navigate = true # use n and N to move between diff sections
side-by-side = true
hyperlinks = true
hyperlinks-file-link-format = "vscode://file/{path}"
[merge]
conflictstyle = diff3
[diff]
colorMoved = default
[user]
email = quentinduchemin@tuta.io
name = Lilou
[push]
autoSetupRemote = true
[pull]
rebase = true
[init]
defaultBranch = main

View File

@ -1,4 +1 @@
enable-ssh-support enable-ssh-support
default-cache-ttl 3600
max-cache-ttl 7200
pinentry-program /usr/bin/pinentry-gnome3

View File

@ -1,3 +1 @@
8870E499C64EEB7720EBA5A442F4FE90129BFAE3 8870E499C64EEB7720EBA5A442F4FE90129BFAE3
85323D13424DE78C6469205C4A0404C4F8A02243
# End of file

View File

@ -19,10 +19,8 @@ POLYBAR_CONFIG="polybar"
ARCH_PACKAGES="bootstrap" ARCH_PACKAGES="bootstrap"
MERGE_DIRS="${I3_CONFIG} ${POLYBAR_CONFIG} ${ARCH_PACKAGES}" MERGE_DIRS="${I3_CONFIG} ${POLYBAR_CONFIG} ${ARCH_PACKAGES}"
changed_files="$(git --git-dir=$HOME/.cfg/ --work-tree=$HOME diff-tree -r --name-status --no-commit-id HEAD^1 HEAD)"
# Check if a file has been modified and deleted since last commit, if so perform an action # Check if a file has been modified and deleted since last commit, if so perform an action
# $1 : absolute path of the file # $1 : path of file
# $2 : command to launch if file has been created of modifed # $2 : command to launch if file has been created of modifed
# $3 : command to launch if file has been deleted # $3 : command to launch if file has been deleted
function check_copy() { function check_copy() {
@ -31,15 +29,15 @@ function check_copy() {
echo -e "* Running \"$2\"" && eval "$2" echo -e "* Running \"$2\"" && eval "$2"
return return
fi fi
changed_file=`grep "${1#$HOME/}" <<< "${changed_files}"` echo "$changed_files" | grep --quiet "${1#$HOME/}"
if [ ! -z "${changed_file}" ]; then if [ $? == "0" ]; then
if echo "$changed_file" | grep -q -E "^D"; then echo "$changed_files" | cut -f 1 | grep --quiet "D"
if [ $? == "0" ]; then
echo "* $1 has been removed" echo "* $1 has been removed"
echo -e "\t* Running \"$3\"" && eval "$3" echo -e "\t* Running \"$3\"" && eval "$3"
fi else
if echo "$changed_file" | grep -q -E "^(A|M)"; then echo "* Changes detected in $1"
echo "* Changes detected in $(basename $1)" echo -e "* Running \"$2\"" && eval "$2"
echo -e "\t* Running \"$2\"" && eval "$2"
fi fi
else else
echo "$1 not modified, no need to copy" echo "$1 not modified, no need to copy"
@ -50,25 +48,18 @@ function check_copy() {
# with an optional `$1/config.d/$2` file. This is useful for having # with an optional `$1/config.d/$2` file. This is useful for having
# a common base for multiple computer, and per-computer stuff. # a common base for multiple computer, and per-computer stuff.
# $1 : path of the folder # $1 : path of the folder
# $2 : current environment # $2 : optional current environment
# $3 : if defined, prepend $2 instead of appending
function merge_config() { function merge_config() {
echo -e "\n=== Generate ${m} config file ===" echo -e "\n=== Generate ${m} config file ==="
final_path=${CONFIG}/${m}/${FINAL_CONFIG}.${2} rm -f ${CONFIG}/${m}/${FINAL_CONFIG}
rm -f ${final_path}
# Copy common config # Copy common config
cp ${CONFIG}/${m}/${BASE_CONFIG} ${final_path} cp ${CONFIG}/${m}/${BASE_CONFIG} ${CONFIG}/${m}/${FINAL_CONFIG}
echo "${final_path} created" echo "${CONFIG}/${m}/${FINAL_CONFIG} created"
# If there is an override folder, merge given env # If there is an override folder, merge given env
if [ ! -z ${2} ] && [ -d ${CONFIG}/${m}/${MERGE_CONFIG_FOLDER} ]; then if [ ! -z ${2} ] && [ -d ${CONFIG}/${m}/${MERGE_CONFIG_FOLDER} ]; then
for f in `find ${CONFIG}/${m}/config.d -type f -path "*${2}"`; do for f in `find ${CONFIG}/${m}/config.d -type f -path "*${2}"`; do
if [ -z $3 ]; then echo "Found ${f}, add to regular config file"
echo "Found ${f}, append to regular config file" cat "${f}" >> ${CONFIG}/${m}/${FINAL_CONFIG}
echo -e "\n$(cat ${f})\n" >> ${final_path}
else
echo "Found ${f}, prepend to regular config file"
echo -e "\n$(cat ${f})\n$(cat ${final_path})\n" > ${final_path}
fi
done done
fi fi
} }
@ -79,94 +70,30 @@ function usage() {
exit 0 exit 0
} }
function init_system() {
echo -e "* Installing base Arch packages..."
yay -Syu --needed --noconfirm - < ${CONFIG}/${ARCH_PACKAGES}/${FINAL_CONFIG}
echo -e "* Changing shell to ZSH..."
chsh -s $(which zsh)
if [ "$ENV" = "desk" ]; then
echo -e "* Add user to realtime group..."
sudo usermod -aG realtime $(whoami)
fi
# https://man.archlinux.org/man/rofi-dmenu.5
echo -e "* Symlink dmenu → rofi..."
sudo ln -sf /usr/bin/rofi /usr/bin/dmenu
echo -e "* Enabling common systemd units..."
sudo systemctl enable --now systemd-timesyncd
sudo systemctl enable --now cups
sudo systemctl enable --now bluetooth
sudo systemctl enable --now bluetooth-autoconnect
sudo systemctl enable --now updatedb.timer
systemctl --user enable --now pipewire-pulse
systemctl --user enable --now pipewire-pulse.socket
echo -e "* Enable resolvctl..."
sudo systemctl enable --now systemd-resolved
sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
~/.config/bootstrap/init_netctl.sh ${ENV}
echo -e "* Ensure hardware clock is up to date..."
sudo hwclock --systohc
# So that "Open in Terminal" works inc Nemo
echo -e "* Make 'Open Terminal' work in Nemo..."
sudo gsettings set org.cinnamon.desktop.default-applications.terminal exec i3-sensible-terminal
# For screenshots
echo -e "* Install pychee for uploading screenshots on Lychee..."
pip install --break-system-packages pychee
# Additionnal plugins for ZSH
echo -e "* Install ZSH plugins for oh-my-zsh..."
sudo git clone https://github.com/zdharma-continuum/fast-syntax-highlighting.git /usr/share/oh-my-zsh/plugins/fast-syntax-highlighting
sudo git clone https://github.com/zsh-users/zsh-autosuggestions /usr/share/oh-my-zsh/plugins/zsh-autosuggestions
sudo git clone https://github.com/unixorn/fzf-zsh-plugin.git /usr/share/oh-my-zsh/plugins/fzf-zsh-plugin
echo -e "* Install everything we need for Catppuccin themes..."
echo -e "\tFor polybar..."
wget https://raw.githubusercontent.com/catppuccin/polybar/main/themes/macchiato.ini -O ~/.config/polybar/macchiato.ini
echo -e "\tFor zsh..."
sudo mkdir -p /usr/local/share/fsh
sudo wget https://raw.githubusercontent.com/catppuccin/zsh-fsh/main/themes/catppuccin-macchiato.ini -O /usr/local/share/fsh/catppuccin-macchiato.ini
echo -e "\tFor gtk..."
# Change icon color for Papirus Icon Theme
papirus-folders -C cat-latte-flamingo --theme Papirus-Dark
echo -e "\tFor Pygments..."
pip install --break-system-packages 'catppuccin[pygments]'
# Basic directory structure
echo -e "* Create base home directories..."
mkdir -p ~/documents ~/images/screenshots ~/videos ~/downloads
echo -e "* Allow user to control brightness..."
sudo usermod $(whoami) -aG video
echo -e "* Allow user to administrate printers..."
sudo usermod $(whoami) -aG wheel
echo -e "* Install host app for PassFF Firefox extension..."
curl -sSL github.com/passff/passff-host/releases/latest/download/install_host_app.sh | bash -s -- firefox
echo -e "* Set Firefox to be the default browser, probably overwritten by Chromium..."
xdg-settings set default-web-browser firefox.desktop
echo -e "* Ensure keyboard will still be in AZERTY mode when plugged/unplugged..."
# This creates a Xorg configuration file
sudo localectl --no-convert set-x11-keymap fr
echo -e "* Create a symlink rrm → rm (rm will be an alias to rmtrash) in zsh"
echo -e "* Install synchronization extension for VSCode settings and plugins..."
# Avoid to push whole extensions up to hundreds of MB, and avoid using
# Micro$oft proprietary stuff, usable with any git server
vscodium --install-extension zokugun.sync-settings
git clone git@git.chosto.me:Chosto/codium-settings.git ~/.config/codium-settings
echo -e "* Install plugin to pick theme for Terminator..."
# See https://github.com/EliverLara/terminator-themes
mkdir -p $HOME/.config/terminator/plugins
wget https://git.io/v5Zww -O $HOME"/.config/terminator/plugins/terminator-themes.py"
}
# Use XDG_CONFIG_HOME if defined, default otherwise # Use XDG_CONFIG_HOME if defined, default otherwise
CONFIG=${XDG_CONFIG_HOME:-$HOME/.config} CONFIG=${XDG_CONFIG_HOME:-$HOME/.config}
ENV=${1} ENV=${1}
# First thing to do, before symlinks changed_files="$(git --git-dir=$HOME/.cfg/ --work-tree=$HOME diff-tree -r --name-status --no-commit-id HEAD^1 HEAD)"
for m in ${MERGE_DIRS}; do for m in ${MERGE_DIRS}; do
if [ -f "${CONFIG}/${m}/${MERGE_CONFIG_FOLDER}/above" ]; then
merge_config $m ${ENV} true
else
merge_config $m ${ENV} merge_config $m ${ENV}
fi
done done
if [ ! -z "$INIT" ]; then
echo -e "* Installing base Arch packages..."
yay -Syu --needed --noconfirm - < ${CONFIG}/${ARCH_PACKAGES}/${FINAL_CONFIG}
echo -e "* Changing shell to ZSH..."
chsh -s $(which zsh)
# https://man.archlinux.org/man/rofi-dmenu.5
echo -e "* Symlink dmenu → rofi..."
sudo ln -s /usr/bin/rofi /usr/bin/dmenu
echo -e "* Enabling NetworkManager..."
sudo systemctl enable --now NetworkManager
fi
if [ ! -z ${ENV} ]; then
echo -e "\n=== Create symlink to *.${ENV} regular files ===" echo -e "\n=== Create symlink to *.${ENV} regular files ==="
# Take all specific files and create a symlink pointing to it without the extension # Take all specific files and create a symlink pointing to it without the extension
# This file will be used by applications # This file will be used by applications
@ -179,6 +106,7 @@ for f in `find ${HOME} -maxdepth 1 -mindepth 1 -type f -name "*.${ENV}"`; do
echo "${f%.*}${f}" echo "${f%.*}${f}"
ln -sf ${f} ${f%.*} ln -sf ${f} ${f%.*}
done done
fi
echo -e "\n=== Copy changed configuration which resides in outer directory ===" echo -e "\n=== Copy changed configuration which resides in outer directory ==="
# Destination files are regular files # Destination files are regular files
@ -187,34 +115,19 @@ for f in `find ${CONFIG} -type f -name ${DEST_FILENAME}`; do
DEST=`cat ${f}` DEST=`cat ${f}`
# Get all files, either regular files or symlinks, which are not the destination file nor specific desktop/laptop files # Get all files, either regular files or symlinks, which are not the destination file nor specific desktop/laptop files
# This is because if desktop/laptop files exist, they already have a symlink pointing to them at this stage # This is because if desktop/laptop files exist, they already have a symlink pointing to them at this stage
# We want to get the path relative to the directory we are searching in, so subfolders are kept when copying for config_file in `find ${DIR} -regextype emacs -mindepth 1 -type f -not \( -regex "*.${ENV_EXT_REGEXP}" -o -name "${DEST_FILENAME}" \)`; do
for config_file in `find ${DIR} -regextype posix-extended -mindepth 1 \( -type f -o -type l \) -not \( -regex "${ENV_EXT_REGEXP}" -o -name "${DEST_FILENAME}" \) -exec realpath -s --relative-to ${DIR} {} \;`; do
# If we have to copy to a subfolder, extract it
if echo ${config_file} | grep -q '/'; then
subfolder=${config_file%/*}
else
subfolder=''
fi
filename=${config_file##*/}
# Now copy to destination # Now copy to destination
real_dest=${DEST}/${subfolder} sudo mkdir -p ${DEST}
sudo mkdir -p ${real_dest} check_copy "${config_file}" "sudo cp ${config_file} ${DEST}" "sudo rm ${DEST}/${config_file##*/}"
absolute_source=`realpath "${DIR}/${config_file}"`
check_copy "${absolute_source}" "sudo cp ${absolute_source} ${real_dest}" "sudo rm ${real_dest}/${filename}"
done done
done done
if [ ! -z "$INIT" ]; then
init_system
fi
if [ ! -z "${WM_RESTART}" ]; then if [ ! -z "${WM_RESTART}" ]; then
echo -e "\n=== Restart graphical environment ===" echo -e "\n=== Restart graphical environment ==="
# Reload i3 configuration # Reload i3 configuration
i3-msg restart i3-msg reload
# Restart picom due to this bug https://github.com/yshui/picom/issues/166 # Restart picom due to this bug https://github.com/yshui/picom/issues/166
killall picom killall picom; picom &>/dev/null &
picom &>/dev/null &
fi fi

6
.vimrc
View File

@ -1,6 +0,0 @@
vmap <C-c> :<Esc>`>a<CR><Esc>mx`<i<CR><Esc>my'xk$v'y!xclip -selection c<CR>u
map <Insert> :set paste<CR>i<CR><CR><Esc>k:.!xclip -o<CR>JxkJx:set nopaste<CR>
" Reopen the last edited position in files
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
syntax on
filetype on

View File

@ -1,11 +0,0 @@
xrandr --output DVI-I-1 --auto --output HDMI-1 --auto --scale 1x1 --right-of DVI-I-1
xrdb -merge /home/.Xresources
# Propagate environment variables to dbus-daemon, necessary for
# pinentry-gnome3 to properly display without falling
# back to ncurses.
dbus-update-activation-environment DISPLAY XAUTHORITY
WALLPAPER_PATH="/home/.local/share/backgrounds/wallpaper.jpg"
if [ -f ${WALLPAPER_PATH} ]; then
feh --bg-scale ${WALLPAPER_PATH}
fi
exec i3

56
.zshrc
View File

@ -1,6 +1,11 @@
# Path to your oh-my-zsh installation. # Path to your oh-my-zsh installation.
export ZSH=/usr/share/oh-my-zsh export ZSH=/usr/share/oh-my-zsh
# Set name of the theme to load. Optionally, if you set this to "random"
# it'll load a random theme each time that oh-my-zsh is loaded.
# See https://github.com/robbyrussell/oh-my-zsh/wiki/Themes
ZSH_THEME="agnoster"
# Uncomment the following line to use case-sensitive completion. # Uncomment the following line to use case-sensitive completion.
CASE_SENSITIVE="true" CASE_SENSITIVE="true"
@ -14,10 +19,6 @@ COMPLETION_WAITING_DOTS="true"
# stamp shown in the history command output. # stamp shown in the history command output.
# The optional three formats: "mm/dd/yyyy"|"dd.mm.yyyy"|"yyyy-mm-dd" # The optional three formats: "mm/dd/yyyy"|"dd.mm.yyyy"|"yyyy-mm-dd"
HIST_STAMPS="dd.mm.yyyy" HIST_STAMPS="dd.mm.yyyy"
# Global history search
HISTFILE=~/.zsh_history
HISTSIZE=10000
SAVEHIST=10000
# Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*) # Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*)
# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/ # Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/
@ -26,7 +27,11 @@ SAVEHIST=10000
plugins=( plugins=(
# acs command → print aliases by group # acs command → print aliases by group
aliases aliases
# `j` to go to an already used directory by partial name
autojump
colored-man-pages colored-man-pages
# cat with colors → ccat or cless
colorize
# commands to copy file content or absolute path to clipboard # commands to copy file content or absolute path to clipboard
copyfile copyfile
copypath copypath
@ -36,16 +41,10 @@ plugins=(
docker docker
# unique command for most archives # unique command for most archives
extract extract
# fish-like highlighting as you type
fast-syntax-highlighting
# fuzzy finder for history, files, docker, process, etc (see fzf)
fzf-zsh-plugin
# aliases # aliases
git git
# password-store autocomplete # password-store autocomplete
pass pass
# fish-like completion as you type
zsh-autosuggestions
) )
# Enable option stacking in autocomplete, i.e. docker run -it <TAB> # Enable option stacking in autocomplete, i.e. docker run -it <TAB>
@ -55,41 +54,20 @@ zstyle ':completion:*:*:docker-*:*' option-stacking yes
# Load ZSH # Load ZSH
source $ZSH/oh-my-zsh.sh source $ZSH/oh-my-zsh.sh
# Use Quick Term prompt theme made for Oh My Posh, in zsh
eval "$(oh-my-posh init zsh --config ~/.config/theme/quick-term.omp.json)"
# Completions for zoxide
eval "$(zoxide init zsh)"
# Completions for scaleway-cli
eval "$(scw autocomplete script shell=zsh)"
# And use Catppuccin Macchiato theme for ZSH fast hightlight plugin (LOCAL means searching in /usr/local/share/fsh)
fast-theme LOCAL:catppuccin-macchiato >/dev/null
# Preferred editor for local and remote sessions # Preferred editor for local and remote sessions
export EDITOR=nvim export EDITOR=vim
# Do not print user@hostname if user is myself # Do not print user@hostname if user is myself
DEFAULT_USER=`whoami` DEFAULT_USER=`whoami`
# Aliases
alias cp="cpv"
alias lt='ls -lath'
# To use when .cfg contains a bare git repo. # To use when .cfg contains a bare git repo.
# See this https://developer.atlassian.com/blog/2016/02/best-way-to-store-dotfiles-git-bare-repo/ # See this https://developer.atlassian.com/blog/2016/02/best-way-to-store-dotfiles-git-bare-repo/
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME' alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
config config --local status.showUntrackedFiles no
# Use GPG key for SSH authentication # GPG with SSH auth capabilities
unset SSH_AGENT_PID export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
if [ "${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]; then
export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)"
fi
export GPG_TTY="$(tty)"
# Source aliases
if [ -f ~/.aliases ]; then
. ~/.aliases
fi
# Source environment variables
if [ -f ~/.env ]; then
. ~/.env
fi

View File

@ -1,10 +1,8 @@
# dotfiles # dotfiles
## Generic TODOs ## Generic todo
* Would be great to have a real people-agnostic base, separated from my own customization. Right now, base configuration still have personal path and stuff, making it unusable as-is for other people. Would be great to have a real people-agnostic base, separated from my own customization. Right now, base configuration still have personal path and stuff, making it unusable as-is for other people.
* Have a command to cancel stuff if case something goes bad, want to restore base system, etc
* Automatically enable systemd units
## What is this, Chosto ? ## What is this, Chosto ?
@ -21,7 +19,6 @@ So basically, what I like about this setup is that there is no "useless" menu ba
In brief this is the classic Arch/i3 combo with : In brief this is the classic Arch/i3 combo with :
* A wonderful theming for most of installed software with [Catppuccin Latte](https://github.com/catppuccin/catppuccin):wq
* [Polybar](https://github.com/jaagr/polybar/), a great replacement for i3-bar with easy custom plugins and [system tray](https://specifications.freedesktop.org/systemtray-spec/systemtray-spec-0.3.html) * [Polybar](https://github.com/jaagr/polybar/), a great replacement for i3-bar with easy custom plugins and [system tray](https://specifications.freedesktop.org/systemtray-spec/systemtray-spec-0.3.html)
* A notification daemon (urgency-aware), [Dunst](https://github.com/dunst-project/dunst), controlled by shortcuts (but possibly with mouse) * A notification daemon (urgency-aware), [Dunst](https://github.com/dunst-project/dunst), controlled by shortcuts (but possibly with mouse)
* [Rofi](https://github.com/DaveDavenport/rofi), a full-customizable app launcher * [Rofi](https://github.com/DaveDavenport/rofi), a full-customizable app launcher
@ -43,10 +40,9 @@ In brief this is the classic Arch/i3 combo with :
* A working [Arch installation](https://wiki.archlinux.org/title/installation_guide) * A working [Arch installation](https://wiki.archlinux.org/title/installation_guide)
* Login with a `sudoer` user * Login with a `sudoer` user
* [yay](https://github.com/Jguer/yay) AUR wrapper (better check your [mirrors](https://wiki.archlinux.org/title/Mirrors) too) * [yay](https://github.com/Jguer/yay) AUR wrapper
* Python 3 and Pip * Python 3 and Pip
* Git * Git
* SSH keys to pull and push from Git repositories
## Installation ## Installation
@ -54,7 +50,7 @@ Please note : on my system `XDG_CONFIG_HOME` is empty and default to `$HOME/.con
### Clone the repository ### Clone the repository
* Clone in bare repository : `git clone --bare https://git.chosto.me/Chosto/dotfiles.git $HOME/.cfg`. A bare repository does not have a working tree (basically it is just `.git` content). So we avoid conflicts with another git repository. * Clone in bare repository : `git clone --bare https://github.com/Chostakovitch/dotfiles.git $HOME/.cfg`. A bare repository does not have a working tree (basically it is just `.git` content). So we avoid conflicts with another git repository.
* Create a working tree outside `.cfg` : `git --git-dir=$HOME/.cfg/ --work-tree=$HOME checkout`. * Create a working tree outside `.cfg` : `git --git-dir=$HOME/.cfg/ --work-tree=$HOME checkout`.
Credits to [this article](https://developer.atlassian.com/blog/2016/02/best-way-to-store-dotfiles-git-bare-repo/) for the trick. Credits to [this article](https://developer.atlassian.com/blog/2016/02/best-way-to-store-dotfiles-git-bare-repo/) for the trick.
@ -69,13 +65,13 @@ However, depending on your machine you may want slightly different modules loade
This can be done in `~/.config/polybar/conf.d/<env>` (see [explanation for env](#managing-divergences-between-environments)). This can be done in `~/.config/polybar/conf.d/<env>` (see [explanation for env](#managing-divergences-between-environments)).
If you want to test this setup, it will probably work with the `laptop` environnment. You can try these fallback values : This is optional for now as by default, polybar will use this fallback values :
```ini ```ini
[variables] [variables]
dpi = 110 dpi = 90
height = 40 height = 27
top_left = powermenu system-uptime-pretty player-mpris top_left = powermenu system-uptime-pretty
top_center = xwindow top_center = xwindow
top_right = system-usb-udev alsa date top_right = system-usb-udev alsa date
``` ```
@ -123,21 +119,21 @@ This will install all needed software and configuration. If you want to re-use m
In actual setup `env` can be : In actual setup `env` can be :
* `desk` is currently adjusted for my home setup, i.e. two screens, a keyboard with media keys and [JACK Audio Connection Kit](https://wiki.archlinux.org/title/JACK_Audio_Connection_Kit). * `desk` is currently adjusted for my home setup, i.e. two screens, a keyboard with media keys and [JACK Audio Connection Kit](https://wiki.archlinux.org/title/JACK_Audio_Connection_Kit).
* `laptop` is adjusted for a basic, single 15' screen laptop, with a simple keyboard. * `laptop` is adjusted for a basic, single and high-DPI screen laptop, with a simple keyboard.
You can now reboot. You can now reboot.
### Install Git Hook ### Install Git Hook
You want to add files named `post-merge` **and** `post-commit` in `~/.cfg/hooks` with contains : You want to add files named `post-merge` **and** `pre-push` in `~/.cfg/hooks` with contains :
```sh ```sh
#!/bin/sh #!/bin/sh
exec env WM_RESTART=1 ~/.init_config.sh <env> exec WM_RESTART=1 ~/.init_config.sh <env>
``` ```
And then `chmod +x ~/.cfg/hooks/{post-merge,post-commit}`. And then `chmod +x ~/.cfg/hooks/{post-merge,pre-push}`.
`WM_RESTART` controls whether `i3`, `polybar` and `picom` are restarted. `WM_RESTART` controls whether `i3`, `polybar` and `picom` are restarted.
That way, each time you commit or pull, changes are applied automagically, including configuration deletion detection. That way, each time you commit or pull, changes are applied automagically, including configuration deletion detection.
@ -171,8 +167,6 @@ Other times, you have a base configuration for all environment with specific add
In that case, the script will create a `<config_subdir>/config` file, which contains the concatenation of `config_common` and `config.d/<env>`, the later being optional. Filenames and path are hardcoded for now. In that case, the script will create a `<config_subdir>/config` file, which contains the concatenation of `config_common` and `config.d/<env>`, the later being optional. Filenames and path are hardcoded for now.
If an `above` file is found in `config.d`, the per-environment configuration will be prepended to the base configuration. This is useful for e.g. setting base variables.
### Configuration outside XDG_CONFIG_HOME, e.g. /etc ### Configuration outside XDG_CONFIG_HOME, e.g. /etc
Some configuration files reside in `/etc` directory, but I want to keep track of them. Some configuration files reside in `/etc` directory, but I want to keep track of them.