program HelloWorld; {$mode objfpc}{$H+} uses Glib2, Gdk2, Gtk2; (* This is a callback function. The data arguments are ignored * in this example. More on callbacks below. *) procedure hello(Widget: PGtkWidget; Data: gpointer); cdecl; begin g_print ('Hello World'#13#10); end; function delete_event( Widget: PGtkWidget; Event: PGdkEvent; Data: gpointer):gint; cdecl; begin (* If you return FALSE in the "delete_event" signal handler, * GTK will emit the "destroy" signal. Returning TRUE means * you don't want the window to be destroyed. * This is useful for popping up 'are you sure you want to quit?' * type dialogs. *) g_print ('delete event occurred'#13#10); (* Change TRUE to FALSE and the main window will be destroyed with * a "delete_event". *) Result:=gTRUE; end; (* Another callback *) procedure destroy(Widget: PGtkWidget; Data: gpointer); cdecl; begin gtk_main_quit; end; var (* GtkWidget is the storage type for widgets *) Window: PGtkWidget; Button: PGtkWidget; begin (* This is called in all GTK applications. Arguments are parsed * from the command line and are returned to the application. *) gtk_init (@argc, @argv); (* create a new window *) window := gtk_window_new (GTK_WINDOW_TOPLEVEL); (* When the window is given the "delete_event" signal (this is given * by the window manager, usually by the "close" option, or on the * titlebar), we ask it to call the delete_event () function * as defined above. The data passed to the callback * function is NULL and is ignored in the callback function. *) g_signal_connect (G_OBJECT (window), 'delete_event', G_CALLBACK (@delete_event), NULL); (* Here we connect the "destroy" event to a signal handler. * This event occurs when we call gtk_widget_destroy() on the window, * or if we return FALSE in the "delete_event" callback. *) g_signal_connect (G_OBJECT (window), 'destroy', G_CALLBACK (@destroy), NULL); (* Sets the border width of the window. *) gtk_container_set_border_width (GTK_CONTAINER (window), 10); (* Creates a new button with the label "Hello World". *) button := gtk_button_new_with_label ('Hello World'); (* When the button receives the "clicked" signal, it will call the * function hello() passing it NULL as its argument. The hello() * function is defined above. *) g_signal_connect (G_OBJECT (button), 'clicked', G_CALLBACK (@hello), NULL); (* This will cause the window to be destroyed by calling * gtk_widget_destroy(window) when "clicked". Again, the destroy * signal could come from here, or the window manager. *) g_signal_connect_swapped (G_OBJECT (button), 'clicked', G_CALLBACK (@gtk_widget_destroy), window); (* This packs the button into the window (a gtk container). *) gtk_container_add (GTK_CONTAINER (window), button); (* The final step is to display this newly created widget. *) gtk_widget_show (button); (* and the window *) gtk_widget_show (window); (* All GTK applications must have a gtk_main(). Control ends here * and waits for an event to occur (like a key press or * mouse event). *) gtk_main (); end.