(featuring Rudá Moura)
Existe uma área do software livre que sempre trabalhou duro para não dar certo. Estou falando dos ambientes gráficos, em particular do Gnome e do KDE.
Em primeiro lugar, o Unix usa o X11 como base da interface gráfica. Muita gente já apontou o X11 como o grande problema do desktop Unix. O X11 não é problema; ele simplesmente faz o papel de driver de vídeo, mouse e teclado. Mas também não soluciona nada.
Por si só o X11 não é um passivo, porém a falta de uma API de nível médio é um problema que sempre foi óbvio. Embora muita gente argumentasse que essa inexistência de tal API significava "liberdade", é apenas uma liberdade potencial, enquanto os perigos da falta de uma API padrão sempre foram, e continuam sendo, reais e imediatos.
É claro, o X11 oferece uma API de baixo nível (x11lib), semelhante à API de baixo nível do Windows. Ao menos a x11lib é um padrão, embora as extensões padeçam de problemas, conforme abordaremos mais adiante.
A API de nível médio, que o X11 não oferece porém é muito necessária, é aquela que fornece elementos necessários a qualquer ambiente gráfico que mereça este nome, e que ofereça recursos como:
* Widgets (ao menos os controles básicos);
* Comunicação interprocessos de alto nível, possivelmente com semelhanças com DDE/OLE/COM do Windows;
* Instalação e manipulação de fontes;
* Impressão;
* Painel/tray;
* Som e multimídia em geral;
* Possivelmente, APIs para drivers multimídia como codecs;
* Recentemente, Bluetooth.
O Windows não tinha todos estes recursos numa API uniforme logo de início, nem mesmo manteve um padrão gravado em pedra. Por exemplo, a comunicação interprocessos era DDE, depois OLE, e atualmente COM. O Mac OS X mudou a API de Bluetooth entre as versões 10.3 e 10.4.
A API de widgets é um ponto delicado, porque também envolve a questão da aparência desses widgets. Uma das "liberdades" apregoadas no mundo X11 é cada aplicativo desenhe widgets do jeito que quiser. Na verdade, isso também é possível no Windows; lembro que o Delphi já desenhava muitos widgets por conta própria, embora com a mesma aparência.
A questão de existir uma aparência padrão que os aplicativos normalmente devam seguir, é uma questão religiosa. Teoricamente o Motif fazia este papel para o X11, porém o Motif era feio e limitado demais já em 1999.
Mas o problema que mais incomoda não é a existência de aplicativos com aparência diferente; o real problema é a reimplementação das mesmas primitivas no Motif, na Qt, no Gtk+: main loop, timers, troca de mensagens, etc. etc. É o que torna impossível usar determinados recursos do GObject porque o main loop da aplicação é Qt, e vice-versa.
Um outro problema da falta de uma API padrão, de que ninguém parece ter lembrado, é que existe duplicação de esforços na introdução de novos recursos gráficos (por exemplo, efeitos 3D). Via de regra, cada recurso novo tem de ser implementado tanto no X11 quanto na API de nível médio.
Como cada camada é mantida por times diferentes, que não se conversam, a conseqüência prática é o enorme e invariável atraso na "entrega" de recursos novos do X11 ao usuário final. Ou pior, a entrega com bugs porque as diferentes APIs não estão em sincronia.
O caso típico para mim é o gerenciador de janelas Compiz com os efeitos especiais. Não posso usá-lo nos meus computadores: não funciona no notebook por conta do X11, e embora funcione no Mac Mini, alguns programas (em particular os que usam OpenGL) "quebram" o Compiz.
No caso de um Windows ou um Mac OS X, tudo fica mais fácil. Qualquer necessidade de corrigir ou contornar bugs sempre pode ser feito na camada de API gráfica, porque é garantido que todas as aplicações passam obrigatoriamente por ela.
Bem, dito tudo isto, e já sendo um problema perfeitamente conhecido em 1997, todo o esforço da comunidade de software livre deveria ser concentrado na criação de uma API gráfica uniforme. Mesmo que não fosse a melhor possível, mas isso resolve-se com o tempo.
Infelizmente, a tal "liberdade", confundida largamente com barderna, estava tão em moda entre os nove-noves que diversas iniciativas diferentes foram criadas: Gnome, KDE, WindowMaker, Enlightenment, OpenStep, e assim por diante.
De início, o KDE tinha a melhor estratégia, porque baseava-se numa biblioteca gráfica madura, o Qt. A princípio esta decisão eliminou o maior problema do X11, que era a falta de biblioteca gráfica padrão. Infelizmente o KDE tinha alguns problemas, alguns criados por ele, outros derivados da "comunidade":
* O Qt, e portanto o KDE, eram baseados em C++. Por algum motivo que não compreendo até hoje, existe esta clivagem entre C e C++ no mundo GNU; distinção praticamente inexistente no Windows desde o início dos anos 90. Os GNU-chatos preferem C puro, e fazem questão de mantê-lo uma linguagem independente do C++. O resultado em 1999 era que o compilador era g++ era relativamente ineficiente.
Ao invés de melhorar o g++, a resposta dos GNU-chatos foi promover um ambiente gráfico em C puro, sendo que C puro é a linguagem mais inadequada possível para este fim. Não gosto de C++, porém ele é certamente melhor que C, para este fim.
* O Qt não era "livre", embora fosse de código aberto e de uso gratuito quando não-comercial. Mais um motivo para os GNU-chatos criticarem o KDE, motivo este que encontrou muito mais ouvidos receptivos, embora eu desconfie que no fundo o problema era mesmo o C++, e a licença do Qt foi usada como pretexto;
* O KDE cometeu, na minha opinião, um grande erro na sua API: "escondeu" excessivamente o Qt, de modo que uma aplicação KDE era desenvolvida de forma completamente diferente de uma aplicação Qt pura. Ou seja, paradoxalmente o KDE não ajudou o Qt a firmar-se como API gráfica padrão. Se o Qt tinha recursos faltando, tais recursos deveriam ter sido oferecidos como "qt-extras", passíveis de inclusão em versões futuras do Qt, e não como "kdelibs". Com o tempo, essa tendência do KDE utilizar APIs próprias ficou cada vez mais aguda, a ponto do KDE não adotar até hoje soluções como o GStreamer (na verdade adota, mas "esconde-a" numa outra API).
* Na onda do ponto anterior, o KDE oferece inúmeras aplicações diferentes no bojo do ambiente gráfico: jogos, editores, até navegador de Internet. Na verdade o KDE teve de fazer isso, porque apenas os aplicativos que utilizam as APIs KDE estão completamente integradas ao ambiente gráfico KDE; as outras aplicações ficam como peixes fora da água. Ou seja, a decisão de design obrigou o projeto KDE a criar inúmeros aplicativos, muito além do escopo do projeto (e da capacidade dos desenvolvedores envolvidos).
O resultado é uma quantidade grande de aplicativos cozidos pela metade -- cujo exemplo mais gritante é o KOffice.
* O KDE imitou muito de perto a aparência gráfica do Windows, o que era pragmático (atendia a necessidade dos usuários) porém jogou fora a oportunidade de tentar algo novo e melhor, que a tal "liberdade" proporciona.
--
O projeto GNU já tinha um ambiente gráfico promissor: o OpenStep, baseada no NextStep (no qual também baseia-se o Mac OS X). Embora fosse muito feio em 1998, ele tinha uma proposta interessante, em particular porque utilizava uma linguagem mais adequada que C e C++: o Objective-C.
Por algum motivo, o GNU largou o OpenStep em favor do projeto GNOME, talvez com a intenção de fazer frente mais prontamente ao KDE.
O GNOME baseia-se na biblioteca gráfica GTK+ (originalmente desenvolvida para o Gimp) e na biblioteca GObject. GObject é um animal sui generis, que recria um sistema de objetos em C puro, usando estruturas e macros. Isto atendeu à necessidade emocional dos GNU-chatos utilizarem C puro.
O GTK+ é muito mais fraco que o Qt, tanto em quantidade como em qualidade de recursos. Porém, existem hoje muito mais aplicativos bons GTK+ do que aplicativos Qt. GTK+ e GObject acabaram tornando-se o mais próximo que temos de uma API gráfica padrão. Ironicamente, os usuários preferem o ambiente gráfico KDE, mas preferem as aplicações GNOME. Por que isto aconteceu?
* Sendo o GTK+ uma API em C puro, atraiu a simpatia inicial dos GNU-chatos. Porém uma API em C puro tem outra vantagem importante: por ser um denominador comum pobre, é fácil oferecer a mesma API em qualquer outra linguagem de programação, através de "bindings". Os mecanismos do GObject permitem a geração desses "bindings" de forma razoavelmente automática. Já uma API em C++ é mais difícil disponibilizar em outras linguagens, porque o modelo de objetos é diferente em cada linguagem.
É prudente lembrar que a API de baixo nível do Windows é em C puro (embora "ninguém use-a" diretamente), e que o MFC em C++ parece estar caindo no ocaso.
* O GNOME não isolou o GTK+ do desenvolvedor. É perfeitamente possível uma aplicação GNOME utilizar de forma seletiva e opcional os recursos específicos do GNOME. Isto facilita o porte da aplicação para outros sistemas operacionais, ou a compilação de uma versão em GTK+ puro que funcione bem no KDE.
* O GNOME desistiu logo de tentar reinventar cada aplicativo, e com isso eximiu-se de ter de desenvolver aplicativos fora da sua área de competência. No início dos anos 2000, o GNOME tentou uma safadeza: açambarcar aplicativos como sendo "do projeto GNOME", como o OpenOffice e o Mozilla, que não utilizam nem GTK+. Essa tentativa de ganhar terreno sobre o KDE por usucapião não colou e foi abandonada, porém revelou-se mais certo a longo prazo não tentar reinventar cada aplicativo.
Os melhores aplicativos, como Pigdin, X-Chat, etc. têm vida própria, mesmo tendo sido inicialmente associados com o GNOME. Assim, o projeto GNOME evita ter responsabilidade por eles. O mesmo aconteceu com diversas tecnologias, como GStreamer, D-BUS etc. que estão hoje sob o guarda-chuva do projeto FreeDesktop e tendem a ser adotadas também pelo KDE.
--
A falta de API padrão para codecs tem conseqüências ainda mais óbvias. O único player que é realmente capaz de tocar "qualquer coisa" no Linux é o MPlayer, embora seja o pior em arquitetura interna. Parte deste poder do MPlayer é derivado da capacidade de usar DLLs de codec do Windows -- e naturalmente isso só é possível porque o Windows tem uma API padrão para DLLs de codec...
O GStreamer tem se firmado como API padrão de codecs e multimídia, mas ainda precisa melhorar muito na qualidade dos plugins, em particular os de vídeo.