Sobre o Software

Nome
X Window System

Descrição

O X é um sistema de janelas e um protocolo que provê acesso a interfaces gráficas, suportado pelo Unix e Linux.

Autor/Empresa

O X surgiu em 1984 no MIT, uma das implementações dele (X.org) que atualmente está na versão 7.1 é mantida pela função X.org, e está disponível como software livre.

Site
www.x.org

Função Resumida

O X possui um framework para ambiente gráfico, para desenhar e mover janelas na tela, interagindo com o mouse, teclados e outros periféricos de entrada. 

O usuário não tem contato direto com o X, esse contato é feito através de programas clientes que dependem dele, como o KDE e Gnome.

O X permite que janelas (programas) que rodem nele possam ser executados remotamente pela rede, por diferentes usuários e telas. Essa característica de cliente e servidor garante um leque de possibilidades de acesso remoto.

Funcionamento

Arquitetura

O X usa o modelo cliente e servidor (Ilustração 1), aonde um servidor comunica com vários programas clientes. O servidor aceita pedidos para desenhar janelas gráficas e de entrada via teclado, mouse ou até mesmo touchscreen.

O X pode exibir janelas do sistema local ou de sistemas de X remotos, permitindo programas clientes remotos comuniquem com o servidor de janelas X local.
Ilustração 1: Arquitetura do X

A comunicação entre eles é feita através da troca de pacotes via socket na rede (Ilustração 2). A conexão é estabelecida pelo cliente, que envia os primeiros pacotes. O servidor responde aos pedidos do cliente com pacotes, aceitando ou não a conexão do cliente, ou até mesmo pedindo confirmação de acesso  (controle de acesso), assim, estabelecida a conexão, 4 tipos de pacotes são trocados via rede:

1.	Request (requisição): O cliente requisita informações do servidor
2.	Reply (resposta): O servidor responde à requisição, mas nem todas requisições precisam ser respondidas.
3.	Event (evento): O servidor envia um evento para o cliente, como a entrada de um teclado ou mouse, movimento de uma janela, etc.
4.	Error (erro): O servidor envia um pacote de erro se a requisição for inválida. Como as requisições podem ser empilhadas, os erros podem ser gerados por requisições feitas anteriormentes.

Os pacotes de requisições e respostas podem ter um tamanho variado, mas os pacotes de evento e error tem tamanho fixo de 32 bytes.
Ilustração 2: Troca de mensagens

O servidor X provê um leque de serviços básicos, para que o cliente possa realizar esses serviços e outros mais complexos, interagindo com o servidor.

Janelas
São interfaces gráficas que possui elementos como botões, menus, ícones, etc, componentes adequados a janelas.

Um janela só pode ser criada a partir de uma janela já existente (Ilustração 3), o que torna as janelas filhas de outras janelas, como um hierarquia. A janela principal é chamada de “janela root”, que é automaticamente criada pelo servidor, que nada mais é que a janela em tela cheia, atrás de todas as janelas.

Ilustração 3: Hierarquia de janelas

Identificadores
Todos dados das janelas, incluindo fontes usadas são armazenados no servidor. Esses objetos são acessados pelo cliente através de um identificador reservado a cada objetivo, no qual o cliente já conhece. 

Caso o cliente deseja que uma janela seja criada, ele faz uma requisição para o servidor para criar a janela passando um identificador. O servidor cria a janela e associa com esse identificador. O identificador pode ser mais usado mais tarde pelo cliente, para por exemplo, escrever uma frase nessa janela.

Identificadores devem ser únicos no servidor, independente do cliente, é um identificador único que não pode ser criado novamente por outro cliente.

Atributos e propriedades
Cada janela tem predefinido alguns atributos e propriedades, todos também armazenados pelo servidor e acessíveis pelo cliente através de requisições. Atributos são datas sobre as janelas, como tamanho, posição, cor de fundo e outros. 

Propriedades são valores dos dados anexados as janelas, contrário aos atributos, propriedades não são pré-identificadas pelo protocolo do servidor. Podendo então, o cliente armazenar dados relevantes a ele nas propriedades das janelas.

Propriedades são caracterizadas por um nome, tipo e valor, são similares a variáveis, no qual uma aplicação cliente pode criar uma nova e armazenar valores. Propriedades são associados à janelas, duas propriedades com o mesmo nome podem existir em duas janelas diferentes, com o mesmo nome, valor e tipo.
Propriedades são bastante usadas pelos clientes e podem ser visualizadas com o comando xprop.

Eventos
Eventos são pacotes enviados pelo servidor para o cliente para comunicar que alguma coisa ocorreu. O cliente pode pedir para o servidor enviar os eventos para outro cliente, isso facilita comunicação entre clientes. Por exemplo: quando um cliente faz uma requisição para saber o texto que está selecionado no momento, um evento é enviado para o cliente que está manipulando a janela no momento.

Alguns tipos de eventos são sempre enviados para o cliente, mas a maioria dos tipos de eventos são enviados somente se o cliente deixar claro que necessita deles (exemplo: cliente quer ter informações do teclado, mas não do mouse).

Xlib
A maioria dos programas clientes comunicam com o servidor através da biblioteca Xlib, mas existem muitas outras bibliotecas que fazem isso (Motif, Gtk, Qt), algumas até usam a Xlib em conjunto para a comunicação.

Gerenciadores de janelas
Um gerenciador de janelas é um programa que controla a aparência das janelas / elementos gráficos. O papel principal de um gerenciador de janelas é prover uma interface amigável e padronizada com estilos para o usuário, contando também com aplicações úteis (exemplo: KDE, Gnome, WindowMaker).

Recursos

A comunicação do cliente com o servidor funciona de maneira transparente na rede, o cliente e o servidor podem funcionar na mesma máquina ou em máquinas diferentes, possibilitando uma interação de diferentes arquiteturas e sistemas operacionais, mas eles devem operar o mesmo sistema X.

A comunicação entre eles pode funcionar também de maneira segura, bastando criptografar a conexão através de um túnel criptografado (via OpenSSH).

Para iniciar um programa remoto e esse ser exibido (visto) localmente, basta o usuário mudar o seu “display”, apontando para um display remoto (servidor X).

Exemplo:
export DISPLAY=host:porta

Feito isso, basta o usuário invocar o programa, o cliente vai se conectar no servidor local da máquina e exibir a janela gráfica (Ilustração 4), aceitando também entrada de mouse/teclado.
Ilustração 4: Exemplo de interação cliente e servidor X

O X permite que várias instancias funcionem com o servidor, permitindo que o usuário inicie sessões paralelas de ambientes gráficos.

É possível usar softwares de acesso remoto em conjunto com o próprio X, como por exemplo: VNC e NX.

Prós e Contras

Prós	Contras	
Arquitetura escalável	Baixo desempenho para interações rápidas (jogos)	
Comunicação via rede		
Suporte a extensões e módulos		
Drivers nativos		
22 anos de desenvolvimento		
Suporte a VNC, NX		

Referências Bibliográficas

http://en.wikipedia.org/wiki/X_Window_System
http://en.wikipedia.org/wiki/X_Window_System_protocols_and_architecture
http://gallery.debian.org.tw/albums/Xorg-Hardware_Acceleration_Mechanism/xgl_arch_glitz.png
ftp://ftp-acd.puc-campinas.edu.br/pub/professores/ceatec/zagari/EE/SD/2_Arquitetura_Modelo_Sistemas.pdf