Vamos fazer mais um exemplo, com um pouco mais de funcionalidade. Vamos fazer um conversor de temperatura (quem já não fez um.... talvez em VB? :-)).
#include <stdio.h>
#include <gtk/gtk.h>
GtkWidget *entrada;
GtkWidget *label_saida;
gboolean converter(GtkButton *button, gpointer data) {
double celsius;
double fahrenheit;
char texto[128];
celsius=atol(gtk_entry_get_text(GTK_ENTRY(entrada)));
fahrenheit=celsius*1.8+32;
sprintf(texto, "%.1f ºC = %.1f ºF", celsius, fahrenheit);
gtk_label_set_text(GTK_LABEL(label_saida), texto);
return FALSE;
}
int main(int argc, char **argv) {
GtkWidget *janela;
GtkWidget *conteudo;
GtkWidget *label_entrada;
GtkWidget *botao;
gtk_init(&argc, &argv);
janela=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(janela), GTK_WIN_POS_CENTER);
conteudo=gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(janela), conteudo);
label_entrada=gtk_label_new("Digite a temperatura em ºC");
gtk_box_pack_start(GTK_BOX(conteudo), label_entrada, FALSE, FALSE, 0);
entrada=gtk_entry_new();
gtk_box_pack_start(GTK_BOX(conteudo), entrada, FALSE, FALSE, 0);
botao=gtk_button_new_with_label("Converter para ºF");
gtk_box_pack_start(GTK_BOX(conteudo), botao, FALSE, FALSE, 0);
label_saida=gtk_label_new("ºC = ºF");
gtk_box_pack_start(GTK_BOX(conteudo), label_saida, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(janela), "destroy", G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(G_OBJECT(botao), "clicked", G_CALLBACK(converter), NULL);
gtk_widget_show_all(janela);
gtk_main();
return 0;
}
Agora uma explicação mais detalhada:
- Primeiro declaramos a janela e definimos a posição dela;
- Criamos um box de conteúdo do tipo vbox que organiza os componentes verticalmente, adicionamos o box à janela;
- Criamos um label de entrada e acrescentamos ele ao box de conteúdo;
- Criamos um componente de entrada de dados e adicionamos ao box de conteúdo;
- Criamos um botão com texto e o adicionamos ao box de conteúdo;
- Criamos um label com o resultado da conversão e o adicionamos ao box de conteúdo;
- Conectamos o sinal de "destroy" à janela fazendo com que chame a função gtk_main_quit(), que encerra o main loop;
- Conectamos o sinal "clicked" ao botão fazendo com que execute a função converter();
- Exibimos tudo que está dentro da janela;
Compilando e rodando, nosso conversor deve funcionar.
Conclusão
Utilizar a GTK+ para desenvolver interfaces gráficas torna-se bem intuitivo depois de um tempo, principalmente pelo fato de que o nome das funções são bem intuitivos.
É óbvio que nosso conversor de unidades tem vários problemas (ele aceita texto no campo de entrada por exemplo...), mas ele demonstra bem a funcionalidade da GTK+.
É fundamental dar uma boa olhada na documentação disponível em
library.gnome.org/devel/gtk/, só assim começamos a nos familiarizar com todos os componentes disponíveis e todas as opções disponíveis.
Em casos de dúvidas, um bom fórum de discussão também pode ajudar:
http://www.gtkforums.com
Uma coisa legal sobre a GTK+ é que existem bindings para várias linguagens, como PHP, python, C++ e outras.
Espero que o artigo o ajude a pelo menos iniciar o uso da GTK+ para o desenvolvimento de interfaces gráficas.