#!/bin/bash
# Conky Configurator Ultimate - Pour MATE Desktop
# Gestion multi-écrans + diagnostics + transparence
# Usage: ./conky-ultimate.sh
# Couleurs pour l'affichage
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
echo -e "${BLUE}╔═══════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║ CONKY CONFIGURATOR ULTIMATE v2.0 ║${NC}"
echo -e "${BLUE}║ Pour MATE Desktop + Multi-écrans ║${NC}"
echo -e "${BLUE}╚═══════════════════════════════════════════╝${NC}"
echo ""
# ========================================
# SECTION 1 : DIAGNOSTIC SYSTÈME
# ========================================
echo -e "${YELLOW}═══ DIAGNOSTIC SYSTÈME ═══${NC}"
echo ""
# Détection du compositeur MATE
echo -n "Compositeur MATE : "
COMP_STATUS=$(gsettings get org.mate.Marco.general compositing-manager 2>/dev/null)
if [ "$COMP_STATUS" = "true" ]; then
echo -e "${GREEN}✓ Activé${NC}"
COMPOSITOR_OK=true
else
echo -e "${RED}✗ Désactivé${NC}"
COMPOSITOR_OK=false
echo -e "${YELLOW} → La transparence nécessite le compositeur !${NC}"
read -p " Activer le compositeur maintenant ? (o/n) : " activate_comp
if [ "$activate_comp" = "o" ]; then
gsettings set org.mate.Marco.general compositing-manager true
echo -e "${GREEN} ✓ Compositeur activé${NC}"
COMPOSITOR_OK=true
fi
fi
# Détection de Conky
echo -n "Conky installé : "
if command -v conky &> /dev/null; then
CONKY_VERSION=$(conky --version | head -1)
echo -e "${GREEN}✓ $CONKY_VERSION${NC}"
else
echo -e "${RED}✗ Non installé${NC}"
echo -e "${YELLOW} Installation requise : sudo apt install conky-all${NC}"
exit 1
fi
# Détection des écrans
echo -n "Écrans détectés : "
SCREENS=$(xrandr --query | grep " connected" | wc -l)
echo -e "${GREEN}$SCREENS écran(s)${NC}"
if [ "$SCREENS" -gt 1 ]; then
echo ""
xrandr --query | grep " connected" | awk '{print " - " $1 " (" $3 ")"}'
fi
# Détection interface réseau
INTERFACE=$(ip route | grep default | awk '{print $5}' | head -1)
if [ -z "$INTERFACE" ]; then
INTERFACE=$(ip link show | grep -E '^[0-9]+:' | grep -v 'lo:' | head -1 | awk -F': ' '{print $2}')
fi
echo -e "Interface réseau : ${GREEN}$INTERFACE${NC}"
# Vérifier si Conky tourne
echo -n "Conky en cours : "
if pgrep -x "conky" > /dev/null; then
CONKY_PID=$(pgrep -x "conky")
echo -e "${GREEN}✓ PID $CONKY_PID${NC}"
CONKY_RUNNING=true
else
echo -e "${YELLOW}✗ Non démarré${NC}"
CONKY_RUNNING=false
fi
# Vérifier config existante
echo -n "Config existante : "
if [ -f ~/.conkyrc ]; then
echo -e "${GREEN}✓ ~/.conkyrc trouvé${NC}"
CONFIG_EXISTS=true
else
echo -e "${YELLOW}✗ Aucune${NC}"
CONFIG_EXISTS=false
fi
echo ""
echo -e "${YELLOW}═══════════════════════════════════════════${NC}"
echo ""
# ========================================
# SECTION 2 : CONFIGURATION
# ========================================
echo -e "${BLUE}═══ CONFIGURATION CONKY ═══${NC}"
echo ""
# 1. Choix de l'écran (si multi-écrans)
if [ "$SCREENS" -gt 1 ]; then
echo "Écrans disponibles :"
SCREEN_LIST=$(xrandr --query | grep " connected" | awk '{print $1}')
i=1
declare -A SCREEN_ARRAY
while IFS= read -r screen; do
SCREEN_INFO=$(xrandr --query | grep "^$screen" | awk '{print $3}')
echo "$i) $screen ($SCREEN_INFO)"
SCREEN_ARRAY[$i]=$screen
((i++))
done <<< "$SCREEN_LIST"
read -p "Sur quel écran afficher Conky ? [1] : " screen_choice
screen_choice=${screen_choice:-1}
SELECTED_SCREEN=${SCREEN_ARRAY[$screen_choice]}
# Récupérer les dimensions de l'écran
SCREEN_GEOMETRY=$(xrandr --query | grep "^$SELECTED_SCREEN" | grep -oP '\d+x\d+\+\d+\+\d+')
SCREEN_X=$(echo $SCREEN_GEOMETRY | cut -d'+' -f2)
SCREEN_Y=$(echo $SCREEN_GEOMETRY | cut -d'+' -f3)
SCREEN_WIDTH=$(echo $SCREEN_GEOMETRY | cut -d'x' -f1)
echo -e "${GREEN}✓ Écran sélectionné : $SELECTED_SCREEN${NC}"
echo " Position : X=$SCREEN_X, Y=$SCREEN_Y, Largeur=$SCREEN_WIDTH"
MULTI_SCREEN=true
else
SCREEN_X=0
SCREEN_Y=0
MULTI_SCREEN=false
fi
echo ""
# 2. Position sur l'écran
echo "Position de Conky :"
echo "1) Haut gauche"
echo "2) Haut droit"
echo "3) Bas gauche"
echo "4) Bas droit"
read -p "Votre choix [1-4] : " pos_choice
case $pos_choice in
1)
ALIGNMENT="top_left"
if [ "$MULTI_SCREEN" = true ]; then
GAP_X=$((SCREEN_X + 20))
else
GAP_X=20
fi
GAP_Y=50
;;
2)
ALIGNMENT="top_right"
if [ "$MULTI_SCREEN" = true ]; then
# Pour l'alignement à droite, on doit calculer depuis le bord droit de l'écran
GAP_X=20 # Distance depuis le bord droit de l'écran sélectionné
else
GAP_X=20
fi
GAP_Y=50
;;
3)
ALIGNMENT="bottom_left"
if [ "$MULTI_SCREEN" = true ]; then
GAP_X=$((SCREEN_X + 20))
else
GAP_X=20
fi
GAP_Y=50
;;
4)
ALIGNMENT="bottom_right"
if [ "$MULTI_SCREEN" = true ]; then
GAP_X=20
else
GAP_X=20
fi
GAP_Y=50
;;
*)
ALIGNMENT="top_right"
GAP_X=20
GAP_Y=50
;;
esac
# Paramètre spécial pour multi-écrans
if [ "$MULTI_SCREEN" = true ]; then
XINERAMA_HEAD="xinerama_head = $((screen_choice - 1)),"
else
XINERAMA_HEAD=""
fi
# 3. Taille
echo ""
echo "Largeur de la fenêtre :"
echo "1) Compact (250px)"
echo "2) Standard (350px)"
echo "3) Large (450px)"
echo "4) Très large (550px)"
read -p "Votre choix [1-4] : " width_choice
case $width_choice in
1) WIDTH=250 ;;
2) WIDTH=350 ;;
3) WIDTH=450 ;;
4) WIDTH=550 ;;
*) WIDTH=350 ;;
esac
# 4. Thème couleur
echo ""
echo "Thème de couleur :"
echo "1) Bleu cyber (défaut)"
echo "2) Vert Matrix"
echo "3) Orange/Rouge"
echo "4) Monochrome blanc"
echo "5) Violet/Magenta"
read -p "Votre choix [1-5] : " color_choice
case $color_choice in
1) COLOR1="00BFFF"; COLOR2="1E90FF"; COLOR3="87CEEB" ;;
2) COLOR1="00FF00"; COLOR2="32CD32"; COLOR3="90EE90" ;;
3) COLOR1="FF4500"; COLOR2="FF6347"; COLOR3="FFA500" ;;
4) COLOR1="FFFFFF"; COLOR2="CCCCCC"; COLOR3="999999" ;;
5) COLOR1="FF00FF"; COLOR2="DA70D6"; COLOR3="DDA0DD" ;;
*) COLOR1="00BFFF"; COLOR2="1E90FF"; COLOR3="87CEEB" ;;
esac
# 5. Type de fenêtre (important pour MATE)
echo ""
echo "Type de fenêtre (affecte la transparence) :"
echo "1) dock - Recommandé pour MATE (comme un dock)"
echo "2) normal - Fenêtre normale transparente"
echo "3) desktop - Intégré au bureau"
echo "4) override - Ignore le gestionnaire de fenêtres"
read -p "Votre choix [1-4] : " wintype_choice
case $wintype_choice in
1) WINDOW_TYPE="dock" ;;
2) WINDOW_TYPE="normal" ;;
3) WINDOW_TYPE="desktop" ;;
4) WINDOW_TYPE="override" ;;
*) WINDOW_TYPE="dock" ;;
esac
# 6. Transparence
echo ""
if [ "$COMPOSITOR_OK" = false ]; then
echo -e "${RED}⚠ ATTENTION : Le compositeur est désactivé !${NC}"
echo " La transparence ne fonctionnera pas correctement."
echo ""
fi
echo "Niveau de transparence :"
echo "1) Transparent total (fond invisible)"
echo "2) Légèrement transparent (90%)"
echo "3) Semi-transparent (70%)"
echo "4) Peu transparent (50%)"
echo "5) Opaque (fond noir)"
read -p "Votre choix [1-5] : " transp_choice
case $transp_choice in
1) OWN_TRANSPARENT="true"; ARGB_VALUE=0 ;;
2) OWN_TRANSPARENT="false"; ARGB_VALUE=230 ;;
3) OWN_TRANSPARENT="false"; ARGB_VALUE=178 ;;
4) OWN_TRANSPARENT="false"; ARGB_VALUE=128 ;;
5) OWN_TRANSPARENT="false"; ARGB_VALUE=255 ;;
*) OWN_TRANSPARENT="true"; ARGB_VALUE=0 ;;
esac
# 7. Sections à afficher
echo ""
echo "Sections à afficher (o/n) :"
read -p "Système (CPU, RAM, Disque) [o] : " show_system
read -p "Réseau [o] : " show_network
read -p "Processus top [o] : " show_processes
read -p "Informations GPU (si disponible) [n] : " show_gpu
SHOW_SYS=${show_system:-o}
SHOW_NET=${show_network:-o}
SHOW_PROC=${show_processes:-o}
SHOW_GPU=${show_gpu:-n}
echo ""
echo -e "${YELLOW}═══════════════════════════════════════════${NC}"
echo ""
# ========================================
# SECTION 3 : GÉNÉRATION DU FICHIER
# ========================================
echo -e "${BLUE}═══ GÉNÉRATION DE LA CONFIGURATION ═══${NC}"
echo ""
# Backup de l'ancienne config si elle existe
if [ "$CONFIG_EXISTS" = true ]; then
BACKUP_FILE=~/.conkyrc.backup.$(date +%Y%m%d_%H%M%S)
cp ~/.conkyrc "$BACKUP_FILE"
echo -e "${GREEN}✓ Backup créé : $BACKUP_FILE${NC}"
fi
# Génération de la configuration
cat > ~/.conkyrc << EOL
conky.config = {
-- Positionnement
alignment = '$ALIGNMENT',
gap_x = $GAP_X,
gap_y = $GAP_Y,
$XINERAMA_HEAD
-- Fenêtre
own_window = true,
own_window_class = 'Conky',
own_window_type = '$WINDOW_TYPE',
own_window_argb_visual = true,
own_window_argb_value = $ARGB_VALUE,
own_window_transparent = $OWN_TRANSPARENT,
own_window_hints = 'undecorated,below,sticky,skip_taskbar,skip_pager',
-- Apparence
background = true,
border_width = 0,
draw_borders = false,
draw_graph_borders = true,
draw_outline = false,
draw_shades = false,
use_xft = true,
font = 'DejaVu Sans Mono:size=10',
-- Dimensions
minimum_width = $WIDTH,
minimum_height = 5,
maximum_width = $WIDTH,
-- Couleurs
default_color = '$COLOR1',
default_outline_color = 'white',
default_shade_color = 'white',
-- Performance
cpu_avg_samples = 2,
net_avg_samples = 2,
no_buffers = true,
double_buffer = true,
-- Mise à jour
update_interval = 2.0,
-- Autres
uppercase = false,
use_spacer = 'none',
show_graph_scale = false,
show_graph_range = false,
}
conky.text = [[
\${color $COLOR2}\${font DejaVu Sans Mono:size=12:bold}KAISEN LINUX\${font}
\${color $COLOR3}\${hr 2}
EOL
# Section Système
if [ "$SHOW_SYS" = "o" ]; then
cat >> ~/.conkyrc << EOL
\${color #$COLOR1}\${font DejaVu Sans Mono:size=11:bold}SYSTÈME\${font}
\${color}Hostname: \${color #$COLOR2}\$nodename
\${color}Uptime: \${color #$COLOR2}\$uptime
\${color}Kernel: \${color #$COLOR2}\$kernel
\${color #$COLOR1}CPU: \${color #$COLOR2}\$cpu% \${color #$COLOR3}\${cpubar 4}
\${color}\${cpugraph 30,0 $COLOR2 $COLOR1}
\${color}Fréquence: \${color #$COLOR2}\${freq_g} GHz
\${color}Température: \${color #$COLOR2}\${acpitemp}°C
\${color #$COLOR1}RAM: \${color #$COLOR2}\$mem/\$memmax \${color #$COLOR3}\${membar 4}
\${color}Swap: \${color #$COLOR2}\$swap/\$swapmax \${color #$COLOR3}\${swapbar 4}
\${color #$COLOR1}Disque: \${color #$COLOR2}\${fs_used /}/\${fs_size /} \${color #$COLOR3}\${fs_bar 4 /}
\${color}I/O: \${color #$COLOR2}\${diskio}
\${color}\${diskiograph 30,0 $COLOR2 $COLOR1}
EOL
fi
# Section Réseau
if [ "$SHOW_NET" = "o" ]; then
cat >> ~/.conkyrc << EOL
\${color #$COLOR1}\${font DejaVu Sans Mono:size=11:bold}RÉSEAU\${font}
\${color}Interface: \${color #$COLOR2}$INTERFACE
\${color}IP locale: \${color #$COLOR2}\${addr $INTERFACE}
\${color}IP publique: \${color #$COLOR2}\${execi 3600 curl -s ifconfig.me}
\${color}Down: \${color #$COLOR2}\${downspeed $INTERFACE}/s \${alignr}\${color}Total: \${color #$COLOR2}\${totaldown $INTERFACE}
\${color #$COLOR3}\${downspeedgraph $INTERFACE 30,0 $COLOR2 $COLOR1}
\${color}Up: \${color #$COLOR2}\${upspeed $INTERFACE}/s \${alignr}\${color}Total: \${color #$COLOR2}\${totalup $INTERFACE}
\${color #$COLOR3}\${upspeedgraph $INTERFACE 30,0 $COLOR2 $COLOR1}
EOL
fi
# Section GPU (si demandé)
if [ "$SHOW_GPU" = "o" ]; then
cat >> ~/.conkyrc << EOL
\${color #$COLOR1}\${font DejaVu Sans Mono:size=11:bold}GPU\${font}
\${color}Nvidia: \${color #$COLOR2}\${nvidia gpufreq} MHz
\${color}Température: \${color #$COLOR2}\${nvidia temp}°C
\${color}Utilisation: \${color #$COLOR2}\${nvidia gpuutil}% \${color #$COLOR3}\${nvidiabar 4 gpuutil}
EOL
fi
# Section Processus
if [ "$SHOW_PROC" = "o" ]; then
cat >> ~/.conkyrc << EOL
\${color #$COLOR1}\${font DejaVu Sans Mono:size=11:bold}TOP PROCESSUS\${font}
\${color}Nom \${alignr}PID CPU% MEM%
\${color #$COLOR2}\${top name 1} \${alignr}\${top pid 1} \${top cpu 1} \${top mem 1}
\${color}\${top name 2} \${alignr}\${top pid 2} \${top cpu 2} \${top mem 2}
\${color}\${top name 3} \${alignr}\${top pid 3} \${top cpu 3} \${top mem 3}
\${color}\${top name 4} \${alignr}\${top pid 4} \${top cpu 4} \${top mem 4}
\${color}\${top name 5} \${alignr}\${top pid 5} \${top cpu 5} \${top mem 5}
EOL
fi
# Fermeture du fichier
echo "]]" >> ~/.conkyrc
echo -e "${GREEN}✓ Configuration générée dans ~/.conkyrc${NC}"
# ========================================
# SECTION 4 : LANCEMENT
# ========================================
echo ""
echo -e "${BLUE}═══ LANCEMENT DE CONKY ═══${NC}"
echo ""
# Tuer l'ancienne instance
if [ "$CONKY_RUNNING" = true ]; then
echo "Arrêt de l'instance en cours..."
killall conky 2>/dev/null
sleep 1
fi
# Lancer Conky
echo "Démarrage de Conky..."
conky &
sleep 2
# Vérification
if pgrep -x "conky" > /dev/null; then
echo -e "${GREEN}✓ Conky démarré avec succès !${NC}"
NEW_PID=$(pgrep -x "conky")
echo " PID: $NEW_PID"
else
echo -e "${RED}✗ Erreur au démarrage de Conky${NC}"
echo " Testez manuellement : conky -d"
fi
echo ""
echo -e "${YELLOW}═══════════════════════════════════════════${NC}"
echo -e "${BLUE}RÉSUMÉ DE LA CONFIGURATION :${NC}"
echo " Écran : $SELECTED_SCREEN"
echo " Position : $ALIGNMENT ($GAP_X, $GAP_Y)"
echo " Type fenêtre : $WINDOW_TYPE"
echo " Transparence : $ARGB_VALUE/255"
echo " Interface réseau : $INTERFACE"
echo " Largeur : ${WIDTH}px"
echo ""
echo -e "${GREEN}Commandes utiles :${NC}"
echo " Reconfigurer : ./conky-ultimate.sh"
echo " Arrêter : killall conky"
echo " Redémarrer : killall conky && conky &"
echo " Déboguer : conky -d"
echo " Éditer manuellement : nano ~/.conkyrc"
echo ""
echo -e "${YELLOW}Si la transparence ne fonctionne pas :${NC}"
echo " 1) Vérifier : gsettings get org.mate.Marco.general compositing-manager"
echo " 2) Activer : gsettings set org.mate.Marco.general compositing-manager true"
echo " 3) Redémarrer WM : mate-window-manager --replace &"
echo ""