sexta-feira, junho 05, 2009

Code::Blocks + Glade/GTK + Windows XP

Este artigo demostrará um exemplo de como desenvolver uma aplicação em C para Windows XP de tal forma a deixar o código fonte portável para plataforma Linux. Utilizaremos ferramentas Open Source para o desenvolvimento. Será um artigo breve, onde supomos que o leitor tenha familiaridade com programação. Opções avançadas não serão discutidas, apenas um exemplo básico.

A IDE de desenvolvimento utilizada aqui é o Code::Blocks, faça o download da versão que inclui o ambiente MinGW (contém compilador gcc para windows) AQUI.

Para desenvolvimento de uma interface gráfica amigável que não fique diretamente ligado ao sistema operacional, optamos pela GTK, que além de ser multi-plataforma, conta com o Glade-3, um "front-end" que facilita o designer gráfico de nossa interface, o desingner não será abordado no momento.

Iniciaremos com a instalação da GTK, para tal, obtenha o pacote DEV da mesma, que contém além da runtime, as bibliotecas para desenvolvimento. Disponível para download AQUI.
Durante sua instalação, não esqueca de marcar as opções para desenvolvimento (pacotes DEV). além da libglade-2.0, responsável pela interpretação do XML gerado pelo Glade-3 e construção da interface utilizando o GTK.

Utilizaremos aqui um exemplo já pronto de interface produzida com Glade-3, encontrado na internet, o arquivo example.glade. Maiores detalhes de como produzir uma interface com Glade-3 pode ser visto AQUI.

Tudo instalado, vamos colocar a mão na massa.

Abra o Code::Blocks e inicie um novo projeto do tipo GTK+ Project.


Defina um nome para o projeto e um diretório onde os arquivos serão salvos e gerados.


Agora vamos definir o caminho para o compilador encontrar o GTK em nosso sistema. Clique no local indicado


Preencha os campos conforme ilustrado abaixo. Se você instalou a GTK no diretório padrão os valores para os campos são:

Base -> C:\Arquivos de programas\Arquivos comuns\GTK\2.0
Include -> C:\Arquivos de programas\Arquivos comuns\GTK\2.0\include
Lib -> C:\Arquivos de programas\Arquivos comuns\GTK\2.0\lib



O próximo passo é escolher as opções de DEBUG e RELEASE em nosso projeto, para concluirmos


Antes de iniciarmos o desenvolvimento de nossa aplicação, é necessário informar ao Code::Blocks a localização da libglade-2.0 já instalada. Para tal acessamos via clique com botão direito, a opção Build Option de nosso projeto, conforme abaixo.


Na Aba Linker Settings, adicionaremos a linha libglade-2.0 no campo link libraries, logo abaixo das opções default da GTK. Atenção aos detalhes em vermelho na imagem abaixo


Agora na Aba Search Directories, na sub-Aba Compiler, adicione o local dos header da libglade-2.0, o caminho padrão de instalação é:
C:\Arquivos de programas\Arquivos comuns\GTK\2.0\include\libglade-2.0


Agora na sub-Aba Linker, adicionamos o local das bibliotecas da libglade-2.0, o caminho padrão de instalação é:
C:\Arquivos de programas\Arquivos comuns\GTK\2.0\lib\libglade\2.0


Pronto, agora o Code::Blocks está corretamente configurado.
Podemos agora desenvolver a aplicação.

Para ilustrar, segue abaixo um código exemplo encontrado na internet juntamente com sua respectiva interface desenvolvida em Glade-3. Este projeto completo está disponível para download AQUI.

É um programa que identifica o sistema operacional e as versões das bibliotecas GTK instaladas e exibe o resultado em uma janela simples.


Note que é importante o arquivo gerado pela Glade-3 estar no diretório do seu projeto (junto com main.c)

Alguns pontos importantes na hora de desenvolver qualquer aplicação utilizando Glade/GTK, estão comentados no código desta aplicação abaixo.

// Inclusão das bibliotecas gtk e libglade
#include
#include

// Arquivo interface grafica gerado pelo Glade-3
#define GLADE_FILE "example.glade"

// Principal
int main (int argc, char *argv[])
{
//Variáveis glade para tratar o xml
GladeXML *gxml;
//Variáveis GTK para manipulação da interface gráfica (botao por exemplo)
GtkWidget *window, *platform, *glib_version, *gtk_version;
GtkWidget *user_name, *home_dir;

// Diretivas de pre-processamento para identificação do sistema operacional.
// Apenas um exemplo de aplicação
#ifdef G_OS_WIN32
const gchar *os = "Windows";
#endif
#ifdef G_OS_UNIX
const gchar *os = "Unix";
#endif

//Inicializacao da GTK
gtk_init (&argc, &argv);
//Leitura do arquivo para parser xml
gxml = glade_xml_new (GLADE_FILE, NULL, NULL);

//Objetos GTK de nossa interface
window = glade_xml_get_widget (gxml, "window");
platform = glade_xml_get_widget (gxml, "platform");
glib_version = glade_xml_get_widget (gxml, "glib_version");
gtk_version = glade_xml_get_widget (gxml, "gtk_version");
user_name = glade_xml_get_widget (gxml, "user_name");
home_dir = glade_xml_get_widget (gxml, "home_dir");

//Definição das rotinas de callback
//quando ocorrer determinado evento na interface gráfica a GTK gera um sinal
// correspondente ao evento, e este é atendido pela rotina do usuário.
// A GTK disponibiliza rotinas básicas de tratamento, mais provavelmente voce
// fará a sua.

// Quando a interface gerar o sinal de window_destroy (fechar janela)
glade_xml_signal_connect (gxml, "on_window_destroy", G_CALLBACK (gtk_main_quit));

// ou quando o usuário clicar no X no canto da janela, a rotina gtk_main_quit será acionada
glade_xml_signal_connect (gxml, "on_close_button_clicked",
G_CALLBACK (gtk_main_quit));

//Uma vez que ja linkamos os objetos da interface, podemos desalocar o arquivo Glade
g_object_unref (G_OBJECT (gxml));

// Métodos ilustrativos da própria GTK para informar os dados abaixo:
//Sistema Operacional
gtk_label_set_text (GTK_LABEL (platform), os);

// Versao Glib
gtk_label_set_text (GTK_LABEL (glib_version), g_strdup_printf ("%d.%d.%d",
glib_major_version,
glib_minor_version,
glib_micro_version));

// Versao Gtk
gtk_label_set_text (GTK_LABEL (gtk_version), g_strdup_printf ("%d.%d.%d",
gtk_major_version,
gtk_minor_version,
gtk_micro_version));

//Nome do usuário que esta executando esta aplicacao
gtk_label_set_text (GTK_LABEL (user_name), g_get_user_name ());

//Diretório default
gtk_label_set_text (GTK_LABEL (home_dir), g_get_home_dir ());

//Exibe a interface gráfica
gtk_widget_show_all (window);

//Chama laço de execução da GTK responsavel por rodar a interface e gerar os
//eventos para as rotinas de callback. Quando clicamos em um botao, esta rotina
//identifica o click, gerando o sinal adequado para tal, este é tratado logo
//acima no código quando definimos as rotinas de callback.

gtk_main ();

return 0;
}

Agora você tem uma alternativa válida aos compiladores proprietários, para desenvolver aplicações para sistemas Windows e Linux.

Lembre-se de disponibilizar as dlls das bibliotecas utilizadas junto com sua aplicação compilada. Um pacotão das principais dlls pode ser obtido AQUI

Detalhes avançados sobre GTK e Glade são obtidos junto ao fabricante, google, etc.

3 comentários:

Anônimo disse...

Ainda não consegui instalar certinho mas muito obrigado, belo post ^^

Anônimo disse...

Amigo,

Obrigado pela postagem deu tudo certo aqui.

Até a próxima

Anônimo disse...

Muito obrigado, consegui configurar no meu computador, funcionou muito bem.

O arquivo para o projeto exemplo, não está mais disponível, mas eu testei com um projeto meu e funcionou.

Valeu