# Multiterminais/Multiterminal com Xnest

Vamos descrever aqui como fazer um Multiterminal com Xnest. Há muitas maneiras de se fazer multiterminais, pra vê-las, veja a seção Veja também.
A partir de uma modificação realizada no programa Xnest, foi possível implementar uma nova solução para multiterminal. Como o sistema utiliza apenas um servidor X, que controla todas as placas de vídeo, a solução funciona com diversas combinações de placas de vídeo.

# Como fazer
## Sistema operacional

Debian Sarge

## Introdução

O Xnest é, basicamente, um servidor X que roda dentro de outro servidor X. O Xnest é um programa que é cliente e servidor, ao mesmo tempo. Ele é cliente do servidor X verdadeiro, mas é também servidor para outros aplicativos, que enxergam o Xnest como se fosse um servidor X normal. O Xnest normalmente é utilizado para se trabalhar em dois ou mais desktops simultaneamente, no entanto, fizemos alterações em seu código para permitir que ele seja utilizado para implementar um sistema multiterminal.
O sistema opera da seguinte maneira. Roda-se apenas um servidor X, configurado para utilizar várias telas (screens), sendo que cada tela estará associada a uma placa de vídeo. Após a inicialização do X, abre-se, em tela cheia, um Xnest para cada tela, o qual será utilizado pelo usuário, de maneira transparente.
O Xnest original obtêm os eventos de mouse e teclado a partir do seu servidor X pai. No entanto, para permitir a utilização do Xnest no multiterminal, tivemos que alterar seu código fonte para que ele lêsse os eventos diretamente dos dispositivos, sem intermediação do servidor X. Para ler os eventos do mouse e do teclado utiliza-se o protocolo evdev.
A grande vantagem do multiXnest (nossa proposta de multiterminal com o Xnest modificado) é que o gerenciamento das diversas placas de vídeo é feito por um único X, o que elimina os problemas de compatibilidade e conflitos presentes nas outras maneiras de implementar o multiterminal. Isso significa que o multiterminal funciona com qualquer combinação de placas de vídeo que o X consiga gerenciar.

## Evdev e Udev

Certifique-se de que seu kernel (núcleo do sistema) esteja compilado com suporte ao módulo evdev.
É necessária também a instalação do udev, que provê um diretório /dev dinâmico e atualizado de acordo com os dispositivos conectados:
O udev exige um kernel 2.6.

## Dispositivos de Entrada

Antes de prosseguir, é preciso verificar se os dispositivos de entrada (mouses e teclados) foram detectados. Para isso analise o arquivo /proc/bus/input/devices, que informa detalhes sobre os dispositivos de entrada encontrados pelo kernel. Um exemplo deste arquivo é apresentado abaixo. Apenas dois campos nos interessam: o nome de cada dispositivo, indicado nas linhas que começam com “N: Name=”, e o nome do arquivo relacionado ao dispositivo, mostrado nas linhas que começam com “H: Handlers”.
Note que o arquivo parece indicar a presença de três teclados, embora no sistema aferido existam apenas dois. A razão do dispositivo adicional é que muitos teclados USB contém teclas especiais (por exemplo, de controle multimídia ou acesso à Internet), detectadas pelo kernel como pertencentes a um teclado secundário, cujo endereço físico termina em “input1”. Configuraremos apenas os teclados primários, com endereço físico terminado em “input0”. Portanto, a seção correspondente ao teclado secundário de endereço físico “usb-0000:00:10.2-1/input1” será ignorada.
Podemos perceber, pelo arquivo de exemplo, a presença de 2 teclados, relacionados aos arquivos /dev/input/event0 e /dev/input/event2, respectivamente, e 2 mouses, associados aos arquivos /dev/input/event1 e /dev/input/event4, respectivamente. Esses arquivos são importantes, pois são utilizados, como descreveremos posteriormente, para relacionar cada cabeça do multiterminal aos dispositivos de entrada corretos.

## Instalação do servidor XOrg

Aqui descreveremos os passos para configurar o multiterminal utilizando o servidor XOrg, mas é possível utilizar o XFree86, com poucas alterações. Para instalar o XOrg, no Debian Sarge, proceda da seguinte maneira:
1. Faça uma cópia de segurança (backup) e remova o arquivo /etc/init.d/xfree-common. 2. Adicione as seguintes linhas ao arquivo /etc/apt/sources.list:
3. Instale o pacote xserver-xorg:

## Download do Xnest Modificado

1. Faça o download do binário do servidor Xnest modificado aqui. Você pode, caso desejar, encontrar o patch para o código fonte do Xnest (Xorg 6.8.2) aqui. Você deve copiar o arquivo multiXnest para o diretório /usr/local/bin. 2. Faça o download do script "wrapper" multiXnest.sh, responsável por carregar o servidor multiXnest. O script deve ser copiado para o diretório /usr/sbin.

## Configuração do Servidor X(XOrg)

Para um multiterminal de N terminais, o arquivo /etc/X11/xorg.conf deve ser configurado da seguinte forma:
1. Defina um layout contendo N screen's.
Obs: A disposição das telas apresentadas no layout acima não é relevante.
2. Defina as seções das N placas de vídeo.
3. Defina as seções dos N monitores.
4. Defina as seções das N screen's.
5. As definições de teclado e mouse podem continuar idênticas as já existentes em seu xorg.conf.
6. Para evitar problemas na inicialização do Servidor X devido ao não reconhecimento do mouse, você pode incluir, sem problemas, a seguinte seção:
Obs: Isso não afetará o multiterminal pois os dispositivos mouses/teclados serão passados como parametros, posteriormente, para o Xnest.
7. Finalmente, para evitar que o servidor X entre no modo de economia de energia, e para desabilitar a troca de VT's e as teclas Ctrl+Alt+Backspace, verifique que a seção "ServerFlags" possui as seguintes opções:

## Configuração XKB

Agora é necessário criar um arquivo de configuração XKB para cada multiXnest, para configurar os teclados. O arquivo de configuração do primeiro multiXnest deve ser colocado no arquivo /usr/X11R6/lib/X11/xkb/X1-config.keyboard, o do segundo em /usr/X11R6/lib/X11/xkb/X2-config.keyboard, e assim em diante. Um exemplo de um arquivo de configuração para um teclado ABNT2 pode ser visto a seguir:

## Configuração do Gdm

O último passo é configurar o gerenciador de login para iniciar o servidor X principal e também para rodar os scripts "wrappers" que serão responsáveis por abrir o Xnest em cada tela. Trataremos apenas do GDM. Outros gerenciadores como o XDM e o KDM podem ser configurados por um processo similar.
Edite o arquivo /etc/gdm/gdm.conf na seção [servers] inserindo o seguinte: