Uma peculiaridade do X Window System: janelas até o fim
Interfaces gráficas do X11 ao Microsoft Windows e ao Mac OS clássico há muito tratam quase todo elemento na tela — botões, caixas de texto, barras de título — como um tipo de “janela” ou view, cada um com suas próprias coordenadas, eventos e contexto de desenho. Os comentários comparam como diferentes sistemas implementam essa hierarquia (controles nativos vs “sem janela”, decorações do lado do cliente vs do servidor, limites globais de handles e captura de entrada) e como essas escolhas afetam desempenho, skinning, exibição remota e acessibilidade. O tema geral é que esse modelo de janela até o fim é historicamente comum e conceitualmente elegante, mas precisou evoluir ou ser parcialmente abandonado à medida que as UIs ficaram mais ricas e complexas.
Janela-como-primitiva-universal
- Muitos sistemas GUI fazem “tudo é uma janela/view”: X, Microsoft Windows (HWND), GTK, Qt, as views clássicas do Smalltalk e, em certa medida, o Mac clássico (janelas mais controles mais leves).
- Desenvolvedores observam que isso muitas vezes “surge naturalmente” ao implementar uma GUI: tudo tem posição, limites, desenho e filhos, então “janela até o fim” é uma arquitetura comum, não algo exclusivo do X.
- Alguns defendem separar conceitos (por exemplo, janelas vs controles) mesmo que compartilhem implementação, para manter o modelo mental mais limpo.
Desempenho, Recursos e Controles sem Janela
- Sistemas antigos usavam muitas janelas reais para controles sem grandes problemas de desempenho, mas atingiam limites de recursos (heaps GDI/USER de 16 bits, máximos de handles).
- À medida que as UIs ficaram mais ricas (navegadores, apps com skins, transparência, imagens complexas), janelas por controle passaram a ser pesadas demais; isso motivou “windowless controls” e os “alien widgets” do Qt.
- Até toolkits modernos como o Qt tornam listas pesadas em QWidget lentas; desenho customizado mais tratamento de eventos para itens de lista escala melhor.
- No Windows, o GDI costumava desenhar diretamente na VRAM; com o Desktop Window Manager, as janelas agora são texturas compostas, mais próximas da história moderna de composição do X.
Áreas de Cliente vs Não Cliente e Decorações
- O Windows clássico distingue áreas de cliente e não cliente (barra de título, bordas, botões), cada uma com mensagens separadas; normalmente os apps deixam os padrões tratarem a área não cliente.
- O Presentation Manager do OS/2 tratava tudo, inclusive a área de cliente, como janelas-filhas, simplificando o modelo com possível custo de velocidade.
- O tratamento da área não cliente ajuda a manter mover/fechar janelas responsivo mesmo quando os apps estão ocupados ou travados; alguns comparam isso favoravelmente às decorações do lado do cliente no Linux/Wayland, onde apps congelados podem ser mais difíceis de gerenciar.
- Há discordância contínua sobre decorações do lado do cliente: alguns valorizam consistência por meio de molduras do lado do servidor; outros observam que apps projetados para CSD (por exemplo, alguns apps Linux) ficam melhores assim.
Modelo Cliente/Servidor do X e Terminologia
- Vários comentários defendem que o “servidor” do X é o sistema de display e os “clientes” são os apps: é análogo a servidores de arquivos/impressão/banco de dados mediando acesso a um recurso.
- A confusão vem principalmente do marketing de “computação cliente-servidor” dos anos 1990 e de modelos mentais centrados no usuário, em que “minha máquina local é o cliente.”
- As pessoas enfatizam que a terminologia do X combina com as normas de redes, uma vez explicada.
Captura de Entrada e Peculiaridades de Interação
- XGrabPointer/XGrabKeyboard direcionam eventos para uma janela específica независимо da focalização do ponteiro, permitindo recursos como menus em cascata e comportamentos robustos de arrastar.
- Mecanismos semelhantes existem em outros lugares (por exemplo, captura do mouse no Windows); sem eles, arrastos que cruzam limites de janela se comportariam mal.
- O comportamento da roda de rolagem difere entre sistemas e épocas: alguns sempre rolam a janela sob o cursor, outros historicamente exigiam foco explícito; o Windows adicionou “rolar janelas inativas” relativamente tarde.
Incorporando Janelas e Composição
- XEmbed aproveita o fato de que “tudo é uma janela” para que um app possa tornar a janela de outro app sua filha (por exemplo, contêineres com abas, navegadores incorporáveis, plugins de áudio).
- O Win32 pode tecnicamente reparentear janelas de topo entre processos, mas sofre com problemas de desempenho e complexidade (trocas de thread/contexto, filas de entrada).
- Alguns componentes modernos (por exemplo, web views fora do processo) desfocam essa fronteira por meio de plumbing mais complexo; como isso se mapeia para o Wayland é visto como incerto.
Skins, Temas e Consistência de UI
- Controles nativos do Windows eram difíceis de aplicar skins, o que levou a UIs desenhadas sob medida e bibliotecas de skinning de terceiros, especialmente na era do XP.
- Isso gerou muitas UIs “parecidas com XP, mas erradas”, que imitavam visualmente os temas do sistema sem fidelidade ao comportamento ou às métricas.
- No Mac clássico, existiam UIs fortemente não nativas, mas frequentemente eram mal vistas pelos usuários, encaradas como exceções e não como regra.
- Há tensão entre dar liberdade para os apps desenharem tudo e preservar uma aparência e um comportamento consistentes e acessíveis no desktop.
Toolkits Históricos e Nostalgia
- O X é lembrado como elegante para a sua época, especialmente pela transparência de rede, mas toolkits iniciais (por exemplo, Motif) eram dolorosos de usar.
- Toolkits mais novos como GTK e Tk pareciam mais acessíveis; outros lembram com carinho da API C do XView, cheia de varargs.
- Vários observam que o estilo de “muitas janelas pequenas” hoje é um conhecimento relativamente obscuro entre desenvolvedores modernos, embora as ideias subjacentes continuem vivas em DOMs e hierarquias de views no estilo MVC.