Cambiar entre el monitor del portátil y el externo en Linux con un solo clic

He escrito un pequeño script en Python para cambiar con un solo clic entre el monitor de mi portatil y el monitor externo en Linux.

Usa aticonfig --query-monitor para comprobar el número de monitores conectados y encendidos (luego como imaginareis está pensado para gráficas ATI). Si hay dos monitores conectados y ambos están encendidos, pasa al primero y apaga el segundo usando aticonfig --enable-monitor y xrandr -s para cambiar la resolución. Si hay dos monitores conectados pero sólo uno encendido, cambia al que estaba apagado.

Cada vez que cambiamos de monitor muestra un aviso usando libnotify. También escribe a la consola (más información), por si alguien lo prefiere.

Para usarlo no tenéis más que cambiar las resoluciones a las de vuestros monitores en el script y bien correrlo desde la línea de comandos o crear un lanzador en uno de los paneles para poder ejecutarlo con un sólo clic: botón derecho del ratón sobre el panel, Añadir al panel, Lanzador personalizado. O bien podéis asociarlo a una combinación de teclas.

Como extra, si hacéis que se ejecute al inicio (Ubuntu Sistema -> Preferencias -> Sesiones -> Nuevo) servirá para que apague el monitor del portátil al iniciar si el externo está conectado.

No me hago responsable de cualquier problema que podáis tener por ejecutarlo. Es muy posible que falle porque está hecho en 5 minutos y sólo probado en mi pc. Haced una copia del xorg.conf por si acaso. Podéis hacer lo que queráis con el código, aunque es bastante tonto y simple, pero agradecería enlaces entrantes.

Cambiar entre monitor portátil y externo en Linux
Cambiar monitor linux

Comentarios
  1. Error 404 página no encontrada. Un fallito?

    Responder

  2. ¡Ouch! Solucionado :$

    Responder

  3. Joer, también le das al python? eres un hacha tío 😉

    Responder

  4. Python es de lo más sencillote Rick. Tienes módulos para hacer de todo y es bastante natural.

    Pero además es potente. Con funciones de orden superior y esa clase de cosas 🙂

    Vamos que es un gustazo de lenguaje.

    Responder

  5. Ya ya, si yo me he encaprichado de el hace poquito, por eso lo digo 🙂
    Ya me he zampao el dive into python, la doc del libnotify, etc, asi que en cuanto tengo algo de tiempo a ver si cacharreo un poco 🙂

    Responder

  6. Pues valor y al toro. Ya me contarás que tal va 😉

    Responder

  7. Zootropo eres el mejor. Justo lo que necesitaba para ver las series con mi Dell 6400. Yo conecto la televisión a la salida de monitor, luego tengo que cambiar la resolución pero siempre veo la imagen tanto en el portátil como en la televisión.

    Responder

  8. ¿Te ha funcionado Mark?
    Pues me extraña… quiero decir, me alegro 😛

    Responder

  9. No lo he probado porque aun ando en el trabajo. Pero segun he leido el post creo que es justo lo que andaba buscando. Luego te cuento.

    Responder

  10. Bueno, si no te funciona al menos sabes los comandos que puedes utilizar.

    Responder

  11. Yo no soy tan “pro”, pero me hice un script (dualhead.sh, que original…) que mediante “xrandr” me configura en mi MacBook el monitor externo que tengo enchufado para ampliar el escritorio a los dos monitores.

    Son 4 líneas de script, pero con una es más rápido :).

    Responder

  12. ¿Por qué no pones un enlace en tu blog Edu? Lo mismo le sirve a alguien.

    Responder

  13. Zootropo te cuento. Mi resolución en el portátil es de 1440×900 y la de la televisión es de 1024×768, me detecta perfectamente los dos monitores:

    Connected monitors: crt1, lvds

    Al hacer el cambio de portátil a TV apaga bien la primera pantalla y cambia la resolución para que se pueda ver bien la televisión. Pero vuelvo a ejecutar el script apaga la TV pero no me cambia la resolución.

    Esta es la ejecución:

    markdbd@markdbd-portatil:~/bin/scripts$ python monitores.py
    Connected monitors: crt1, lvds
    Enabled monitors: crt1
    There is one enabled monitor: crt1
    There are two connected monitors: crt1, lvds
    Switching to monitor lvds
    aticonfig: Writing to ‘/etc/X11/xorg.conf’ failed. Bad file descriptor.
    Using /etc/X11/xorg.conf
    Saved back-up to /etc/X11/xorg.conf.fglrx-1

    Responder

  14. ¿Si ejecutas xrandr a mano pasa de tí mark?
    xrandr -s 1440×900

    Responder

  15. Me funciona bien si luego ejecuto el xrandr -s 1440×900

    Responder

  16. Pues es lo que hace el script.
    Prueba a ejecutar con DISPLAY:=0 a ver si es eso lo que lo jode

    Responder

  17. Ok listo, había asignado al revés las resoluciones. La resolución 1 es para la TV y la 2 para el portátil:

    resol1 = “1024×768”
    resol2 = “1440×900”

    Ya esta resuelto y funciona perfectamente. Mil gracias, si te digo que todas las noches enchufo la tele, cambio la resolución y podía ver la película tanto en el monitor como en la Tele, te puedes imaginar lo bien que me viene este script. Gracias de verdad.

    Responder

  18. Ole 🙂 Pues me alegro.

    Responder

  19. Pere

    Hola una duda, llevo poco tiempo con esto del ubuntu he probado con varios posts para ver tb la TV con mi ATI 9200 pero nada.

    He probado este pero cuando me dice q no tengo ningún monitor conectado.

    pere@pere-desktop:~$ aticonfig –query-monitor
    Connected monitors: none
    Enabled monitors: none

    ESTE ES MI ARCHIVO XORG.CONF

    Section “Files”
    FontPath “/usr/share/X11/fonts/misc”
    FontPath “/usr/share/X11/fonts/cyrillic”
    FontPath “/usr/share/X11/fonts/100dpi/:unscaled”
    FontPath “/usr/share/X11/fonts/75dpi/:unscaled”
    FontPath “/usr/share/X11/fonts/Type1”
    FontPath “/usr/share/X11/fonts/100dpi”
    FontPath “/usr/share/X11/fonts/75dpi”
    FontPath “/usr/share/fonts/X11/misc”
    # path to defoma fonts
    FontPath “/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType”
    EndSection

    Section “Module”
    Load “i2c”
    Load “bitmap”
    Load “ddc”
    Load “dri”
    Load “extmod”
    Load “freetype”
    Load “glx”
    Load “int10”
    Load “type1”
    Load “vbe”
    EndSection

    Section “InputDevice”
    Identifier “Generic Keyboard”
    Driver “kbd”
    Option “CoreKeyboard”
    Option “XkbRules” “xorg”
    Option “XkbModel” “pc105”
    Option “XkbLayout” “es”
    Option “XkbOptions” “lv3:ralt_switch”
    EndSection

    Section “InputDevice”
    Identifier “Configured Mouse”
    Driver “mouse”
    Option “CorePointer”
    Option “Device” “/dev/input/mice”
    Option “Protocol” “ExplorerPS/2”
    Option “ZAxisMapping” “4 5”
    Option “Emulate3Buttons” “true”
    EndSection

    Section “InputDevice”
    Driver “wacom”
    Identifier “stylus”
    Option “Device” “/dev/wacom” # Change to
    # /dev/input/event
    # for USB
    Option “Type” “stylus”
    Option “ForceDevice” “ISDV4” # Tablet PC ONLY
    EndSection

    Section “InputDevice”
    Driver “wacom”
    Identifier “eraser”
    Option “Device” “/dev/wacom” # Change to
    # /dev/input/event
    # for USB
    Option “Type” “eraser”
    Option “ForceDevice” “ISDV4” # Tablet PC ONLY
    EndSection

    Section “InputDevice”
    Driver “wacom”
    Identifier “cursor”
    Option “Device” “/dev/wacom” # Change to
    # /dev/input/event
    # for USB
    Option “Type” “cursor”
    Option “ForceDevice” “ISDV4” # Tablet PC ONLY
    EndSection

    Section “Device”
    Identifier “ATI Technologies, Inc. RV280 [Radeon 9200]”
    Driver “ati”
    BusID “PCI:1:0:0”
    EndSection

    Section “Monitor”
    Identifier “Visual Sensa”
    Option “DPMS”
    EndSection

    Section “Screen”
    Identifier “Default Screen”
    Device “ATI Technologies, Inc. RV280 [Radeon 9200]”
    Monitor “Visual Sensa”
    DefaultDepth 24
    SubSection “Display”
    Depth 1
    Modes “1024×768” “800×600” “640×480”
    EndSubSection
    SubSection “Display”
    Depth 4
    Modes “1024×768” “800×600” “640×480”
    EndSubSection
    SubSection “Display”
    Depth 8
    Modes “1024×768” “800×600” “640×480”
    EndSubSection
    SubSection “Display”
    Depth 15
    Modes “1024×768” “800×600” “640×480”
    EndSubSection
    SubSection “Display”
    Depth 16
    Modes “1024×768” “800×600” “640×480”
    EndSubSection
    SubSection “Display”
    Depth 24
    Modes “1024×768” “800×600” “640×480”
    EndSubSection
    EndSection

    Section “ServerLayout”
    Identifier “Default Layout”
    Screen “Default Screen”
    InputDevice “Generic Keyboard”
    InputDevice “Configured Mouse”
    InputDevice “stylus” “SendCoreEvents”
    InputDevice “cursor” “SendCoreEvents”
    InputDevice “eraser” “SendCoreEvents”
    EndSection

    Section “DRI”
    Mode 0666
    EndSection

    Alguién puede ayudarme?

    Responder

  20. ¿Has probado “DISPLAY=:0 aticonfig –query-monitor” pere?

    Responder

  21. Por cierto, Zoo, sabes donde anda la doc del python-notify, la API, o algo así? Pq todo lo que he visto a sido código de otros programas…

    Responder

  22. Creo que libnotify trae una carpeta doc con documentación generada con doxygen. Pero también creo recordar que era bastante pobre, Rick.

    Responder

  23. Si, es la misma que ya había visto yo,y coincido contigo: es muy muy pobre…

    Responder

  24. Me lo he bajado y funciona a la perfección. Muchas gracias porque llevaba ya unos cuantos días buscando algo parecido.

    Responder

  25. Rodrigo Lopez

    Creo que esto supero mis conocimientos he bajado el archivo localize donde dice la resolucion le doy 2 click y me manda el anuncio de mostrar o ejecutar en terminal lo ejecuto en terminal y nada no pasa nada Yo tengo una HPdv1000 con una tarjeta de video Intel

    Mi laptop la conecto a mi TV una Sony Bravia pero siempre tengo que andar con las teclas de la laptop para cambiar de monitor y quisiera poder entender este script espero y me ayuden

    Responder

  26. @Rodrigo, como dice claramente el texto sólo funciona con tarjetas ATI

    Responder

  27. Edgar Salas

    Podrian ayudarme, soy principiante, tengo instalado mandriva 2006, como puedo instalar el archivo para ver mi monitor en lugar del display de mi lap?

    Responder

  28. Edgar Salas

    mi tarjeta de video es una ti radeon express 200M

    Responder

  29. Estoy peleando por poder usar la tv-out (s-video) de mi laptop Dell Inspirion 6400 (Ati Radeon x1300)

    El problema que presento es que al cambiar monitor a TV la pantalla de television se ve negra y se apaga el pc tambien… (el cable esta bien ya que funciona en windows)

    La ejecucion es:

    Connected monitors: lvds, tv
    Enabled monitors: lvds
    There is one enabled monitor: lvds
    There are two connected monitors: lvds, tv
    Switching to monitor tv
    aticonfig: Writing to ‘/etc/X11/xorg.conf’ failed. Bad file descriptor.
    Using /etc/X11/xorg.conf
    Saved back-up to /etc/X11/xorg.conf.fglrx-2

    Y se van a negro las dos pantallas

    Responder

  30. sabes si en java se puede detectar el numero de monitores conectados… agradeceria tu respuesta…

    si sabes … entonces dime cual podria ser el comando…
    saludos 😀

    Responder

  31. Zackreffil

    Tengo un problema, al conectar un monitor externo (LG) desde ubuntu, la imagen no me aparece completa, como le puedo hacer para que la imagen se muestre completa

    Responder

Deja un comentario