![]() |
![]() |
![]() |
![]() |
In the long tradition of programming languages and libraries, this example is called Hello, World.
Create a new file with the following content named
example-1.c
.
#include <gtk/gtk.h> static void print_hello (GtkWidget *widget, gpointer data) { g_print ("Hello World\n"); } static void activate (GtkApplication *app, gpointer user_data) { GtkWidget *window; GtkWidget *button; GtkWidget *box; window = gtk_application_window_new (app); gtk_window_set_title (GTK_WINDOW (window), "Window"); gtk_window_set_default_size (GTK_WINDOW (window), 200, 200); box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); gtk_window_set_child (GTK_WINDOW (window), box); button = gtk_button_new_with_label ("Hello World"); g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL); g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_window_destroy), window); gtk_box_append (GTK_BOX (box), button); gtk_widget_show (window); } int main (int argc, char **argv) { GtkApplication *app; int status; app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE); g_signal_connect (app, "activate", G_CALLBACK (activate), NULL); status = g_application_run (G_APPLICATION (app), argc, argv); g_object_unref (app); return status; }
You can compile the program above with GCC using:
gcc `pkg-config --cflags gtk4` -o example-1 example-1.c `pkg-config --libs gtk4`
As seen above, example-1.c builds further upon example-0.c by
adding a button to our window, with the label “Hello
World”. Two new GtkWidget pointers are declared to
accomplish this, button
and
box
. The box variable is created to store a
GtkBox, which is GTK’s way of controlling the size and layout of
buttons.
The GtkBox is created with gtk_box_new()
which takes a
GtkOrientation enum as parameter. The buttons which this box
will contain can either be laid out horizontally or vertically.
This does not matter in this particular case, as we are dealing
with only one button. After initializing box with the newly
created GtkBox, the code adds the box widget to the window
widget using gtk_window_set_child()
.
Next the button
variable is initialized in
similar manner. gtk_button_new_with_label()
is called which
returns a GtkButton to be stored in button
.
Afterwards button
is added to our
box
.
Using g_signal_connect()
, the button is connected to a function
in our app called print_hello()
, so that when the button is
clicked, GTK will call this function. As the print_hello()
function does not use any data as input, NULL is passed to it.
print_hello()
calls g_print()
with the string “Hello
World” which will print Hello World in a terminal if the
GTK application was started from one.
After connecting print_hello()
, another signal is connected to
the “clicked” state of the button using
g_signal_connect_swapped()
. This functions is similar to a
g_signal_connect()
with the difference lying in how the callback
function is treated. g_signal_connect_swapped()
allows you to
specify what the callback function should take as parameter by
letting you pass it as data. In this case the function being
called back is gtk_window_destroy()
and the
window
pointer is passed to it. This has the
effect that when the button is clicked, the whole GTK window is
destroyed. In contrast if a normal g_signal_connect()
were used
to connect the “clicked” signal with
gtk_window_destroy()
, then the function would be called on
button
(which would not go well, since the
function expects a GtkWindow as argument).
More information about creating buttons can be found here.
The rest of the code in example-1.c
is
identical to example-0.c
. The next section
will elaborate further on how to add several GtkWidgets to your
GTK application.