APP_CONF_SCREEN

Primer crearem l’archiu de l’script:

touch screen-sharing.sh

Despres entrarem dins d’ell

nano screen-sharing.sh

Dins tindrem que posar el seguent codi:

#!/bin/bash
# Configuración avanzada de pantalla con menú visual mejorado en Linux

# Definir colores ANSI
RED='\033[1;31m'
GREEN='\033[1;32m'
BLUE='\033[1;34m'
YELLOW='\033[1;33m'
CYAN='\033[1;36m'
MAGENTA='\033[1;35m'
WHITE='\033[1;37m'
NC='\033[0m'  # Resetear color

# Directorio para guardar perfiles de configuración
PROFILES_DIR="$HOME/.config/display-profiles"
mkdir -p "$PROFILES_DIR"

# ===============================================
#  FUNCIONES DE UTILIDAD Y COMPROBACIÓN
# ===============================================

# Función para verificar si un comando existe
command_exists () {
    type "$1" &> /dev/null
}

# Verificar herramientas esenciales
check_dependencies() {
    if ! command_exists xrandr; then
        echo -e "${RED}ERROR: 'xrandr' no encontrado. Por favor, instala xorg-xrandr o x11-xserver-utils.${NC}"
        exit 1
    fi
    if ! command_exists notify-send; then
        echo -e "${YELLOW}ADVERTENCIA: 'notify-send' no encontrado. Las notificaciones de escritorio no funcionarán. (Instala libnotify-bin).${NC}"
        # No salimos, solo advertimos
    fi
    if ! command_exists awk; then
        echo -e "${RED}ERROR: 'awk' no encontrado. Este script lo necesita.${NC}"
        exit 1
    fi
}

# Función para obtener la salida principal conectada (la que no es virtual)
# Prioriza eDP (pantalla interna), luego toma la primera conectada no virtual.
get_primary_display_output() {
    if xrandr | grep -q "eDP-1 connected"; then
        echo "eDP-1"
        return
    fi
    xrandr | grep " connected" | grep -v " disconnected" | awk '{print $1}' | head -n 1
}

# Función para seleccionar una pantalla de una lista
select_display_output() {
    local outputs=()
    local i=1
    clear
    echo -e "${YELLOW}Detectando pantallas conectadas...${NC}"
    echo -e "${WHITE}-------------------------------${NC}"

    while IFS= read -r line; do
        outputs+=("$line")
        echo -e "${CYAN}$i. ${line}${NC}"
        i=$((i+1))
    done < <(xrandr | grep " connected" | awk '{print $1}')

    if [ ${#outputs[@]} -eq 0 ]; then
        echo -e "${RED}❌ No se detectaron pantallas conectadas. Asegúrate de que estén físicamente conectadas.${NC}"
        read -p "Presiona Enter para continuar..."
        return 1
    fi

    echo -e "${WHITE}-------------------------------${NC}"
    read -p "Selecciona el NÚMERO de la pantalla que deseas configurar: " selection

    if [[ "$selection" -ge 1 && "$selection" -le ${#outputs[@]} ]]; then
        echo "${outputs[$((selection-1))]}"
        return 0
    else
        echo -e "${RED}❌ Selección no válida.${NC}"
        read -p "Presiona Enter para continuar..."
        return 1
    fi
}

# Función para mostrar y seleccionar resoluciones disponibles
select_resolution() {
    local output="$1"
    local modes=()
    local i=1
    echo -e "${YELLOW}Resoluciones disponibles para ${output}:${NC}"
    echo -e "${WHITE}-------------------------------${NC}"
    # Obtener modos de xrandr, quitar duplicados y ordenar
    while IFS= read -r line; do
        modes+=("$line")
        echo -e "${CYAN}$i. ${line}${NC}"
        i=$((i+1))
    done < <(xrandr | grep "^  " | grep -A 10 "$output" | awk '{print $1}' | grep -E '^[0-9]+x[0-9]+$' | sort -V | uniq)

    if [ ${#modes[@]} -eq 0 ]; then
        echo -e "${RED}❌ No se encontraron resoluciones para ${output}.${NC}"
        read -p "Presiona Enter para continuar..."
        return 1
    fi

    echo -e "${WHITE}-------------------------------${NC}"
    read -p "Selecciona el NÚMERO de la resolución deseada: " selection

    if [[ "$selection" -ge 1 && "$selection" -le ${#modes[@]} ]]; then
        echo "${modes[$((selection-1))]}"
        return 0
    else
        echo -e "${RED}❌ Selección no válida.${NC}"
        read -p "Presiona Enter para continuar..."
        return 1
    fi
}

# Función para mostrar y seleccionar tasas de refresco disponibles
select_refresh_rate() {
    local output="$1"
    local rates=()
    local i=1
    echo -e "${YELLOW}Tasas de refresco disponibles para ${output}:${NC}"
    echo -e "${WHITE}-------------------------------${NC}"
    # Obtener tasas de refresco de xrandr
    while IFS= read -r line; do
        rates+=("$line")
        echo -e "${CYAN}$i. ${line} Hz${NC}"
        i=$((i+1))
    done < <(xrandr | grep "^  " | grep -A 10 "$output" | awk '{print $NF}' | grep -E '^[0-9]+(\.[0-9]+)?\*?$' | sed 's/\*//g' | sort -g | uniq)

    if [ ${#rates[@]} -eq 0 ]; then
        echo -e "${RED}❌ No se encontraron tasas de refresco para ${output}.${NC}"
        read -p "Presiona Enter para continuar..."
        return 1
    fi

    echo -e "${WHITE}-------------------------------${NC}"
    read -p "Selecciona el NÚMERO de la tasa de refresco deseada: " selection

    if [[ "$selection" -ge 1 && "$selection" -le ${#rates[@]} ]]; then
        echo "${rates[$((selection-1))]}"
        return 0
    else
        echo -e "${RED}❌ Selección no válida.${NC}"
        read -p "Presiona Enter para continuar..."
        return 1
    fi
}

# ===============================================
#  CONFIGURACIÓN INICIAL DEL SCRIPT
# ===============================================

# 1. Crear el archivo .desktop global
DESKTOP_FILE="/usr/share/applications/configuracion-pantalla.desktop"
SCRIPT_PATH="/usr/local/bin/configuracion-pantalla.sh"

# Asegúrate de que el script principal esté en la ubicación deseada ANTES de crear el .desktop
# Esto es para cuando el script se ejecuta por primera vez y aún no se ha movido a /usr/local/bin
CURRENT_SCRIPT_LOCATION="$(readlink -f "$0")"
if [ "$CURRENT_SCRIPT_LOCATION" != "$SCRIPT_PATH" ]; then
    echo -e "${YELLOW}INFO: Moviendo script a $SCRIPT_PATH para configuración inicial...${NC}"
    sudo mkdir -p "$(dirname "$SCRIPT_PATH")"
    sudo cp "$CURRENT_SCRIPT_LOCATION" "$SCRIPT_PATH"
    sudo chmod +x "$SCRIPT_PATH"
    echo -e "${GREEN}✅ Script movido y permisos establecidos.${NC}"
fi

cat <<EOF > "$DESKTOP_FILE"
[Desktop Entry]
Version=1.0
Type=Application
Name=Configuración de Pantalla
Comment=Administra la configuración y compartición de pantalla
Exec=$SCRIPT_PATH
Icon=display
Terminal=true
Categories=Settings;Utility;
EOF

sudo chmod +x "$DESKTOP_FILE"
echo -e "${GREEN}✅ Archivo .desktop global creado en $DESKTOP_FILE${NC}"

# 2. Copiar el .desktop al escritorio de usuarios nuevos
DESKTOP_DIR="/etc/skel/Desktop"
if [ ! -d "$DESKTOP_DIR" ]; then
    DESKTOP_DIR="/etc/skel/Escritorio"
fi

sudo mkdir -p "$DESKTOP_DIR"
sudo cp "$DESKTOP_FILE" "$DESKTOP_DIR/configuracion-pantalla.desktop"
sudo chmod +x "$DESKTOP_DIR/configuracion-pantalla.desktop"
echo -e "${GREEN}✅ Archivo .desktop copiado en $DESKTOP_DIR (para nuevos usuarios)${NC}"

# 3. Copiar el acceso directo para usuarios existentes
for user_dir in /home/*; do
    if [ -d "$user_dir" ]; then
        USER_NAME=$(basename "$user_dir")
        if [ -d "$user_dir/Desktop" ]; then
            sudo cp "$DESKTOP_FILE" "$user_dir/Desktop/"
            sudo chmod +x "$user_dir/Desktop/configuracion-pantalla.desktop"
            echo -e "${GREEN}✅ Archivo .desktop copiado en $user_dir/Desktop${NC}"
        elif [ -d "$user_dir/Escritorio" ]; then
            sudo cp "$DESKTOP_FILE" "$user_dir/Escritorio/"
            sudo chmod +x "$user_dir/Escritorio/configuracion-pantalla.desktop"
            echo -e "${GREEN}✅ Archivo .desktop copiado en $user_dir/Escritorio${NC}"
        fi
    fi
done

# ===============================================
#  FUNCIONES DE PERFILES DE CONFIGURACIÓN
# ===============================================

save_profile() {
    clear
    echo -e "${YELLOW}Descripción: Guarda la configuración actual de todas tus pantallas en un perfil.${NC}"
    echo -e "${WHITE}Esto incluye resolución, brillo, rotación y disposición (duplicar/extender).${NC}"
    read -p "Introduce un nombre para el perfil: " profile_name
    if [ -z "$profile_name" ]; then
        echo -e "${RED}❌ Nombre de perfil no puede estar vacío.${NC}"
        sleep 2
        return
    fi

    local profile_file="$PROFILES_DIR/$profile_name.sh" # Cambiado a .sh para que sea ejecutable

    # Generar el contenido del script de perfil
    echo "#!/bin/bash" > "$profile_file"
    echo "# Perfil de pantalla: $profile_name" >> "$profile_file"
    echo "# Generado el $(date)" >> "$profile_file"
    echo "" >> "$profile_file"

    # Comando para apagar todas las pantallas antes de aplicar la nueva configuración
    echo "xrandr --current | grep ' connected' | awk '{print \$1}' | while read output; do xrandr --output \$output --off; done" >> "$profile_file"
    echo "sleep 1" # Pequeña pausa para que los cambios se apliquen

    # Obtener la configuración actual de todas las pantallas conectadas
    # y construir los comandos xrandr para restaurarlas
    xrandr | grep " connected" | while read -r line; do
        output_name=$(echo "$line" | awk '{print $1}')
        
        # Obtener los parámetros de configuración de xrandr para cada salida
        # Esto es un poco más complejo ya que xrandr --query tiene un formato específico.
        # Vamos a intentar construir el comando de la forma más fiable.
        
        local current_config=$(xrandr --query | grep -A 1 "$output_name connected" | head -n 2)
        local mode_info=$(echo "$current_config" | awk 'NR==2 {print $1}' | grep -E '^[0-9]+x[0-9]+$')
        local rate_info=$(echo "$current_config" | awk 'NR==2 {print $2}' | sed 's/\*//g' | grep -E '^[0-9]+(\.[0-9]+)?$')
        
        local command_parts="--output $output_name"

        # Modo y tasa de refresco
        if [ -n "$mode_info" ]; then
            command_parts="$command_parts --mode $mode_info"
            if [ -n "$rate_info" ]; then
                command_parts="$command_parts --rate $rate_info"
            fi
        fi

        # Posición (si está extendida)
        if echo "$line" | grep -q '\-\-pos'; then
            local pos=$(echo "$line" | grep -oP '\-\-pos [0-9]+x[0-9]+')
            if [ -n "$pos" ]; then
                command_parts="$command_parts $pos"
            fi
        fi
        
        # Rotación
        if echo "$line" | grep -q '\-\-rotate'; then
            local rot=$(echo "$line" | grep -oP '\-\-rotate (normal|inverted|left|right)')
            if [ -n "$rot" ]; then
                command_parts="$command_parts $rot"
            fi
        fi

        # Brillo
        if echo "$line" | grep -q '\-\-brightness'; then
            local brightness=$(echo "$line" | grep -oP '\-\-brightness [0-9]+\.?[0-9]*')
            if [ -n "$brightness" ]; then
                command_parts="$command_parts $brightness"
            fi
        fi

        # Primaria
        if echo "$line" | grep -q 'primary'; then
            command_parts="$command_parts --primary"
        fi
        
        # Asegurarse de que la pantalla esté encendida por defecto al aplicar el perfil
        command_parts="$command_parts --auto"
        
        echo "xrandr $command_parts" >> "$profile_file"
    done
    
    # Asegurar que el script de perfil sea ejecutable
    chmod +x "$profile_file"

    echo -e "${GREEN}✅ Perfil '$profile_name' guardado en '$profile_file'.${NC}"
    notify-send "💾 Perfil de pantalla guardado: $profile_name"
    sleep 2
}


load_profile() {
    clear
    echo -e "${YELLOW}Descripción: Carga y aplica una configuración de pantalla previamente guardada.${NC}"
    echo -e "${WHITE}Esto restaurará la resolución, brillo, rotación y disposición de tus pantallas.${NC}"
    local profiles=()
    local i=1
    echo -e "${YELLOW}Perfiles de pantalla disponibles:${NC}"
    echo -e "${WHITE}-------------------------------${NC}"
    for file in "$PROFILES_DIR"/*.sh; do # Buscar .sh en lugar de .xrandr
        if [ -f "$file" ]; then
            profile=$(basename "$file" .sh)
            profiles+=("$profile")
            echo -e "${CYAN}$i. $profile${NC}"
            i=$((i+1))
        fi
    done

    if [ ${#profiles[@]} -eq 0 ]; then
        echo -e "${RED}❌ No hay perfiles guardados.${NC}"
        read -p "Presiona Enter para continuar..."
        return
    fi

    echo -e "${WHITE}-------------------------------${NC}"
    read -p "Selecciona el NÚMERO del perfil para cargar: " selection

    if [[ "$selection" -ge 1 && "$selection" -le ${#profiles[@]} ]]; then
        local profile_to_load="${profiles[$((selection-1))]}"
        local profile_path="$PROFILES_DIR/$profile_to_load.sh"

        echo -e "${YELLOW}Aplicando perfil '$profile_to_load'....${NC}"
        bash "$profile_path" # Ejecuta el archivo de perfil como un script

        notify-send "✅ Perfil de pantalla cargado: $profile_to_load"
        echo -e "${GREEN}✅ Perfil '$profile_to_load' cargado.${NC}"
    else
        echo -e "${RED}❌ Selección no válida.${NC}"
    fi
    read -p "Presiona Enter para continuar..."
}


delete_profile() {
    clear
    echo -e "${YELLOW}Descripción: Elimina un perfil de configuración de pantalla guardado.${NC}"
    echo -e "${WHITE}Una vez eliminado, no podrás restaurar esa configuración fácilmente.${NC}"
    local profiles=()
    local i=1
    echo -e "${YELLOW}Perfiles de pantalla disponibles para eliminar:${NC}"
    echo -e "${WHITE}-------------------------------${NC}"
    for file in "$PROFILES_DIR"/*.sh; do # Buscar .sh en lugar de .xrandr
        if [ -f "$file" ]; then
            profile=$(basename "$file" .sh)
            profiles+=("$profile")
            echo -e "${CYAN}$i. $profile${NC}"
            i=$((i+1))
        fi
    done

    if [ ${#profiles[@]} -eq 0 ]; then
        echo -e "${RED}❌ No hay perfiles guardados para eliminar.${NC}"
        read -p "Presiona Enter para continuar..."
        return
    fi

    echo -e "${WHITE}-------------------------------${NC}"
    read -p "Selecciona el NÚMERO del perfil para eliminar: " selection

    if [[ "$selection" -ge 1 && "$selection" -le ${#profiles[@]} ]]; then
        local profile_to_delete="${profiles[$((selection-1))]}"
        rm "$PROFILES_DIR/$profile_to_delete.sh" # Eliminar .sh
        echo -e "${GREEN}✅ Perfil '$profile_to_delete' eliminado.${NC}"
        notify-send "🗑️ Perfil de pantalla eliminado: $profile_to_delete"
    else
        echo -e "${RED}❌ Selección no válida.${NC}"
    fi
    read -p "Presiona Enter para continuar..."
}

# ===============================================
#  MENÚ PRINCIPAL Y SUBMENÚS
# ===============================================

# Verificar dependencias al inicio del script
check_dependencies

# Menú principal
while true; do
    clear
    echo -e "${CYAN}🔧 Menú Principal de Configuración de Pantalla${NC}"
    echo -e "${WHITE}-------------------------------${NC}"
    echo -e "${GREEN}1. ⚙️ Configuración de Pantalla (Resolución, Brillo, Rotación, Refresco)${NC}"
    echo "   Permite ajustar las propiedades individuales de una pantalla seleccionada."
    echo -e "${BLUE}2. 📡 Compartición de Pantalla (Duplicar, Extender, Solo)${NC}"
    echo "   Controla cómo se muestran tus pantallas, ideal para presentaciones o multi-monitor."
    echo -e "${MAGENTA}3. 💾 Perfiles de Configuración (Guardar/Cargar/Eliminar)${NC}"
    echo "   Guarda y restaura tus configuraciones de pantalla favoritas con facilidad."
    echo -e "${YELLOW}4. 🚀 Configurar al Inicio de Sesión${NC}"
    echo "   Define una configuración de pantalla para que se aplique automáticamente al iniciar tu sesión."
    echo -e "${RED}5. ❌ Salir${NC}"
    echo "   Cierra esta herramienta."
    echo -e "${WHITE}-------------------------------${NC}"
    read -p "Selecciona una opción: " main_option

    case $main_option in
        1) # Menú de configuración de pantalla
            while true; do
                clear
                echo -e "${GREEN}⚙️ Configuración de Pantalla Individual${NC}"
                echo -e "${WHITE}-------------------------------${NC}"
                echo "Aquí puedes ajustar las propiedades de una pantalla específica."
                echo -e "${CYAN}1. 🎚️ Modificar resolución${NC}"
                echo -e "${YELLOW}2. 🌅 Ajustar brillo${NC}"
                echo -e "${BLUE}3. 🔄 Rotar pantalla${NC}"
                echo -e "${MAGENTA}4. 🏳️ Cambiar tasa de refresco${NC}"
                echo -e "${RED}5. ↩️ Volver al menú principal${NC}"
                echo -e "${WHITE}-------------------------------${NC}"
                read -p "Selecciona una opción: " config_option

                case $config_option in
                    1) # Modificar resolución
                        clear
                        echo -e "${CYAN}--- Modificar Resolución ---${NC}"
                        echo "Descripción: Cambia el tamaño y la claridad de la imagen en la pantalla seleccionada."
                        echo "Instrucciones: Primero, selecciona la pantalla de la lista numerada."
                        echo "               Luego, selecciona la resolución deseada de la nueva lista numerada."
                        echo -e "${WHITE}-------------------------------${NC}"
                        SELECTED_OUTPUT=$(select_display_output)
                        if [ $? -ne 0 ]; then continue; fi # Si falla la selección de pantalla
                        SELECTED_RESOLUTION=$(select_resolution "$SELECTED_OUTPUT")
                        if [ $? -ne 0 ]; then continue; fi # Si falla la selección de resolución
                        xrandr --output "$SELECTED_OUTPUT" --mode "$SELECTED_RESOLUTION"
                        notify-send "🎚️ Resolución cambiada en $SELECTED_OUTPUT a $SELECTED_RESOLUTION"
                        sleep 2
                        ;;
                    2) # Ajustar brillo
                        clear
                        echo -e "${YELLOW}--- Ajustar Brillo ---${NC}"
                        echo "Descripción: Controla la intensidad de la luz emitida por la pantalla."
                        echo "Instrucciones: Primero, selecciona la pantalla de la lista numerada."
                        echo "               Luego, introduce un valor numérico para el brillo."
                        echo "               Ejemplo: '1.0' para brillo normal (100%), '0.5' para 50%, '0.2' para 20%."
                        echo -e "${WHITE}-------------------------------${NC}"
                        SELECTED_OUTPUT=$(select_display_output)
                        if [ $? -ne 0 ]; then continue; fi
                        read -p "Introduce el nivel de brillo (Ejemplo: 0.5 para 50%): " brightness
                        if ! [[ "$brightness" =~ ^[0-9]+(\.[0-9]+)?$ ]]; then
                            echo -e "${RED}❌ Brillo no válido. Usa un número (ej. 0.8).${NC}"
                            sleep 2; continue
                        fi
                        xrandr --output "$SELECTED_OUTPUT" --brightness "$brightness"
                        notify-send "🌅 Brillo ajustado en $SELECTED_OUTPUT a $brightness"
                        sleep 2
                        ;;
                    3) # Rotar pantalla
                        clear
                        echo -e "${BLUE}--- Rotar Pantalla ---${NC}"
                        echo "Descripción: Gira la orientación de la pantalla."
                        echo "Instrucciones: Primero, selecciona la pantalla de la lista numerada."
                        echo "               Luego, introduce una de las siguientes palabras para la rotación:"
                        echo "               - 'normal': Orientación estándar (0 grados)."
                        echo "               - 'inverted': Pantalla rotada 180 grados."
                        echo "               - 'left': Pantalla rotada 90 grados a la izquierda (en sentido antihorario)."
                        echo "               - 'right': Pantalla rotada 90 grados a la derecha (en sentido horario)."
                        echo -e "${WHITE}-------------------------------${NC}"
                        SELECTED_OUTPUT=$(select_display_output)
                        if [ $? -ne 0 ]; then continue; fi
                        read -p "Introduce el ángulo de rotación (normal, inverted, left, right): " rotation
                        case "$rotation" in
                            normal|inverted|left|right)
                                xrandr --output "$SELECTED_OUTPUT" --rotate "$rotation"
                                notify-send "🔄 Pantalla $SELECTED_OUTPUT rotada: $rotation"
                                ;;
                            *) echo -e "${RED}❌ Rotación no válida. Usa 'normal', 'inverted', 'left' o 'right'.${NC}" ;;
                        esac
                        sleep 2
                        ;;
                    4) # Cambiar tasa de refresco
                        clear
                        echo -e "${MAGENTA}--- Cambiar Tasa de Refresco ---${NC}"
                        echo "Descripción: Ajusta la suavidad del movimiento en la pantalla (medido en Herzios - Hz)."
                        echo "Instrucciones: Primero, selecciona la pantalla de la lista numerada."
                        echo "               Luego, selecciona la tasa de refresco deseada de la nueva lista numerada."
                        echo -e "${WHITE}-------------------------------${NC}"
                        SELECTED_OUTPUT=$(select_display_output)
                        if [ $? -ne 0 ]; then continue; fi
                        SELECTED_RATE=$(select_refresh_rate "$SELECTED_OUTPUT")
                        if [ $? -ne 0 ]; then continue; fi
                        xrandr --output "$SELECTED_OUTPUT" --rate "$SELECTED_RATE"
                        notify-send "🏳️ Tasa de refresco de $SELECTED_OUTPUT cambiada a $SELECTED_RATE Hz"
                        sleep 2
                        ;;
                    5) break ;;
                    *) echo -e "${RED}❌ Opción no válida, intenta de nuevo.${NC}" ;;
                esac # FIN DE CASE DE OPCIONES DE CONFIGURACIÓN
            done
            ;;
        2) # Menú de compartición de pantalla
            while true; do
                clear
                echo -e "${BLUE}📡 Compartición de Pantalla${NC}"
                echo -e "${WHITE}-------------------------------${NC}"
                echo "Estas opciones te permiten gestionar cómo se muestran tus pantallas, ideal para trabajar con múltiples monitores o realizar presentaciones."
                echo -e "${CYAN}📺 Modos de visualización${NC}"
                echo -e "${GREEN}1. 🔵 Duplicar pantalla (primaria y secundaria)${NC}"
                echo "   Muestra el mismo contenido en ambas pantallas. Útil para proyectores o compartir lo que ves."
                echo -e "${GREEN}2. 🟢 Pantalla extendida (primaria y secundaria)${NC}"
                echo "   Extiende tu escritorio a una segunda pantalla, dándote más espacio de trabajo."
                echo -e "${YELLOW}3. 📽️ Solo pantalla secundaria${NC}"
                echo "   Desactiva la pantalla principal y utiliza solo la secundaria. Ideal para presentaciones."
                echo -e "${YELLOW}4. 🖥️ Solo pantalla primaria${NC}"
                echo "   Desactiva las pantallas secundarias y utiliza solo la principal."
                echo -e "${MAGENTA}5. 📊 Modo presentación (ej. apagar otras pantallas, notificaciones)${NC}"
                echo "   Activa un modo optimizado para presentaciones (puede requerir configuración adicional)."
                echo -e "${WHITE}-------------------------------${NC}"
                echo -e "${CYAN}🌍 Opciones de transmisión/servicios${NC}"
                echo -e "${BLUE}6. 🔗 Compartir pantalla en red (Requiere VNC/RDP)${NC}"
                echo "   Habilita la compartición de tu escritorio a través de la red para que otros usuarios puedan verlo o controlarlo de forma remota."
                echo -e "${BLUE}7. 🎥 Activar transmisión a otro dispositivo (Requiere software adicional)${NC}"
                echo "   Prepara tu sistema para enviar la pantalla a dispositivos como Smart TVs o dongles de streaming."
                echo -e "${BLUE}8. 💡 Alternar DPMS (Standby/Suspend/Off)${NC}"
                echo "   Controla el estado de ahorro de energía de tus pantallas."
                echo -e "${RED}9. ↩️ Volver al menú principal${NC}"
                echo -e "${WHITE}-------------------------------${NC}"
                read -p "Selecciona una opción: " share_option

                PRIMARY_OUTPUT=$(get_primary_display_output)
                SECONDARY_OUTPUT=$(xrandr | grep " connected" | awk '{if ($1 != "'"$PRIMARY_OUTPUT"'") print $1;}' | head -n 1)

                if [ -z "$PRIMARY_OUTPUT" ]; then
                    echo -e "${RED}❌ No se detectó una pantalla principal conectada. Asegúrate de tener al menos una pantalla conectada.${NC}"
                    sleep 3
                    continue
                fi

                case $share_option in
                    1) # Duplicar pantalla
                        clear
                        echo -e "${BLUE}--- Duplicar Pantalla ---${NC}"
                        echo "Descripción: Muestra el mismo contenido en tu pantalla principal y una secundaria."
                        echo "Instrucciones: Esta opción se aplica automáticamente si detecta una pantalla secundaria."
                        echo -e "${WHITE}-------------------------------${NC}"
                        if [ -n "$SECONDARY_OUTPUT" ]; then
                           xrandr --output "$SECONDARY_OUTPUT" --same-as "$PRIMARY_OUTPUT" --auto
                           notify-send "🔵 Pantalla duplicada: $PRIMARY_OUTPUT y $SECONDARY_OUTPUT"
                        else
                           echo -e "${RED}❌ No se detectó una pantalla secundaria para duplicar.${NC}"
                        fi ;;
                    2) # Pantalla extendida
                        clear
                        echo -e "${GREEN}--- Pantalla Extendida ---${NC}"
                        echo "Descripción: Extiende tu escritorio a una segunda pantalla, dándote más espacio de trabajo."
                        echo "Instrucciones: El sistema extenderá automáticamente la pantalla secundaria a la derecha de la principal."
                        echo -e "${WHITE}-------------------------------${NC}"
                        if [ -n "$SECONDARY_OUTPUT" ]; then
                           xrandr --output "$SECONDARY_OUTPUT" --right-of "$PRIMARY_OUTPUT" --auto
                           notify-send "🟢 Pantalla extendida: $PRIMARY_OUTPUT y $SECONDARY_OUTPUT"
                        else
                           echo -e "${RED}❌ No se detectó una pantalla secundaria para extender.${NC}"
                        fi ;;
                    3) # Solo pantalla secundaria
                        clear
                        echo -e "${YELLOW}--- Solo Pantalla Secundaria ---${NC}"
                        echo "Descripción: Desactiva la pantalla principal y utiliza solo la secundaria. Útil para proyectores."
                        echo "Instrucciones: Si hay una pantalla secundaria conectada, se activará como principal y la otra se apagará."
                        echo -e "${WHITE}-------------------------------${NC}"
                        if [ -n "$SECONDARY_OUTPUT" ]; then
                           xrandr --output "$PRIMARY_OUTPUT" --off
                           xrandr --output "$SECONDARY_OUTPUT" --primary --auto
                           notify-send "📽️ Solo pantalla secundaria activada: $SECONDARY_OUTPUT"
                        else
                           echo -e "${RED}❌ No se detectó una pantalla secundaria para activar.${NC}"
                        fi ;;
                    4) # Solo pantalla primaria
                        clear
                        echo -e "${YELLOW}--- Solo Pantalla Primaria ---${NC}"
                        echo "Descripción: Desactiva todas las pantallas secundarias y utiliza solo la principal."
                        echo "Instrucciones: Esta opción se aplica automáticamente, apagando cualquier otra pantalla conectada."
                        echo -e "${WHITE}-------------------------------${NC}"
                        if [ -n "$PRIMARY_OUTPUT" ]; then
                           xrandr --output "$PRIMARY_OUTPUT" --primary --auto
                           xrandr | grep " connected" | awk '{print $1}' | while read output; do
                               if [ "$output" != "$PRIMARY_OUTPUT" ]; then
                                   xrandr --output "$output" --off
                               fi
                           done
                           notify-send "🖥️ Solo pantalla primaria activada: $PRIMARY_OUTPUT"
                        else
                           echo -e "${RED}❌ No se detectó una pantalla primaria para activar.${NC}"
                        fi ;;
                    5) # Modo presentación
                        clear
                        echo -e "${MAGENTA}--- Modo Presentación ---${NC}"
                        echo "Descripción: Activa un modo optimizado para presentaciones."
                        echo "Instrucciones: Actualmente, esta opción solo muestra una notificación."
                        echo "               Puedes expandirla manualmente en el script para, por ejemplo, deshabilitar el salvapantallas o las notificaciones del sistema durante una presentación."
                        echo -e "${WHITE}-------------------------------${NC}"
                        notify-send "📊 Modo presentación activado (Funcionalidad avanzada pendiente: Por ejemplo, puedes agregar aquí comandos para deshabilitar el salvapantallas, las notificaciones de escritorio, etc.)"
                        # Ejemplo: xset dpms force off (para apagar la pantalla) o configurar un fondo de escritorio específico.
                        # Para deshabilitar salvapantallas temporalmente: xset s off && xset -dpms
                        ;;
                    6) # Compartir pantalla en red
                        clear
                        echo -e "${BLUE}--- Compartir Pantalla en Red ---${NC}"
                        echo "Descripción: Habilita la compartición de tu escritorio a través de la red."
                        echo "Instrucciones: Esta función requiere un servidor VNC/RDP (ej. 'x11vnc' o 'vino-server') instalado y configurado en tu sistema. Este script solo te informa al respecto."
                        echo -e "${WHITE}-------------------------------${NC}"
                        notify-send "🔗 Compartición de pantalla en red: Esta función requiere un servidor VNC/RDP (ej. 'x11vnc' o 'vino-server') para compartir tu escritorio en la red. ¡Instálalo y configúralo!"
                        ;;
                    7) # Activar transmisión a otro dispositivo
                        clear
                        echo -e "${BLUE}--- Activar Transmisión ---${NC}"
                        echo "Descripción: Prepara tu sistema para enviar la pantalla a dispositivos externos como Smart TVs o dongles de streaming."
                        echo "Instrucciones: Esta función requiere software de streaming adicional (como FFmpeg, GStreamer, o herramientas para Miracast/Chromecast). Este script solo te informa al respecto."
                        echo -e "${WHITE}-------------------------------${NC}"
                        notify-send "🎥 Transmisión a otro dispositivo: Esta función requiere software de streaming como FFmpeg, GStreamer, o herramientas para Miracast/Chromecast. ¡Instálalo y configúralo!"
                        ;;
                    8) # Alternar DPMS
                        clear
                        echo -e "${BLUE}--- Alternar DPMS (Display Power Management Signaling) ---${NC}"
                        echo "Descripción: DPMS permite controlar el estado de ahorro de energía de tus pantallas (Standby, Suspend, Off)."
                        echo "Instrucciones: Selecciona la opción deseada para aplicar el modo de ahorro de energía."
                        echo -e "${WHITE}-------------------------------${NC}"
                        echo -e "${CYAN}1. Standby (ahorro de energía moderado)${NC}"
                        echo -e "${CYAN}2. Suspend (ahorro de energía significativo)${NC}"
                        echo -e "${CYAN}3. Off (apagar pantalla)${NC}"
                        echo -e "${RED}4. Volver${NC}"
                        read -p "Selecciona una opción DPMS: " dpms_option
                        case $dpms_option in
                            1) xset dpms force standby; notify-send "💡 DPMS: Pantalla en Standby.";;
                            2) xset dpms force suspend; notify-send "💡 DPMS: Pantalla en Suspend.";;
                            3) xset dpms force off; notify-send "💡 DPMS: Pantalla apagada.";;
                            4) ;;
                            *) echo -e "${RED}❌ Opción DPMS no válida.${NC}";;
                        esac
                        ;;
                    9) break ;;
                    *) echo -e "${RED}❌ Opción no válida, intenta de nuevo.${NC}" ;;
                esac
                sleep 2
            done
            ;;
        3) # Menú de perfiles de configuración
            while true; do
                clear
                echo -e "${MAGENTA}💾 Perfiles de Configuración${NC}"
                echo -e "${WHITE}-------------------------------${NC}"
                echo "Gestiona tus configuraciones de pantalla guardadas para aplicarlas rápidamente cuando las necesites."
                echo -e "${GREEN}1. Guardar configuración actual${NC}"
                echo -e "${BLUE}2. Cargar perfil guardado${NC}"
                echo -e "${RED}3. Eliminar perfil${NC}"
                echo -e "${YELLOW}4. ↩️ Volver al menú principal${NC}"
                echo -e "${WHITE}-------------------------------${NC}"
                read -p "Selecciona una opción: " profile_option

                case $profile_option in
                    1)
                        clear
                        echo -e "${GREEN}--- Guardar Configuración Actual ---${NC}"
                        echo "Descripción: Crea un nuevo perfil basado en la configuración actual de tus pantallas."
                        echo "Instrucciones: Introduce un nombre único para tu nuevo perfil."
                        echo -e "${WHITE}-------------------------------${NC}"
                        save_profile ;;
                    2)
                        clear
                        echo -e "${BLUE}--- Cargar Perfil Guardado ---${NC}"
                        echo "Descripción: Aplica una configuración de pantalla guardada anteriormente."
                        echo "Instrucciones: Se te presentará una lista numerada de tus perfiles. Introduce el número del perfil que deseas cargar."
                        echo -e "${WHITE}-------------------------------${NC}"
                        load_profile ;;
                    3)
                        clear
                        echo -e "${RED}--- Eliminar Perfil ---${NC}"
                        echo "Descripción: Borra un perfil de configuración que ya no necesites."
                        echo "Instrucciones: Se te presentará una lista numerada de tus perfiles. Introduce el número del perfil que deseas eliminar."
                        echo -e "${WHITE}-------------------------------${NC}"
                        delete_profile ;;
                    4) break ;;
                    *) echo -e "${RED}❌ Opción no válida, intenta de nuevo.${NC}" ;;
                esac
                sleep 2
            done
            ;;
        4) # Configurar al inicio de sesión
            clear
            echo -e "${YELLOW}🚀 Configuración al Inicio de Sesión${NC}"
            echo -e "${WHITE}-------------------------------${NC}"
            echo "Esta opción permite que tu configuración de pantalla se aplique automáticamente al iniciar sesión."
            echo "Para ello, se creará un archivo de autoinicio en tu directorio de usuario."
            echo -e "${WHITE}-------------------------------${NC}"
            echo -e "${GREEN}1. Establecer configuración al inicio${NC}"
            echo -e "${RED}2. Deshabilitar configuración al inicio${NC}"
            echo -e "${YELLOW}3. ↩️ Volver al menú principal${NC}"
            echo -e "${WHITE}-------------------------------${NC}"
            read -p "Selecciona una opción: " autostart_option

            case $autostart_option in
                1)
                    clear
                    echo -e "${GREEN}--- Establecer Configuración al Inicio ---${NC}"
                    echo "Descripción: Configura el script para aplicar un perfil de pantalla (o una configuración por defecto) cada vez que inicies sesión."
                    echo "Instrucciones: A continuación, se te preguntará si quieres aplicar un perfil guardado o simplemente usar la configuración predeterminada del sistema."
                    echo -e "${WHITE}-------------------------------${NC}"
                    AUTORUN_SCRIPT="$HOME/.config/autostart/display_autostart.desktop"
                    
                    echo -e "${YELLOW}Elige la configuración a aplicar al inicio de sesión:${NC}"
                    echo -e "${CYAN}1. Aplicar un perfil guardado.${NC}"
                    echo "   Selecciona uno de tus perfiles existentes para cargar al inicio."
                    echo -e "${CYAN}2. No aplicar ningún perfil (usar la configuración predeterminada o la última manual).${NC}"
                    echo "   El sistema operativo gestionará la configuración de pantalla al inicio, sin cargar un perfil específico de este script."
                    read -p "Selecciona una opción: " profile_autostart_choice

                    local AUTORUN_COMMAND=""

                    case $profile_autostart_choice in
                        1)
                            # Permite al usuario seleccionar un perfil existente para el inicio
                            local profiles_autostart=()
                            local i=1
                            echo -e "${YELLOW}Perfiles disponibles para aplicar al inicio:${NC}"
                            for file in "$PROFILES_DIR"/*.sh; do
                                if [ -f "$file" ]; then
                                    profile=$(basename "$file" .sh)
                                    profiles_autostart+=("$profile")
                                    echo -e "${CYAN}$i. $profile${NC}"
                                    i=$((i+1))
                                    # Muestra las descripciones de los perfiles si fuera necesario
                                    # (Podrías añadir un comentario al perfil en save_profile para mostrarlo aquí)
                                fi
                            done
                            if [ ${#profiles_autostart[@]} -eq 0 ]; then
                                echo -e "${RED}❌ No hay perfiles guardados. No se puede configurar el inicio automático con un perfil.${NC}"
                                notify-send "❌ Fallo al configurar inicio: No hay perfiles."
                                sleep 3
                                continue
                            fi
                            echo -e "${WHITE}-------------------------------${NC}"
                            read -p "Selecciona el NÚMERO del perfil a cargar al inicio: " autostart_profile_num
                            if [[ "$autostart_profile_num" -ge 1 && "$autostart_profile_num" -le ${#profiles_autostart[@]} ]]; then
                                selected_autostart_profile="${profiles_autostart[$((autostart_profile_num-1))]}"
                                AUTORUN_COMMAND="bash $PROFILES_DIR/$selected_autostart_profile.sh"
                                echo -e "${GREEN}✅ Se configurará el perfil '$selected_autostart_profile' al inicio.${NC}"
                            else
                                echo -e "${RED}❌ Selección de perfil no válida. No se configurará el inicio automático con perfil.${NC}"
                                notify-send "❌ Fallo al configurar inicio: Perfil no válido."
                                sleep 3
                                continue
                            fi
                            ;;
                        2)
                            AUTORUN_COMMAND="echo 'No se aplica ningún perfil específico al inicio de sesión por este script.'" # Un comando que no hace nada visual, solo para que el .desktop sea válido
                            echo -e "${YELLOW}Se usará la configuración por defecto o la última aplicada manualmente al inicio.${NC}"
                            ;;
                        *)
                            echo -e "${RED}❌ Opción no válida. Volviendo al menú anterior.${NC}"
                            sleep 2
                            continue
                            ;;
                    esac

                    mkdir -p "$(dirname "$AUTORUN_SCRIPT")"
                    cat <<EOF > "$AUTORUN_SCRIPT"
[Desktop Entry]
Type=Application
Exec=$AUTORUN_COMMAND
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name[es_ES]=Configuración de Pantalla al Inicio
Comment[es_ES]=Aplica la configuración de pantalla al inicio de sesión
EOF
                    chmod +x "$AUTORUN_SCRIPT"
                    notify-send "🚀 Configuración de pantalla habilitada al inicio de sesión."
                    echo -e "${GREEN}✅ Configuración habilitada al inicio de sesión. (Archivo: $AUTORUN_SCRIPT)${NC}"
                    ;;
                2)
                    clear
                    echo -e "${RED}--- Deshabilitar Configuración al Inicio ---${NC}"
                    echo "Descripción: Elimina la configuración de autoinicio para que las pantallas no se ajusten automáticamente al iniciar sesión."
                    echo "Instrucciones: No se requiere entrada adicional. La acción se realizará inmediatamente si existe una configuración previa."
                    echo -e "${WHITE}-------------------------------${NC}"
                    if [ -f "$HOME/.config/autostart/display_autostart.desktop" ]; then
                        rm "$HOME/.config/autostart/display_autostart.desktop"
                        notify-send "⛔ Configuración de pantalla deshabilitada al inicio."
                        echo -e "${GREEN}✅ Configuración deshabilitada al inicio de sesión.${NC}"
                    else
                        echo -e "${YELLOW}ℹ️ No hay configuración de inicio de sesión activa para deshabilitar.${NC}"
                    fi
                    ;;
                3) break ;;
                *) echo -e "${RED}❌ Opción no válida, intenta de nuevo.${NC}" ;;
            esac
            sleep 2
            ;;
        5) echo -e "${RED}Saliendo... ¡Hasta pronto!${NC}"; exit ;;
        *) echo -e "${RED}❌ Opción no válida, intenta de nuevo.${NC}" ;;
    esac

    sleep 2
done

Despres de crear l’script tindrem que donar’li permisos:

chmod +x screen-sharing.sh

A continuacio tindrem que executar l’script per que es crei el .desktop:

./screen-sharing.sh

Leave a comment

Your email address will not be published. Required fields are marked *