lunes, 1 de abril de 2013

Script para cambiar de monitor


Buenas, soy un nuevo colaborador de este estupendo bloog.

No soy ningún experto informático, solamente un usuario con un poco de curiosidad, como imagino seréis la mayoría de los que leéis este bloog.

Mi primera aportación quiero que sea un script que permita el cambio de monitor de pantalla, de forma rápida y con algún añadido más. Decir que este sistema funciona para los casos en que tenemos instalados los drivers privativos de Nvidia. Sobre ATI, al no tener, no se su funcionamiento, aunque creo, sin poder afirmarlo, que funcionaria de igual modo, puesto que depende del mismo programa y mismo archivo de configuración. Los driver Noveau que vienen por defecto en LMDE, no permiten, por lo menos en mi caso, cambiar de monitores.

Decir que en Linux al ser diferente del lado oscuro y depender de otro programa X Window System, se necesita reiniciar el servidor X, lo que no permite hacerlo como en caliente como si permite el sistema de Bill Gates. Por lo tanto vamos a dotar al script, de todo lo necesario para que lo haga el solito.


El primer paso trataría de entrar en nvidia-settings y guardar las diferentes combinaciones que queremos usar. (Save to X configuration File).

  
No hace falta ni guardarlas, bastaría con hacer una vista previa, copiarlas y guárdalas en un archivo, con el pluma, mismo.
Una vez tenemos estos archivos vamos a proceder con el script en si.


#!/bin/bash

radio=$(zenity --list --title="MONITORES" --text="Configuracion monitores" --column="" --column="Elegir configuración" --height="192" --width="60" --radiolist FALSE "Belinea" FALSE "TV LG" FALSE "Belina+LG")

if [ "$radio" = "Belinea" ]; then
pacmd set-default-sink 0
cp $HOME/.Belinea.conf /etc/X11/xorg.conf
gconftool-2 -t str -s /desktop/gnome/background/picture_filename
$HOME/Imágenes/Wallpaper/green-guitar-wallpaper.jpg
echo "12345678" | sudo -S kill -HUP `pgrep X`
sudo /etc/init.d/gdm start
exit


elif [ "$radio" = "TV LG" ]; then
pacmd set-default-sink 1
cp $HOME/.LG.conf /etc/X11/xorg.conf
gconftool-2 -t str -s /desktop/gnome/background/picture_filename
$HOME/Imágenes/Wallpaper/green-guitar-LG.jpg
echo "12345678" | sudo -S kill -HUP `pgrep X`
sudo /etc/init.d/gdm start
exit


elif [ "$radio" = "Belina+LG" ]; then
cp $HOME/.Belinea+Lg.conf /etc/X11/xorg.conf
gconftool-2 -t str -s /desktop/gnome/background/picture_filename
$HOME/Imágenes/Wallpaper/green-guitar-LG.jpg
echo "12345678" | sudo -S kill -HUP `pgrep X`
sudo /etc/init.d/gdm start
exit
fi

Esta hecho con zenity, en base a mi monitor Belinia, mi TV LG y una combinación de los dos.

El funcionamiento se baja unicamente en copiar las 3 configuraciones desde nvidia-settings, como he explicado en el principio, en nuestro home en un archivo de texto (Belinea.conf, LG.conf y .Belinea+Lg.conf, en mi caso), y grabarlas en el archivo por defecto de Nvidia, xorg.conf.

Vamos a proceder a explicar el script, en si:

La segunda linea radio=$(zenity... pertenece a zenity que es la ventana que nos abrirá para poder elegir configuración aquí solo habría que cambiar los nombres Belinia, TV LG y Belina+LG, por los que cada uno quiera poner. Añadir o quitar si queremos más o menos configuraciones eliminado o añadiendo también el FALSE. También se puede modificar el valor de height y width para tamaño de ventana y title, test y column si queremos otro nombre. Por supuesto respetando las comillas, iguales, guiones...

La tercera : if [ "$radio" = "Belinea" ]; thentambién hace referencia a la ventana, cambiar Belinea por el nombre que le hayamos puesto, en la línea anterior. La columnas que empiezan por elif, hacen referencia también a la ventana, cambiar nombre por el puesto, y añadir o quitar en función del número de configuraciones a emplear. El fi de final de archivo, termina el bucle y también pertenece a la ventana. El bucle empieza por If, luego lleva tantos elif como sean necesarios y se cierra con fi, por si alguien no tiene idea de programación.

Después del if y los elif que se vayan a emplear, están los comandos para el cambio de monitor y otras cosillas, no todas son necesarias.

pacmd set-default-sink 0 tiene que ver con la tarjeta de sonido, ya que cambio del monitor con sus altavoces, a el HDMI de la TV, quiero que me cambie también la salida de sonido. El comando pacmd es complejo, a mi este comando me funciona, pero hay múltiples formas de hacerlo. Deberéis abrir un terminal y poner pacmd list-sinks, esto os listara los dispositivos de sonido, fijaros en la línea index: que os dará el número a poner al final del comando, en el mio 0corresponde a la salida analogica y 1 a la HDMI. Si tenéis más configuraciones como puedan ser 4,1 o 6,1... Podéis pedirme una ayuda, pero no os prometo nada, con ese comando, nunca conseguí saber la sintaxis exacta para cambiar cosas de otra manera que no sea usando default-sink.
Podéis tirar el comando por terminal y al lado abrir mate-volume-control (en mi caso que es Mate), y en la pestaña salida, observar como cambia automatico, para comprobar que os funciona.

cp
$HOME/Belinea.conf /etc/X11/xorg.conf reescribe la configuración del archivo salvado de mi monitor en el archivo de configuración por defecto de Nvidia. Decir que esto se debe hacer como root, en mi caso entre como root y cambie la propiedad de ese archivo por la de mi usuario, con lo que ya no es necesario, esto se puede hacer de muchas maneras, (una esta explicada más abajo), para gustos colores. Este cambio de configuración del archivo, podemos hacerlo a mano reiniciando el ordenador o usando CTRL + ALT + BACKSPACE, guardando a buen recaudo el original, para comprobar que os funciona, aunque debería hacerlo sin problemas.

gconftool-2 -t str -s /desktop/gnome/background/picture_filename
$HOME/Imágenes/Wallpaper/green-guitar-wallpaper.jpg    >>Gnome

mateconftool-2 -t str -s /desktop/mate/background/picture_filename $HOME/Imágenes/Wallpaper/green-guitar-wallpaper.jpg    >>Mate
Cambia la foto de escritorio, en mi caso es la misma con diferente tamaño para que me cuadre el conky, debido a que monitor y TV no tienen misma definición, tampoco entrare en más detalles. De querer usarlo cambiar ubicación $HOME/Imágenes/Wallpaper/green-guitar-wallpaper.jpgpor la de la foto que queráis.

echo "12345678" | sudo -S kill -HUP `pgrep X` este comando es muy interesante echo "12345678" | sudo -S más el comando a usar, es la forma de logearte como root y mandar un cómando (12345678 es mí muy segura clave). Es decir, echo "*" | sudo -S sudo apt-get update && sudo apt-get upgrade, generaría un script con el que cualquiera podría actualizar el sistema sin ser root ni saber la clave, con un script que pidiera una variable nombre de programa, se podría hacer uno que permitiera instalar programas de la misma manera (también dejaría un archivo de texto donde estaría la clave a la vista, salvo que se le de permiso de ejecución y no de lectura, y habría que ponerle el exit para no dejar una terminal de root abierta). Igual un día hago el script y lo publico, pero ahora volvemos al tema que nos ocupaba. En este caso sudo kill -HUP `pgrep X` mata el servidor X.

sudo /etc/init.d/gdm start inicia la sección de gdm, es decir el logeo de usuario, en gnome.
En Mate  sudo /etc/init.d/mdm start
Este comando no debería ser necesario, en mate me funciona sin el. Importe el script desde mi Ubuntu sin cambiar mdm por gdm y me funcionaba igual, por eso, creo, la última línea no es necesaria, en LMDE.

El script me tira un error que no influye en el funcionamiento, al no tener ningún logeo, para acceder al sistema (en mi caso).


Decir que a veces la grabación del archivo de configuración falla, no es habitual pero me ha pasado, si os quedáis sin imágenes, haciendo pruebas por ejemplo, y no tenéis imágenes, es decir no arranca el servidor gráfico, no os asustéis, bastaría por ejemplo con entrar con un live CD y volver a meter la configuración del archivo /etc/X11/xorg.conf, que veréis se ha quedado vacio, lanzar el comando cp /home/usuario/.Belinea.conf /etc/X11/xorg.conf (el vuestro modificado), crear un comando personalizado por consola(arreglar_monitor, por ejemlo).... También puede pasar si una actualización de drivers de tarjeta grafica os ha quitado los permisos de ese archivo. Para esto bastaría con añadir un comando que cambie permisos de ese archivo, que ese paso se haga como root...Ya os he dicho que en mi caso le cambie la propiedad a xorg.conf.

Yo sinceramente echaba de menos algo que superara o al menos igualara el lado oscuro en ese sentido, de hecho si no fuera porque tengo que logearme en mdm, con este script lo haría de forma más rápida y cómoda que lo hace el lado oscuro.

Por último para el que quiera probarlo, dejo otros comandos que podrían sustituir a los dos últimos.
$ sudo /etc/init.d/gdm restart >> gnome
$ sudo /etc/init.d/mdm restart >> mate
$ sudo /etc/init.d/kdm restart >>> KDE

Deberían reiniciar el servidor X, pero igualmente te hacen pasar por el logeo. Decir que en mi caso no funciona salvo que utilice

$ sudo /etc/init.d/mdm stop && sudo /etc/init.d/mdm start

No recuerdo que comando utilice en su día, imagino que tendrían que ver con startx, es decir actuando directamente sobre el servicio del servidor X, sin usar el gestor mdm, gdm... para gestionarlo, pero conseguía hacer el cambio en caliente, con sesión y aplicaciones abiertas (luego dejo de funcionar). Se que esos gestores vuelven a reiniciar el servidor X si detectan que no se esta ejecutando.

Si alguien me hecha una mano en eso se lo agradecería, puesto que el objetivo seria que pudiera cambiar de monitor en caliente.

No hay comentarios:

Publicar un comentario