Вообще-то, первый проект hello world не полностью функционален. Закрыть его можно было только "убивством" из шела, ну и вообще. Значит, меняем.
#include <gtk/gtk.h> void hello( GtkWidget *widget, gpointer data) { g_print ("Здравствуй, мир!\n"); // наглость написания по русски приветствия // можно себе позволить только с нормально русифицированной консолью } gint delete_event( GtkWidget *widget, GdkEvent *event, gpointer data ) { g_print ("delete event!!!!!!\n"); return (TRUE); } void destroy( GtkWidget *widget, gpointer data ) { gtk_main_quit (); // это для того, чтобы программу можно было закрыть с кнопки на окне // } int main( int argc, char *argv[] ) { GtkWidget *window; GtkWidget *button; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (delete_event), NULL); gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (destroy), NULL); gtk_container_set_border_width (GTK_CONTAINER (window), 10); button = gtk_button_new_with_label ("Здорово, Мир!"); gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (hello), NULL); gtk_signal_connect_object (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), GTK_OBJECT (window)); gtk_container_add (GTK_CONTAINER (window), button); gtk_widget_show (button); gtk_widget_show (window); gtk_main(); return 0; }
Некоторые замечания. Как, наверно, читатель заметил, здесь довольно часто использовались русско-кодированные слова. Ну, с консолью у меня (xterm) давно все в порядке, а вот надпись на кнопке отобразилась поначалу кривовато. Ну, чтоб все было нормально, необходимо шрифт на заказ в Gnome Control Center поставить. Например, отлично смотрится Helvetica-Cronyx.
По поводу сигналов. Все то, что использовалось в этом примере, проходилось в предыдущем шаге. Новым здесь является gtk_container. Теорию контейнеров мы рассмотрим в следующем шаге.