Script : conky-ultimate.sh

#!/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 ""