diff options
Diffstat (limited to 'examples/packbox/packbox.c')
-rw-r--r-- | examples/packbox/packbox.c | 285 |
1 files changed, 285 insertions, 0 deletions
diff --git a/examples/packbox/packbox.c b/examples/packbox/packbox.c new file mode 100644 index 0000000000..009d33b557 --- /dev/null +++ b/examples/packbox/packbox.c @@ -0,0 +1,285 @@ +/* This file extracted from the GTK tutorial. */ + +/* packbox.c */ + +#include "gtk/gtk.h" + +void +delete_event (GtkWidget *widget, gpointer *data) +{ + gtk_main_quit (); +} + +/* Make a new hbox filled with button-labels. Arguments for the + * variables we're interested are passed in to this function. + * We do not show the box, but do show everything inside. */ +GtkWidget *make_box (gint homogeneous, gint spacing, + gint expand, gint fill, gint padding) +{ + GtkWidget *box; + GtkWidget *button; + char padstr[80]; + + /* create a new hbox with the appropriate homogeneous and spacing + * settings */ + box = gtk_hbox_new (homogeneous, spacing); + + /* create a series of buttons with the appropriate settings */ + button = gtk_button_new_with_label ("gtk_box_pack"); + gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding); + gtk_widget_show (button); + + button = gtk_button_new_with_label ("(box,"); + gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding); + gtk_widget_show (button); + + button = gtk_button_new_with_label ("button,"); + gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding); + gtk_widget_show (button); + + /* create a button with the label depending on the value of + * expand. */ + if (expand == TRUE) + button = gtk_button_new_with_label ("TRUE,"); + else + button = gtk_button_new_with_label ("FALSE,"); + + gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding); + gtk_widget_show (button); + + /* This is the same as the button creation for "expand" + * above, but uses the shorthand form. */ + button = gtk_button_new_with_label (fill ? "TRUE," : "FALSE,"); + gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding); + gtk_widget_show (button); + + sprintf (padstr, "%d);", padding); + + button = gtk_button_new_with_label (padstr); + gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding); + gtk_widget_show (button); + + return box; +} + +int +main (int argc, char *argv[]) +{ + GtkWidget *window; + GtkWidget *button; + GtkWidget *box1; + GtkWidget *box2; + GtkWidget *separator; + GtkWidget *label; + GtkWidget *quitbox; + int which; + + /* Our init, don't forget this! :) */ + gtk_init (&argc, &argv); + + if (argc != 2) { + fprintf (stderr, "usage: packbox num, where num is 1, 2, or 3.\n"); + /* this just does cleanup in GTK, and exits with an exit status of 1. */ + gtk_exit (1); + } + + which = atoi (argv[1]); + + /* Create our window */ + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + + /* You should always remember to connect the destroy signal to the + * main window. This is very important for proper intuitive + * behavior */ + gtk_signal_connect (GTK_OBJECT (window), "delete_event", + GTK_SIGNAL_FUNC (delete_event), NULL); + gtk_container_border_width (GTK_CONTAINER (window), 10); + + /* We create a vertical box (vbox) to pack the horizontal boxes into. + * This allows us to stack the horizontal boxes filled with buttons one + * on top of the other in this vbox. */ + box1 = gtk_vbox_new (FALSE, 0); + + /* which example to show. These correspond to the pictures above. */ + switch (which) { + case 1: + /* create a new label. */ + label = gtk_label_new ("gtk_hbox_new (FALSE, 0);"); + + /* Align the label to the left side. We'll discuss this function and + * others in the section on Widget Attributes. */ + gtk_misc_set_alignment (GTK_MISC (label), 0, 0); + + /* Pack the label into the vertical box (vbox box1). Remember that + * widgets added to a vbox will be packed one on top of the other in + * order. */ + gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0); + + /* show the label */ + gtk_widget_show (label); + + /* call our make box function - homogeneous = FALSE, spacing = 0, + * expand = FALSE, fill = FALSE, padding = 0 */ + box2 = make_box (FALSE, 0, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0); + gtk_widget_show (box2); + + /* call our make box function - homogeneous = FALSE, spacing = 0, + * expand = FALSE, fill = FALSE, padding = 0 */ + box2 = make_box (FALSE, 0, TRUE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0); + gtk_widget_show (box2); + + /* Args are: homogeneous, spacing, expand, fill, padding */ + box2 = make_box (FALSE, 0, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0); + gtk_widget_show (box2); + + /* creates a separator, we'll learn more about these later, + * but they are quite simple. */ + separator = gtk_hseparator_new (); + + /* pack the separator into the vbox. Remember each of these + * widgets are being packed into a vbox, so they'll be stacked + * vertically. */ + gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5); + gtk_widget_show (separator); + + /* create another new label, and show it. */ + label = gtk_label_new ("gtk_hbox_new (TRUE, 0);"); + gtk_misc_set_alignment (GTK_MISC (label), 0, 0); + gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0); + gtk_widget_show (label); + + /* Args are: homogeneous, spacing, expand, fill, padding */ + box2 = make_box (TRUE, 0, TRUE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0); + gtk_widget_show (box2); + + /* Args are: homogeneous, spacing, expand, fill, padding */ + box2 = make_box (TRUE, 0, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0); + gtk_widget_show (box2); + + /* another new separator. */ + separator = gtk_hseparator_new (); + /* The last 3 arguments to gtk_box_pack_start are: expand, fill, padding. */ + gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5); + gtk_widget_show (separator); + + break; + + case 2: + + /* create a new label, remember box1 is a vbox as created + * near the beginning of main() */ + label = gtk_label_new ("gtk_hbox_new (FALSE, 10);"); + gtk_misc_set_alignment (GTK_MISC (label), 0, 0); + gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0); + gtk_widget_show (label); + + /* Args are: homogeneous, spacing, expand, fill, padding */ + box2 = make_box (FALSE, 10, TRUE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0); + gtk_widget_show (box2); + + /* Args are: homogeneous, spacing, expand, fill, padding */ + box2 = make_box (FALSE, 10, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0); + gtk_widget_show (box2); + + separator = gtk_hseparator_new (); + /* The last 3 arguments to gtk_box_pack_start are: expand, fill, padding. */ + gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5); + gtk_widget_show (separator); + + label = gtk_label_new ("gtk_hbox_new (FALSE, 0);"); + gtk_misc_set_alignment (GTK_MISC (label), 0, 0); + gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0); + gtk_widget_show (label); + + /* Args are: homogeneous, spacing, expand, fill, padding */ + box2 = make_box (FALSE, 0, TRUE, FALSE, 10); + gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0); + gtk_widget_show (box2); + + /* Args are: homogeneous, spacing, expand, fill, padding */ + box2 = make_box (FALSE, 0, TRUE, TRUE, 10); + gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0); + gtk_widget_show (box2); + + separator = gtk_hseparator_new (); + /* The last 3 arguments to gtk_box_pack_start are: expand, fill, padding. */ + gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5); + gtk_widget_show (separator); + break; + + case 3: + + /* This demonstrates the ability to use gtk_box_pack_end() to + * right justify widgets. First, we create a new box as before. */ + box2 = make_box (FALSE, 0, FALSE, FALSE, 0); + /* create the label that will be put at the end. */ + label = gtk_label_new ("end"); + /* pack it using gtk_box_pack_end(), so it is put on the right side + * of the hbox created in the make_box() call. */ + gtk_box_pack_end (GTK_BOX (box2), label, FALSE, FALSE, 0); + /* show the label. */ + gtk_widget_show (label); + + /* pack box2 into box1 (the vbox remember ? :) */ + gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0); + gtk_widget_show (box2); + + /* a separator for the bottom. */ + separator = gtk_hseparator_new (); + /* this explicitly sets the separator to 400 pixels wide by 5 pixels + * high. This is so the hbox we created will also be 400 pixels wide, + * and the "end" label will be separated from the other labels in the + * hbox. Otherwise, all the widgets in the hbox would be packed as + * close together as possible. */ + gtk_widget_set_usize (separator, 400, 5); + /* pack the separator into the vbox (box1) created near the start + * of main() */ + gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5); + gtk_widget_show (separator); + } + + /* Create another new hbox.. remember we can use as many as we need! */ + quitbox = gtk_hbox_new (FALSE, 0); + + /* Our quit button. */ + button = gtk_button_new_with_label ("Quit"); + + /* setup the signal to destroy the window. Remember that this will send + * the "destroy" signal to the window which will be caught by our signal + * handler as defined above. */ + gtk_signal_connect_object (GTK_OBJECT (button), "clicked", + GTK_SIGNAL_FUNC (gtk_main_quit), + GTK_OBJECT (window)); + /* pack the button into the quitbox. + * The last 3 arguments to gtk_box_pack_start are: expand, fill, padding. */ + gtk_box_pack_start (GTK_BOX (quitbox), button, TRUE, FALSE, 0); + /* pack the quitbox into the vbox (box1) */ + gtk_box_pack_start (GTK_BOX (box1), quitbox, FALSE, FALSE, 0); + + /* pack the vbox (box1) which now contains all our widgets, into the + * main window. */ + gtk_container_add (GTK_CONTAINER (window), box1); + + /* and show everything left */ + gtk_widget_show (button); + gtk_widget_show (quitbox); + + gtk_widget_show (box1); + /* Showing the window last so everything pops up at once. */ + gtk_widget_show (window); + + /* And of course, our main function. */ + gtk_main (); + + /* control returns here when gtk_main_quit() is called, but not when + * gtk_exit is used. */ + + return 0; +} |