Mesmo com o aumento dos recursos disponíveis para as aplicações web, o desenvolvimento desktop sempre foi uma peça importante na construção de softwares. Isso continuar sendo uma verdade por alguns motivos, por exemplo, muitos recursos só são acessados localmente, necessidade do desempenho, segurança, uso de bibliotecas de terceiros. Sei que tudo isso tem melhorado nas APIs javascript, mais ainda não são satisfatórias a ponto de abrirmos mão de 100% dos aplicativos desktop. Por conta disso, hoje apresento como iniciar o desenvolvimento desktop, utilizando PHP e Gtk.

É de conhecimento que o PHP é uma linguagem incrível, dado a quantidade de softwares de ótima qualidade no mercado, que possibilita desde pequenos scripts, até grandes aplicações, pois é uma linguagem muito bem estruturada, rápida, e de grande facilidade de aprendizado. Quem disser o contrario disso, ou é por falta de conhecimento da evolução da linguagem, ou é por má fé mesmo, pois alem de acompanhar as teorias de software, a cada novo lançamento, tanto o interpretador quanto a linguagem ganham muito coisa nova.

Com o lançamento do PHP 7, onde a Zend Engine foi completamente melhorada, foi dado um ganho de performance de pelo menos 2 vezes mais, e em alguns casos 4 vezes mais rápido, principalmente devido à reescrita da hashtable, que trata diretamente valores referenciais entre PHP e o C, e outras modificações como garbage colector.

Já o Gtk é uma toolkit para desenvolvimento de interfaces gráficas. É uma toolkit, por que é um conjunto de widgets. Isso significa que independente do sistema operacional (linux, mac, window, android, etc) e da interface gráfica (kde, gnome, xwindow), os widgets serão os mesmos. Isso tem vantagens e desvantagens, pois ao mesmo tempo que você desenvolve da mesma forma para qualquer sistema, em alguns outros, depende de temas para que tenha o mesmo visual do sistema operacional, o que não chega à ser um problema enorme nos dias atuais com a quantidade de temas presentes para download. Toda via, a quantidade de documentação, a flexibilidade e a forma simples de desenvolvimento, faz com que as vantagens sejam maiores que as desvantagens.

Então, se a linguagem é boa, o toolkit é bom, por que não unir as duas coisas? E unirão. Desde o Gtk 1 que a lib teve seus bindings para o PHP. Mas até agora, houve um período depreciado, onde o Gtk 3 não foi portado para o PHP, pois como a Zend Enguine foi modificada, e Gtk 3 também foi modificado, então necessitava de uma reescrita substancial para que isso pudesse ocorrer.

Felizmente o projeto foi retomado, e já temos uma versão beta para testes, desenvolvida sob PHP 7.3.5 e Gtk 3.18, tudo que há de mais moderno.

O projeto e release para download pode ser encontrado no Github.

Vale lembrar que a versão disponível até a escrita deste artigo é para testes de distribuição. Isso quer dizer que foi lançado somente para que pudesse testar se a forma de distribuição é conveniente e funcional. De qualquer forma, quando testei, percebi que está bem estável, com bastante widget disponível para utilização. Então resolvi começar essa serie de artigos de como utilizar, passo à passo, esse binding.

Iniciando o desenvolvimento com PHP-GTK

Como dissemos acima, Gtk é um conjunto de widgets. Então basicamente você cria o Widget e apresenta à interface. Assim, você pode criar os widgets, e ir adicionando um dentro do outro. Por exemplo, poderá por um widget do tipo botão, dentro de um widget do tipo window.

Para começar, e criar uma janela básica, precisamos criar o widget do tipo window:

1
$win = new GtkWindow();

Apresentar ele para à interface:

1
$win->show_all();

Travar o loop principal:

1
Gtk::main();

Somente com essas 3 linhas, já teríamos nossa janela na tela. Mas se reparar, mesmo fechando a janela o programa continuará executando. Isso por que o loop Gtk ainda está ativo. Em outras palavras, fechando a janela, você destruiu o widget, porem o programa Gtk ainda está rodando. Para fechar a aplicação Gtk, precisamos entender sobre sinais.

Todo Gtk funciona com base em sinais, isso é, tudo que ocorre na aplicação, inclusive nos widgets, emitem sinais, que podem ser interceptados para interação com o usuário. Escreverei outro artigo para facilitar o entendimento desse conceito. Mas por hora com exemplo, fica fácil entender vendo o código.

Com nossa janela criada, conectamos o signal destroy ao widget $win

1
2
3
4
5
function win_ondestroy($widget) {
    Gtk::main_quit();
}
 
$win->connect("destroy", "win_ondestroy");

Veja que é bem lógico: Quando o $win receber o sinal destrua, execute a função "win_ondestroy". Agora sim, nesta função, podemos dar o quit no loop do Gtk.

Todo o código fica assim:

1
2
3
4
56
7
8
9
1011
12
13
14
15
<?php
 
    /**
     * GSignal destroy da janela principal
     */    function win_ondestroy($widget) {
        Gtk::main_quit();
    }
 
    $win = new GtkWindow();    $win->connect("destroy", "win_ondestroy");
 
    $win->show_all();
 
    Gtk::main();

Tranquilo até aqui, certo? No proximo artigo, espero falar um pouco sobre como recorrer à documentação oficial do Gtk para desenvolvimento PHP-GTK. Até lá!