¿Queríais rant sobre el lamentable estado del stack gráfico de Linux? ¡Pues allá vamos! ⬇ ⚠ hilo extremadamente largo y algo técnico (aunque he intentado simplificar)

9:30 AM · Nov 8, 2021

52
416
101
898
Antes de nada, para los despistados: el "stack gráfico" es esa parte del OS que te permite ver porno ventanas e interactuar con ellas (moverlas. minimizarlas, etc...) usando el ratón, el teclado, un lápiz táctil, etc...
2
0
2
25
MacOS lo tiene. Windows lo tiene. Arrancas el ordenador, enchufas una o varias pantallas (a lo mejor con distinta resolución / DPI, a lo mejor con HDR). Se pintan las ventanas. Se pintan los colores...
2
2
1
24
... Interactúas con el ratón y el teclado, haces scroll. Reproduces videos con aceleración gráfica. Sin dramas, sin complicaciones. Fin.
2
1
0
25
... y luego esta Linux...
1
4
1
44
GIF
Quiero abrir con una cita: "Si los creadores de X diseñasen coches, habría al menos 5 volantes escondidos por el habitáculo y ninguno de ellos funcionaria de la misma manera que el resto, pero podrías cambiar las marchas con los botones de la radio." - Marcus J. Ranum
1
33
1
170
Todo empezó allá por el siglo XIII cuando los "PCs" no tenían capacidad ni para calcular 2+2, y la gente se conectaba a servidores externos (normalmente de la universidad o del trabajo) para trabajar en ellos.
1
2
0
20
Como esa manera de usar los PCs era lo normal, los X-m̶e̶n̶devs diseñaron un protocolo llamado "X" [0], que iba a servir para pintar interfaces en los "PCs" de la gente desde esos servidores externos. [0] - en.wikipedia.org/wiki/X_Wind…
1
0
0
18
"Y todo de manera transparente a la red", que significaba algo así como que ibas a poder arrancar una app en un ordenador y poder usarla en otro, ya que X se encargaría de enviar por la tarjeta de red lo que hiciera falta para que eso funcionara "sin mas" ™.
1
0
0
20
Las apps (que ejecutarías en esas maquinas remotas) se llamarían "clientes de X" y en tu PC (que pintaría las interfaces de esas apps) ejecutarías un "servidor de X". Porque para los X-devs lo que se ejecuta en remota es "cliente" y lo que se ejecuta en tu pc es "servidor".
3
6
0
76
Pero X era solo un protocolo, se necesitaba que algo lo implementara. Ahí nace XFree86 [1] (que en realidad se llamaba X386, pero por problemas de licencias, tras un impresionante despliegue de creatividad, cambiaron el "X-three-86" por "X-free-86"). [1] - en.wikipedia.org/wiki/XFree8…
1
0
0
31
GIF
XFree86 implementa tanto el <servidor> como el <cliente>. Y funciona como prometieron. El cliente X (mediante una librería llamada "Xlib") le dice al servidor X "píntame un cuadradito de 50x50 pixeles en las coordenadas (100,400)" y el servidor lo pinta (y aparece en la pantalla)
1
1
0
21
Pero hay un problema. El protocolo de X no entiende qué es un "botón" o un "texto". El protocolo entiende de pixeles. ¿Quieres dibujar un botón? Pues tienes que decirle al servidor de X que quieres dibujar un cuadradito de tal tamaño en tal coordenada.
1
1
0
21
Y que luego quieres pintar una linea de tal color en tal coordenada (para simular una sombra). Y que luego quieres pintar <estos pixeles con forma de letras> en tal coordenada (para simular un texto encima del botón).
1
0
0
17
Para tener un campo de texto tienes que crear una ventana (sin bordes / barra superior / los botones de minimizar / maximizar) y embeberla donde te haga falta. ¿Quieres tener una app-formulario con 12 campos de texto? Pues tienes que crear 12 ventanas + la ventana de la app en sí
1
1
0
21
Básicamente, para dibujar un formulario con 4 botones, 10 campos de texto con sus 10 labels, sus sombras y sus bordes tienes que hacer 236347 peticiones desde el cliente X al servidor X. Como os podéis imaginar, todo era extremadamente rápido.
1
2
0
27
GIF
Ahí nace el concepto de "toolkit", que viene a ser una "librería" que esconde todas esas llamadas detrás de cómodas funciones tipo "creame_un_botón()", "creame_un_label()", etc... Y nace el primer toolkit: Motif.
1
1
0
25
Recapitulemos: tu app ➡ Motif ➡ Xlib ➡ servidor X Facil, ¿no? ¡Seguimos!
1
1
0
23
Pero hay otro problema. El protocolo de X, <que fue creado para adaptarse al futuro gráfico de los ordenadores>, tampoco entiende los conceptos de "mover una ventana", "seleccionar un texto", "recibir entrada de un teclado/ratón", etc... El protocolo solo entiende como dibujar px
1
0
0
18
Vaya despiste más tonto por parte de los X-devs...
1
0
0
18
GIF
No pasa nada, porque cualquier problema se puede solucionar. Simplemente modificaron el servidor de X y el protocolo para que pudieran entender esos conceptHAJHJAHJAHJAHJAJHAHJAHJAHJAAHJHJAAHJHJAHJAHJAHJAHJAHJAHJAHJAHJAHJAJHAJ
1
0
0
29
Crean un nuevo componente llamado "window manager" ("WM" de aquí en adelante), que se encargaría de "encapsular" todos los clientes X. Básicamente, se encargaría de saber donde están, cual de ellos tiene el foco, etc...
1
1
0
20
Y también crean un nuevo protocolo, ICCCM, que los WM usarían para hablar con el servidor X. [2] [2] - en.wikipedia.org/wiki/Inter-…
1
1
0
21
GIF
Motif, que hasta ahora era un toolkit, pasa a ser también un WM... 🤦‍♂️
1
0
0
16
Recapitulemos de nuevo: tu app ➡ toolkit (Motif) ➡ Xlib (protocolo X) ➡ servidor X y en paralelo tu app ➡ WM (también Motif; protocolo ICCCM) ➡ servidor X
2
1
0
22
GIF
¿Por que tener un único WM que haga las cosas bien cuando puedes tener 100? Empiezan a salir decenas de WMs. KWin de KDE, GDM de Gnome, hasta Emacs (si, el editor de texto) se apunta a la fiesta con EXWM. ¿O creías que lo de que Emacs es prácticamente un OS era una exageración?
1
1
2
42
Pasan unos años, estamos a principios de los 2000, y XFree86 entra en una espiral de dramas y decadencia. Nace X.Org, que es exactamente lo mismo que XFree86, pero ahora llamado de otra manera. En aquel momento la realidad había cambiado radicalmente.
1
0
0
21
Los PCs habían avanzado hasta el punto de tener tarjetas gráficas integradas (ya no era necesario que la gente se conectara a servidores remotos para ejecutar ahí sus apps).
1
0
0
21
¿Y cómo arreglaron ese diseño de X, Xlib, ICCCM, los WM y todo eso que estaba mal de base (dada la nueva situación)? Obviamente tuvieron que reescribir todo el protocolo de 0 y plantearlHJAJAHHJAHJAHJAHJAHJAHAJHJAJAHHJAJHAJHAHJAHJAHJ
1
1
0
32
Cambiaron "tarjeta de red" por "IPC con unix sockets" y ahora tu PC ejecutaba tanto el servidor X como los clientes X.
2
1
0
25
Por si no lo has entendiendo bien: para que una app dibuje algo en la pantalla tiene que hacer peticiones (asíncronas) por un socket a un servidor (que también se esta ejecutando en tu PC), para que este a su vez dibuje eso.
2
6
0
66
GIF