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]
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
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.
|
|
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.
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 é
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".
|