logo titulo
anterior indice proximo

O sistema de janelas X


Desenvolvido no MIT (Massachussets Institute of Technology) nos anos 80, e atualmente na versão 11, release 6, abreviado como X11R6, o sistema de janelas X foi a base para a aparição de todos os outros sistemas de janelas da atualidade. Seus conceitos de janelas, ícones, botões, decorações (bordas das janelas), como forma de controlar aplicações rodando em um sistema transformou-se na metáfora mais empregada em toda a indústria, com o uso do mouse substituindo o teclado na manipulação de propriedades e adicionando uma idéia de terceira dimensão na visualização de processos.

O X11 funciona com um modelo cliente-servidor, de forma inteiramente independente do sistema operacional. O servidor controla diretamente o display (vídeo) e dispositivos de entrada (teclado, mouse, digitalizadores,...) em favor das aplicações, que são os clientes. Rigorosamente falando, X é apenas a coleção de protocolos para determinar como será essa comunicação entre os servidores e os clientes. Um servidor pode ser rodado localmente, na mesma máquina aonde está o programa (cliente), ou remotamente, via vários protocolos de transporte, que na realidade não fazem parte do sistema X. Somente o servidor precisa ser dependente do hardware, os clientes (programas) não precisam ter conhecimento implícito ou explícito da arquitetura que está sendo usada, mas somente dos protocolos, que são apresentados na forma de uma API (Application Programming Interface) conhecida como Xlib. Para manipular melhor o ambiente gráfico, teremos window managers (gerenciadores de janelas), que são simplesmente clientes como um programa qualquer. Existem inúmeras opções de window managers em Linux, como por exemplo, para citar alguns mais populares: kde, gnome, afterstep, enlightenment, fvwm, blackbox, vtwm, olvwm, fvwm95, icewm, wmx. Cada um destes apresenta uma distinta forma de apresentar e tratar com os outros programas, para iconizar, esconder as janelas indesejáveis formando "desktops virtuais", apresentar decorações como barras com botões de controle, ou diversas metáforas de controle como drag-and-drop. [39]

scrshot1 O sistema de janelas X tem grande variedade de gerenciadores de janelas, cada qual com características que os diferenciam dentre os demais. Para manter compatibilidade das aplicações nestes diversos ambientes, exite uma padronização descrita no documento ICCCM (Inter-Client Communications Conventios Manual). Sem os gerenciadores de janelas, as aplicações ficariam sem decorações, quando muito com um background, que é colocado independentemente por programas como xsetroot, xv, ou xli, para citar alguns.

Os botões localizados nas decorações das janelas são usados pelo wm (gerenciador de janelas) para enviar sinais à aplicação ou para deixar a janela invisível, iconizada, não sendo programadas suas funções na aplicação mas no wm diretamente.

Menus para invocação de aplicações são também responsabilidades do wm, bem como barras com vários ícones para lançamento de programas ou alterações das propriedades do wm. Muitos window managers produzem uma visão de várias telas ou desktops independentes, que é simulada fazendo aparecer ou desaparecer janelas das aplicações, bem como trocando o fundo (background) da tela, dando a ilusão perfeita de que a tela é bem maior do que ela realmente o é.

O wm também captura eventos produzidos por teclas e pelo mouse e filtra-os enviando o que for da aplicação ou interpretando estes eventos e realizando determinadas tarefas como invocar programs (por exemplo, tirar um screenshot de uma janela), e geralmente estes eventos são configuráveis pelo usuário via edição de um arquivo de configuração (com o nome do tipo .<wm nome>rc ou mesmo através de utilitários com uma GUI (interface gráfica do usuário) tornando trivial a sua configuração.

Além da customização produzida pelo wm, bibliotecas como libXaw (Athena widgets) pode ser substituida por versões mais apresentáveis, com botões e scrollbars 3D, ou até com texturas controláveis (bibliotecas Xaw3d, Xaw-XPM, neXtaw), sem ser necessário recompilar as aplicações.

O emulador de terminais padrão, xterm, têm vários substitutos como xterm_color, xiterm, rxvt e outros, com fundo transparente, texturas, menus adicionais, transformando aplicações que rodam somente no modo texto (console) mas agradáveis de serem observadas, igaulmente sem modificar ou recompilar estas aplicações.

scrshot2
scrshot3
scrshot4
scrshot5

Um programa cliente em X procura pela variável do environment DISPLAY para determinar a qual servidor ele será conectado. Modificando esta variável ou executando-o com o argumento -display host:servidor.tela, ele executará usando nosso processador, mas o servidor (display) da outra máquina. Evidentmente o mesmo poderia ser feito da outra máquina com uma conexo telnet com a nossa. Usualmente a variável display contém :0.0, significando que estamos na nossa própria máquina, servidor número 0 e tela número 0. Podemos dar partida a outra sessão X na mesma máquina especificando outro número para o servidor, e assim comutar para outro ambiente X diverso do que estivermos rodando, com outro window manager (se desejado) e outras aplicações.

O comando para iniciar uma sessão, se nossa máquina não estiver no nível que inicializa direto o xdm, é startx, que na verdade chama o servidor (comando X) após preparar alguns parâmetros. Esse servidor irá então executar o conteúdo do arquivo de inicialização .xinitrc, no diretório $HOME para carregar alguns clientes (se algum é desejado) e para definir o window manager a ser utilizado. Com o xdm o arquivo .xsession, no $HOME será carregado.

O seguinte comando dá partida a outra sessão X sem executar o arquivo .xinitrc :

X -bpp 16 :1.0& 
xterm -display :1.0&

Se executássemos startx novamente, o wm não iria executar pois detectaria outra cópia dele próprio executando na mesma tela. Para mudar entre uma tela e outra, usamos o Ctrl-Alt-F1 a Ctrl-Alt-F10, os mesmos comandos que mudam de console. Para um teste rápido, podemos também usar Xnest, que é um cliente e servidor ao mesmo tempo. Ele cria uma nova sessão X dentro de uma janela, com qualquer wm e outros clientes.

configuração do servidor e clientes X


A configuração do servidor X é localizada no arquivo /etc/XF86Config, mas no lugar de voce tentar editar esse arquivo manualmente, recomendamos o uso de um dos muitos configuradores existentes, a menos que voce realmente entenda de temporização de sinais de vídeo para criar suas próprias modelines [40]. O xf86config roda em qualquer terminal (modo texto), mas o XF86Setup já dá partida a um servidor X no modo vga, sem muitas cores, mas bem mais atraente. Ambos produzem um arquivo de configuração (/etc/XF86Config) com pouco conhecimento específico do vídeo por parte do usuário.

Programas clientes têm a sua configuração armazena no banco de dados de recursos (resources) do X, selecionados por arquivos no diretório /usr/X11/lib/X11/app-defaults. Este arquivos têm o mesmo nome que a aplicação, mas começam com uma letra maiúscula, e contém os defaults a serem usados pelos widgets desses programas. Vejamos uma amostra (truncada) de um desses arquivos, para configurar um xterm. (arquivo XTerm)

! $XConsortium: XTerm.ad /main/35 1996/12/03 16:44:38 swick $
!
*SimpleMenu*Cursor: left_ptr
*mainMenu.Label:  Main Options
*mainMenu*securekbd*Label:  Secure Keyboard
*mainMenu*allowsends*Label:  Allow SendEvents
*mainMenu*logging*Label:  Log to File

*mainMenu*hangup*Label:  Send HUP Signal
*mainMenu*terminate*Label:  Send TERM Signal
*mainMenu*kill*Label:  Send KILL Signal
*mainMenu*quit*Label:  Quit
*mainMenu*eightBit*Label: 8-Bit Controls

*SimpleMenu*menuLabel.font: -adobe-helvetica-bold-r-normal--*-120-*-*-*-*-iso88

*fontMenu.Label:  VT Fonts
*fontMenu*fontdefault*Label:    Default
*fontMenu*font1*Label:  Unreadable
*VT100*font1:       nil2
*IconFont:      nil2
*fontMenu*font2*Label:  Tiny
*VT100*font2:       5x7
*fontMenu*font3*Label:  Small
*VT100*font3:       6x10
*fontMenu*font4*Label:  Medium
*VT100*font4:       7x13

! Uncomment this to use color for the bold attribute
!*VT100*colorBDMode: on

*VT100*color0: black
*VT100*color1: red3
*VT100*color2: green3
*VT100*color3: yellow3
*VT100*color4: blue3
*VT100*color5: magenta3
*VT100*color6: cyan3

A forma geral de um recurso é <especificação do recurso>: valor, onde a especificação do recurso contém nomes de widgets separados por pontos para indicar sub-widgets dos mesmos, com asteriscos para servir como wildcards, e com nomes das classes de widgets capitalizados (começando com letras maiúsculas). Podemos observar a hierarquia de widgets numa aplicação (cliente) com o comando editres, com a aplicação já rodando, interativamente e posteriormente salvar em um arquivo no mesmo formato acima. Esses recursos podem ser incluidos no arquivo que define a aplicação (XTerm, por exemplo) ou no arquivo privativo de cada usuário como $HOME/.Xdefaults. Com o comando xrdb -q voce poderá ver todos os resources atualmente no banco de dados.

As especificações de geometria (largura e altura de uma janela) são normalmente dadas de uma forma compacta, por exemplo: 800x700+20-0, significa que a janela terá 800 pixels de largura, 700 de altura e estará localizada a 20 pontos do topo e alinhada com o lado direito (sinal "-") na "janela raiz".
Especificações de fontes de caracteres são um pouco mais detalhadas, com um formato genérico: -produtor-família-intensidade-inclinação-largura-
estilo-tam_pixels-tam_pontos-res_x-res_y-espacejamento-
larg_média-registro-codificação (tudo isso numa linha só)
Veja um exemplo numa janela do programa xfontsel. (existem programas melhores para selecionar fontes)

xfontsel

editres


rpragana
Sun Jan 17 12:25:36 EDT 1999