Screen layout switcher para Linux

Mi setup de trabajo consiste en la laptop (Lenovo x1 del 2015), un monitor externo de 22" y un combo teclado + mouse inalambrico del supermercado. Actualmente estoy usando Pop!_OS

El monitor está en un brazo que me permite acomodarlo y girarlo en cualquier posición. El brazo está en una pequeña alzada que me permite ganar unos 13cm de altura, de manera que puedo usarlo para hacer standup desk junto con mi mesita.

Trato de trabajar al menos la mitad del día parado y a veces me voy con la compu a otra parte de la casa. Así que todo el tiempo estoy cambiando la configuración de la/s pantalla/s. Hacer esta tarea a mano me llevaba mucho tiempo y además es dificilisima la motricidad con el mouse si la pantalla está girada.

Dentro del soporte de "funciones avanzadas de teclado" de los linux modernos está "switch-monitor". Gnome mapea esta funcion con <Super>+P además de la tecla especial del teclado.

$ gsettings get org.gnome.mutter.keybindings switch-monitor
['<Super>p', 'XF86Display']

El problema con esta funcionalidad es que los modos están predefinidos: monitores espejados, sólo externa, sólo integrada o ambas "unidas" pero asumiendo ambas horizontales y el monitor izquierdo a la derecha (y el mio queda a la izquierda de la laptop).

Pregunté en twitter y varios amigos me apuntaron a la herramienta arandr que permite hacer las mismas configuraciones de pantallas que la herramienta de Gnome (de manera manual y visual) con la diferencia de que los modos definidos se pueden guardar como un comando de xrandr. Por ejemplo este setup de ambas pantallas encendidas y horizontales

arandr example

se guarda desde arandr (¡y se puede abrir para editar!) como un script

(blog) tin@pop-os:~/.screenlayout$ cat 2horizontal.sh 
#!/bin/sh
xrandr --output eDP-1 --mode 1920x1080 --pos 1920x283 --rotate normal --output DP-1 --off --output HDMI-1 --off --output DP-2 --off --output HDMI-2 --primary --mode 1920x1080 --pos 0x0 --rotate normal

Asi es que definí con esa herramienta los modos frecuentes que uso

~/.screenlayout$ ls *.sh
2horizontal.sh  ext-horizontal.sh  ext-vertical.sh  lapt-solo.sh

Lo que quería luego era un atajo de teclado que me permitiera rotar entre esos modos. Hice un script en python que lo dejé en la misma carpeta

#!/usr/bin/env python3
import itertools
import subprocess
from pathlib import Path

folder = Path(__file__).absolute().parent
layouts = itertools.cycle(list(folder.glob('*.sh')))  # roundrobin over the layouts. 


try:
    # if there is a last used, move to the next one
    last = (folder / '.last').read_text()
    print("last found", last)
    layouts = itertools.dropwhile(lambda x: str(x) != str(last), layouts)
    next(layouts)   
except FileNotFoundError:
    pass 


current = next(layouts)
print(f"switching to {current.name}")
# write the last
(folder / '.last').write_text(str(current))

subprocess.call([str(current)])

Este switcher.py busca todos los archivos .sh en la misma carpeta y ejecuta el que sigue al ultimo ejecutado, que se guarda en un archivo .last (si no existe, el primer modo será el primero listado).

Decidí deshabilitar el atajo por default

$ gsettings set org.gnome.mutter.keybindings switch-monitor "['XF86Display']

y agregué un shortcut que ejecuta ~/.screenlayout/switcher con Ctrl + Super + P (en gnome: Configuración -> Keyboard -> Combinación de teclas -> Customize Shortcuts -> Combinación Personalizada )

image

Ahora puedo pararme cuando quiera, levantar y girar el monitor y apretar Ctrl + Super + P las veces necesarias hasta que quede como quiero.

Comentarios

Comments powered by Disqus