feat(waybar): island floating 3-pills + popups + deploy
- Config waybar 3-pills glassmorphism (left/center/right) - Scripts : gpu, network, power-profile (toggle+luminosité/profil), cava daemon+reader, wob (volume/luminosité), rofi-launcher - Popup media GTK3 : volume sortie+entrée + luminosité (vc-media-popup.py) - Profil énergie : cycle balanced→low-power→performance avec brightnessctl - Autostart COSMIC : waybar.desktop + wob.desktop - Thème COSMIC Light ajouté (accent violet-chaton) - deploy : +autostart, +sudoers platform_profile, +udev platform_profile, +scripts .py waybar, +CosmicTheme.Light
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -4,3 +4,6 @@ config.tar.gz
|
|||||||
# Dépôt git du thème Discord (sources SCSS)
|
# Dépôt git du thème Discord (sources SCSS)
|
||||||
# Le CSS compilé est dans INSTALL/themes/violet-chaton.theme.css
|
# Le CSS compilé est dans INSTALL/themes/violet-chaton.theme.css
|
||||||
INSTALL/themes/violet-chaton-discord-theme/
|
INSTALL/themes/violet-chaton-discord-theme/
|
||||||
|
# Dépôt git du thème VSCode
|
||||||
|
# Aucune source dans le projet général en 1.0.0
|
||||||
|
INSTALL/themes/violet-chaton-VSCode-theme/
|
||||||
8
INSTALL/configs/autostart/waybar.desktop
Normal file
8
INSTALL/configs/autostart/waybar.desktop
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Name=Waybar
|
||||||
|
Comment=violet-chaton status bar
|
||||||
|
Type=Application
|
||||||
|
Exec=waybar
|
||||||
|
Hidden=false
|
||||||
|
NoDisplay=false
|
||||||
|
X-GNOME-Autostart-enabled=true
|
||||||
8
INSTALL/configs/autostart/wob.desktop
Normal file
8
INSTALL/configs/autostart/wob.desktop
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Name=WOB
|
||||||
|
Comment=Wayland overlay bar (volume / luminosité)
|
||||||
|
Type=Application
|
||||||
|
Exec=/home/tetardtek/.config/waybar/scripts/wob-start.sh
|
||||||
|
Hidden=false
|
||||||
|
NoDisplay=false
|
||||||
|
X-GNOME-Autostart-enabled=true
|
||||||
7
INSTALL/configs/rofi/config.rasi
Normal file
7
INSTALL/configs/rofi/config.rasi
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
configuration {
|
||||||
|
font: "JetBrainsMono Nerd Font 13";
|
||||||
|
show-icons: false;
|
||||||
|
click-to-exit: true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@theme "violet-chaton"
|
||||||
18
INSTALL/configs/waybar/cava-waybar.cfg
Normal file
18
INSTALL/configs/waybar/cava-waybar.cfg
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
[general]
|
||||||
|
bars = 8
|
||||||
|
framerate = 30
|
||||||
|
|
||||||
|
[input]
|
||||||
|
method = pulse
|
||||||
|
source = auto
|
||||||
|
|
||||||
|
[output]
|
||||||
|
method = raw
|
||||||
|
raw_target = /dev/stdout
|
||||||
|
data_format = ascii
|
||||||
|
ascii_max_range = 8
|
||||||
|
bar_delimiter = 59
|
||||||
|
|
||||||
|
[smoothing]
|
||||||
|
gravity = 100
|
||||||
|
noise_reduction = 77
|
||||||
312
INSTALL/configs/waybar/config
Normal file
312
INSTALL/configs/waybar/config
Normal file
@@ -0,0 +1,312 @@
|
|||||||
|
{
|
||||||
|
// ── violet-chaton Waybar — island floating 3 pills ──────────────────────
|
||||||
|
// LEFT : launcher | cpu + temp | gpu | ram | disk | network
|
||||||
|
// CENTER : cava | clock | date | mpris
|
||||||
|
// RIGHT : wireplumber | backlight | bluetooth | idle_inhibitor |
|
||||||
|
// battery | power-profile | keyboard-state |
|
||||||
|
// systemd-failed | uptime | tray
|
||||||
|
// ────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
"layer": "top",
|
||||||
|
"position": "top",
|
||||||
|
"height": 60,
|
||||||
|
"margin-top": 0,
|
||||||
|
"margin-left": 16,
|
||||||
|
"margin-right": 16,
|
||||||
|
"spacing": 0,
|
||||||
|
"exclusive": true,
|
||||||
|
|
||||||
|
"modules-left": [
|
||||||
|
"custom/launcher",
|
||||||
|
"custom/sep",
|
||||||
|
"cpu",
|
||||||
|
"temperature",
|
||||||
|
"custom/gpu",
|
||||||
|
"memory",
|
||||||
|
"disk",
|
||||||
|
"custom/sep",
|
||||||
|
"custom/network"
|
||||||
|
],
|
||||||
|
|
||||||
|
"modules-center": [
|
||||||
|
"custom/cava",
|
||||||
|
"clock",
|
||||||
|
"custom/date",
|
||||||
|
"mpris"
|
||||||
|
],
|
||||||
|
|
||||||
|
"modules-right": [
|
||||||
|
"wireplumber",
|
||||||
|
"backlight",
|
||||||
|
"bluetooth",
|
||||||
|
"custom/sep",
|
||||||
|
"idle_inhibitor",
|
||||||
|
"custom/sep",
|
||||||
|
"battery",
|
||||||
|
"custom/power-profile",
|
||||||
|
"custom/sep",
|
||||||
|
"custom/uptime",
|
||||||
|
"tray",
|
||||||
|
"custom/power"
|
||||||
|
],
|
||||||
|
|
||||||
|
// ── Launcher ────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
"custom/launcher": {
|
||||||
|
"format": "",
|
||||||
|
"tooltip": false,
|
||||||
|
"on-click": "~/.config/waybar/scripts/rofi-launcher.sh"
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── Séparateur ──────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
"custom/sep": {
|
||||||
|
"format": "|",
|
||||||
|
"tooltip": false
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── CPU ─────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
"cpu": {
|
||||||
|
"format": " {usage}%",
|
||||||
|
"tooltip-format": "<b>Intel i5-12450H</b>\n<span color='#8be9fd'> {usage}%</span> <span color='#6c7086'>@ {avg_frequency} GHz</span>\n\n<span color='#e79cfe'>T00</span> {usage0}% <span color='#e79cfe'>T01</span> {usage1}% <span color='#e79cfe'>T02</span> {usage2}% <span color='#e79cfe'>T03</span> {usage3}%\n<span color='#e79cfe'>T04</span> {usage4}% <span color='#e79cfe'>T05</span> {usage5}% <span color='#e79cfe'>T06</span> {usage6}% <span color='#e79cfe'>T07</span> {usage7}%\n<span color='#e79cfe'>T08</span> {usage8}% <span color='#e79cfe'>T09</span> {usage9}% <span color='#e79cfe'>T10</span> {usage10}% <span color='#e79cfe'>T11</span> {usage11}%",
|
||||||
|
"states": {
|
||||||
|
"warning": 70,
|
||||||
|
"critical": 90
|
||||||
|
},
|
||||||
|
"interval": 2
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── Température ─────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
"temperature": {
|
||||||
|
"thermal-zone": 9,
|
||||||
|
"format": " {temperatureC}°",
|
||||||
|
"format-critical": " {temperatureC}°",
|
||||||
|
"critical-threshold": 80,
|
||||||
|
"tooltip": false,
|
||||||
|
"interval": 2
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── GPU ─────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
"custom/gpu": {
|
||||||
|
"exec": "~/.config/waybar/scripts/gpu.sh",
|
||||||
|
"return-type": "json",
|
||||||
|
"interval": 2,
|
||||||
|
"format": "{}"
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── RAM ─────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
"memory": {
|
||||||
|
"format": " {used:0.1f}G",
|
||||||
|
"tooltip-format": " RAM\n{used:0.1f} GiB / {total:0.1f} GiB\n{percentage}% utilisé",
|
||||||
|
"states": {
|
||||||
|
"warning": 75,
|
||||||
|
"critical": 90
|
||||||
|
},
|
||||||
|
"interval": 2
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── Disque ──────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
"disk": {
|
||||||
|
"format": " {used}",
|
||||||
|
"tooltip-format": " Disque /\n{used} / {total}\n{percentage_used}% utilisé",
|
||||||
|
"interval": 30
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── Réseau ──────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
"custom/network": {
|
||||||
|
"exec": "~/.config/waybar/scripts/network.sh",
|
||||||
|
"return-type": "json",
|
||||||
|
"interval": 2,
|
||||||
|
"format": "{}"
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── CAVA ────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
"custom/cava": {
|
||||||
|
"exec": "~/.config/waybar/scripts/cava-read.sh",
|
||||||
|
"return-type": "json",
|
||||||
|
"interval": 1,
|
||||||
|
"format": "{}",
|
||||||
|
"tooltip": false
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── Horloge ─────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
"clock": {
|
||||||
|
"format": " {:%H:%M}",
|
||||||
|
"format-alt": " {:%H:%M:%S}",
|
||||||
|
"tooltip-format": "<big>{:%B %Y}</big>\n<tt><small>{calendar}</small></tt>",
|
||||||
|
"calendar": {
|
||||||
|
"mode": "month",
|
||||||
|
"on-scroll": 1,
|
||||||
|
"format": {
|
||||||
|
"months": "<span color='#ff79c6'><b>{}</b></span>",
|
||||||
|
"days": "<span color='#f8f8f2'>{}</span>",
|
||||||
|
"weeks": "<span color='#8be9fd'><b>W{}</b></span>",
|
||||||
|
"weekdays": "<span color='#e79cfe'><b>{}</b></span>",
|
||||||
|
"today": "<span color='#ff79c6'><b><u>{}</u></b></span>"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"interval": 1
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── Date ────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
"custom/date": {
|
||||||
|
"exec": "LC_ALL=fr_FR.UTF-8 date '+%a %d %b' | awk '{print toupper(substr($0,1,1)) substr($0,2)}'",
|
||||||
|
"interval": 60,
|
||||||
|
"tooltip": false
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── MPRIS ───────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
"mpris": {
|
||||||
|
"format": "{player_icon} {dynamic}",
|
||||||
|
"format-paused": "{player_icon} <i>{dynamic}</i>",
|
||||||
|
"player-icons": {
|
||||||
|
"default": "",
|
||||||
|
"spotify": "",
|
||||||
|
"firefox": "",
|
||||||
|
"chromium": "",
|
||||||
|
"vlc": ""
|
||||||
|
},
|
||||||
|
"status-icons": {
|
||||||
|
"paused": "",
|
||||||
|
"playing": "",
|
||||||
|
"stopped": ""
|
||||||
|
},
|
||||||
|
"dynamic-len": 30,
|
||||||
|
"ignored-players": ["firefox"],
|
||||||
|
"tooltip-format": "{player} — {title}\n{artist}\n{album}"
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── Volume (wireplumber) ─────────────────────────────────────────────────
|
||||||
|
|
||||||
|
"wireplumber": {
|
||||||
|
"format": "{icon} {volume}%",
|
||||||
|
"format-muted": " {volume}%",
|
||||||
|
"format-icons": ["", "", ""],
|
||||||
|
"on-click": "python3 ~/.config/waybar/scripts/vc-media-popup.py",
|
||||||
|
"on-click-right": "~/.config/waybar/scripts/wob-volume.sh mute",
|
||||||
|
"on-scroll-up": "~/.config/waybar/scripts/wob-volume.sh up",
|
||||||
|
"on-scroll-down": "~/.config/waybar/scripts/wob-volume.sh down",
|
||||||
|
"tooltip-format": " Volume : {volume}%\n{node_name}"
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── Luminosité ──────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
"backlight": {
|
||||||
|
"format": "{icon} {percent}%",
|
||||||
|
"format-icons": ["", "", ""],
|
||||||
|
"tooltip": false,
|
||||||
|
"on-click": "python3 ~/.config/waybar/scripts/vc-media-popup.py",
|
||||||
|
"on-scroll-up": "~/.config/waybar/scripts/wob-brightness.sh up",
|
||||||
|
"on-scroll-down": "~/.config/waybar/scripts/wob-brightness.sh down"
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── Bluetooth ───────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
"bluetooth": {
|
||||||
|
"format": "",
|
||||||
|
"format-disabled": "",
|
||||||
|
"format-connected": " {device_alias}",
|
||||||
|
"tooltip-format": "{controller_alias} — {controller_address}\n{num_connections} connecté(s)",
|
||||||
|
"tooltip-format-connected": "{controller_alias}\n{device_enumerate}",
|
||||||
|
"tooltip-format-enumerate-connected": " {device_alias} ({device_address})"
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── Idle inhibitor ──────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
"idle_inhibitor": {
|
||||||
|
"format": "{icon}",
|
||||||
|
"format-icons": {
|
||||||
|
"activated": "",
|
||||||
|
"deactivated": ""
|
||||||
|
},
|
||||||
|
"tooltip-format-activated": "Veille désactivée",
|
||||||
|
"tooltip-format-deactivated": "Veille active"
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── Batterie ────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
"battery": {
|
||||||
|
"bat": "BAT1",
|
||||||
|
"states": {
|
||||||
|
"full": 95,
|
||||||
|
"good": 80,
|
||||||
|
"warning": 30,
|
||||||
|
"critical": 15
|
||||||
|
},
|
||||||
|
"format": "{icon} {capacity}%",
|
||||||
|
"format-charging": " {capacity}%",
|
||||||
|
"format-plugged": " {capacity}%",
|
||||||
|
"format-full": " {capacity}%",
|
||||||
|
"format-icons": ["", "", "", "", "", "", "", "", "", ""],
|
||||||
|
"tooltip-format": "Batterie : {capacity}%\n{timeTo}\nCycles estimés",
|
||||||
|
"interval": 30
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── Profil énergie ──────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
"custom/power-profile": {
|
||||||
|
"exec": "~/.config/waybar/scripts/power-profile.sh",
|
||||||
|
"return-type": "json",
|
||||||
|
"interval": 5,
|
||||||
|
"signal": 8,
|
||||||
|
"on-click": "~/.config/waybar/scripts/power-profile.sh --toggle"
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── Clavier ─────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
"keyboard-state": {
|
||||||
|
"numlock": true,
|
||||||
|
"capslock": true,
|
||||||
|
"format": {
|
||||||
|
"numlock": "{icon}",
|
||||||
|
"capslock": "{icon}"
|
||||||
|
},
|
||||||
|
"format-icons": {
|
||||||
|
"locked": "",
|
||||||
|
"unlocked": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── Systemd failed ──────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
"systemd-failed-units": {
|
||||||
|
"format": " {nr_failed}",
|
||||||
|
"format-ok": "",
|
||||||
|
"hide-on-ok": true,
|
||||||
|
"system": true,
|
||||||
|
"user": true
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── Uptime ──────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
"custom/uptime": {
|
||||||
|
"exec": "awk '{s=$1; d=int(s/86400); h=int((s%86400)/3600); m=int((s%3600)/60); if(d>0) printf \" %dj %dh\",d,h; else if(h>0) printf \" %dh %dm\",h,m; else printf \" %dm\",m}' /proc/uptime",
|
||||||
|
"interval": 60,
|
||||||
|
"tooltip": false
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── Tray ────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
"tray": {
|
||||||
|
"spacing": 8,
|
||||||
|
"icon-size": 16
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── Bouton power ────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
"custom/power": {
|
||||||
|
"format": "",
|
||||||
|
"tooltip": false,
|
||||||
|
"on-click": "~/.config/waybar/scripts/power-menu.sh"
|
||||||
|
}
|
||||||
|
}
|
||||||
20
INSTALL/configs/waybar/scripts/cava-read.sh
Executable file
20
INSTALL/configs/waybar/scripts/cava-read.sh
Executable file
@@ -0,0 +1,20 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# cava-read.sh — lit /tmp/waybar_cava → JSON waybar (interval: 1)
|
||||||
|
# Lance automatiquement le démon cava-waybar.sh si absent.
|
||||||
|
|
||||||
|
OUT="/tmp/waybar_cava"
|
||||||
|
PID="/tmp/waybar_cava.pid"
|
||||||
|
DAEMON="$HOME/.config/waybar/scripts/cava-waybar.sh"
|
||||||
|
|
||||||
|
# Démarrer le démon si pas actif
|
||||||
|
if [[ ! -f "$PID" ]] || ! kill -0 "$(cat "$PID" 2>/dev/null)" 2>/dev/null; then
|
||||||
|
nohup bash "$DAEMON" >/dev/null 2>&1 &
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Lire et retourner le JSON
|
||||||
|
if [[ -f "$OUT" ]]; then
|
||||||
|
BAR=$(tail -1 "$OUT" 2>/dev/null)
|
||||||
|
[[ -n "$BAR" ]] && printf '{"text":"%s","tooltip":"","class":""}\n' "$BAR" && exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf '{"text":"▁▁▁▁▁▁▁▁","tooltip":"","class":"muted"}\n'
|
||||||
12
INSTALL/configs/waybar/scripts/cava-waybar-daemon.sh
Executable file
12
INSTALL/configs/waybar/scripts/cava-waybar-daemon.sh
Executable file
@@ -0,0 +1,12 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# cava-waybar-daemon.sh — lance CAVA en daemon → /tmp/waybar_cava
|
||||||
|
# Appeler au démarrage de la session
|
||||||
|
|
||||||
|
pkill -f "cava -p.*cava-waybar.cfg" 2>/dev/null
|
||||||
|
sleep 0.3
|
||||||
|
|
||||||
|
CFG="$HOME/.config/waybar/cava-waybar.cfg"
|
||||||
|
[[ ! -f "$CFG" ]] && { echo "Config manquante : $CFG"; exit 1; }
|
||||||
|
|
||||||
|
cava -p "$CFG" > /tmp/waybar_cava &
|
||||||
|
echo "CAVA daemon lancé (PID $!)"
|
||||||
22
INSTALL/configs/waybar/scripts/cava-waybar.sh
Executable file
22
INSTALL/configs/waybar/scripts/cava-waybar.sh
Executable file
@@ -0,0 +1,22 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# cava-waybar.sh — démon CAVA : écrit la visu dans /tmp/waybar_cava
|
||||||
|
# Lancé automatiquement par cava-read.sh, ne pas appeler directement.
|
||||||
|
|
||||||
|
BLOCKS=('▁' '▁' '▂' '▃' '▄' '▅' '▆' '▇' '█')
|
||||||
|
CFG="$HOME/.config/waybar/cava-waybar.cfg"
|
||||||
|
OUT="/tmp/waybar_cava"
|
||||||
|
PID="/tmp/waybar_cava.pid"
|
||||||
|
|
||||||
|
echo $$ > "$PID"
|
||||||
|
|
||||||
|
cleanup() { rm -f "$PID" "$OUT"; exit; }
|
||||||
|
trap cleanup EXIT INT TERM
|
||||||
|
|
||||||
|
cava -p "$CFG" | while IFS=';' read -ra VALUES; do
|
||||||
|
BAR=""
|
||||||
|
for v in "${VALUES[@]}"; do
|
||||||
|
v="${v//[^0-9]/}"
|
||||||
|
[[ -n "$v" ]] && BAR+="${BLOCKS[$v]:-▁}"
|
||||||
|
done
|
||||||
|
[[ -n "$BAR" ]] && printf '%s\n' "$BAR" > "$OUT"
|
||||||
|
done
|
||||||
26
INSTALL/configs/waybar/scripts/gpu.sh
Executable file
26
INSTALL/configs/waybar/scripts/gpu.sh
Executable file
@@ -0,0 +1,26 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# gpu.sh — NVIDIA GPU stats → JSON waybar
|
||||||
|
|
||||||
|
DATA=$(nvidia-smi --query-gpu=utilization.gpu,temperature.gpu,memory.used,memory.total \
|
||||||
|
--format=csv,noheader,nounits 2>/dev/null)
|
||||||
|
|
||||||
|
if [[ -z "$DATA" ]]; then
|
||||||
|
echo '{"text":"","tooltip":"GPU non disponible","class":"","percentage":0}'
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
LOAD=$(echo "$DATA" | awk -F', ' '{print $1}')
|
||||||
|
TEMP=$(echo "$DATA" | awk -F', ' '{print $2}')
|
||||||
|
MEM_USED=$(echo "$DATA" | awk -F', ' '{print $3}')
|
||||||
|
MEM_TOTAL=$(echo "$DATA" | awk -F', ' '{print $4}')
|
||||||
|
|
||||||
|
if (( LOAD > 90 )); then CLASS="critical"
|
||||||
|
elif (( LOAD > 70 )); then CLASS="warning"
|
||||||
|
else CLASS="normal"
|
||||||
|
fi
|
||||||
|
|
||||||
|
TEXT=" ${LOAD}% ${TEMP}°"
|
||||||
|
TOOLTIP=" GPU\nCharge : ${LOAD}%\nTempérature : ${TEMP}°C\nVRAM : ${MEM_USED} / ${MEM_TOTAL} MiB"
|
||||||
|
|
||||||
|
printf '{"text":"%s","tooltip":"%s","class":"%s","percentage":%s}\n' \
|
||||||
|
"$TEXT" "$TOOLTIP" "$CLASS" "$LOAD"
|
||||||
66
INSTALL/configs/waybar/scripts/network.sh
Executable file
66
INSTALL/configs/waybar/scripts/network.sh
Executable file
@@ -0,0 +1,66 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# network.sh — bande passante réseau → JSON waybar
|
||||||
|
|
||||||
|
STATE_FILE="/tmp/waybar_net_state"
|
||||||
|
|
||||||
|
# Détecter l'interface active
|
||||||
|
IFACE=""
|
||||||
|
for candidate in enp7s0 enp6s0 eth0; do
|
||||||
|
if [[ -d "/sys/class/net/$candidate" && "$(cat /sys/class/net/$candidate/operstate 2>/dev/null)" == "up" ]]; then
|
||||||
|
IFACE="$candidate"; TYPE="eth"; break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [[ -z "$IFACE" ]]; then
|
||||||
|
for candidate in wlp8s0 wlp0s20f3 wlan0; do
|
||||||
|
if [[ -d "/sys/class/net/$candidate" && "$(cat /sys/class/net/$candidate/operstate 2>/dev/null)" == "up" ]]; then
|
||||||
|
IFACE="$candidate"; TYPE="wifi"; break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -z "$IFACE" ]]; then
|
||||||
|
echo '{"text":" déco","tooltip":"Déconnecté","class":"disconnected"}'
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
RX_NOW=$(cat "/sys/class/net/$IFACE/statistics/rx_bytes" 2>/dev/null || echo 0)
|
||||||
|
TX_NOW=$(cat "/sys/class/net/$IFACE/statistics/tx_bytes" 2>/dev/null || echo 0)
|
||||||
|
NOW=$(date +%s%N)
|
||||||
|
|
||||||
|
if [[ -f "$STATE_FILE" ]]; then
|
||||||
|
read -r RX_PREV TX_PREV TIME_PREV < "$STATE_FILE"
|
||||||
|
ELAPSED=$(( (NOW - TIME_PREV) / 1000000 )) # ms
|
||||||
|
if (( ELAPSED > 0 )); then
|
||||||
|
DOWN_BPS=$(( (RX_NOW - RX_PREV) * 1000 / ELAPSED ))
|
||||||
|
UP_BPS=$(( (TX_NOW - TX_PREV) * 1000 / ELAPSED ))
|
||||||
|
else
|
||||||
|
DOWN_BPS=0; UP_BPS=0
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
DOWN_BPS=0; UP_BPS=0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$RX_NOW $TX_NOW $NOW" > "$STATE_FILE"
|
||||||
|
|
||||||
|
# Formatage humain
|
||||||
|
human() {
|
||||||
|
local B=$1
|
||||||
|
if (( B >= 1073741824 )); then LC_ALL=C awk "BEGIN{printf \"%.1fG\", $B/1073741824}"
|
||||||
|
elif (( B >= 1048576 )); then LC_ALL=C awk "BEGIN{printf \"%.1fM\", $B/1048576}"
|
||||||
|
elif (( B >= 1024 )); then LC_ALL=C awk "BEGIN{printf \"%.0fK\", $B/1024}"
|
||||||
|
else echo "${B}B"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
DOWN_H=$(human $DOWN_BPS)
|
||||||
|
UP_H=$(human $UP_BPS)
|
||||||
|
RX_TOTAL=$(human $RX_NOW)
|
||||||
|
TX_TOTAL=$(human $TX_NOW)
|
||||||
|
|
||||||
|
ICON_DOWN=""; ICON_UP=""
|
||||||
|
[[ "$TYPE" == "wifi" ]] && ICON_NET="" || ICON_NET=""
|
||||||
|
|
||||||
|
TEXT="${ICON_DOWN} ${DOWN_H}/s ${ICON_UP} ${UP_H}/s"
|
||||||
|
TOOLTIP="${ICON_NET} ${IFACE}\n${ICON_DOWN} ${DOWN_H}/s ${ICON_UP} ${UP_H}/s\n\n Total reçu : ${RX_TOTAL}\n Total envoyé : ${TX_TOTAL}"
|
||||||
|
|
||||||
|
printf '{"text":"%s","tooltip":"%s","class":"%s"}\n' "$TEXT" "$TOOLTIP" "$TYPE"
|
||||||
27
INSTALL/configs/waybar/scripts/power-menu.sh
Executable file
27
INSTALL/configs/waybar/scripts/power-menu.sh
Executable file
@@ -0,0 +1,27 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# power-menu.sh — menu power dédié (wofi)
|
||||||
|
|
||||||
|
STYLE="$HOME/.config/wofi/power-style.css"
|
||||||
|
|
||||||
|
ENTRIES=(
|
||||||
|
" Verrouiller"
|
||||||
|
" Veille"
|
||||||
|
" Redémarrer"
|
||||||
|
" Éteindre"
|
||||||
|
)
|
||||||
|
|
||||||
|
CHOICE=$(printf '%s\n' "${ENTRIES[@]}" | \
|
||||||
|
wofi --dmenu \
|
||||||
|
--prompt "⏻ " \
|
||||||
|
--style "$STYLE" \
|
||||||
|
--width 210 \
|
||||||
|
--height 160 \
|
||||||
|
--y 70 \
|
||||||
|
--location top_right)
|
||||||
|
|
||||||
|
case "$CHOICE" in
|
||||||
|
" Verrouiller") loginctl lock-session ;;
|
||||||
|
" Veille") systemctl suspend ;;
|
||||||
|
" Redémarrer") systemctl reboot ;;
|
||||||
|
" Éteindre") systemctl poweroff ;;
|
||||||
|
esac
|
||||||
53
INSTALL/configs/waybar/scripts/power-profile.sh
Executable file
53
INSTALL/configs/waybar/scripts/power-profile.sh
Executable file
@@ -0,0 +1,53 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# power-profile.sh — profil énergie ACPI → JSON waybar
|
||||||
|
# Sans argument : affiche le profil courant en JSON
|
||||||
|
# --toggle : cycle vers le profil suivant + applique la luminosité
|
||||||
|
|
||||||
|
# Luminosité par profil (%)
|
||||||
|
BRIGHT_performance=80
|
||||||
|
BRIGHT_balanced=60
|
||||||
|
BRIGHT_low_power=30 # low-power → clé sans tiret
|
||||||
|
|
||||||
|
_bright_for() {
|
||||||
|
local key="${1//-/_}"
|
||||||
|
local var="BRIGHT_${key}"
|
||||||
|
echo "${!var:-60}"
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ "$1" == "--toggle" ]]; then
|
||||||
|
CURRENT=$(cat /sys/firmware/acpi/platform_profile 2>/dev/null || echo "balanced")
|
||||||
|
case "$CURRENT" in
|
||||||
|
performance) NEXT="balanced" ;;
|
||||||
|
balanced) NEXT="low-power" ;;
|
||||||
|
*) NEXT="performance" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
echo "$NEXT" > /sys/firmware/acpi/platform_profile
|
||||||
|
|
||||||
|
# Appliquer la luminosité du nouveau profil
|
||||||
|
BRIGHT=$(_bright_for "$NEXT")
|
||||||
|
brightnessctl set "${BRIGHT}%" -q
|
||||||
|
|
||||||
|
# Feedback wob
|
||||||
|
if [[ -p /tmp/wob.fifo ]]; then
|
||||||
|
echo "$BRIGHT" > /tmp/wob.fifo 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Rafraîchir le module waybar
|
||||||
|
pkill -RTMIN+8 waybar
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ── Affichage JSON ────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
PROFILE=$(cat /sys/firmware/acpi/platform_profile 2>/dev/null || echo "unknown")
|
||||||
|
|
||||||
|
case "$PROFILE" in
|
||||||
|
performance) ICON=""; CLASS="performance" ;;
|
||||||
|
balanced) ICON=""; CLASS="balanced" ;;
|
||||||
|
low-power) ICON=""; CLASS="low-power" ;;
|
||||||
|
*) ICON=""; CLASS="unknown" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
printf '{"text":"%s","tooltip":"Profil énergie : %s","class":"%s"}\n' \
|
||||||
|
"$ICON" "$PROFILE" "$CLASS"
|
||||||
110
INSTALL/configs/waybar/scripts/rofi-launcher.sh
Executable file
110
INSTALL/configs/waybar/scripts/rofi-launcher.sh
Executable file
@@ -0,0 +1,110 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# launcher.sh — boite à outils violet-chaton avec historique (wofi)
|
||||||
|
|
||||||
|
STYLE="$HOME/.config/wofi/style.css"
|
||||||
|
TERM="cosmic-term"
|
||||||
|
HIST_FILE="$HOME/.cache/waybar-launcher.hist"
|
||||||
|
MAX_HIST=5
|
||||||
|
HIST_ICON=" "
|
||||||
|
|
||||||
|
SEP="<span foreground='#3d2454'>────────────────────</span>"
|
||||||
|
HIST_HDR="<span foreground='#8be9fd' size='small'> RÉCENTS</span>"
|
||||||
|
|
||||||
|
# ── Favoris (ordre fixe, toujours en haut) ───────────────────────────────────
|
||||||
|
FAVORITES=(
|
||||||
|
" Vivaldi"
|
||||||
|
" Terminal"
|
||||||
|
" Nemo"
|
||||||
|
" VSCode"
|
||||||
|
" Vesktop"
|
||||||
|
" btop"
|
||||||
|
" lazygit"
|
||||||
|
" pipes.sh"
|
||||||
|
" cbonsai"
|
||||||
|
)
|
||||||
|
|
||||||
|
# ── Historique (dernières applis lancées, dédoublonné) ───────────────────────
|
||||||
|
RECENT_ENTRIES=""
|
||||||
|
if [[ -f "$HIST_FILE" ]]; then
|
||||||
|
RECENT_ENTRIES=$(awk '!seen[$0]++' "$HIST_FILE" | head -"$MAX_HIST" | \
|
||||||
|
sed "s|^|${HIST_ICON}|")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ── Toutes les applis installées ─────────────────────────────────────────────
|
||||||
|
ALL_APPS=$(for f in \
|
||||||
|
/usr/share/applications/*.desktop \
|
||||||
|
~/.local/share/applications/*.desktop \
|
||||||
|
/var/lib/flatpak/exports/share/applications/*.desktop \
|
||||||
|
~/.local/share/flatpak/exports/share/applications/*.desktop; do
|
||||||
|
[[ -f "$f" ]] || continue
|
||||||
|
grep -q "^NoDisplay=true" "$f" && continue
|
||||||
|
grep -q "^Type=Application" "$f" || continue
|
||||||
|
grep -m1 "^Name=" "$f" | cut -d= -f2-
|
||||||
|
done | sort -u)
|
||||||
|
|
||||||
|
# ── Construction de la liste ─────────────────────────────────────────────────
|
||||||
|
FULL_LIST=$(
|
||||||
|
printf '%s\n' "${FAVORITES[@]}"
|
||||||
|
if [[ -n "$RECENT_ENTRIES" ]]; then
|
||||||
|
echo "$SEP"
|
||||||
|
echo "$HIST_HDR"
|
||||||
|
echo "$RECENT_ENTRIES"
|
||||||
|
fi
|
||||||
|
echo "$SEP"
|
||||||
|
echo "$ALL_APPS"
|
||||||
|
)
|
||||||
|
|
||||||
|
# ── Affichage wofi ───────────────────────────────────────────────────────────
|
||||||
|
CHOICE=$(echo "$FULL_LIST" | \
|
||||||
|
wofi --dmenu \
|
||||||
|
--prompt " " \
|
||||||
|
--style "$STYLE" \
|
||||||
|
--width 300 \
|
||||||
|
--height 500 \
|
||||||
|
--x 16 \
|
||||||
|
--y 70 \
|
||||||
|
--location top_left)
|
||||||
|
|
||||||
|
[[ -z "$CHOICE" ]] && exit 0
|
||||||
|
|
||||||
|
# Enlever le préfixe historique si présent
|
||||||
|
CHOICE_CLEAN="${CHOICE#$HIST_ICON}"
|
||||||
|
|
||||||
|
# ── Mise à jour historique ────────────────────────────────────────────────────
|
||||||
|
save_history() {
|
||||||
|
local app="$1"
|
||||||
|
# Ignorer les favoris (déjà toujours visibles), séparateurs et power
|
||||||
|
case "$app" in
|
||||||
|
" Vivaldi"|" Terminal"|" Nemo"|" VSCode"|" Vesktop") return ;;
|
||||||
|
" btop"|" lazygit"|" pipes.sh"|" cbonsai") return ;;
|
||||||
|
*"────"*|*"RÉCENTS"*|"") return ;;
|
||||||
|
esac
|
||||||
|
# Dépiler l'entrée existante et rajouter en tête
|
||||||
|
local tmp
|
||||||
|
tmp=$(grep -vxF "$app" "$HIST_FILE" 2>/dev/null)
|
||||||
|
printf '%s\n%s\n' "$app" "$tmp" | head -20 > "$HIST_FILE"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ── Actions ───────────────────────────────────────────────────────────────────
|
||||||
|
case "$CHOICE_CLEAN" in
|
||||||
|
" Vivaldi") vivaldi-stable & ;;
|
||||||
|
" Terminal") $TERM & ;;
|
||||||
|
" Nemo") nemo & ;;
|
||||||
|
" VSCode") code & ;;
|
||||||
|
" Vesktop") flatpak run dev.vencord.Vesktop & ;;
|
||||||
|
" btop") $TERM --command btop & ;;
|
||||||
|
" lazygit") $TERM --command lazygit & ;;
|
||||||
|
" pipes.sh") $TERM --command pipes.sh & ;;
|
||||||
|
" cbonsai") $TERM --command bash -c "cbonsai -l; read" & ;;
|
||||||
|
*"────"*|*"RÉCENTS"*) : ;;
|
||||||
|
*)
|
||||||
|
save_history "$CHOICE_CLEAN"
|
||||||
|
DESKTOP=$(grep -rlm1 "^Name=$CHOICE_CLEAN$" \
|
||||||
|
/usr/share/applications \
|
||||||
|
~/.local/share/applications \
|
||||||
|
/var/lib/flatpak/exports/share/applications \
|
||||||
|
~/.local/share/flatpak/exports/share/applications \
|
||||||
|
2>/dev/null | head -1)
|
||||||
|
[[ -n "$DESKTOP" ]] && gtk-launch "$(basename "${DESKTOP%.desktop}")" &
|
||||||
|
;;
|
||||||
|
esac
|
||||||
245
INSTALL/configs/waybar/scripts/vc-brightness-popup.py
Executable file
245
INSTALL/configs/waybar/scripts/vc-brightness-popup.py
Executable file
@@ -0,0 +1,245 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# vc-brightness-popup.py — Popup luminosité violet-chaton
|
||||||
|
# Lancé par le clic sur le module backlight de waybar
|
||||||
|
|
||||||
|
import gi
|
||||||
|
gi.require_version('Gtk', '3.0')
|
||||||
|
gi.require_version('GtkLayerShell', '0.1')
|
||||||
|
from gi.repository import Gtk, Gdk, GtkLayerShell, GLib
|
||||||
|
import subprocess
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
|
||||||
|
# ── CSS ───────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
CSS = b"""
|
||||||
|
window {
|
||||||
|
background-color: rgba(52, 28, 74, 0.93);
|
||||||
|
border: 3px solid rgba(255, 121, 198, 0.78);
|
||||||
|
border-radius: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#container {
|
||||||
|
padding: 14px 20px 16px 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#bright-icon {
|
||||||
|
color: #8be9fd;
|
||||||
|
font-family: "JetBrainsMono Nerd Font";
|
||||||
|
font-size: 18px;
|
||||||
|
min-width: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#bright-title {
|
||||||
|
color: rgba(248, 248, 242, 0.55);
|
||||||
|
font-family: "JetBrainsMono Nerd Font";
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#device-name {
|
||||||
|
color: #8be9fd;
|
||||||
|
font-family: "JetBrainsMono Nerd Font";
|
||||||
|
font-size: 11px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
#bright-pct {
|
||||||
|
color: #f8f8f2;
|
||||||
|
font-family: "JetBrainsMono Nerd Font";
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: bold;
|
||||||
|
min-width: 44px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#separator {
|
||||||
|
color: rgba(92, 73, 108, 0.60);
|
||||||
|
margin: 4px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
scale trough {
|
||||||
|
background-color: rgba(92, 73, 108, 0.55);
|
||||||
|
border-radius: 3px;
|
||||||
|
min-height: 6px;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
scale highlight {
|
||||||
|
background-color: #8be9fd;
|
||||||
|
border-radius: 3px;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
scale slider {
|
||||||
|
background-color: #f8f8f2;
|
||||||
|
border-radius: 50%;
|
||||||
|
min-width: 18px;
|
||||||
|
min-height: 18px;
|
||||||
|
border: 2px solid rgba(139, 233, 253, 0.80);
|
||||||
|
box-shadow: none;
|
||||||
|
transition: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
scale slider:hover {
|
||||||
|
background-color: #8be9fd;
|
||||||
|
border-color: #8be9fd;
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
|
||||||
|
POPUP_WIDTH = 300
|
||||||
|
|
||||||
|
# ── Brightness helpers ────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
def get_brightness():
|
||||||
|
"""Retourne (valeur 0-100, nom du device)."""
|
||||||
|
try:
|
||||||
|
r = subprocess.run(
|
||||||
|
['brightnessctl', 'info'],
|
||||||
|
capture_output=True, text=True, timeout=2
|
||||||
|
)
|
||||||
|
pct_match = re.search(r'\((\d+)%\)', r.stdout)
|
||||||
|
dev_match = re.search(r"Device '([^']+)'", r.stdout)
|
||||||
|
pct = int(pct_match.group(1)) if pct_match else 50
|
||||||
|
dev = dev_match.group(1) if dev_match else 'Écran'
|
||||||
|
# Rendre le nom plus lisible
|
||||||
|
dev = dev.replace('_', ' ').replace('backlight', '').strip().title()
|
||||||
|
return pct, dev
|
||||||
|
except Exception:
|
||||||
|
return 50, 'Écran'
|
||||||
|
|
||||||
|
def set_brightness(pct):
|
||||||
|
pct = max(1, min(100, pct)) # minimum 1% pour ne pas éteindre l'écran
|
||||||
|
subprocess.run(
|
||||||
|
['brightnessctl', 'set', f'{pct}%', '-q'],
|
||||||
|
capture_output=True
|
||||||
|
)
|
||||||
|
# Feedback wob
|
||||||
|
fifo = '/tmp/wob.fifo'
|
||||||
|
if os.path.exists(fifo):
|
||||||
|
try:
|
||||||
|
fd = os.open(fifo, os.O_WRONLY | os.O_NONBLOCK)
|
||||||
|
os.write(fd, f'{pct}\n'.encode())
|
||||||
|
os.close(fd)
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def bright_icon(pct):
|
||||||
|
if pct < 34:
|
||||||
|
return ''
|
||||||
|
if pct < 67:
|
||||||
|
return ''
|
||||||
|
return ''
|
||||||
|
|
||||||
|
# ── Popup ─────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
class BrightnessPopup(Gtk.Window):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__()
|
||||||
|
self._blocked = False
|
||||||
|
|
||||||
|
# ── Position : centré sous le module backlight ────────────────────────
|
||||||
|
display = Gdk.Display.get_default()
|
||||||
|
monitor = display.get_primary_monitor() if display else None
|
||||||
|
screen_w = monitor.get_geometry().width if monitor else 1920
|
||||||
|
|
||||||
|
# Backlight est le 2e module de la pill droite (~250px depuis le bord)
|
||||||
|
module_center = screen_w - 16 - 250
|
||||||
|
margin_left = max(0, module_center - POPUP_WIDTH // 2)
|
||||||
|
|
||||||
|
GtkLayerShell.init_for_window(self)
|
||||||
|
GtkLayerShell.set_layer(self, GtkLayerShell.Layer.OVERLAY)
|
||||||
|
GtkLayerShell.set_anchor(self, GtkLayerShell.Edge.TOP, True)
|
||||||
|
GtkLayerShell.set_anchor(self, GtkLayerShell.Edge.LEFT, True)
|
||||||
|
GtkLayerShell.set_margin(self, GtkLayerShell.Edge.TOP, 66)
|
||||||
|
GtkLayerShell.set_margin(self, GtkLayerShell.Edge.LEFT, margin_left)
|
||||||
|
GtkLayerShell.set_keyboard_mode(self, GtkLayerShell.KeyboardMode.ON_DEMAND)
|
||||||
|
GtkLayerShell.set_exclusive_zone(self, -1)
|
||||||
|
|
||||||
|
self.set_decorated(False)
|
||||||
|
self.set_resizable(False)
|
||||||
|
self.set_default_size(POPUP_WIDTH, -1)
|
||||||
|
|
||||||
|
# ── CSS ───────────────────────────────────────────────────────────────
|
||||||
|
provider = Gtk.CssProvider()
|
||||||
|
provider.load_from_data(CSS)
|
||||||
|
Gtk.StyleContext.add_provider_for_screen(
|
||||||
|
Gdk.Screen.get_default(),
|
||||||
|
provider,
|
||||||
|
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
|
||||||
|
)
|
||||||
|
|
||||||
|
# ── État initial ──────────────────────────────────────────────────────
|
||||||
|
pct, dev = get_brightness()
|
||||||
|
|
||||||
|
# ── Layout ────────────────────────────────────────────────────────────
|
||||||
|
container = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
|
||||||
|
container.set_name('container')
|
||||||
|
self.add(container)
|
||||||
|
|
||||||
|
# Ligne device
|
||||||
|
dev_row = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=6)
|
||||||
|
dev_icon = Gtk.Label(label='')
|
||||||
|
dev_icon.set_name('bright-title')
|
||||||
|
dev_row.pack_start(dev_icon, False, False, 0)
|
||||||
|
dev_label = Gtk.Label(label=dev)
|
||||||
|
dev_label.set_name('device-name')
|
||||||
|
dev_label.set_halign(Gtk.Align.START)
|
||||||
|
dev_label.set_ellipsize(3)
|
||||||
|
dev_row.pack_start(dev_label, True, True, 0)
|
||||||
|
container.pack_start(dev_row, False, False, 0)
|
||||||
|
|
||||||
|
# Séparateur
|
||||||
|
sep = Gtk.Label(label='─' * 30)
|
||||||
|
sep.set_name('separator')
|
||||||
|
container.pack_start(sep, False, False, 4)
|
||||||
|
|
||||||
|
# En-tête : icône + "Luminosité" + %
|
||||||
|
header = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=8)
|
||||||
|
self.icon = Gtk.Label(label=bright_icon(pct))
|
||||||
|
self.icon.set_name('bright-icon')
|
||||||
|
header.pack_start(self.icon, False, False, 0)
|
||||||
|
|
||||||
|
title = Gtk.Label(label='Luminosité')
|
||||||
|
title.set_name('bright-title')
|
||||||
|
title.set_halign(Gtk.Align.START)
|
||||||
|
header.pack_start(title, True, True, 0)
|
||||||
|
|
||||||
|
self.pct = Gtk.Label(label=f'{pct}%')
|
||||||
|
self.pct.set_name('bright-pct')
|
||||||
|
self.pct.set_halign(Gtk.Align.END)
|
||||||
|
header.pack_end(self.pct, False, False, 0)
|
||||||
|
container.pack_start(header, False, False, 0)
|
||||||
|
|
||||||
|
# Slider (min 1% pour ne pas éteindre l'écran)
|
||||||
|
self.scale = Gtk.Scale.new_with_range(
|
||||||
|
Gtk.Orientation.HORIZONTAL, 1, 100, 5
|
||||||
|
)
|
||||||
|
self.scale.set_value(pct)
|
||||||
|
self.scale.set_draw_value(False)
|
||||||
|
self.scale.set_hexpand(True)
|
||||||
|
self.scale.connect('value-changed', self._on_changed)
|
||||||
|
container.pack_start(self.scale, False, False, 0)
|
||||||
|
|
||||||
|
# ── Fermeture ─────────────────────────────────────────────────────────
|
||||||
|
self.connect('key-press-event', self._on_key)
|
||||||
|
self.connect('focus-out-event', lambda *_: self.destroy())
|
||||||
|
|
||||||
|
self.show_all()
|
||||||
|
self.grab_focus()
|
||||||
|
|
||||||
|
def _on_changed(self, scale):
|
||||||
|
if self._blocked:
|
||||||
|
return
|
||||||
|
pct = int(scale.get_value())
|
||||||
|
self.pct.set_label(f'{pct}%')
|
||||||
|
self.icon.set_label(bright_icon(pct))
|
||||||
|
set_brightness(pct)
|
||||||
|
|
||||||
|
def _on_key(self, _widget, event):
|
||||||
|
if event.keyval == Gdk.KEY_Escape:
|
||||||
|
self.destroy()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
win = BrightnessPopup()
|
||||||
|
win.connect('destroy', Gtk.main_quit)
|
||||||
|
Gtk.main()
|
||||||
470
INSTALL/configs/waybar/scripts/vc-media-popup.py
Executable file
470
INSTALL/configs/waybar/scripts/vc-media-popup.py
Executable file
@@ -0,0 +1,470 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# vc-media-popup.py — Popup audio + luminosité violet-chaton
|
||||||
|
# Lancé depuis le clic sur wireplumber OU backlight
|
||||||
|
|
||||||
|
import gi
|
||||||
|
gi.require_version('Gtk', '3.0')
|
||||||
|
gi.require_version('GtkLayerShell', '0.1')
|
||||||
|
from gi.repository import Gtk, Gdk, GtkLayerShell, GLib
|
||||||
|
import subprocess
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
|
||||||
|
# ── CSS ───────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
CSS = """
|
||||||
|
window {
|
||||||
|
background-color: rgba(52, 28, 74, 0.93);
|
||||||
|
border: 3px solid rgba(255, 121, 198, 0.78);
|
||||||
|
border-radius: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#container {
|
||||||
|
padding: 14px 20px 16px 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Labels ────────────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
#section-label {
|
||||||
|
color: rgba(248, 248, 242, 0.45);
|
||||||
|
font-family: "JetBrainsMono Nerd Font";
|
||||||
|
font-size: 10px;
|
||||||
|
font-weight: bold;
|
||||||
|
letter-spacing: 0.08em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#device-name {
|
||||||
|
color: rgba(248, 248, 242, 0.75);
|
||||||
|
font-family: "JetBrainsMono Nerd Font";
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pct-label {
|
||||||
|
color: #f8f8f2;
|
||||||
|
font-family: "JetBrainsMono Nerd Font";
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: bold;
|
||||||
|
min-width: 38px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#separator {
|
||||||
|
color: rgba(92, 73, 108, 0.50);
|
||||||
|
margin: 6px 0 4px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Boutons mute (icônes cliquables) ───────────────────────────────────────── */
|
||||||
|
|
||||||
|
#mute-icon {
|
||||||
|
font-family: "JetBrainsMono Nerd Font";
|
||||||
|
font-size: 17px;
|
||||||
|
color: #ff79c6;
|
||||||
|
background: transparent;
|
||||||
|
border: none;
|
||||||
|
border-radius: 6px;
|
||||||
|
padding: 0 4px;
|
||||||
|
min-width: 28px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#mute-icon:hover {
|
||||||
|
background: rgba(255, 121, 198, 0.15);
|
||||||
|
}
|
||||||
|
|
||||||
|
#mute-icon.muted {
|
||||||
|
color: rgba(243, 139, 168, 0.70);
|
||||||
|
}
|
||||||
|
|
||||||
|
#mic-icon {
|
||||||
|
font-family: "JetBrainsMono Nerd Font";
|
||||||
|
font-size: 17px;
|
||||||
|
color: #ff79c6;
|
||||||
|
background: transparent;
|
||||||
|
border: none;
|
||||||
|
border-radius: 6px;
|
||||||
|
padding: 0 4px;
|
||||||
|
min-width: 28px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#mic-icon:hover {
|
||||||
|
background: rgba(255, 121, 198, 0.15);
|
||||||
|
}
|
||||||
|
|
||||||
|
#mic-icon.muted {
|
||||||
|
color: rgba(243, 139, 168, 0.70);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Sliders audio (rose) ───────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
scale.audio trough {
|
||||||
|
background-color: rgba(92, 73, 108, 0.55);
|
||||||
|
border-radius: 3px;
|
||||||
|
min-height: 5px;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
scale.audio highlight {
|
||||||
|
background-color: #ff79c6;
|
||||||
|
border-radius: 3px;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
scale.audio.muted highlight {
|
||||||
|
background-color: rgba(108, 112, 134, 0.40);
|
||||||
|
}
|
||||||
|
|
||||||
|
scale.audio slider {
|
||||||
|
background-color: #f8f8f2;
|
||||||
|
border-radius: 50%;
|
||||||
|
min-width: 16px;
|
||||||
|
min-height: 16px;
|
||||||
|
border: 2px solid rgba(255, 121, 198, 0.80);
|
||||||
|
box-shadow: none;
|
||||||
|
transition: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
scale.audio slider:hover {
|
||||||
|
background-color: #e79cfe;
|
||||||
|
border-color: #ff79c6;
|
||||||
|
}
|
||||||
|
|
||||||
|
scale.audio.muted slider {
|
||||||
|
border-color: rgba(108, 112, 134, 0.60);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Slider luminosité (cyan) ───────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
scale.bright trough {
|
||||||
|
background-color: rgba(92, 73, 108, 0.55);
|
||||||
|
border-radius: 3px;
|
||||||
|
min-height: 5px;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
scale.bright highlight {
|
||||||
|
background-color: #8be9fd;
|
||||||
|
border-radius: 3px;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
scale.bright slider {
|
||||||
|
background-color: #f8f8f2;
|
||||||
|
border-radius: 50%;
|
||||||
|
min-width: 16px;
|
||||||
|
min-height: 16px;
|
||||||
|
border: 2px solid rgba(139, 233, 253, 0.80);
|
||||||
|
box-shadow: none;
|
||||||
|
transition: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
scale.bright slider:hover {
|
||||||
|
background-color: #8be9fd;
|
||||||
|
border-color: #8be9fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
#bright-icon {
|
||||||
|
color: #8be9fd;
|
||||||
|
font-family: "JetBrainsMono Nerd Font";
|
||||||
|
font-size: 17px;
|
||||||
|
min-width: 28px;
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
|
||||||
|
POPUP_WIDTH = 310
|
||||||
|
|
||||||
|
# ── Helpers ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
def run(cmd, **kw):
|
||||||
|
return subprocess.run(cmd, capture_output=True, text=True, timeout=2, **kw)
|
||||||
|
|
||||||
|
def get_sink_volume():
|
||||||
|
r = run(['wpctl', 'get-volume', '@DEFAULT_AUDIO_SINK@'])
|
||||||
|
parts = r.stdout.strip().split()
|
||||||
|
vol = int(float(parts[1]) * 100) if len(parts) >= 2 else 50
|
||||||
|
return min(max(vol, 0), 100), '[MUTED]' in r.stdout
|
||||||
|
|
||||||
|
def get_source_volume():
|
||||||
|
r = run(['wpctl', 'get-volume', '@DEFAULT_AUDIO_SOURCE@'])
|
||||||
|
parts = r.stdout.strip().split()
|
||||||
|
vol = int(float(parts[1]) * 100) if len(parts) >= 2 else 50
|
||||||
|
return min(max(vol, 0), 100), '[MUTED]' in r.stdout
|
||||||
|
|
||||||
|
def get_node_name(target):
|
||||||
|
r = run(['wpctl', 'inspect', target])
|
||||||
|
for field in ('node.description', 'node.nick'):
|
||||||
|
m = re.search(rf'{field}\s*=\s*"([^"]+)"', r.stdout)
|
||||||
|
if m:
|
||||||
|
return m.group(1)
|
||||||
|
return target
|
||||||
|
|
||||||
|
def set_sink_vol(v):
|
||||||
|
run(['wpctl', 'set-volume', '-l', '1.0', '@DEFAULT_AUDIO_SINK@', f'{v}%'])
|
||||||
|
_wob(v)
|
||||||
|
|
||||||
|
def set_source_vol(v):
|
||||||
|
run(['wpctl', 'set-volume', '@DEFAULT_AUDIO_SOURCE@', f'{v}%'])
|
||||||
|
|
||||||
|
def toggle_sink_mute():
|
||||||
|
run(['wpctl', 'set-mute', '@DEFAULT_AUDIO_SINK@', 'toggle'])
|
||||||
|
|
||||||
|
def toggle_source_mute():
|
||||||
|
run(['wpctl', 'set-mute', '@DEFAULT_AUDIO_SOURCE@', 'toggle'])
|
||||||
|
|
||||||
|
def get_brightness():
|
||||||
|
r = run(['brightnessctl', 'info'])
|
||||||
|
m = re.search(r'\((\d+)%\)', r.stdout)
|
||||||
|
return int(m.group(1)) if m else 50
|
||||||
|
|
||||||
|
def set_brightness(v):
|
||||||
|
v = max(1, v)
|
||||||
|
run(['brightnessctl', 'set', f'{v}%', '-q'])
|
||||||
|
_wob(v)
|
||||||
|
|
||||||
|
def _wob(v):
|
||||||
|
fifo = '/tmp/wob.fifo'
|
||||||
|
if os.path.exists(fifo):
|
||||||
|
try:
|
||||||
|
fd = os.open(fifo, os.O_WRONLY | os.O_NONBLOCK)
|
||||||
|
os.write(fd, f'{v}\n'.encode())
|
||||||
|
os.close(fd)
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def vol_icon(muted):
|
||||||
|
return '' if muted else ''
|
||||||
|
|
||||||
|
def mic_icon(muted):
|
||||||
|
return '' if muted else ''
|
||||||
|
|
||||||
|
def bright_icon(pct):
|
||||||
|
if pct < 34: return ''
|
||||||
|
if pct < 67: return ''
|
||||||
|
return ''
|
||||||
|
|
||||||
|
# ── Popup ─────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
class MediaPopup(Gtk.Window):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__()
|
||||||
|
self._blk = False
|
||||||
|
|
||||||
|
# ── Position ─────────────────────────────────────────────────────────
|
||||||
|
display = Gdk.Display.get_default()
|
||||||
|
monitor = display.get_primary_monitor() if display else None
|
||||||
|
screen_w = monitor.get_geometry().width if monitor else 1920
|
||||||
|
module_center = screen_w - 16 - 210
|
||||||
|
margin_left = max(0, module_center - POPUP_WIDTH // 2)
|
||||||
|
|
||||||
|
GtkLayerShell.init_for_window(self)
|
||||||
|
GtkLayerShell.set_layer(self, GtkLayerShell.Layer.OVERLAY)
|
||||||
|
GtkLayerShell.set_anchor(self, GtkLayerShell.Edge.TOP, True)
|
||||||
|
GtkLayerShell.set_anchor(self, GtkLayerShell.Edge.LEFT, True)
|
||||||
|
GtkLayerShell.set_margin(self, GtkLayerShell.Edge.TOP, 66)
|
||||||
|
GtkLayerShell.set_margin(self, GtkLayerShell.Edge.LEFT, margin_left)
|
||||||
|
GtkLayerShell.set_keyboard_mode(self, GtkLayerShell.KeyboardMode.ON_DEMAND)
|
||||||
|
GtkLayerShell.set_exclusive_zone(self, -1)
|
||||||
|
self.set_decorated(False)
|
||||||
|
self.set_resizable(False)
|
||||||
|
self.set_default_size(POPUP_WIDTH, -1)
|
||||||
|
|
||||||
|
# ── CSS ───────────────────────────────────────────────────────────────
|
||||||
|
provider = Gtk.CssProvider()
|
||||||
|
provider.load_from_data(CSS.encode())
|
||||||
|
Gtk.StyleContext.add_provider_for_screen(
|
||||||
|
Gdk.Screen.get_default(), provider,
|
||||||
|
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
|
||||||
|
)
|
||||||
|
|
||||||
|
# ── États initiaux ────────────────────────────────────────────────────
|
||||||
|
sink_vol, sink_muted = get_sink_volume()
|
||||||
|
src_vol, src_muted = get_source_volume()
|
||||||
|
self._sink_muted = sink_muted
|
||||||
|
self._src_muted = src_muted
|
||||||
|
|
||||||
|
# ── Layout ────────────────────────────────────────────────────────────
|
||||||
|
box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
|
||||||
|
box.set_name('container')
|
||||||
|
self.add(box)
|
||||||
|
|
||||||
|
# ╔═══ SORTIE ══════════════════════════════════════════════════════════╗
|
||||||
|
box.pack_start(self._section_header('SORTIE', ''), False, False, 0)
|
||||||
|
box.pack_start(self._device_label(
|
||||||
|
get_node_name('@DEFAULT_AUDIO_SINK@')), False, False, 2)
|
||||||
|
sink_row, self.sink_scale, self.sink_pct, self.sink_icon = \
|
||||||
|
self._slider_row(sink_vol, sink_muted, 'audio', vol_icon(sink_muted),
|
||||||
|
self._toggle_sink_mute, '@DEFAULT_AUDIO_SINK@')
|
||||||
|
box.pack_start(sink_row, False, False, 4)
|
||||||
|
|
||||||
|
# ╔═══ ENTRÉE ══════════════════════════════════════════════════════════╗
|
||||||
|
sep1 = Gtk.Label(label='─' * 34)
|
||||||
|
sep1.set_name('separator')
|
||||||
|
box.pack_start(sep1, False, False, 0)
|
||||||
|
|
||||||
|
box.pack_start(self._section_header('ENTRÉE', ''), False, False, 0)
|
||||||
|
box.pack_start(self._device_label(
|
||||||
|
get_node_name('@DEFAULT_AUDIO_SOURCE@')), False, False, 2)
|
||||||
|
src_row, self.src_scale, self.src_pct, self.src_icon = \
|
||||||
|
self._slider_row(src_vol, src_muted, 'audio', mic_icon(src_muted),
|
||||||
|
self._toggle_src_mute, '@DEFAULT_AUDIO_SOURCE@')
|
||||||
|
box.pack_start(src_row, False, False, 4)
|
||||||
|
|
||||||
|
# ╔═══ LUMINOSITÉ ══════════════════════════════════════════════════════╗
|
||||||
|
sep2 = Gtk.Label(label='─' * 34)
|
||||||
|
sep2.set_name('separator')
|
||||||
|
box.pack_start(sep2, False, False, 0)
|
||||||
|
|
||||||
|
bright_row, self.bright_scale, self.bright_pct, self.bright_icon_lbl = \
|
||||||
|
self._bright_row(get_brightness())
|
||||||
|
box.pack_start(bright_row, False, False, 6)
|
||||||
|
|
||||||
|
# ── Refresh + fermeture ───────────────────────────────────────────────
|
||||||
|
GLib.timeout_add(2000, self._refresh)
|
||||||
|
self.connect('key-press-event', lambda w, e:
|
||||||
|
self.destroy() if e.keyval == Gdk.KEY_Escape else None)
|
||||||
|
self.connect('focus-out-event', lambda *_: self.destroy())
|
||||||
|
self.show_all()
|
||||||
|
self.grab_focus()
|
||||||
|
|
||||||
|
# ── Builders UI ───────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
def _section_header(self, label, icon):
|
||||||
|
row = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=6)
|
||||||
|
ico = Gtk.Label(label=icon)
|
||||||
|
ico.set_name('section-label')
|
||||||
|
row.pack_start(ico, False, False, 0)
|
||||||
|
lbl = Gtk.Label(label=label)
|
||||||
|
lbl.set_name('section-label')
|
||||||
|
lbl.set_halign(Gtk.Align.START)
|
||||||
|
row.pack_start(lbl, True, True, 0)
|
||||||
|
return row
|
||||||
|
|
||||||
|
def _device_label(self, name):
|
||||||
|
lbl = Gtk.Label(label=name)
|
||||||
|
lbl.set_name('device-name')
|
||||||
|
lbl.set_halign(Gtk.Align.START)
|
||||||
|
lbl.set_ellipsize(3)
|
||||||
|
lbl.set_margin_start(4)
|
||||||
|
return lbl
|
||||||
|
|
||||||
|
def _slider_row(self, val, muted, css_class, icon_char, mute_cb, target):
|
||||||
|
"""Retourne (row, scale, pct_label, icon_btn)"""
|
||||||
|
row = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=6)
|
||||||
|
|
||||||
|
# Icône = bouton mute
|
||||||
|
icon_btn = Gtk.Button(label=icon_char)
|
||||||
|
icon_btn.set_name('mute-icon' if target == '@DEFAULT_AUDIO_SINK@' else 'mic-icon')
|
||||||
|
if muted:
|
||||||
|
icon_btn.get_style_context().add_class('muted')
|
||||||
|
icon_btn.connect('clicked', mute_cb)
|
||||||
|
row.pack_start(icon_btn, False, False, 0)
|
||||||
|
|
||||||
|
# Slider
|
||||||
|
scale = Gtk.Scale.new_with_range(Gtk.Orientation.HORIZONTAL, 0, 100, 5)
|
||||||
|
scale.set_value(val)
|
||||||
|
scale.set_draw_value(False)
|
||||||
|
scale.set_hexpand(True)
|
||||||
|
scale.get_style_context().add_class(css_class)
|
||||||
|
if muted:
|
||||||
|
scale.get_style_context().add_class('muted')
|
||||||
|
scale.connect('value-changed', lambda s, t=target:
|
||||||
|
self._on_audio_changed(s, pct_lbl, t))
|
||||||
|
row.pack_start(scale, True, True, 0)
|
||||||
|
|
||||||
|
# %
|
||||||
|
pct_lbl = Gtk.Label(label=f'{val}%')
|
||||||
|
pct_lbl.set_name('pct-label')
|
||||||
|
pct_lbl.set_halign(Gtk.Align.END)
|
||||||
|
row.pack_end(pct_lbl, False, False, 0)
|
||||||
|
|
||||||
|
return row, scale, pct_lbl, icon_btn
|
||||||
|
|
||||||
|
def _bright_row(self, pct):
|
||||||
|
row = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=8)
|
||||||
|
|
||||||
|
icon_lbl = Gtk.Label(label=bright_icon(pct))
|
||||||
|
icon_lbl.set_name('bright-icon')
|
||||||
|
row.pack_start(icon_lbl, False, False, 0)
|
||||||
|
|
||||||
|
scale = Gtk.Scale.new_with_range(Gtk.Orientation.HORIZONTAL, 1, 100, 5)
|
||||||
|
scale.set_value(pct)
|
||||||
|
scale.set_draw_value(False)
|
||||||
|
scale.set_hexpand(True)
|
||||||
|
scale.get_style_context().add_class('bright')
|
||||||
|
scale.connect('value-changed', self._on_bright_changed)
|
||||||
|
row.pack_start(scale, True, True, 0)
|
||||||
|
|
||||||
|
pct_lbl = Gtk.Label(label=f'{pct}%')
|
||||||
|
pct_lbl.set_name('pct-label')
|
||||||
|
pct_lbl.set_halign(Gtk.Align.END)
|
||||||
|
row.pack_end(pct_lbl, False, False, 0)
|
||||||
|
|
||||||
|
return row, scale, pct_lbl, icon_lbl
|
||||||
|
|
||||||
|
# ── Handlers ──────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
def _on_audio_changed(self, scale, pct_lbl, target):
|
||||||
|
if self._blk:
|
||||||
|
return
|
||||||
|
v = int(scale.get_value())
|
||||||
|
pct_lbl.set_label(f'{v}%')
|
||||||
|
if target == '@DEFAULT_AUDIO_SINK@':
|
||||||
|
set_sink_vol(v)
|
||||||
|
else:
|
||||||
|
set_source_vol(v)
|
||||||
|
|
||||||
|
def _on_bright_changed(self, scale):
|
||||||
|
if self._blk:
|
||||||
|
return
|
||||||
|
v = int(scale.get_value())
|
||||||
|
self.bright_pct.set_label(f'{v}%')
|
||||||
|
self.bright_icon_lbl.set_label(bright_icon(v))
|
||||||
|
set_brightness(v)
|
||||||
|
|
||||||
|
def _apply_mute(self, scale, icon_btn, muted, icon_fn):
|
||||||
|
sc = scale.get_style_context()
|
||||||
|
bc = icon_btn.get_style_context()
|
||||||
|
if muted:
|
||||||
|
sc.add_class('muted')
|
||||||
|
bc.add_class('muted')
|
||||||
|
else:
|
||||||
|
sc.remove_class('muted')
|
||||||
|
bc.remove_class('muted')
|
||||||
|
icon_btn.set_label(icon_fn(muted))
|
||||||
|
|
||||||
|
def _toggle_sink_mute(self, _btn):
|
||||||
|
toggle_sink_mute()
|
||||||
|
_, self._sink_muted = get_sink_volume()
|
||||||
|
self._apply_mute(self.sink_scale, self.sink_icon,
|
||||||
|
self._sink_muted, vol_icon)
|
||||||
|
|
||||||
|
def _toggle_src_mute(self, _btn):
|
||||||
|
toggle_source_mute()
|
||||||
|
_, self._src_muted = get_source_volume()
|
||||||
|
self._apply_mute(self.src_scale, self.src_icon,
|
||||||
|
self._src_muted, mic_icon)
|
||||||
|
|
||||||
|
def _refresh(self):
|
||||||
|
sink_vol, sink_muted = get_sink_volume()
|
||||||
|
src_vol, src_muted = get_source_volume()
|
||||||
|
|
||||||
|
if sink_muted != self._sink_muted:
|
||||||
|
self._sink_muted = sink_muted
|
||||||
|
self._apply_mute(self.sink_scale, self.sink_icon,
|
||||||
|
sink_muted, vol_icon)
|
||||||
|
if src_muted != self._src_muted:
|
||||||
|
self._src_muted = src_muted
|
||||||
|
self._apply_mute(self.src_scale, self.src_icon,
|
||||||
|
src_muted, mic_icon)
|
||||||
|
|
||||||
|
self._blk = True
|
||||||
|
self.sink_scale.set_value(sink_vol)
|
||||||
|
self.sink_pct.set_label(f'{sink_vol}%')
|
||||||
|
self.src_scale.set_value(src_vol)
|
||||||
|
self.src_pct.set_label(f'{src_vol}%')
|
||||||
|
self._blk = False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
win = MediaPopup()
|
||||||
|
win.connect('destroy', Gtk.main_quit)
|
||||||
|
Gtk.main()
|
||||||
422
INSTALL/configs/waybar/scripts/vc-volume-popup.py
Executable file
422
INSTALL/configs/waybar/scripts/vc-volume-popup.py
Executable file
@@ -0,0 +1,422 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# vc-volume-popup.py — Popup volume slider violet-chaton
|
||||||
|
# Lancé par le clic sur le module wireplumber de waybar
|
||||||
|
|
||||||
|
import gi
|
||||||
|
gi.require_version('Gtk', '3.0')
|
||||||
|
gi.require_version('GtkLayerShell', '0.1')
|
||||||
|
from gi.repository import Gtk, Gdk, GtkLayerShell, GLib
|
||||||
|
import subprocess
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
|
||||||
|
# ── CSS ───────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
CSS = b"""
|
||||||
|
window {
|
||||||
|
background-color: rgba(52, 28, 74, 0.93);
|
||||||
|
border: 3px solid rgba(255, 121, 198, 0.78);
|
||||||
|
border-radius: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#container {
|
||||||
|
padding: 14px 20px 16px 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#vol-icon {
|
||||||
|
color: #ff79c6;
|
||||||
|
font-family: "JetBrainsMono Nerd Font";
|
||||||
|
font-size: 18px;
|
||||||
|
min-width: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#vol-title {
|
||||||
|
color: rgba(248, 248, 242, 0.55);
|
||||||
|
font-family: "JetBrainsMono Nerd Font";
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sink-name {
|
||||||
|
color: #8be9fd;
|
||||||
|
font-family: "JetBrainsMono Nerd Font";
|
||||||
|
font-size: 11px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
#vol-pct {
|
||||||
|
color: #f8f8f2;
|
||||||
|
font-family: "JetBrainsMono Nerd Font";
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: bold;
|
||||||
|
min-width: 44px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#separator {
|
||||||
|
color: rgba(92, 73, 108, 0.60);
|
||||||
|
margin: 4px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
scale trough {
|
||||||
|
background-color: rgba(92, 73, 108, 0.55);
|
||||||
|
border-radius: 3px;
|
||||||
|
min-height: 6px;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
scale highlight {
|
||||||
|
background-color: #ff79c6;
|
||||||
|
border-radius: 3px;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
scale slider {
|
||||||
|
background-color: #f8f8f2;
|
||||||
|
border-radius: 50%;
|
||||||
|
min-width: 18px;
|
||||||
|
min-height: 18px;
|
||||||
|
border: 2px solid rgba(255, 121, 198, 0.80);
|
||||||
|
box-shadow: none;
|
||||||
|
transition: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
scale slider:hover {
|
||||||
|
background-color: #e79cfe;
|
||||||
|
border-color: #ff79c6;
|
||||||
|
}
|
||||||
|
|
||||||
|
#mute-btn {
|
||||||
|
background: rgba(73, 49, 97, 0.50);
|
||||||
|
border: 1px solid rgba(92, 73, 108, 0.60);
|
||||||
|
border-radius: 8px;
|
||||||
|
color: rgba(248, 248, 242, 0.65);
|
||||||
|
font-family: "JetBrainsMono Nerd Font";
|
||||||
|
font-size: 12px;
|
||||||
|
padding: 5px 16px;
|
||||||
|
margin-top: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#mute-btn:hover {
|
||||||
|
background: rgba(255, 121, 198, 0.18);
|
||||||
|
border-color: rgba(255, 121, 198, 0.45);
|
||||||
|
color: #ff79c6;
|
||||||
|
}
|
||||||
|
|
||||||
|
#mute-btn.muted {
|
||||||
|
color: #f38ba8;
|
||||||
|
border-color: rgba(243, 139, 168, 0.45);
|
||||||
|
background: rgba(243, 139, 168, 0.10);
|
||||||
|
}
|
||||||
|
|
||||||
|
#mic-btn {
|
||||||
|
background: rgba(73, 49, 97, 0.50);
|
||||||
|
border: 1px solid rgba(139, 233, 253, 0.35);
|
||||||
|
border-radius: 8px;
|
||||||
|
color: #8be9fd;
|
||||||
|
font-family: "JetBrainsMono Nerd Font";
|
||||||
|
font-size: 12px;
|
||||||
|
padding: 5px 16px;
|
||||||
|
margin-top: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#mic-btn:hover {
|
||||||
|
background: rgba(139, 233, 253, 0.12);
|
||||||
|
border-color: rgba(139, 233, 253, 0.60);
|
||||||
|
color: #8be9fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
#mic-btn.muted {
|
||||||
|
color: #f38ba8;
|
||||||
|
border-color: rgba(243, 139, 168, 0.45);
|
||||||
|
background: rgba(243, 139, 168, 0.10);
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
|
||||||
|
POPUP_WIDTH = 300
|
||||||
|
|
||||||
|
# ── Audio helpers ─────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
def get_volume():
|
||||||
|
"""Retourne (volume 0-100, is_muted)"""
|
||||||
|
try:
|
||||||
|
r = subprocess.run(
|
||||||
|
['wpctl', 'get-volume', '@DEFAULT_AUDIO_SINK@'],
|
||||||
|
capture_output=True, text=True, timeout=2
|
||||||
|
)
|
||||||
|
parts = r.stdout.strip().split()
|
||||||
|
vol = int(float(parts[1]) * 100)
|
||||||
|
muted = '[MUTED]' in r.stdout
|
||||||
|
return min(max(vol, 0), 100), muted
|
||||||
|
except Exception:
|
||||||
|
return 50, False
|
||||||
|
|
||||||
|
def get_sink_name():
|
||||||
|
"""Retourne le nom humain de la sortie audio active."""
|
||||||
|
try:
|
||||||
|
r = subprocess.run(
|
||||||
|
['wpctl', 'inspect', '@DEFAULT_AUDIO_SINK@'],
|
||||||
|
capture_output=True, text=True, timeout=2
|
||||||
|
)
|
||||||
|
# Chercher node.description en priorité, sinon node.nick
|
||||||
|
for field in ('node.description', 'node.nick'):
|
||||||
|
m = re.search(rf'{field}\s*=\s*"([^"]+)"', r.stdout)
|
||||||
|
if m:
|
||||||
|
return m.group(1)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
return 'Sortie audio'
|
||||||
|
|
||||||
|
def set_volume(vol):
|
||||||
|
subprocess.run(
|
||||||
|
['wpctl', 'set-volume', '-l', '1.0', '@DEFAULT_AUDIO_SINK@', f'{vol}%'],
|
||||||
|
capture_output=True
|
||||||
|
)
|
||||||
|
# Feedback wob (non-bloquant)
|
||||||
|
fifo = '/tmp/wob.fifo'
|
||||||
|
if os.path.exists(fifo):
|
||||||
|
try:
|
||||||
|
fd = os.open(fifo, os.O_WRONLY | os.O_NONBLOCK)
|
||||||
|
os.write(fd, f'{vol}\n'.encode())
|
||||||
|
os.close(fd)
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def toggle_mute():
|
||||||
|
subprocess.run(
|
||||||
|
['wpctl', 'set-mute', '@DEFAULT_AUDIO_SINK@', 'toggle'],
|
||||||
|
capture_output=True
|
||||||
|
)
|
||||||
|
|
||||||
|
def get_mic_muted():
|
||||||
|
"""Retourne True si le micro actif est muté."""
|
||||||
|
try:
|
||||||
|
r = subprocess.run(
|
||||||
|
['wpctl', 'get-volume', '@DEFAULT_AUDIO_SOURCE@'],
|
||||||
|
capture_output=True, text=True, timeout=2
|
||||||
|
)
|
||||||
|
return '[MUTED]' in r.stdout
|
||||||
|
except Exception:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def toggle_mic_mute():
|
||||||
|
subprocess.run(
|
||||||
|
['wpctl', 'set-mute', '@DEFAULT_AUDIO_SOURCE@', 'toggle'],
|
||||||
|
capture_output=True
|
||||||
|
)
|
||||||
|
|
||||||
|
def vol_icon(vol, muted):
|
||||||
|
if muted or vol == 0:
|
||||||
|
return ''
|
||||||
|
if vol < 50:
|
||||||
|
return ''
|
||||||
|
return ''
|
||||||
|
|
||||||
|
# ── Popup ─────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
class VolumePopup(Gtk.Window):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__()
|
||||||
|
self._blocked = False
|
||||||
|
|
||||||
|
# ── Position : centré sous le module wireplumber ──────────────────────
|
||||||
|
# Wireplumber = 1er module de la pill droite (côté droit de l'écran).
|
||||||
|
# On centre le popup horizontalement sous ce module.
|
||||||
|
display = Gdk.Display.get_default()
|
||||||
|
monitor = display.get_primary_monitor() if display else None
|
||||||
|
if monitor:
|
||||||
|
screen_w = monitor.get_geometry().width
|
||||||
|
else:
|
||||||
|
screen_w = 1920 # fallback
|
||||||
|
|
||||||
|
# La pill droite a ~16px de marge depuis le bord droit.
|
||||||
|
# Le module wireplumber est le 1er élément : ~180px depuis le bord droit.
|
||||||
|
module_center = screen_w - 16 - 180
|
||||||
|
margin_left = max(0, module_center - POPUP_WIDTH // 2)
|
||||||
|
|
||||||
|
GtkLayerShell.init_for_window(self)
|
||||||
|
GtkLayerShell.set_layer(self, GtkLayerShell.Layer.OVERLAY)
|
||||||
|
GtkLayerShell.set_anchor(self, GtkLayerShell.Edge.TOP, True)
|
||||||
|
GtkLayerShell.set_anchor(self, GtkLayerShell.Edge.LEFT, True)
|
||||||
|
GtkLayerShell.set_margin(self, GtkLayerShell.Edge.TOP, 66)
|
||||||
|
GtkLayerShell.set_margin(self, GtkLayerShell.Edge.LEFT, margin_left)
|
||||||
|
GtkLayerShell.set_keyboard_mode(self, GtkLayerShell.KeyboardMode.ON_DEMAND)
|
||||||
|
GtkLayerShell.set_exclusive_zone(self, -1)
|
||||||
|
|
||||||
|
self.set_decorated(False)
|
||||||
|
self.set_resizable(False)
|
||||||
|
self.set_default_size(POPUP_WIDTH, -1)
|
||||||
|
|
||||||
|
# ── CSS ───────────────────────────────────────────────────────────────
|
||||||
|
provider = Gtk.CssProvider()
|
||||||
|
provider.load_from_data(CSS)
|
||||||
|
Gtk.StyleContext.add_provider_for_screen(
|
||||||
|
Gdk.Screen.get_default(),
|
||||||
|
provider,
|
||||||
|
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
|
||||||
|
)
|
||||||
|
|
||||||
|
# ── État initial ──────────────────────────────────────────────────────
|
||||||
|
vol, muted = get_volume()
|
||||||
|
self._muted = muted
|
||||||
|
self._mic_muted = get_mic_muted()
|
||||||
|
sink = get_sink_name()
|
||||||
|
|
||||||
|
# ── Layout ────────────────────────────────────────────────────────────
|
||||||
|
container = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
|
||||||
|
container.set_name('container')
|
||||||
|
self.add(container)
|
||||||
|
|
||||||
|
# Ligne sink (sortie active)
|
||||||
|
sink_row = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=6)
|
||||||
|
sink_icon = Gtk.Label(label='')
|
||||||
|
sink_icon.set_name('vol-title')
|
||||||
|
sink_row.pack_start(sink_icon, False, False, 0)
|
||||||
|
self.sink_label = Gtk.Label(label=sink)
|
||||||
|
self.sink_label.set_name('sink-name')
|
||||||
|
self.sink_label.set_halign(Gtk.Align.START)
|
||||||
|
self.sink_label.set_ellipsize(3) # PANGO_ELLIPSIZE_END
|
||||||
|
sink_row.pack_start(self.sink_label, True, True, 0)
|
||||||
|
container.pack_start(sink_row, False, False, 0)
|
||||||
|
|
||||||
|
# Séparateur
|
||||||
|
sep = Gtk.Label(label='─' * 30)
|
||||||
|
sep.set_name('separator')
|
||||||
|
container.pack_start(sep, False, False, 4)
|
||||||
|
|
||||||
|
# En-tête volume : icône + "Volume" + %
|
||||||
|
header = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=8)
|
||||||
|
self.icon = Gtk.Label(label=vol_icon(vol, muted))
|
||||||
|
self.icon.set_name('vol-icon')
|
||||||
|
header.pack_start(self.icon, False, False, 0)
|
||||||
|
|
||||||
|
title = Gtk.Label(label='Volume')
|
||||||
|
title.set_name('vol-title')
|
||||||
|
title.set_halign(Gtk.Align.START)
|
||||||
|
header.pack_start(title, True, True, 0)
|
||||||
|
|
||||||
|
self.pct = Gtk.Label(label=f'{vol}%')
|
||||||
|
self.pct.set_name('vol-pct')
|
||||||
|
self.pct.set_halign(Gtk.Align.END)
|
||||||
|
header.pack_end(self.pct, False, False, 0)
|
||||||
|
container.pack_start(header, False, False, 0)
|
||||||
|
|
||||||
|
# Slider
|
||||||
|
self.scale = Gtk.Scale.new_with_range(
|
||||||
|
Gtk.Orientation.HORIZONTAL, 0, 100, 5
|
||||||
|
)
|
||||||
|
self.scale.set_value(vol)
|
||||||
|
self.scale.set_draw_value(False)
|
||||||
|
self.scale.set_hexpand(True)
|
||||||
|
self.scale.connect('value-changed', self._on_changed)
|
||||||
|
container.pack_start(self.scale, False, False, 0)
|
||||||
|
|
||||||
|
# Bouton mute
|
||||||
|
self.mute_btn = Gtk.Button(label=f' {"Remettre le son" if muted else "Muet"}')
|
||||||
|
self.mute_btn.set_name('mute-btn')
|
||||||
|
self.mute_btn.set_halign(Gtk.Align.CENTER)
|
||||||
|
if muted:
|
||||||
|
self.mute_btn.get_style_context().add_class('muted')
|
||||||
|
self.mute_btn.connect('clicked', self._on_mute)
|
||||||
|
container.pack_start(self.mute_btn, False, False, 0)
|
||||||
|
|
||||||
|
# ── Section micro ─────────────────────────────────────────────────────
|
||||||
|
sep2 = Gtk.Label(label='─' * 30)
|
||||||
|
sep2.set_name('separator')
|
||||||
|
container.pack_start(sep2, False, False, 4)
|
||||||
|
|
||||||
|
mic_row = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=8)
|
||||||
|
mic_icon = Gtk.Label(label='')
|
||||||
|
mic_icon.set_name('vol-title')
|
||||||
|
mic_icon.set_markup('<span font_family="JetBrainsMono Nerd Font" size="large"></span>')
|
||||||
|
mic_row.pack_start(mic_icon, False, False, 0)
|
||||||
|
|
||||||
|
mic_title = Gtk.Label(label='Micro')
|
||||||
|
mic_title.set_name('vol-title')
|
||||||
|
mic_title.set_halign(Gtk.Align.START)
|
||||||
|
mic_row.pack_start(mic_title, True, True, 0)
|
||||||
|
|
||||||
|
mic_label = ' Coupé' if self._mic_muted else ' Actif'
|
||||||
|
self.mic_btn = Gtk.Button(label=mic_label)
|
||||||
|
self.mic_btn.set_name('mic-btn')
|
||||||
|
if self._mic_muted:
|
||||||
|
self.mic_btn.get_style_context().add_class('muted')
|
||||||
|
self.mic_btn.connect('clicked', self._on_mic_mute)
|
||||||
|
mic_row.pack_end(self.mic_btn, False, False, 0)
|
||||||
|
|
||||||
|
container.pack_start(mic_row, False, False, 0)
|
||||||
|
|
||||||
|
# ── Refresh périodique (détecte changement de sink/micro) ─────────────
|
||||||
|
GLib.timeout_add(2000, self._refresh_sink)
|
||||||
|
|
||||||
|
# ── Fermeture ─────────────────────────────────────────────────────────
|
||||||
|
self.connect('key-press-event', self._on_key)
|
||||||
|
self.connect('focus-out-event', lambda *_: self.destroy())
|
||||||
|
|
||||||
|
self.show_all()
|
||||||
|
self.grab_focus()
|
||||||
|
|
||||||
|
def _on_changed(self, scale):
|
||||||
|
if self._blocked:
|
||||||
|
return
|
||||||
|
vol = int(scale.get_value())
|
||||||
|
self.pct.set_label(f'{vol}%')
|
||||||
|
self.icon.set_label(vol_icon(vol, self._muted))
|
||||||
|
set_volume(vol)
|
||||||
|
|
||||||
|
def _on_mute(self, btn):
|
||||||
|
toggle_mute()
|
||||||
|
_, self._muted = get_volume()
|
||||||
|
vol = int(self.scale.get_value())
|
||||||
|
self.icon.set_label(vol_icon(vol, self._muted))
|
||||||
|
if self._muted:
|
||||||
|
btn.get_style_context().add_class('muted')
|
||||||
|
btn.set_label(' Remettre le son')
|
||||||
|
else:
|
||||||
|
btn.get_style_context().remove_class('muted')
|
||||||
|
btn.set_label(' Muet')
|
||||||
|
|
||||||
|
def _refresh_sink(self):
|
||||||
|
"""Met à jour la sortie et l'état du micro si changement détecté."""
|
||||||
|
# Sortie audio
|
||||||
|
sink = get_sink_name()
|
||||||
|
if self.sink_label.get_label() != sink:
|
||||||
|
self.sink_label.set_label(sink)
|
||||||
|
vol, muted = get_volume()
|
||||||
|
self._blocked = True
|
||||||
|
self.scale.set_value(vol)
|
||||||
|
self._blocked = False
|
||||||
|
self.pct.set_label(f'{vol}%')
|
||||||
|
self._muted = muted
|
||||||
|
self.icon.set_label(vol_icon(vol, muted))
|
||||||
|
|
||||||
|
# Micro
|
||||||
|
mic_muted = get_mic_muted()
|
||||||
|
if mic_muted != self._mic_muted:
|
||||||
|
self._mic_muted = mic_muted
|
||||||
|
if mic_muted:
|
||||||
|
self.mic_btn.get_style_context().add_class('muted')
|
||||||
|
self.mic_btn.set_label(' Coupé')
|
||||||
|
else:
|
||||||
|
self.mic_btn.get_style_context().remove_class('muted')
|
||||||
|
self.mic_btn.set_label(' Actif')
|
||||||
|
|
||||||
|
return True # continuer le timer
|
||||||
|
|
||||||
|
def _on_mic_mute(self, btn):
|
||||||
|
toggle_mic_mute()
|
||||||
|
self._mic_muted = get_mic_muted()
|
||||||
|
if self._mic_muted:
|
||||||
|
btn.get_style_context().add_class('muted')
|
||||||
|
btn.set_label(' Coupé')
|
||||||
|
else:
|
||||||
|
btn.get_style_context().remove_class('muted')
|
||||||
|
btn.set_label(' Actif')
|
||||||
|
|
||||||
|
def _on_key(self, _widget, event):
|
||||||
|
if event.keyval == Gdk.KEY_Escape:
|
||||||
|
self.destroy()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
win = VolumePopup()
|
||||||
|
win.connect('destroy', Gtk.main_quit)
|
||||||
|
Gtk.main()
|
||||||
17
INSTALL/configs/waybar/scripts/wob-brightness.sh
Executable file
17
INSTALL/configs/waybar/scripts/wob-brightness.sh
Executable file
@@ -0,0 +1,17 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# wob-brightness.sh — scroll luminosité + feedback wob
|
||||||
|
# Usage: wob-brightness.sh up|down
|
||||||
|
|
||||||
|
STEP=5
|
||||||
|
FIFO="/tmp/wob.fifo"
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
up) brightnessctl set "${STEP}%+" -q ;;
|
||||||
|
down) brightnessctl set "${STEP}%-" -q ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Feedback wob si le daemon tourne
|
||||||
|
if [[ -p "$FIFO" ]] && pgrep -x wob >/dev/null 2>&1; then
|
||||||
|
BRIGHT=$(brightnessctl -m 2>/dev/null | awk -F, '{gsub(/%/,"",$4); print int($4)}')
|
||||||
|
echo "$BRIGHT" > "$FIFO"
|
||||||
|
fi
|
||||||
16
INSTALL/configs/waybar/scripts/wob-start.sh
Executable file
16
INSTALL/configs/waybar/scripts/wob-start.sh
Executable file
@@ -0,0 +1,16 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# wob-start.sh — lance le daemon wob via FIFO
|
||||||
|
# Appelé au démarrage de session (autostart)
|
||||||
|
|
||||||
|
FIFO="/tmp/wob.fifo"
|
||||||
|
|
||||||
|
pkill wob 2>/dev/null
|
||||||
|
rm -f "$FIFO"
|
||||||
|
mkfifo "$FIFO"
|
||||||
|
|
||||||
|
# Ouvrir le FIFO en lecture+écriture sur fd3 :
|
||||||
|
# - empêche wob de recevoir EOF entre deux écritures
|
||||||
|
# - wob hérite du fd et reste vivant même après la fin de ce script
|
||||||
|
exec 3<> "$FIFO"
|
||||||
|
wob --config "$HOME/.config/wob.ini" <&3 &
|
||||||
|
disown $!
|
||||||
28
INSTALL/configs/waybar/scripts/wob-volume.sh
Executable file
28
INSTALL/configs/waybar/scripts/wob-volume.sh
Executable file
@@ -0,0 +1,28 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# wob-volume.sh — scroll volume + feedback wob
|
||||||
|
# Usage: wob-volume.sh up|down|mute
|
||||||
|
|
||||||
|
STEP=5
|
||||||
|
FIFO="/tmp/wob.fifo"
|
||||||
|
|
||||||
|
get_vol() {
|
||||||
|
wpctl get-volume @DEFAULT_AUDIO_SINK@ 2>/dev/null | \
|
||||||
|
LC_ALL=C awk '{v=int($2*100); if(v>100)v=100; print v}'
|
||||||
|
}
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
up)
|
||||||
|
wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ "${STEP}%+"
|
||||||
|
;;
|
||||||
|
down)
|
||||||
|
wpctl set-volume @DEFAULT_AUDIO_SINK@ "${STEP}%-"
|
||||||
|
;;
|
||||||
|
mute)
|
||||||
|
wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Feedback wob si le daemon tourne
|
||||||
|
if [[ -p "$FIFO" ]] && pgrep -x wob >/dev/null 2>&1; then
|
||||||
|
echo "$(get_vol)" > "$FIFO"
|
||||||
|
fi
|
||||||
20
INSTALL/configs/wob/wob.ini
Normal file
20
INSTALL/configs/wob/wob.ini
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# ── violet-chaton wob config (v0.14.2) ───────────────────────────────────────
|
||||||
|
|
||||||
|
timeout = 1000
|
||||||
|
max = 100
|
||||||
|
width = 260
|
||||||
|
height = 36
|
||||||
|
border_offset = 4
|
||||||
|
border_size = 2
|
||||||
|
bar_padding = 4
|
||||||
|
anchor = bottom
|
||||||
|
margin = 40
|
||||||
|
|
||||||
|
background_color = 261537e0
|
||||||
|
border_color = 5C496Ccc
|
||||||
|
bar_color = ff79c6ff
|
||||||
|
|
||||||
|
overflow_mode = wrap
|
||||||
|
overflow_bar_color = f38ba8ff
|
||||||
|
overflow_background_color = 261537e0
|
||||||
|
overflow_border_color = f38ba8cc
|
||||||
7
INSTALL/configs/wofi/config
Normal file
7
INSTALL/configs/wofi/config
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
allow_markup=true
|
||||||
|
insensitive=true
|
||||||
|
hide_scroll=true
|
||||||
|
matching=contains
|
||||||
|
no_actions=true
|
||||||
|
layer=overlay
|
||||||
|
lines=15
|
||||||
@@ -82,6 +82,15 @@ else
|
|||||||
fail "CosmicTheme.Dark"
|
fail "CosmicTheme.Dark"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
step "COSMIC Theme Light..."
|
||||||
|
backup_dir "$COSMIC_DST/com.system76.CosmicTheme.Light/v1"
|
||||||
|
ensure_dir "$COSMIC_DST/com.system76.CosmicTheme.Light/v1"
|
||||||
|
if cp "$COSMIC_SRC/com.system76.CosmicTheme.Light/v1/"* "$COSMIC_DST/com.system76.CosmicTheme.Light/v1/" 2>/dev/null; then
|
||||||
|
ok "CosmicTheme.Light"
|
||||||
|
else
|
||||||
|
fail "CosmicTheme.Light"
|
||||||
|
fi
|
||||||
|
|
||||||
step "COSMIC Theme Mode (dark)..."
|
step "COSMIC Theme Mode (dark)..."
|
||||||
backup_dir "$COSMIC_DST/com.system76.CosmicTheme.Mode/v1"
|
backup_dir "$COSMIC_DST/com.system76.CosmicTheme.Mode/v1"
|
||||||
ensure_dir "$COSMIC_DST/com.system76.CosmicTheme.Mode/v1"
|
ensure_dir "$COSMIC_DST/com.system76.CosmicTheme.Mode/v1"
|
||||||
@@ -205,6 +214,78 @@ PYEOF
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# ── Waybar ─────────────────────────────────────────────────────────────────────
|
||||||
|
section "Waybar — island floating 3 pills"
|
||||||
|
deploy_file "$CONFIGS/waybar/config" "$HOME/.config/waybar/config"
|
||||||
|
deploy_file "$THEMES/violet-chaton-waybar.css" "$HOME/.config/waybar/style.css"
|
||||||
|
deploy_file "$CONFIGS/waybar/cava-waybar.cfg" "$HOME/.config/waybar/cava-waybar.cfg"
|
||||||
|
|
||||||
|
step "Scripts waybar..."
|
||||||
|
ensure_dir "$HOME/.config/waybar/scripts"
|
||||||
|
for script in "$CONFIGS/waybar/scripts/"*.sh; do
|
||||||
|
dst="$HOME/.config/waybar/scripts/$(basename "$script")"
|
||||||
|
cp "$script" "$dst" && chmod +x "$dst"
|
||||||
|
done
|
||||||
|
for script in "$CONFIGS/waybar/scripts/"*.py; do
|
||||||
|
dst="$HOME/.config/waybar/scripts/$(basename "$script")"
|
||||||
|
cp "$script" "$dst" && chmod +x "$dst"
|
||||||
|
done
|
||||||
|
ok "Scripts waybar"
|
||||||
|
|
||||||
|
# ── Autostart ───────────────────────────────────────────────────────────────────
|
||||||
|
section "Autostart — waybar + wob"
|
||||||
|
ensure_dir "$HOME/.config/autostart"
|
||||||
|
deploy_file "$CONFIGS/autostart/waybar.desktop" "$HOME/.config/autostart/waybar.desktop"
|
||||||
|
deploy_file "$CONFIGS/autostart/wob.desktop" "$HOME/.config/autostart/wob.desktop"
|
||||||
|
|
||||||
|
# ── Règle sudoers — profil énergie ──────────────────────────────────────────────
|
||||||
|
section "Sudoers — profil énergie ACPI"
|
||||||
|
SUDOERS_FILE="/etc/sudoers.d/waybar-power-profile"
|
||||||
|
SUDOERS_RULE="$USER ALL=(ALL) NOPASSWD: /usr/bin/tee /sys/firmware/acpi/platform_profile"
|
||||||
|
if [ -f "$SUDOERS_FILE" ]; then
|
||||||
|
ok "Règle sudoers déjà présente"
|
||||||
|
else
|
||||||
|
step "Création de la règle sudoers (mot de passe sudo requis)..."
|
||||||
|
echo "$SUDOERS_RULE" > /tmp/waybar-pp-sudoers
|
||||||
|
if sudo cp /tmp/waybar-pp-sudoers "$SUDOERS_FILE" && sudo chmod 440 "$SUDOERS_FILE"; then
|
||||||
|
rm -f /tmp/waybar-pp-sudoers
|
||||||
|
ok "Règle sudoers créée"
|
||||||
|
else
|
||||||
|
rm -f /tmp/waybar-pp-sudoers
|
||||||
|
warn "Échec sudoers — changement de profil énergie nécessitera sudo"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ── Règle udev — permissions platform_profile ────────────────────────────────
|
||||||
|
section "udev — platform_profile accessible au groupe video"
|
||||||
|
UDEV_FILE="/etc/udev/rules.d/90-platform-profile.rules"
|
||||||
|
if [ -f "$UDEV_FILE" ]; then
|
||||||
|
ok "Règle udev déjà présente"
|
||||||
|
else
|
||||||
|
step "Création de la règle udev (mot de passe sudo requis)..."
|
||||||
|
echo 'ACTION=="add|change", KERNEL=="platform_profile", SUBSYSTEM=="acpi", RUN+="/bin/chmod g+w /sys/firmware/acpi/platform_profile", RUN+="/bin/chgrp video /sys/firmware/acpi/platform_profile"' \
|
||||||
|
> /tmp/90-platform-profile.rules
|
||||||
|
if sudo cp /tmp/90-platform-profile.rules "$UDEV_FILE" && sudo chmod 644 "$UDEV_FILE"; then
|
||||||
|
rm -f /tmp/90-platform-profile.rules
|
||||||
|
sudo chmod g+w /sys/firmware/acpi/platform_profile 2>/dev/null
|
||||||
|
sudo chgrp video /sys/firmware/acpi/platform_profile 2>/dev/null
|
||||||
|
ok "Règle udev créée"
|
||||||
|
else
|
||||||
|
rm -f /tmp/90-platform-profile.rules
|
||||||
|
warn "Échec udev — redémarrage requis pour les permissions platform_profile"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ── Rofi ────────────────────────────────────────────────────────────────────────
|
||||||
|
section "Rofi — thème violet-chaton"
|
||||||
|
ensure_dir "$HOME/.config/rofi"
|
||||||
|
deploy_file "$CONFIGS/rofi/config.rasi" "$HOME/.config/rofi/config.rasi"
|
||||||
|
deploy_file "$THEMES/violet-chaton-rofi.rasi" "$HOME/.config/rofi/violet-chaton.rasi"
|
||||||
|
|
||||||
|
# ── wob ─────────────────────────────────────────────────────────────────────────
|
||||||
|
section "wob — overlay volume/luminosité"
|
||||||
|
deploy_file "$CONFIGS/wob/wob.ini" "$HOME/.config/wob.ini"
|
||||||
|
|
||||||
# ── Logo fastfetch ─────────────────────────────────────────────────────────────
|
# ── Logo fastfetch ─────────────────────────────────────────────────────────────
|
||||||
section "Logo fastfetch"
|
section "Logo fastfetch"
|
||||||
if [ -f "$SCRIPT_DIR/assets/violet-chaton-logo.png" ]; then
|
if [ -f "$SCRIPT_DIR/assets/violet-chaton-logo.png" ]; then
|
||||||
|
|||||||
@@ -0,0 +1,74 @@
|
|||||||
|
(
|
||||||
|
base: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
hover: (
|
||||||
|
red: 0.7988549,
|
||||||
|
green: 0.5659659,
|
||||||
|
blue: 0.8900906,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
pressed: (
|
||||||
|
red: 0.81436175,
|
||||||
|
green: 0.6745583,
|
||||||
|
blue: 0.91372323,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
selected: (
|
||||||
|
red: 0.7988549,
|
||||||
|
green: 0.5659659,
|
||||||
|
blue: 0.8900906,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
selected_text: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
focus: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
divider: (
|
||||||
|
red: 0.9999203,
|
||||||
|
green: 0.99998146,
|
||||||
|
blue: 1.0,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
on: (
|
||||||
|
red: 0.9999203,
|
||||||
|
green: 0.99998146,
|
||||||
|
blue: 1.0,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
on_disabled: (
|
||||||
|
red: 0.9529013,
|
||||||
|
green: 0.8058731,
|
||||||
|
blue: 0.99803925,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
border: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled_border: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 0.5,
|
||||||
|
),
|
||||||
|
)
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
(
|
||||||
|
base: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
hover: (
|
||||||
|
red: 0.7988549,
|
||||||
|
green: 0.5659659,
|
||||||
|
blue: 0.8900906,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
pressed: (
|
||||||
|
red: 0.81436175,
|
||||||
|
green: 0.6745583,
|
||||||
|
blue: 0.91372323,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
selected: (
|
||||||
|
red: 0.7988549,
|
||||||
|
green: 0.5659659,
|
||||||
|
blue: 0.8900906,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
selected_text: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
focus: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
divider: (
|
||||||
|
red: 0.84878576,
|
||||||
|
green: 0.8639131,
|
||||||
|
blue: 0.9608068,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
on: (
|
||||||
|
red: 0.9999203,
|
||||||
|
green: 0.99998146,
|
||||||
|
blue: 1.0,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
on_disabled: (
|
||||||
|
red: 0.9999203,
|
||||||
|
green: 0.99998146,
|
||||||
|
blue: 1.0,
|
||||||
|
alpha: 0.5,
|
||||||
|
),
|
||||||
|
border: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled_border: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 0.5,
|
||||||
|
),
|
||||||
|
)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
None
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
3
|
||||||
@@ -0,0 +1,100 @@
|
|||||||
|
(
|
||||||
|
base: (
|
||||||
|
red: 0.20392156,
|
||||||
|
green: 0.109803915,
|
||||||
|
blue: 0.2901961,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
component: (
|
||||||
|
base: (
|
||||||
|
red: 0.28618598,
|
||||||
|
green: 0.19189146,
|
||||||
|
blue: 0.3797182,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
hover: (
|
||||||
|
red: 0.25756738,
|
||||||
|
green: 0.17270231,
|
||||||
|
blue: 0.3417464,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
pressed: (
|
||||||
|
red: 0.22894879,
|
||||||
|
green: 0.15351318,
|
||||||
|
blue: 0.30377457,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
selected: (
|
||||||
|
red: 0.25756738,
|
||||||
|
green: 0.17270231,
|
||||||
|
blue: 0.3417464,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
selected_text: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
focus: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
divider: (
|
||||||
|
red: 0.8318751,
|
||||||
|
green: 0.8318648,
|
||||||
|
blue: 0.80908096,
|
||||||
|
alpha: 0.2,
|
||||||
|
),
|
||||||
|
on: (
|
||||||
|
red: 0.8318751,
|
||||||
|
green: 0.8318648,
|
||||||
|
blue: 0.80908096,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled: (
|
||||||
|
red: 0.28618598,
|
||||||
|
green: 0.19189146,
|
||||||
|
blue: 0.3797182,
|
||||||
|
alpha: 0.5,
|
||||||
|
),
|
||||||
|
on_disabled: (
|
||||||
|
red: 0.8318751,
|
||||||
|
green: 0.8318648,
|
||||||
|
blue: 0.80908096,
|
||||||
|
alpha: 0.65,
|
||||||
|
),
|
||||||
|
border: (
|
||||||
|
red: 0.072988935,
|
||||||
|
green: 0.079405405,
|
||||||
|
blue: 0.14595589,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled_border: (
|
||||||
|
red: 0.072988935,
|
||||||
|
green: 0.079405405,
|
||||||
|
blue: 0.14595589,
|
||||||
|
alpha: 0.5,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
divider: (
|
||||||
|
red: 0.3609102,
|
||||||
|
green: 0.285616,
|
||||||
|
blue: 0.42522332,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
on: (
|
||||||
|
red: 0.98886484,
|
||||||
|
green: 0.98886436,
|
||||||
|
blue: 0.9653322,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
small_widget: (
|
||||||
|
red: 0.20783836,
|
||||||
|
green: 0.20930338,
|
||||||
|
blue: 0.23179808,
|
||||||
|
alpha: 0.25,
|
||||||
|
),
|
||||||
|
)
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
(
|
||||||
|
base: (
|
||||||
|
red: 0.16402894,
|
||||||
|
green: 0.17314792,
|
||||||
|
blue: 0.246458,
|
||||||
|
alpha: 0.25,
|
||||||
|
),
|
||||||
|
hover: (
|
||||||
|
red: 0.15616347,
|
||||||
|
green: 0.16312802,
|
||||||
|
blue: 0.2164568,
|
||||||
|
alpha: 0.4,
|
||||||
|
),
|
||||||
|
pressed: (
|
||||||
|
red: 0.3942264,
|
||||||
|
green: 0.40330547,
|
||||||
|
blue: 0.46497566,
|
||||||
|
alpha: 0.625,
|
||||||
|
),
|
||||||
|
selected: (
|
||||||
|
red: 0.15616347,
|
||||||
|
green: 0.16312802,
|
||||||
|
blue: 0.2164568,
|
||||||
|
alpha: 0.4,
|
||||||
|
),
|
||||||
|
selected_text: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
focus: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
divider: (
|
||||||
|
red: 0.8318751,
|
||||||
|
green: 0.8318648,
|
||||||
|
blue: 0.80908096,
|
||||||
|
alpha: 0.2,
|
||||||
|
),
|
||||||
|
on: (
|
||||||
|
red: 0.8318751,
|
||||||
|
green: 0.8318648,
|
||||||
|
blue: 0.80908096,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled: (
|
||||||
|
red: 0.16402894,
|
||||||
|
green: 0.17314792,
|
||||||
|
blue: 0.246458,
|
||||||
|
alpha: 0.125,
|
||||||
|
),
|
||||||
|
on_disabled: (
|
||||||
|
red: 0.8318751,
|
||||||
|
green: 0.8318648,
|
||||||
|
blue: 0.80908096,
|
||||||
|
alpha: 0.65,
|
||||||
|
),
|
||||||
|
border: (
|
||||||
|
red: 0.072988935,
|
||||||
|
green: 0.079405405,
|
||||||
|
blue: 0.14595589,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled_border: (
|
||||||
|
red: 0.072988935,
|
||||||
|
green: 0.079405405,
|
||||||
|
blue: 0.14595589,
|
||||||
|
alpha: 0.5,
|
||||||
|
),
|
||||||
|
)
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
Some((
|
||||||
|
red: 0.46666667,
|
||||||
|
green: 0.46666667,
|
||||||
|
blue: 0.46666667,
|
||||||
|
))
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
(
|
||||||
|
radius_0: (0.0, 0.0, 0.0, 0.0),
|
||||||
|
radius_xs: (2.0, 2.0, 2.0, 2.0),
|
||||||
|
radius_s: (8.0, 8.0, 8.0, 8.0),
|
||||||
|
radius_m: (8.0, 8.0, 8.0, 8.0),
|
||||||
|
radius_l: (8.0, 8.0, 8.0, 8.0),
|
||||||
|
radius_xl: (8.0, 8.0, 8.0, 8.0),
|
||||||
|
)
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
(
|
||||||
|
base: (
|
||||||
|
red: 0.47058824,
|
||||||
|
green: 0.16078432,
|
||||||
|
blue: 0.18039216,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
hover: (
|
||||||
|
red: 0.45061958,
|
||||||
|
green: 0.20518154,
|
||||||
|
blue: 0.23754153,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
pressed: (
|
||||||
|
red: 0.59671474,
|
||||||
|
green: 0.44906804,
|
||||||
|
blue: 0.5058801,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
selected: (
|
||||||
|
red: 0.45061958,
|
||||||
|
green: 0.20518154,
|
||||||
|
blue: 0.23754153,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
selected_text: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
focus: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
divider: (
|
||||||
|
red: 0.9999203,
|
||||||
|
green: 0.99998146,
|
||||||
|
blue: 1.0,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
on: (
|
||||||
|
red: 0.9999203,
|
||||||
|
green: 0.99998146,
|
||||||
|
blue: 1.0,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled: (
|
||||||
|
red: 0.47058824,
|
||||||
|
green: 0.16078432,
|
||||||
|
blue: 0.18039216,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
on_disabled: (
|
||||||
|
red: 0.7352543,
|
||||||
|
green: 0.5803829,
|
||||||
|
blue: 0.5901961,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
border: (
|
||||||
|
red: 0.47058824,
|
||||||
|
green: 0.16078432,
|
||||||
|
blue: 0.18039216,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled_border: (
|
||||||
|
red: 0.47058824,
|
||||||
|
green: 0.16078432,
|
||||||
|
blue: 0.18039216,
|
||||||
|
alpha: 0.5,
|
||||||
|
),
|
||||||
|
)
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
(
|
||||||
|
base: (
|
||||||
|
red: 0.47058824,
|
||||||
|
green: 0.16078432,
|
||||||
|
blue: 0.18039216,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
hover: (
|
||||||
|
red: 0.45061958,
|
||||||
|
green: 0.20518154,
|
||||||
|
blue: 0.23754153,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
pressed: (
|
||||||
|
red: 0.59671474,
|
||||||
|
green: 0.44906804,
|
||||||
|
blue: 0.5058801,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
selected: (
|
||||||
|
red: 0.45061958,
|
||||||
|
green: 0.20518154,
|
||||||
|
blue: 0.23754153,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
selected_text: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
focus: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
divider: (
|
||||||
|
red: 0.84878576,
|
||||||
|
green: 0.8639131,
|
||||||
|
blue: 0.9608068,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
on: (
|
||||||
|
red: 0.9999203,
|
||||||
|
green: 0.99998146,
|
||||||
|
blue: 1.0,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled: (
|
||||||
|
red: 0.47058824,
|
||||||
|
green: 0.16078432,
|
||||||
|
blue: 0.18039216,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
on_disabled: (
|
||||||
|
red: 0.9999203,
|
||||||
|
green: 0.99998146,
|
||||||
|
blue: 1.0,
|
||||||
|
alpha: 0.5,
|
||||||
|
),
|
||||||
|
border: (
|
||||||
|
red: 0.47058824,
|
||||||
|
green: 0.16078432,
|
||||||
|
blue: 0.18039216,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled_border: (
|
||||||
|
red: 0.47058824,
|
||||||
|
green: 0.16078432,
|
||||||
|
blue: 0.18039216,
|
||||||
|
alpha: 0.5,
|
||||||
|
),
|
||||||
|
)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
(0, 8)
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
(
|
||||||
|
base: (
|
||||||
|
red: 0.0,
|
||||||
|
green: 0.0,
|
||||||
|
blue: 0.0,
|
||||||
|
alpha: 0.0,
|
||||||
|
),
|
||||||
|
hover: (
|
||||||
|
red: 0.37074497,
|
||||||
|
green: 0.38277033,
|
||||||
|
blue: 0.46613896,
|
||||||
|
alpha: 0.2,
|
||||||
|
),
|
||||||
|
pressed: (
|
||||||
|
red: 0.7228412,
|
||||||
|
green: 0.7373518,
|
||||||
|
blue: 0.8313681,
|
||||||
|
alpha: 0.5,
|
||||||
|
),
|
||||||
|
selected: (
|
||||||
|
red: 0.37074497,
|
||||||
|
green: 0.38277033,
|
||||||
|
blue: 0.46613896,
|
||||||
|
alpha: 0.2,
|
||||||
|
),
|
||||||
|
selected_text: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
focus: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
divider: (
|
||||||
|
red: 0.072988935,
|
||||||
|
green: 0.079405405,
|
||||||
|
blue: 0.14595589,
|
||||||
|
alpha: 0.2,
|
||||||
|
),
|
||||||
|
on: (
|
||||||
|
red: 0.072988935,
|
||||||
|
green: 0.079405405,
|
||||||
|
blue: 0.14595589,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled: (
|
||||||
|
red: 0.0,
|
||||||
|
green: 0.0,
|
||||||
|
blue: 0.0,
|
||||||
|
alpha: 0.0,
|
||||||
|
),
|
||||||
|
on_disabled: (
|
||||||
|
red: 0.072988935,
|
||||||
|
green: 0.079405405,
|
||||||
|
blue: 0.14595589,
|
||||||
|
alpha: 0.65,
|
||||||
|
),
|
||||||
|
border: (
|
||||||
|
red: 0.072988935,
|
||||||
|
green: 0.079405405,
|
||||||
|
blue: 0.14595589,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled_border: (
|
||||||
|
red: 0.072988935,
|
||||||
|
green: 0.079405405,
|
||||||
|
blue: 0.14595589,
|
||||||
|
alpha: 0.5,
|
||||||
|
),
|
||||||
|
)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
false
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
false
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
false
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
(
|
||||||
|
base: (
|
||||||
|
red: 0.0,
|
||||||
|
green: 0.0,
|
||||||
|
blue: 0.0,
|
||||||
|
alpha: 0.0,
|
||||||
|
),
|
||||||
|
hover: (
|
||||||
|
red: 0.0,
|
||||||
|
green: 0.0,
|
||||||
|
blue: 0.0,
|
||||||
|
alpha: 0.0,
|
||||||
|
),
|
||||||
|
pressed: (
|
||||||
|
red: 0.0,
|
||||||
|
green: 0.0,
|
||||||
|
blue: 0.0,
|
||||||
|
alpha: 0.0,
|
||||||
|
),
|
||||||
|
selected: (
|
||||||
|
red: 0.0,
|
||||||
|
green: 0.0,
|
||||||
|
blue: 0.0,
|
||||||
|
alpha: 0.0,
|
||||||
|
),
|
||||||
|
selected_text: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
focus: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
divider: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 0.2,
|
||||||
|
),
|
||||||
|
on: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled: (
|
||||||
|
red: 0.0,
|
||||||
|
green: 0.0,
|
||||||
|
blue: 0.0,
|
||||||
|
alpha: 0.0,
|
||||||
|
),
|
||||||
|
on_disabled: (
|
||||||
|
red: 0.45294115,
|
||||||
|
green: 0.30588236,
|
||||||
|
blue: 0.49803922,
|
||||||
|
alpha: 0.5,
|
||||||
|
),
|
||||||
|
border: (
|
||||||
|
red: 0.072988935,
|
||||||
|
green: 0.079405405,
|
||||||
|
blue: 0.14595589,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled_border: (
|
||||||
|
red: 0.072988935,
|
||||||
|
green: 0.079405405,
|
||||||
|
blue: 0.14595589,
|
||||||
|
alpha: 0.5,
|
||||||
|
),
|
||||||
|
)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
"cosmic-light"
|
||||||
195
INSTALL/themes/cosmic/com.system76.CosmicTheme.Light/v1/palette
Normal file
195
INSTALL/themes/cosmic/com.system76.CosmicTheme.Light/v1/palette
Normal file
@@ -0,0 +1,195 @@
|
|||||||
|
(
|
||||||
|
name: "cosmic-light",
|
||||||
|
bright_red: (
|
||||||
|
red: 0.5372549,
|
||||||
|
green: 0.015686275,
|
||||||
|
blue: 0.09411765,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
bright_green: (
|
||||||
|
red: 0.0,
|
||||||
|
green: 0.34117648,
|
||||||
|
blue: 0.17254902,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
bright_orange: (
|
||||||
|
red: 0.4745098,
|
||||||
|
green: 0.17254902,
|
||||||
|
blue: 0.0,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
gray_1: (
|
||||||
|
red: 0.8666667,
|
||||||
|
green: 0.8666667,
|
||||||
|
blue: 0.8666667,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
gray_2: (
|
||||||
|
red: 0.9098039,
|
||||||
|
green: 0.9098039,
|
||||||
|
blue: 0.9098039,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
neutral_0: (
|
||||||
|
red: 1.0,
|
||||||
|
green: 1.0,
|
||||||
|
blue: 1.0,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
neutral_1: (
|
||||||
|
red: 0.8862745,
|
||||||
|
green: 0.8862745,
|
||||||
|
blue: 0.8862745,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
neutral_2: (
|
||||||
|
red: 0.7764706,
|
||||||
|
green: 0.7764706,
|
||||||
|
blue: 0.7764706,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
neutral_3: (
|
||||||
|
red: 0.67058825,
|
||||||
|
green: 0.67058825,
|
||||||
|
blue: 0.67058825,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
neutral_4: (
|
||||||
|
red: 0.5686275,
|
||||||
|
green: 0.5686275,
|
||||||
|
blue: 0.5686275,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
neutral_5: (
|
||||||
|
red: 0.46666667,
|
||||||
|
green: 0.46666667,
|
||||||
|
blue: 0.46666667,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
neutral_6: (
|
||||||
|
red: 0.36862746,
|
||||||
|
green: 0.36862746,
|
||||||
|
blue: 0.36862746,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
neutral_7: (
|
||||||
|
red: 0.2784314,
|
||||||
|
green: 0.2784314,
|
||||||
|
blue: 0.2784314,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
neutral_8: (
|
||||||
|
red: 0.1882353,
|
||||||
|
green: 0.1882353,
|
||||||
|
blue: 0.1882353,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
neutral_9: (
|
||||||
|
red: 0.105882354,
|
||||||
|
green: 0.105882354,
|
||||||
|
blue: 0.105882354,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
neutral_10: (
|
||||||
|
red: 0.0,
|
||||||
|
green: 0.0,
|
||||||
|
blue: 0.0,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
accent_blue: (
|
||||||
|
red: 0.0,
|
||||||
|
green: 0.32156864,
|
||||||
|
blue: 0.3529412,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
accent_indigo: (
|
||||||
|
red: 0.18039216,
|
||||||
|
green: 0.28627452,
|
||||||
|
blue: 0.42745098,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
accent_purple: (
|
||||||
|
red: 0.40784314,
|
||||||
|
green: 0.12941177,
|
||||||
|
blue: 0.4862745,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
accent_pink: (
|
||||||
|
red: 0.5254902,
|
||||||
|
green: 0.015686275,
|
||||||
|
blue: 0.22745098,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
accent_red: (
|
||||||
|
red: 0.47058824,
|
||||||
|
green: 0.16078432,
|
||||||
|
blue: 0.18039216,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
accent_orange: (
|
||||||
|
red: 0.38431373,
|
||||||
|
green: 0.2509804,
|
||||||
|
blue: 0.0,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
accent_yellow: (
|
||||||
|
red: 0.3254902,
|
||||||
|
green: 0.28235295,
|
||||||
|
blue: 0.0,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
accent_green: (
|
||||||
|
red: 0.09411765,
|
||||||
|
green: 0.33333334,
|
||||||
|
blue: 0.16078432,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
accent_warm_grey: (
|
||||||
|
red: 0.33333334,
|
||||||
|
green: 0.2784314,
|
||||||
|
blue: 0.25882354,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
ext_warm_grey: (
|
||||||
|
red: 0.60784316,
|
||||||
|
green: 0.5568628,
|
||||||
|
blue: 0.5411765,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
ext_orange: (
|
||||||
|
red: 0.9843137,
|
||||||
|
green: 0.72156864,
|
||||||
|
blue: 0.42352942,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
ext_yellow: (
|
||||||
|
red: 0.96862745,
|
||||||
|
green: 0.8784314,
|
||||||
|
blue: 0.38431373,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
ext_blue: (
|
||||||
|
red: 0.41568628,
|
||||||
|
green: 0.7921569,
|
||||||
|
blue: 0.84705883,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
ext_purple: (
|
||||||
|
red: 0.8352941,
|
||||||
|
green: 0.54901963,
|
||||||
|
blue: 1.0,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
ext_pink: (
|
||||||
|
red: 1.0,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.8666667,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
ext_indigo: (
|
||||||
|
red: 0.58431375,
|
||||||
|
green: 0.76862746,
|
||||||
|
blue: 0.9882353,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
)
|
||||||
100
INSTALL/themes/cosmic/com.system76.CosmicTheme.Light/v1/primary
Normal file
100
INSTALL/themes/cosmic/com.system76.CosmicTheme.Light/v1/primary
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
(
|
||||||
|
base: (
|
||||||
|
red: 0.21960787,
|
||||||
|
green: 0.13725492,
|
||||||
|
blue: 0.29411766,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
component: (
|
||||||
|
base: (
|
||||||
|
red: 0.28282174,
|
||||||
|
green: 0.19933021,
|
||||||
|
blue: 0.36183798,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
hover: (
|
||||||
|
red: 0.25453955,
|
||||||
|
green: 0.17939718,
|
||||||
|
blue: 0.32565418,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
pressed: (
|
||||||
|
red: 0.2262574,
|
||||||
|
green: 0.15946417,
|
||||||
|
blue: 0.2894704,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
selected: (
|
||||||
|
red: 0.25453955,
|
||||||
|
green: 0.17939718,
|
||||||
|
blue: 0.32565418,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
selected_text: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
focus: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
divider: (
|
||||||
|
red: 0.8318751,
|
||||||
|
green: 0.8318648,
|
||||||
|
blue: 0.80908096,
|
||||||
|
alpha: 0.2,
|
||||||
|
),
|
||||||
|
on: (
|
||||||
|
red: 0.8318751,
|
||||||
|
green: 0.8318648,
|
||||||
|
blue: 0.80908096,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled: (
|
||||||
|
red: 0.28282174,
|
||||||
|
green: 0.19933021,
|
||||||
|
blue: 0.36183798,
|
||||||
|
alpha: 0.5,
|
||||||
|
),
|
||||||
|
on_disabled: (
|
||||||
|
red: 0.8318751,
|
||||||
|
green: 0.8318648,
|
||||||
|
blue: 0.80908096,
|
||||||
|
alpha: 0.65,
|
||||||
|
),
|
||||||
|
border: (
|
||||||
|
red: 0.072988935,
|
||||||
|
green: 0.079405405,
|
||||||
|
blue: 0.14595589,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled_border: (
|
||||||
|
red: 0.072988935,
|
||||||
|
green: 0.079405405,
|
||||||
|
blue: 0.14595589,
|
||||||
|
alpha: 0.5,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
divider: (
|
||||||
|
red: 0.32675916,
|
||||||
|
green: 0.26087362,
|
||||||
|
blue: 0.38188773,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
on: (
|
||||||
|
red: 0.7553642,
|
||||||
|
green: 0.7553483,
|
||||||
|
blue: 0.732968,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
small_widget: (
|
||||||
|
red: 0.22808892,
|
||||||
|
green: 0.22971416,
|
||||||
|
blue: 0.25254303,
|
||||||
|
alpha: 0.25,
|
||||||
|
),
|
||||||
|
)
|
||||||
@@ -0,0 +1,100 @@
|
|||||||
|
(
|
||||||
|
base: (
|
||||||
|
red: 0.30756307,
|
||||||
|
green: 0.21295837,
|
||||||
|
blue: 0.4027321,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
component: (
|
||||||
|
base: (
|
||||||
|
red: 0.3401073,
|
||||||
|
green: 0.24494115,
|
||||||
|
blue: 0.4376148,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
hover: (
|
||||||
|
red: 0.30609655,
|
||||||
|
green: 0.22044702,
|
||||||
|
blue: 0.3938533,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
pressed: (
|
||||||
|
red: 0.27208585,
|
||||||
|
green: 0.19595292,
|
||||||
|
blue: 0.35009184,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
selected: (
|
||||||
|
red: 0.30609655,
|
||||||
|
green: 0.22044702,
|
||||||
|
blue: 0.3938533,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
selected_text: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
focus: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
divider: (
|
||||||
|
red: 0.8966642,
|
||||||
|
green: 0.8966583,
|
||||||
|
blue: 0.87355375,
|
||||||
|
alpha: 0.2,
|
||||||
|
),
|
||||||
|
on: (
|
||||||
|
red: 0.8966642,
|
||||||
|
green: 0.8966583,
|
||||||
|
blue: 0.87355375,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled: (
|
||||||
|
red: 0.3401073,
|
||||||
|
green: 0.24494115,
|
||||||
|
blue: 0.4376148,
|
||||||
|
alpha: 0.5,
|
||||||
|
),
|
||||||
|
on_disabled: (
|
||||||
|
red: 0.8966642,
|
||||||
|
green: 0.8966583,
|
||||||
|
blue: 0.87355375,
|
||||||
|
alpha: 0.65,
|
||||||
|
),
|
||||||
|
border: (
|
||||||
|
red: 0.072988935,
|
||||||
|
green: 0.079405405,
|
||||||
|
blue: 0.14595589,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled_border: (
|
||||||
|
red: 0.072988935,
|
||||||
|
green: 0.079405405,
|
||||||
|
blue: 0.14595589,
|
||||||
|
alpha: 0.5,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
divider: (
|
||||||
|
red: 0.41758668,
|
||||||
|
green: 0.34190118,
|
||||||
|
blue: 0.48913747,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
on: (
|
||||||
|
red: 0.8576811,
|
||||||
|
green: 0.8576725,
|
||||||
|
blue: 0.83475876,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
small_widget: (
|
||||||
|
red: 0.31199428,
|
||||||
|
green: 0.31415156,
|
||||||
|
blue: 0.33818555,
|
||||||
|
alpha: 0.25,
|
||||||
|
),
|
||||||
|
)
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
(
|
||||||
|
red: 0.0,
|
||||||
|
green: 0.0,
|
||||||
|
blue: 0.0,
|
||||||
|
alpha: 0.08,
|
||||||
|
)
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
(
|
||||||
|
space_none: 0,
|
||||||
|
space_xxxs: 4,
|
||||||
|
space_xxs: 4,
|
||||||
|
space_xs: 8,
|
||||||
|
space_s: 8,
|
||||||
|
space_m: 16,
|
||||||
|
space_l: 24,
|
||||||
|
space_xl: 32,
|
||||||
|
space_xxl: 48,
|
||||||
|
space_xxxl: 64,
|
||||||
|
)
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
(
|
||||||
|
base: (
|
||||||
|
red: 0.09411765,
|
||||||
|
green: 0.33333334,
|
||||||
|
blue: 0.16078432,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
hover: (
|
||||||
|
red: 0.14944312,
|
||||||
|
green: 0.34322074,
|
||||||
|
blue: 0.22185525,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
pressed: (
|
||||||
|
red: 0.40847942,
|
||||||
|
green: 0.5353426,
|
||||||
|
blue: 0.4960762,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
selected: (
|
||||||
|
red: 0.14944312,
|
||||||
|
green: 0.34322074,
|
||||||
|
blue: 0.22185525,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
selected_text: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
focus: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
divider: (
|
||||||
|
red: 0.9999203,
|
||||||
|
green: 0.99998146,
|
||||||
|
blue: 1.0,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
on: (
|
||||||
|
red: 0.9999203,
|
||||||
|
green: 0.99998146,
|
||||||
|
blue: 1.0,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled: (
|
||||||
|
red: 0.09411765,
|
||||||
|
green: 0.33333334,
|
||||||
|
blue: 0.16078432,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
on_disabled: (
|
||||||
|
red: 0.547019,
|
||||||
|
green: 0.6666574,
|
||||||
|
blue: 0.5803922,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
border: (
|
||||||
|
red: 0.09411765,
|
||||||
|
green: 0.33333334,
|
||||||
|
blue: 0.16078432,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled_border: (
|
||||||
|
red: 0.09411765,
|
||||||
|
green: 0.33333334,
|
||||||
|
blue: 0.16078432,
|
||||||
|
alpha: 0.5,
|
||||||
|
),
|
||||||
|
)
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
(
|
||||||
|
base: (
|
||||||
|
red: 0.09411765,
|
||||||
|
green: 0.33333334,
|
||||||
|
blue: 0.16078432,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
hover: (
|
||||||
|
red: 0.1530087,
|
||||||
|
green: 0.34438127,
|
||||||
|
blue: 0.20634201,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
pressed: (
|
||||||
|
red: 0.41866177,
|
||||||
|
green: 0.53826964,
|
||||||
|
blue: 0.45199502,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
selected: (
|
||||||
|
red: 0.1530087,
|
||||||
|
green: 0.34438127,
|
||||||
|
blue: 0.20634201,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
selected_text: (
|
||||||
|
red: 0.23921569,
|
||||||
|
green: 0.04705882,
|
||||||
|
blue: 0.066666655,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
focus: (
|
||||||
|
red: 0.23921569,
|
||||||
|
green: 0.04705882,
|
||||||
|
blue: 0.066666655,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
divider: (
|
||||||
|
red: 0.8698165,
|
||||||
|
green: 0.8698165,
|
||||||
|
blue: 0.8698163,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
on: (
|
||||||
|
red: 0.99999994,
|
||||||
|
green: 0.99999994,
|
||||||
|
blue: 0.9999997,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled: (
|
||||||
|
red: 0.09411765,
|
||||||
|
green: 0.33333334,
|
||||||
|
blue: 0.16078432,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
on_disabled: (
|
||||||
|
red: 0.99999994,
|
||||||
|
green: 0.99999994,
|
||||||
|
blue: 0.9999997,
|
||||||
|
alpha: 0.5,
|
||||||
|
),
|
||||||
|
border: (
|
||||||
|
red: 0.09411765,
|
||||||
|
green: 0.33333334,
|
||||||
|
blue: 0.16078432,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled_border: (
|
||||||
|
red: 0.09411765,
|
||||||
|
green: 0.33333334,
|
||||||
|
blue: 0.16078432,
|
||||||
|
alpha: 0.5,
|
||||||
|
),
|
||||||
|
)
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
(
|
||||||
|
base: (
|
||||||
|
red: 0.0,
|
||||||
|
green: 0.0,
|
||||||
|
blue: 0.0,
|
||||||
|
alpha: 0.0,
|
||||||
|
),
|
||||||
|
hover: (
|
||||||
|
red: 0.37074497,
|
||||||
|
green: 0.38277033,
|
||||||
|
blue: 0.46613896,
|
||||||
|
alpha: 0.2,
|
||||||
|
),
|
||||||
|
pressed: (
|
||||||
|
red: 0.7228412,
|
||||||
|
green: 0.7373518,
|
||||||
|
blue: 0.8313681,
|
||||||
|
alpha: 0.5,
|
||||||
|
),
|
||||||
|
selected: (
|
||||||
|
red: 0.37074497,
|
||||||
|
green: 0.38277033,
|
||||||
|
blue: 0.46613896,
|
||||||
|
alpha: 0.2,
|
||||||
|
),
|
||||||
|
selected_text: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
focus: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
divider: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 0.2,
|
||||||
|
),
|
||||||
|
on: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled: (
|
||||||
|
red: 0.0,
|
||||||
|
green: 0.0,
|
||||||
|
blue: 0.0,
|
||||||
|
alpha: 0.0,
|
||||||
|
),
|
||||||
|
on_disabled: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 0.65,
|
||||||
|
),
|
||||||
|
border: (
|
||||||
|
red: 0.072988935,
|
||||||
|
green: 0.079405405,
|
||||||
|
blue: 0.14595589,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled_border: (
|
||||||
|
red: 0.072988935,
|
||||||
|
green: 0.079405405,
|
||||||
|
blue: 0.14595589,
|
||||||
|
alpha: 0.5,
|
||||||
|
),
|
||||||
|
)
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
Some((
|
||||||
|
red: 0.17254902,
|
||||||
|
green: 0.20392157,
|
||||||
|
blue: 0.26666668,
|
||||||
|
))
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
(
|
||||||
|
base: (
|
||||||
|
red: 0.3254902,
|
||||||
|
green: 0.28235295,
|
||||||
|
blue: 0.0,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
hover: (
|
||||||
|
red: 0.33454114,
|
||||||
|
green: 0.30243644,
|
||||||
|
blue: 0.093227796,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
pressed: (
|
||||||
|
red: 0.5241657,
|
||||||
|
green: 0.50985235,
|
||||||
|
blue: 0.41568404,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
selected: (
|
||||||
|
red: 0.33454114,
|
||||||
|
green: 0.30243644,
|
||||||
|
blue: 0.093227796,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
selected_text: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
focus: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
divider: (
|
||||||
|
red: 0.9999203,
|
||||||
|
green: 0.99998146,
|
||||||
|
blue: 1.0,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
on: (
|
||||||
|
red: 0.9999203,
|
||||||
|
green: 0.99998146,
|
||||||
|
blue: 1.0,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled: (
|
||||||
|
red: 0.3254902,
|
||||||
|
green: 0.28235295,
|
||||||
|
blue: 0.0,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
on_disabled: (
|
||||||
|
red: 0.66270524,
|
||||||
|
green: 0.6411672,
|
||||||
|
blue: 0.5,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
border: (
|
||||||
|
red: 0.3254902,
|
||||||
|
green: 0.28235295,
|
||||||
|
blue: 0.0,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled_border: (
|
||||||
|
red: 0.3254902,
|
||||||
|
green: 0.28235295,
|
||||||
|
blue: 0.0,
|
||||||
|
alpha: 0.5,
|
||||||
|
),
|
||||||
|
)
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
(
|
||||||
|
base: (
|
||||||
|
red: 0.3254902,
|
||||||
|
green: 0.28235295,
|
||||||
|
blue: 0.0,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
hover: (
|
||||||
|
red: 0.33454114,
|
||||||
|
green: 0.30243644,
|
||||||
|
blue: 0.093227796,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
pressed: (
|
||||||
|
red: 0.5241657,
|
||||||
|
green: 0.50985235,
|
||||||
|
blue: 0.41568404,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
selected: (
|
||||||
|
red: 0.33454114,
|
||||||
|
green: 0.30243644,
|
||||||
|
blue: 0.093227796,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
selected_text: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
focus: (
|
||||||
|
red: 0.9058823,
|
||||||
|
green: 0.6117647,
|
||||||
|
blue: 0.99607843,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
divider: (
|
||||||
|
red: 0.0,
|
||||||
|
green: 0.0,
|
||||||
|
blue: 0.000000000000000000000000000000000000000000036,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
on: (
|
||||||
|
red: 0.9999203,
|
||||||
|
green: 0.99998146,
|
||||||
|
blue: 1.0,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled: (
|
||||||
|
red: 0.3254902,
|
||||||
|
green: 0.28235295,
|
||||||
|
blue: 0.0,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
on_disabled: (
|
||||||
|
red: 0.9999203,
|
||||||
|
green: 0.99998146,
|
||||||
|
blue: 1.0,
|
||||||
|
alpha: 0.5,
|
||||||
|
),
|
||||||
|
border: (
|
||||||
|
red: 0.3254902,
|
||||||
|
green: 0.28235295,
|
||||||
|
blue: 0.0,
|
||||||
|
alpha: 1.0,
|
||||||
|
),
|
||||||
|
disabled_border: (
|
||||||
|
red: 0.3254902,
|
||||||
|
green: 0.28235295,
|
||||||
|
blue: 0.0,
|
||||||
|
alpha: 0.5,
|
||||||
|
),
|
||||||
|
)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
None
|
||||||
137
INSTALL/themes/violet-chaton-rofi.rasi
Normal file
137
INSTALL/themes/violet-chaton-rofi.rasi
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
/* ── violet-chaton rofi theme ─────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
* {
|
||||||
|
bg0: #261537;
|
||||||
|
bg1: #341c4a;
|
||||||
|
surface: #493161;
|
||||||
|
pink: #ff79c6;
|
||||||
|
purple: #e79cfe;
|
||||||
|
cyan: #8be9fd;
|
||||||
|
text: #f8f8f2;
|
||||||
|
muted: #6c7086;
|
||||||
|
overlay: #9399b2;
|
||||||
|
|
||||||
|
background-color: transparent;
|
||||||
|
text-color: @text;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Fenêtre — positionnée sous les pills ─────────────────────────────────── */
|
||||||
|
|
||||||
|
window {
|
||||||
|
background-color: rgba(38, 21, 55, 0.94);
|
||||||
|
border: 2px;
|
||||||
|
border-color: rgba(255, 121, 198, 0.38);
|
||||||
|
border-radius: 14px;
|
||||||
|
width: 500px;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Layout — résultats en haut, recherche en bas ─────────────────────────── */
|
||||||
|
|
||||||
|
mainbox {
|
||||||
|
background-color: transparent;
|
||||||
|
padding: 10px;
|
||||||
|
spacing: 0;
|
||||||
|
children: [ listview, inputbar ];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Liste des résultats ──────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
listview {
|
||||||
|
background-color: transparent;
|
||||||
|
padding: 4px 0 8px 0;
|
||||||
|
spacing: 2px;
|
||||||
|
lines: 9;
|
||||||
|
columns: 1;
|
||||||
|
scrollbar: false;
|
||||||
|
dynamic: false;
|
||||||
|
}
|
||||||
|
|
||||||
|
element {
|
||||||
|
background-color: transparent;
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 7px 10px;
|
||||||
|
spacing: 10px;
|
||||||
|
orientation: horizontal;
|
||||||
|
}
|
||||||
|
|
||||||
|
element selected {
|
||||||
|
background-color: rgba(255, 121, 198, 0.16);
|
||||||
|
border: 1px;
|
||||||
|
border-color: rgba(255, 121, 198, 0.32);
|
||||||
|
}
|
||||||
|
|
||||||
|
element hover {
|
||||||
|
background-color: rgba(255, 121, 198, 0.16);
|
||||||
|
border: 1px;
|
||||||
|
border-color: rgba(255, 121, 198, 0.32);
|
||||||
|
}
|
||||||
|
|
||||||
|
element-icon {
|
||||||
|
size: 22px;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
element-text {
|
||||||
|
background-color: transparent;
|
||||||
|
text-color: @text;
|
||||||
|
vertical-align: 0.5;
|
||||||
|
highlight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
element-text selected {
|
||||||
|
text-color: @pink;
|
||||||
|
}
|
||||||
|
|
||||||
|
element-text hover {
|
||||||
|
text-color: @pink;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Séparateur visuel avant la recherche ─────────────────────────────────── */
|
||||||
|
|
||||||
|
inputbar {
|
||||||
|
background-color: rgba(52, 28, 74, 0.75);
|
||||||
|
border-radius: 0 0 12px 12px;
|
||||||
|
border: 1px;
|
||||||
|
border-color: rgba(92, 73, 108, 0.50);
|
||||||
|
padding: 9px 14px;
|
||||||
|
spacing: 8px;
|
||||||
|
children: [ prompt, entry ];
|
||||||
|
}
|
||||||
|
|
||||||
|
prompt {
|
||||||
|
background-color: transparent;
|
||||||
|
text-color: @pink;
|
||||||
|
font: "JetBrainsMono Nerd Font Bold 14";
|
||||||
|
vertical-align: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
entry {
|
||||||
|
background-color: transparent;
|
||||||
|
text-color: @text;
|
||||||
|
placeholder: "Rechercher une application...";
|
||||||
|
placeholder-color: @muted;
|
||||||
|
vertical-align: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Scrollbar ────────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
scrollbar {
|
||||||
|
background-color: rgba(92, 73, 108, 0.30);
|
||||||
|
handle-color: rgba(255, 121, 198, 0.40);
|
||||||
|
handle-width: 4px;
|
||||||
|
border-radius: 2px;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Messages ─────────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
message {
|
||||||
|
background-color: transparent;
|
||||||
|
padding: 4px 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
textbox {
|
||||||
|
text-color: @overlay;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
419
INSTALL/themes/violet-chaton-waybar.css
Normal file
419
INSTALL/themes/violet-chaton-waybar.css
Normal file
@@ -0,0 +1,419 @@
|
|||||||
|
/* ── violet-chaton Waybar — island floating 3 pills glassmorphism ───────────
|
||||||
|
*
|
||||||
|
* Palette :
|
||||||
|
* bg-medium rgba(52, 28, 74, 0.88) #341c4a
|
||||||
|
* surface rgba(73, 49, 97, 0.95) #493161
|
||||||
|
* pink #ff79c6 accent primaire
|
||||||
|
* purple #e79cfe accent secondaire
|
||||||
|
* cyan #8be9fd info
|
||||||
|
* text #f8f8f2 texte principal
|
||||||
|
* muted #6c7086 texte secondaire
|
||||||
|
* warning #f9e2af
|
||||||
|
* danger #f38ba8
|
||||||
|
* success #a6e3a1
|
||||||
|
* border #5C496C
|
||||||
|
*
|
||||||
|
* ─────────────────────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
/* ── Reset global ─────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
* {
|
||||||
|
font-family: "JetBrainsMono Nerd Font", "JetBrains Mono", monospace;
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: bold;
|
||||||
|
min-height: 0;
|
||||||
|
border: none;
|
||||||
|
border-radius: 0;
|
||||||
|
transition: all 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Fenêtre — fond transparent entre les pills ───────────────────────────── */
|
||||||
|
|
||||||
|
window#waybar {
|
||||||
|
background: transparent;
|
||||||
|
color: #f8f8f2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Pills (glassmorphism) ────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
.modules-left,
|
||||||
|
.modules-center,
|
||||||
|
.modules-right {
|
||||||
|
background: rgba(52, 28, 74, 0.88);
|
||||||
|
border-radius: 14px;
|
||||||
|
border: 3px solid rgba(255, 121, 198, 0.78);
|
||||||
|
margin: 8px 2px 8px 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Hover pill glow */
|
||||||
|
.modules-left:hover,
|
||||||
|
.modules-center:hover,
|
||||||
|
.modules-right:hover {
|
||||||
|
border-color: #ff79c6;
|
||||||
|
box-shadow:
|
||||||
|
0 4px 28px rgba(231, 156, 254, 0.18),
|
||||||
|
0 1px 0 rgba(255, 255, 255, 0.06) inset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Animations ───────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
@keyframes pulse-critical {
|
||||||
|
0% { color: #f38ba8; }
|
||||||
|
50% { color: rgba(243, 139, 168, 0.35); }
|
||||||
|
100% { color: #f38ba8; }
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes pulse-warning {
|
||||||
|
0% { color: #f9e2af; }
|
||||||
|
50% { color: rgba(249, 226, 175, 0.50); }
|
||||||
|
100% { color: #f9e2af; }
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes glow-pink {
|
||||||
|
0% { box-shadow: 0 0 6px rgba(255, 121, 198, 0.4); }
|
||||||
|
50% { box-shadow: 0 0 14px rgba(255, 121, 198, 0.8); }
|
||||||
|
100% { box-shadow: 0 0 6px rgba(255, 121, 198, 0.4); }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Launcher ─────────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
#custom-launcher {
|
||||||
|
color: #ff79c6;
|
||||||
|
font-size: 19px;
|
||||||
|
padding: 0 14px 0 18px;
|
||||||
|
border-radius: 14px 0 0 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#custom-launcher:hover {
|
||||||
|
color: #e79cfe;
|
||||||
|
animation: glow-pink 1.4s ease-in-out infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Séparateur ───────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
#custom-sep {
|
||||||
|
color: rgba(248, 248, 242, 0.12);
|
||||||
|
font-size: 11px;
|
||||||
|
padding: 0 4px;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Base commune modules ─────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
#cpu,
|
||||||
|
#temperature,
|
||||||
|
#custom-gpu,
|
||||||
|
#memory,
|
||||||
|
#disk,
|
||||||
|
#custom-network,
|
||||||
|
#clock,
|
||||||
|
#custom-date,
|
||||||
|
#mpris,
|
||||||
|
#custom-cava,
|
||||||
|
#wireplumber,
|
||||||
|
#backlight,
|
||||||
|
#bluetooth,
|
||||||
|
#idle-inhibitor,
|
||||||
|
#battery,
|
||||||
|
#custom-power-profile,
|
||||||
|
#custom-uptime,
|
||||||
|
#tray {
|
||||||
|
padding: 0 8px;
|
||||||
|
color: #f8f8f2;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── CPU ──────────────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
#cpu {
|
||||||
|
color: #8be9fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cpu.warning {
|
||||||
|
color: #f9e2af;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cpu.critical {
|
||||||
|
color: #f38ba8;
|
||||||
|
animation: pulse-critical 0.8s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Température ──────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
#temperature {
|
||||||
|
color: rgba(139, 233, 253, 0.60);
|
||||||
|
font-size: 11px;
|
||||||
|
font-weight: normal;
|
||||||
|
padding-left: 2px;
|
||||||
|
padding-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#temperature.critical {
|
||||||
|
color: #f38ba8;
|
||||||
|
font-weight: bold;
|
||||||
|
animation: pulse-critical 0.8s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── GPU ──────────────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
#custom-gpu {
|
||||||
|
color: #ff79c6;
|
||||||
|
}
|
||||||
|
|
||||||
|
#custom-gpu.warning {
|
||||||
|
color: #f9e2af;
|
||||||
|
}
|
||||||
|
|
||||||
|
#custom-gpu.critical {
|
||||||
|
color: #f38ba8;
|
||||||
|
animation: pulse-critical 0.8s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── RAM ──────────────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
#memory {
|
||||||
|
color: #ff79c6;
|
||||||
|
}
|
||||||
|
|
||||||
|
#memory.warning {
|
||||||
|
color: #f9e2af;
|
||||||
|
}
|
||||||
|
|
||||||
|
#memory.critical {
|
||||||
|
color: #f38ba8;
|
||||||
|
animation: pulse-critical 0.8s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Disque ───────────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
#disk {
|
||||||
|
color: rgba(255, 121, 198, 0.70);
|
||||||
|
font-size: 11px;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Réseau ───────────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
#custom-network {
|
||||||
|
color: #8be9fd;
|
||||||
|
font-size: 11px;
|
||||||
|
font-weight: normal;
|
||||||
|
padding-right: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#custom-network.disconnected {
|
||||||
|
color: #f38ba8;
|
||||||
|
}
|
||||||
|
|
||||||
|
#custom-network.eth {
|
||||||
|
color: #8be9fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
#custom-network.wifi {
|
||||||
|
color: rgba(139, 233, 253, 0.80);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── CAVA ─────────────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
#custom-cava {
|
||||||
|
color: rgba(231, 156, 254, 0.65);
|
||||||
|
font-size: 11px;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
padding: 0 10px;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Horloge ──────────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
#clock {
|
||||||
|
color: #ff79c6;
|
||||||
|
font-weight: 900;
|
||||||
|
font-size: 14px;
|
||||||
|
letter-spacing: 0.04em;
|
||||||
|
padding: 0 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#clock:hover {
|
||||||
|
color: #e79cfe;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Date ─────────────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
#custom-date {
|
||||||
|
color: #8be9fd;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: normal;
|
||||||
|
padding: 0 10px 0 2px;
|
||||||
|
letter-spacing: 0.03em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── MPRIS ────────────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
#mpris {
|
||||||
|
color: #e79cfe;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: normal;
|
||||||
|
padding: 0 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#mpris.paused {
|
||||||
|
color: rgba(231, 156, 254, 0.50);
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Volume (wireplumber) ─────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
#wireplumber {
|
||||||
|
color: #ff79c6;
|
||||||
|
}
|
||||||
|
|
||||||
|
#wireplumber.muted {
|
||||||
|
color: rgba(255, 121, 198, 0.30);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Luminosité ───────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
#backlight {
|
||||||
|
color: #8be9fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Bluetooth ────────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
#bluetooth {
|
||||||
|
color: rgba(139, 233, 253, 0.45);
|
||||||
|
font-size: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#bluetooth.connected {
|
||||||
|
color: #e79cfe;
|
||||||
|
}
|
||||||
|
|
||||||
|
#bluetooth.disabled {
|
||||||
|
color: rgba(108, 112, 134, 0.50);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Idle inhibitor ───────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
#idle-inhibitor {
|
||||||
|
color: rgba(248, 248, 242, 0.35);
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#idle-inhibitor.activated {
|
||||||
|
color: #f9e2af;
|
||||||
|
animation: pulse-warning 1.6s ease-in-out infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Batterie ─────────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
#battery {
|
||||||
|
color: #ff79c6;
|
||||||
|
}
|
||||||
|
|
||||||
|
#battery.charging,
|
||||||
|
#battery.plugged {
|
||||||
|
color: #a6e3a1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#battery.full {
|
||||||
|
color: rgba(166, 227, 161, 0.65);
|
||||||
|
}
|
||||||
|
|
||||||
|
#battery.warning:not(.charging):not(.plugged) {
|
||||||
|
color: #f9e2af;
|
||||||
|
}
|
||||||
|
|
||||||
|
#battery.critical:not(.charging):not(.plugged) {
|
||||||
|
color: #f38ba8;
|
||||||
|
animation: pulse-critical 0.6s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Profil énergie ───────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
#custom-power-profile {
|
||||||
|
color: #8be9fd;
|
||||||
|
font-size: 15px;
|
||||||
|
padding: 0 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#custom-power-profile.performance {
|
||||||
|
color: #f38ba8;
|
||||||
|
}
|
||||||
|
|
||||||
|
#custom-power-profile.balanced {
|
||||||
|
color: #8be9fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
#custom-power-profile.low-power {
|
||||||
|
color: #a6e3a1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Uptime ───────────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
#custom-uptime {
|
||||||
|
color: rgba(139, 233, 253, 0.45);
|
||||||
|
font-size: 11px;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Tray ─────────────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
#tray {
|
||||||
|
padding: 0 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Power ────────────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
#custom-power {
|
||||||
|
color: #f38ba8;
|
||||||
|
font-size: 15px;
|
||||||
|
padding: 0 14px 0 8px;
|
||||||
|
border-radius: 0 14px 14px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#custom-power:hover {
|
||||||
|
color: #ff79c6;
|
||||||
|
}
|
||||||
|
|
||||||
|
#tray > .passive {
|
||||||
|
-gtk-icon-effect: dim;
|
||||||
|
}
|
||||||
|
|
||||||
|
#tray > .needs-attention {
|
||||||
|
-gtk-icon-effect: highlight;
|
||||||
|
background-color: rgba(255, 121, 198, 0.12);
|
||||||
|
border-radius: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Tooltip ──────────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
tooltip {
|
||||||
|
background-color: rgba(38, 21, 55, 0.96);
|
||||||
|
border: 1px solid rgba(255, 121, 198, 0.30);
|
||||||
|
border-radius: 10px;
|
||||||
|
color: #f8f8f2;
|
||||||
|
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.40);
|
||||||
|
}
|
||||||
|
|
||||||
|
tooltip label {
|
||||||
|
color: #f8f8f2;
|
||||||
|
padding: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Hover global ─────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
#cpu:hover,
|
||||||
|
#memory:hover,
|
||||||
|
#disk:hover,
|
||||||
|
#custom-network:hover,
|
||||||
|
#wireplumber:hover,
|
||||||
|
#backlight:hover,
|
||||||
|
#battery:hover,
|
||||||
|
#custom-power-profile:hover,
|
||||||
|
#custom-uptime:hover {
|
||||||
|
color: #e79cfe;
|
||||||
|
}
|
||||||
|
|
||||||
|
#bluetooth:hover {
|
||||||
|
color: #e79cfe;
|
||||||
|
}
|
||||||
54
INSTALL/themes/violet-chaton-wofi-power.css
Normal file
54
INSTALL/themes/violet-chaton-wofi-power.css
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
/* ── violet-chaton wofi — power menu (sans barre de recherche) ─────────────── */
|
||||||
|
|
||||||
|
window {
|
||||||
|
background-color: rgba(52, 28, 74, 0.88);
|
||||||
|
border: 2px solid rgba(255, 121, 198, 0.28);
|
||||||
|
border-radius: 14px;
|
||||||
|
font-family: "JetBrainsMono Nerd Font";
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Cacher complètement la barre de recherche */
|
||||||
|
#input {
|
||||||
|
min-height: 0;
|
||||||
|
min-width: 0;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
border: 0;
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#outer-box {
|
||||||
|
padding: 0;
|
||||||
|
border-radius: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#scroll {
|
||||||
|
margin: 6px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#inner-box {
|
||||||
|
padding: 4px 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#entry {
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 9px 14px;
|
||||||
|
margin: 1px 0;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
#entry:selected {
|
||||||
|
background-color: rgba(243, 139, 168, 0.16);
|
||||||
|
border-color: rgba(243, 139, 168, 0.35);
|
||||||
|
}
|
||||||
|
|
||||||
|
#text {
|
||||||
|
color: #f8f8f2;
|
||||||
|
font-family: "JetBrainsMono Nerd Font";
|
||||||
|
}
|
||||||
|
|
||||||
|
#text:selected {
|
||||||
|
color: #f38ba8;
|
||||||
|
}
|
||||||
64
INSTALL/themes/violet-chaton-wofi.css
Normal file
64
INSTALL/themes/violet-chaton-wofi.css
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
/* ── violet-chaton wofi theme ─────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
window {
|
||||||
|
background-color: rgba(52, 28, 74, 0.88);
|
||||||
|
border: 2px solid rgba(255, 121, 198, 0.28);
|
||||||
|
border-radius: 14px;
|
||||||
|
font-family: "JetBrainsMono Nerd Font";
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Barre de recherche ──────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
#input {
|
||||||
|
all: unset;
|
||||||
|
background-color: rgba(38, 21, 55, 0.60);
|
||||||
|
color: #f8f8f2;
|
||||||
|
border-bottom: 1px solid rgba(92, 73, 108, 0.50);
|
||||||
|
border-radius: 12px 12px 0 0;
|
||||||
|
padding: 10px 14px;
|
||||||
|
margin: 0;
|
||||||
|
font-family: "JetBrainsMono Nerd Font";
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: bold;
|
||||||
|
caret-color: #ff79c6;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Conteneurs ──────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
#outer-box {
|
||||||
|
padding: 0;
|
||||||
|
border-radius: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#scroll {
|
||||||
|
margin: 4px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#inner-box {
|
||||||
|
padding: 4px 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Entrées ─────────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
|
#entry {
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 7px 10px;
|
||||||
|
margin: 1px 0;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
#entry:selected {
|
||||||
|
background-color: rgba(255, 121, 198, 0.16);
|
||||||
|
border-color: rgba(255, 121, 198, 0.32);
|
||||||
|
}
|
||||||
|
|
||||||
|
#text {
|
||||||
|
color: #f8f8f2;
|
||||||
|
font-family: "JetBrainsMono Nerd Font";
|
||||||
|
}
|
||||||
|
|
||||||
|
#text:selected {
|
||||||
|
color: #ff79c6;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user