En informática , el sistema X Window (comúnmente: X11 o X) es un sistema de ventanas transparente a la red para visualizaciones de mapas de bits . Este artículo detalla los protocolos y la estructura técnica de X11.
X utiliza un modelo cliente-servidor . Un programa de servidor X se ejecuta en una computadora con una pantalla gráfica y se comunica con varios programas cliente . El servidor X actúa como intermediario entre el usuario y los programas cliente, aceptando solicitudes en el puerto TCP 6000 más el número de pantalla [1] para la salida gráfica (ventanas) de los programas cliente y mostrándolas al usuario (pantalla). y recibir entradas del usuario (teclado, mouse) y transmitirlas a los programas cliente.
En X, el servidor se ejecuta en la computadora del usuario, mientras que los clientes pueden ejecutarse en máquinas remotas. Esta terminología invierte la noción común de sistemas cliente-servidor, donde el cliente normalmente se ejecuta en la computadora local del usuario y el servidor se ejecuta en la computadora remota. La terminología X Window adopta la perspectiva de que el programa X Window está en el centro de toda actividad, es decir, el programa X Window acepta y responde a solicitudes de aplicaciones y de las entradas del mouse y teclado del usuario. Por lo tanto, las aplicaciones (en computadoras remotas) se ven como clientes del programa servidor X Window.
El protocolo de comunicación entre el servidor y el cliente se ejecuta de forma transparente en la red : el cliente y el servidor pueden ejecutarse en la misma máquina o en diferentes, posiblemente con diferentes arquitecturas y sistemas operativos . Un cliente y un servidor pueden comunicarse de forma segura a través de Internet mediante un túnel de la conexión a través de una conexión cifrada. [2]
Bob Scheifler y Jim Gettys establecieron los primeros principios de X de la siguiente manera (como se enumeran en Scheifler/Gettys 1996):
El primer principio se modificó durante el diseño de X11 para: No agregar nuevas funciones a menos que conozca alguna aplicación real que las requiera.
Desde entonces, X se ha atenido en gran medida a estos principios. La Fundación X.Org desarrolla la implementación de referencia con miras a ampliar y mejorar la implementación, manteniéndola casi totalmente compatible con el protocolo original de 1987.
La comunicación entre el servidor y los clientes se realiza mediante el intercambio de paquetes a través de un canal de red . El cliente establece la conexión enviando el primer paquete. El servidor responde devolviendo un paquete indicando la aceptación o el rechazo de la conexión, o con una solicitud de autenticación adicional. Si se acepta la conexión, el paquete de aceptación contiene datos para que el cliente los utilice en la interacción posterior con el servidor.
Una vez establecida la conexión, el cliente y el servidor intercambian cuatro tipos diferentes de paquetes a través del canal:
El servidor X proporciona un conjunto de servicios básicos. Los programas cliente realizan funcionalidades más complejas al interactuar con el servidor.
Lo que otras interfaces gráficas de usuario suelen llamar ventana es una ventana de nivel superior en el sistema X Window. El término ventana también se utiliza para las ventanas que se encuentran dentro de otra ventana, es decir, las subventanas de una ventana principal . Los elementos gráficos como botones, menús, iconos, etc. se realizan mediante ventanas.
Una ventana sólo se puede crear como subventana de una ventana principal. Esto hace que las ventanas se ordenen jerárquicamente en un árbol . El servidor X crea automáticamente la raíz del árbol, llamada ventana raíz . Las ventanas de nivel superior son exactamente las subventanas directas de la ventana raíz. Visiblemente, la ventana raíz es tan grande como la pantalla y se encuentra detrás de todas las demás ventanas.
El servidor X almacena todos los datos sobre ventanas, fuentes, etc. El cliente conoce los identificadores de estos objetos: números enteros que puede utilizar como nombres para ellos cuando interactúa con el servidor. Por ejemplo, si un cliente desea que se cree una ventana, solicita al servidor que cree una y (en caso de éxito) obtiene a cambio un identificador del servidor asociado con la ventana recién creada. El cliente puede utilizar posteriormente el identificador para solicitar, por ejemplo, que se dibuje una cadena en la ventana.
Los identificadores son exclusivos del servidor, no sólo del cliente; por ejemplo, no hay dos ventanas que tengan el mismo identificador, incluso si fueron creadas por dos clientes diferentes. Un cliente puede acceder a cualquier objeto dado su identificador, incluso si otro cliente creó el objeto.
Cada ventana tiene un conjunto predefinido de atributos y un conjunto de propiedades, todos almacenados en el servidor X y accesibles para los clientes a través de las solicitudes apropiadas. Los atributos son datos sobre la ventana, como su tamaño, posición, color de fondo, etc. Las propiedades son datos adjuntos a una ventana. A diferencia de los atributos, las propiedades no tienen significado en el nivel del protocolo central de X Window. Un cliente puede almacenar datos arbitrarios en una propiedad de una ventana.
Una propiedad se caracteriza por un nombre, un tipo y un valor. Las propiedades se parecen a las variables de los lenguajes de programación imperativos , en el sentido de que la aplicación puede crear una nueva propiedad con un nombre determinado y de un tipo determinado y almacenar un valor en ella. Las propiedades están asociadas a ventanas: dos propiedades con el mismo nombre pueden existir en dos ventanas diferentes y tener diferentes tipos y valores.
Las propiedades se utilizan principalmente para la comunicación entre clientes. Por ejemplo, la propiedad denominada WM_NAME
almacena el nombre de la ventana; Los administradores de ventanas normalmente leen esta propiedad y muestran el nombre de la ventana en la parte superior.
El xprop
programa puede mostrar las propiedades de una ventana. En particular, xprop -root
muestra las propiedades de la ventana raíz, que incluyen los recursos X (parámetros de programas).
Los eventos son paquetes enviados por el servidor al cliente para comunicar que ha sucedido algo que puede interesar al cliente. Un cliente puede solicitar al servidor que envíe un evento a otro cliente; esto se utiliza para la comunicación entre clientes. Por ejemplo, cuando un cliente solicita el texto actualmente seleccionado, se envía un evento al cliente que actualmente está manejando la ventana que contiene la selección.
El contenido de una ventana puede "destruirse" en algunas condiciones (por ejemplo, si la ventana está cubierta). Cada vez que un área de contenido destruido se hace visible, el servidor genera un Expose
evento para notificar al cliente que se debe dibujar una parte de la ventana.
Otros eventos pueden servir para notificar a los clientes sobre la entrada del teclado o el mouse, la creación de nuevas ventanas, etc.
Algunos tipos de eventos siempre se envían a un cliente, pero la mayoría de los tipos de eventos se envían solo si el cliente previamente manifestó interés en ellos, porque es posible que los clientes solo estén interesados en algunos tipos de eventos. Por ejemplo, un cliente puede estar interesado en eventos relacionados con el teclado pero no en eventos relacionados con el mouse.
La forma en que el sistema X Window maneja los colores a veces puede confundir a los usuarios e históricamente se han admitido varios modos diferentes. La mayoría de las aplicaciones modernas utilizan todo color (color de 24 bits, 8 bits para cada uno de rojo, verde y azul), pero las aplicaciones antiguas o especializadas pueden requerir un modo de color diferente. Muchas aplicaciones comerciales especializadas utilizan PseudoColor.
El protocolo X11 en realidad utiliza un único entero sin signo de 32 bits, llamado valor de píxel , para representar un solo color en la mayoría de las operaciones gráficas. Al transferir la intensidad de los colores primarios , se utiliza un número entero de 16 bits para cada componente de color. Existen las siguientes representaciones de colores; Es posible que no todos sean compatibles con un dispositivo específico.
La mayoría de los programas cliente se comunican con el servidor a través de la biblioteca cliente Xlib . Además de Xlib, la biblioteca XCB opera más estrechamente con el protocolo X. En particular, la mayoría de los clientes utilizan bibliotecas como Xaw , Motif , GTK+ o Qt que a su vez utilizan Xlib para interactuar con el servidor. Qt cambió de Xlib a XCB con la versión 5.0, pero los programas cliente casi no se vieron afectados por este cambio.
El protocolo central de X Window proporciona mecanismos para la comunicación entre clientes: propiedades y eventos de ventana, en particular eventos de mensajes de cliente a cliente. Sin embargo, no especifica ningún protocolo para tales interacciones. En cambio, un conjunto separado de convenciones de comunicación entre clientes rige estos protocolos.
El Manual de convenciones de comunicación entre clientes especifica el protocolo para el intercambio de datos mediante selecciones y la interacción de las aplicaciones con el administrador de ventanas. Algunos han considerado esta especificación difícil y confusa; [3] [4] La coherencia de la apariencia y la comunicación de la aplicación generalmente se aborda mediante la programación en un entorno de escritorio determinado.
El protocolo de intercambio entre clientes (ICE) especifica un marco para crear protocolos para la interacción entre clientes, de modo que los programadores puedan crear un protocolo específico sobre él. En particular, el protocolo X Session Management (XSMP) es un protocolo basado en ICE que gobierna la interacción entre aplicaciones con el administrador de sesiones , que es el programa que se encarga de almacenar el estado del escritorio al final de una sesión interactiva y recuperándolo cuando se vuelva a iniciar otra sesión con el mismo usuario.
Las especificaciones de freedesktop incluyen convenciones más nuevas, incluida la convención de arrastrar y soltar Xdnd (utilizada para transferir datos seleccionándola y arrastrándola en otra ventana) y la convención de aplicación integrada Xembed (que detalla cómo se puede ejecutar una aplicación en una subventana de otra aplicación). ).
Los mecanismos de selección, corte de búfer y arrastrar y soltar en el sistema X Window permiten al usuario transferir datos de una ventana a otra. Las selecciones y el búfer de corte se utilizan (normalmente) cuando un usuario selecciona texto u otros datos en una ventana y lo pega en una ventana diferente. Arrastrar y soltar se utiliza cuando un usuario selecciona algo en una ventana, luego hace clic en la selección y la arrastra a otra ventana.
Dado que dos aplicaciones diferentes pueden manejar las dos ventanas, la transferencia de datos requiere diferentes clientes conectados con el mismo servidor X para interactuar. El protocolo central de X Window incluye algunos tipos de solicitudes y eventos que son específicos del intercambio de selección, pero la transferencia se realiza principalmente utilizando el envío de eventos generales de cliente a cliente y las propiedades de ventana, que no son específicas de la transferencia de selección.
Los usuarios pueden transferir datos de diferentes tipos entre clientes: normalmente es texto, pero también puede ser un mapa de píxeles, un número, una lista de objetos, etc.
Las selecciones y arrastrar y soltar son mecanismos activos: después de que el usuario selecciona datos en una ventana, el cliente que maneja la ventana debe admitir activamente un protocolo para transferir esos datos a la aplicación que los solicita. Los buffers de corte , por el contrario, proporcionan un mecanismo pasivo: cuando el usuario selecciona algún texto, su contenido se transfiere a un buffer de corte, donde permanece incluso si la aplicación que maneja la ventana finaliza y la ventana se destruye.
Un administrador de ventanas es un programa que controla la apariencia general de las ventanas y otros elementos gráficos de la interfaz gráfica de usuario . Las diferencias en el aspecto del sistema X Window en diferentes instalaciones se deben principalmente al uso de diferentes administradores de ventanas o a diferentes configuraciones del administrador de ventanas.
El administrador de ventanas se encarga de decidir la posición de las ventanas, colocar el borde decorativo alrededor de ellas, manejar los iconos, manejar los clics del mouse fuera de las ventanas (en el “fondo”), manejar ciertas pulsaciones de teclas, etc.
Desde el punto de vista del servidor X, el administrador de ventanas funciona como un cliente como cualquier otro cliente. La posición inicial y los bordes decorativos alrededor de las ventanas los maneja el administrador de ventanas mediante las siguientes solicitudes:
El administrador de ventanas utiliza la primera solicitud para interceptar cualquier solicitud de mapeo de ventanas de nivel superior (hijas de la ventana raíz). Cada vez que otra aplicación solicita el mapeo de una ventana de nivel superior, el servidor no lo hace sino que envía un evento al administrador de ventanas. La mayoría de los administradores de ventanas reparan la ventana: crean una ventana de nivel superior más grande (llamada ventana de marco) y reparan la ventana original como hija de ella. Gráficamente, esto corresponde a colocar la ventana original dentro del marco de la ventana. El espacio del marco de la ventana que no ocupa la ventana original se utiliza para el marco decorativo alrededor de la ventana (el "borde" y la "barra de título").
El administrador de ventanas gestiona los clics del mouse en la ventana del marco. Esto permite, por ejemplo, que un usuario mueva o cambie el tamaño de la ventana haciendo clic y arrastrando en el borde o en la barra de título.
El administrador de ventanas también maneja íconos y elementos visuales relacionados de la interfaz gráfica de usuario. Los iconos no existen en el nivel del protocolo central de X Window. Son implementados por el administrador de ventanas. Por ejemplo, siempre que es necesario "iconificar" una ventana, el administrador de ventanas FVWM desasigna la ventana y crea una ventana para el nombre del icono y posiblemente otra ventana para la imagen del icono. Por lo tanto, el significado y el manejo de los iconos lo decide completamente el administrador de ventanas: algunos administradores de ventanas como wm2 no implementan iconos en absoluto.
A grandes rasgos, el estado de una sesión es el “estado del escritorio” en un momento dado: un conjunto de ventanas con su contenido actual. Más precisamente, es el conjunto de aplicaciones que administran estas ventanas y la información que permite a estas aplicaciones restaurar la condición de sus ventanas administradas si es necesario. Un programa conocido como administrador de sesiones X guarda y restaura el estado de las sesiones.
Lo más reconocible es que el uso de un administrador de sesión permite al usuario cerrar sesión en una sesión interactiva pero encontrar exactamente las mismas ventanas en el mismo estado al iniciar sesión nuevamente. Para que esto funcione, el programa administrador de sesión almacena los nombres de las aplicaciones en ejecución al cerrar sesión y las inicia nuevamente al iniciar sesión. Para que también se restaure el estado de las aplicaciones (lo cual es necesario para restaurar el contenido de Windows), las aplicaciones deben poder guardar su estado de ejecución cuando lo solicite el administrador de sesión y volver a cargarlo cuando se inicien de nuevo. .
El sistema X Window incluye un administrador de sesión predeterminado llamado xsm
. Los desarrolladores han escrito otros administradores de sesiones para sistemas de escritorio específicos. Los ejemplos principales incluyen ksmserver
, xfce4-session
y gnome-session
para KDE , Xfce y GNOME respectivamente.
El programa conocido como administrador de pantalla X muestra el mensaje gráfico de inicio de sesión en el sistema X Window. De manera más general, un administrador de pantalla ejecuta uno o más servidores X en la computadora local o acepta conexiones entrantes de servidores X que se ejecutan en computadoras remotas. Los servidores locales son iniciados por el administrador de pantalla, que luego se conecta a ellos para presentar al usuario la pantalla de inicio de sesión. Los servidores remotos se inician independientemente del administrador de pantalla y se conectan a él. En esta situación, el administrador de pantalla funciona como un servidor telnet gráfico : un servidor X puede conectarse al administrador de pantalla, que inicia una sesión; las aplicaciones que utilizan esta sesión se ejecutan en la misma computadora del administrador de pantalla pero tienen entrada y salida en la computadora donde se ejecuta el servidor X (que puede ser la computadora frente al usuario o una remota).
El sistema X Window se envía con XDM como administrador de pantalla básico suministrado. Otros administradores de pantalla incluyen GDM ( GNOME ), KDM / SDDM ( KDE ), WDM (usando el conjunto de widgets WINGs usado en Window Maker ) y entrada (usando la arquitectura usada en Enlightenment v.17).
Los primeros kits de herramientas de widgets para X incluían Xaw ( Athena Widget Set, 1983), OLIT ( OPEN LOOK Intrinsics Toolkit, 1988), XView (1988), Motif (década de 1980) y Tk . OLIT y XView funcionan como conjuntos de herramientas básicos para el entorno de escritorio OpenWindows heredado de Sun.
Motif proporciona el conjunto de herramientas básico para Common Desktop Environment (CDE), el entorno de escritorio utilizado en sistemas Unix comerciales como Solaris , AIX y HP-UX . (Solaris 10 incluye CDE y GNOME , siendo este último el entorno de escritorio preferido a partir de 2010 [actualizar]).
Los kits de herramientas desarrollados más recientemente incluyen Qt (1991-, utilizado por KDE ), GTK+ (1997-, utilizado por GNOME), wxWidgets (1992-), FLTK (1998-), FOX (1997-) y fpGUI (2005-actual).
Scheifler y Gettys diseñaron el servidor X para que fuera simple pero extensible. Como tal, gran parte de la funcionalidad reside ahora en extensiones del protocolo.
A nivel de protocolo, a cada extensión se le pueden asignar nuevos tipos de paquetes de solicitud/evento/error. Las aplicaciones cliente acceden a las funciones de extensión a través de bibliotecas de extensión. Según se informa, agregar extensiones a las implementaciones actuales del servidor X es difícil debido a la falta de modularidad en el diseño del servidor. [5] Un objetivo a largo plazo del proyecto XCB es automatizar la generación de extensiones tanto en el lado del cliente como en el del servidor a partir de descripciones de protocolo XML.
La siguiente tabla proporciona un catálogo parcial de extensiones que se han desarrollado, ordenadas aproximadamente por fecha de introducción reciente:
La ICCCM es increíblemente densa, hay que seguirla al pie de la letra y todavía no funciona. El cumplimiento de ICCCM es una de las pruebas más complejas a la hora de implementar kits de herramientas X, administradores de ventanas e incluso aplicaciones simples. Es tan difícil que muchos de los beneficios simplemente no valen la molestia de cumplirlos.
ICCCM es tan horrible como lo describen los autores [del Manual de los enemigos de Unix], pero eso es difícil de notar hoy en día porque los kits de herramientas y administradores de ventanas modernos hacen un trabajo bastante bueno al ocultar la fealdad de las aplicaciones.
X11 no permite volver a leer toda la información que pueda haberse almacenado en el servidor (por ejemplo, el protocolo X11 no permite consultar el estado del GC). Esto hace que la modularidad sea algo más difícil de lograr.
libXi - biblioteca para la extensión de entrada X