Exemplo simples do uso de GtkBuilder

Ok… existe um jeito de construir uma janela e atribuir os sinais aos widgets sem escrever muito código usando o Glade. O exemplo abaixo é bem simples: Apenas uma janelinha com um label e um button:

Essa já é a janela da aplicação rodando!

Para fazer isso vamos ao Glade criar uma GtkWindow e, dentro dela, colocar uma GtkBox com orientação vertical (o padrão) e duas divisões:

Note que mudei o nome do objeto da janela para window, ao invés do default window1. Modifiquei também a propriedade title na aba “General” para “Hello”. O motivo de colocarmos a GtkBox acima é que queremos colocar uma janela filha embaixo da outra. Daí, colocamos elas na GtkBox e temos algo assim:

Depois de modificadas as características visuais de cada objeto vou às abas “Signals” tanto da window quanto de button1 e colocarei o nome da função gtk_main_quit nos eventos destroy e clicked:

Tudo o que temos que fazer agora é salvar o projeto no formato GtkBuilder e fazer um programinha para carregá-lo:

#include <gtk/gtk.h>

int main(int argc, char *argv[])
{
  GtkBuilder *builder;
  GtkWidget *window;

  gtk_init(&argc, &argv);

  builder = gtk_builder_new();

  // "App.glade" é o arquivo que salvamos antes!
  // Existem outros lugares de onde podemos obter o XML!
  gtk_builder_add_from_file(builder, "App.glade", NULL);

  // Conecta os eventos assinalados no XML com as 
  // respectivas funções.
  gtk_builder_connect_signals(builder, NULL);

  // Pega o objeto window e mostra-o.
  window = GTK_WIDGET(gtk_builder_get_object(builder,
                      "window"));
  gtk_widget_show_all(window);

  gtk_main();

  return 0;
}

Voilà! Basta compilar e executar:

$ gcc -O3 -s -o hello hello.c \
`pkg-config --cflags --libs gtk+-3.0`

Repare que isso ai exige o GTK+3.x.

UPDATE:

Duas pequenas modificações sem muita importância… É conveniente que o evento “clicked” do botão requisite que a janela seja fechada. Isso pode ser feito modificando o evento para chamar gtk_window_close com o parâmetro window (aparecerá uma lista com os objetos contidos na janela ao clicar em “User Data”).

A outra modificação é quanto às própria janela window, o label label1 e o botão button1. Em window, habilite os tamanhos default e ajuste-os em 320×200 (por exemplo). No label1, na aba “Packing”, habilite “Expand”. E em button1, mude o “Button Content” para “Stock Button” e selecione “gtk-close” na combobox. A diferença na janela final será essa:

No caso do botão, se seu sistema estiver em português, aparecerá “Fechar” e se os botões com ícones estiverem habilitados, aparecerá um x vermelho, ao lado… :)