Un blog de...

Mi foto
Un ente multicelular, polisistemático, psicosocial y ciberespacial; hiperlaboral, intersintético, polifacético, uniespiritual, hipoeconómico, tecnofílico, pseudopoético y megaridículo...

lunes, 30 de agosto de 2021

Smartphone como extensión del escritorio de Ubuntu

¿Sabías  que puedes convertir tu smartphone en una pantalla adicional que extiende el escritorio de tu laptop?

La disposición habitual de pantallas físicas en mi oficina es la siguiente:

  • Pantalla de laptop (1600x900), ubicada como pantalla principal, al centro.
  • Pantalla adicional conectada al puerto HDMI-1 (1920x1080), ubicada a la izquierda de la pantalla principal.

Para extender mi escritorio a una tercera pantalla, uso un smartphone que está ubicado a la derecha de la pantalla principal.

La cuestión es ¿cómo consigo que la pantalla de mi smartphone funcione en calidad de extensión del escritorio de mi laptop? Tengo identificadas dos respuestas:

La más sencilla es usando Deskreen, con las desventajas de que no permite interactuar con el contenido desde el propio smartphone, no permite un control de la resolución y suele desconectarse con más frecuencia.

La segunda respuesta es más complicada, aunque más interesante y ofrece las ventajas de hacer posible la interacción con el contenido desde el propio smartphone y manipular la resolución. Esta opción es la que desglosaré y requiere de los siguientes ingredientes:

  • Red
    • La laptop y el smartphone deben estar conectados a la misma red de área local.
  • En la laptop:
    • Sistema operativo GNU/Linux (yo uso Kubuntu 20.04, pero otras distribuciones basadas en Debian funcionarán igual).
    • x11vnc instalado (muy recomendable tenerlo configurado para funcionar con contraseña y a través de SSH). Esto servirá para crear una pantalla virtual, "proyectable" en cualquier dispositivo que pueda ejecutar un cliente VNC.
    • Conexión "dummy" conectada a la salida VGA o, como en mi caso, conectar a dicha salida un cable que da a la entrada VGA del mismo monitor que tengo a la izquierda, esto es para hacer creer al sistema que hay un tercer monitor conectado.
    • Terminal de comandos (yo uso Konsole, pero cualquier otra funcionará igual).
  • En el smartphone:
    • Sistema operativo Android (aunque seguro también hay forma de hacerlo funcionar en iOS).
    • Alguna app que funcione como cliente VNC (yo uso Remote Ripple PRO).
    • Si se usa SSH, alguna app que permita redirigir puertos (yo uso ConnectBot).

En los siguientes pasos se asume que x11vnc ya está configurado con contraseña y que el smartphone ya tiene configurada una conexión SSH hacia la laptop.

Etapa 1: Hacerle creer a mi laptop que hay una tercera pantalla física conectada

  1. Obtener la información de los puertos de video disponibles en la laptop:

    xrandr Screen 0: minimum 320 x 200, current 3520 x 1080, maximum 16384 x 16384 eDP-1 connected primary 1600x900+1920+0 (normal left inverted right x axis y axis) 309mm x 174mm 1600x900 60.00*+ 59.99 59.94 59.95 59.82 1440x900 59.89 1440x810 60.00 59.97 1360x768 59.80 59.96 1280x800 59.99 59.97 59.81 59.91 1152x864 60.00 1280x720 60.00 59.99 59.86 59.74 1024x768 60.04 60.00 960x720 60.00 800x600 60.00 60.32 56.25 840x525 60.01 59.88 864x486 59.92 59.57 800x512 60.17 700x525 59.98 800x450 59.95 59.82 640x512 60.02 720x450 59.89 640x480 60.00 59.94 680x384 59.80 59.96 640x400 59.88 59.98 640x360 59.86 59.83 59.84 59.32 512x384 60.00 512x288 60.00 59.92 480x270 59.63 59.82 400x300 60.32 56.34 432x243 59.92 59.57 320x240 60.05 360x202 59.51 59.13 320x180 59.84 59.32 DP-1 disconnected (normal left inverted right x axis y axis) HDMI-1 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 509mm x 286mm 1920x1080 60.00*+ 1280x1024 60.02 1440x900 59.90 1280x800 59.91 1152x864 75.00 1024x768 70.07 60.00 800x600 60.32 56.25 640x480 66.67 59.94 720x400 70.08 DP-2 disconnected (normal left inverted right x axis y axis) HDMI-2 disconnected (normal left inverted right x axis y axis)


    Con la información obtenida, tomo nota de alguno de los dispositivos desconectados, en este caso DP-2
  2. Generar el modeline para la resolución con la que se desea proyectar en la pantalla virtual, en este caso será 1200x540 (para que coincida en proporción a las dimensiones de la pantalla del smartphone, sin que los textos queden diminutos) a 120 MHz:

    gtf 1200 540 120 # 1200x540 @ 120.00 Hz (GTF) hsync: 69.48 kHz; pclk: 112.28 MHz Modeline "1200x540_120.00" 112.28 1200 1280 1408 1616 540 541 544 579 -HSync +Vsync

  3. Crear un nuevo modo de resolución basado en el modeline obtenido en el paso anterior:

    xrandr --newmode "1200x540_120.00" 112.28 1200 1280 1408 1616 540 541 544 579 -HSync +Vsync

  4. Añadir el modo creado como una opción en la salida de video no usada realmente, conectada a un dummy o a un cable que lleva a una entrada no usada en el monitor, en este caso, DP-2:

    xrandr --addmode DP-2 1200x540_120.00

  5. Conectar el cable al puerto de salida de video no usado en la laptop y llevarlo al puerto de entrada de video no usado en el monitor, entonces, habilitar la pantalla virtual usando el nuevo modo añadido y usarlo para extender el escritorio a la derecha de la pantalla principal (en este caso, eDP-1):

    xrandr --output DP-2 --mode 1200x540_120.00 --right-of eDP-1

    Esto extenderá el escritorio a la pantalla virtual que, actualmente, es "invisible", aunque es posible notar que el puntero del ratón ya se puede mover más allá del borde derecho.

Hasta este punto, el diagrama de monitores que muestra la herramienta de configuración de pantallas de KDE-Plasma, ayuda a entender mejor lo que se está configurando:

Hacer visible la pantalla virtual en otro dispositivo (en este caso, en el smartphone)

A partir de lo anterior, el comando de x11vnc que se debe ejecutar en el equipo emisor (laptop) es:

x11vnc -localhost -usepw -forever -bg -geometry 1200x540 -shared -noprimary -auth /var/run/lightdm/root/:0 -display :0 -clip 1200x540+3520+450 -threads -noxdamage -noxwarppointer

Explico los parámetros:

-geometry establece la resolución de la sesión VNC y debe coincidir con el tamaño de la pantalla virtual: 1200x540.

-clip define una resolución objetivo (1200x540) y un recorte desde el borde izquierdo del escritorio actual (en este caso, se suma el ancho de la pantalla adicional al ancho de la pantalla principal, 1920+1600=3520), es decir, 3520 en el eje horizontal y 450 en el eje vertical. Nota: El recorte en el eje horizontal sería negativo si la pantalla virtual estuviera a la izquierda de la principal.

-threads y -noxdamage mejoran el desempeño de la conexión VNC para estos fines.

Por último, se conecta el otro dispositivo al servicio VNC, en este caso, conecto el smartphone así:

  1. Activo la conexión a la laptop mediante SSH desde ConnectBot y verifico que la redirección de puertos coincide con el servicio VNC, debe verse así:
  2. Activo la conexión VNC que, en RemoteRipple, debe estar configurada así:

    Lo importante son el Host (localhost) y el Puerto (5900, o el dato que arroje el comando de x11vnc en la laptop). El nombre puede ser cualquiera.

    Una recomendación que me encontré, es que, una vez activa la conexión, se configure un método de codificación con baja compresión, ya que los dispositivos están conectados a la misma red de área local, esto impactará poco en la velocidad de la red y mejorará notablemente el redibujado de la pantalla en el smartphone, porque requiere menos procesamiento.

    Al activar la conexión VNC, se mostrará la parte del escritorio de la laptop que se ha configurado para mirarse por esa vía. Es posible arrastrar ventanas desde cualquiera de las pantallas hacia la del smartphone. También es posible interactuar con esa parte del escritorio, ya sea desde el teclado y touchpad de la laptop o tocando físicamente la pantalla del smartphone.