Implementando soporte para Xinerama en Superkb

Desde hace tiempo, Alfredo observó el problema. Incluso, hay un screenshot en la sección de bloopers (al final de la sección de Pantallazos) donde se ve una pantalla doble con un teclado muy bonito. Pero, ¿por qué es eso un blooper?

Para pintar el teclado, Superkb le pregunta a X el tamaño de la pantalla, y pinta el teclado aprovechando al máximo la pantalla, según el tamaño que se le reporta.

El problema

Para X, una tarjeta dual con dos monitores, es en realidad un solo «display», de modo que Superkb no logra percatarse de la existencia de dos monitores, y aunque el screenshot se ve perfecto, la realidad es muy distinta. (Disculpen ustedes mi falta de pulso.)


(Superkb sin soporte para Xinerama: A la izquierda, el screenshot, a la derecha, las pantallas reales)

Nótese que en este caso, el problema se agrava debido a que cada monitor tiene una resolución distinta, de modo que no sólo el teclado se ve partido, sino que además una parte se pierde.

¿Cómo se podría resolver el problema? El problema dejaría de existir si Superkb tuviera la capacidad de conocer la cantidad de monitores existentes y la resolución de cada uno, y pintar varios teclados a la vez, uno por monitor.

XINERAMA

En una configuración de doble monitor, para X.org, se sigue tratando de un único «display», es sólo que un conjunto de pixeles se asignan al primer monitor y otro conjunto de pixeles se asignan al segundo monitor.

Xinerama es una librería que, en esencia, cuenta con sólo una función, llamada XineramaQueryScreens. Aunque en realidad son 4 funciones, las tres restantes sólo se usan para consultar la versión, disponibilidad y compatibilidad de Xinerama como extensión de X.

Con esta función le pregunto a X.org cuántos monitores hay y qué pixeles se mapean a cada uno de los monitores, y me contesta en un arreglo de estructuras XineramaScreenInfo.

Por ejemplo, en la PC que se usó para el screenshot, esta es la información que regresa:

screen_number = 0
x_org = 0
y_org = 0
width = 1024
height = 768

screen_number = 1
x_org = 1024
y_org = 0
width = 1280
height = 1024

Con esta información, Superkb sólo se limita a pintar los teclados en sus correspondientes coordenadas: un teclado entre 0-1023 x 0-767 y otro en 1024-2303 x 0-1023. El screenshot queda un poco diferente, y tal vez no se vea del todo bien. Pero ya en pantalla se ve como se espera.


(Superkb con soporte para Xinerama: A la izquierda, el screenshot, a la derecha, las pantallas reales)

Debido esto, hubo que convertir el pixmap y la ventana de Superkb, en un arreglo de pixmaps y ventanas. (No, no puedo usar un mismo pixmap para todas las ventanas, porque pueden ser monitores de diferente resolución).

En conclusión: para el tiempo que duré con conocimiento del bug y sin arreglarlo (desde la versión 0.10), creo que hice una tormenta con un vaso de agua. El cambio fue relativamente fácil de implementar.

… y todo para Xinerama se desprecie en favor de Xrandr. 😉


Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *