use Glib qw/TRUE FALSE/;
use Gtk2 '-init';
sub delete_event
{
Gtk2->main_quit;
return FALSE;
}
# 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.
sub make_box
{
my ($homogeneous, $spacing, $expand, $fill, $padding) = @_;
# Create a new hbox with the appropriate homogeneous
# and spacing settings
$box = Gtk2::HBox->new($homogenous, $spacing);
# Create a series of buttons with the appropriate settings
$button = Gtk2::Button->new("Gtk2::HBox::pack");
$box->pack_start($button, $expand, $fill, $padding);
$button->show;
$button = Gtk2::Button->new("(box,");
$box->pack_start($button, $expand, $fill, $padding);
$button->show;
$button = Gtk2::Button->new("button,");
$box->pack_start($button, $expand, $fill, $padding);
$button->show;
# Create a button with the label depending on the value of $expand.
if ($expand == TRUE)
{
$button = Gtk2::Button->new("TRUE,");
}
else
{
$button = Gtk2::Button->new("FALSE,");
}
$box->pack_start($button, $expand, $fill, $padding);
$button->show;
# This is the same as the button creation for "expand"
# above, but uses the shorthand form.
$button = Gtk2::Button->new($fill ? "TRUE," : "FALSE,");
$box->pack_start($button, $expand, $fill, $padding);
$button->show;
$button = Gtk2::Button->new("$padding");
$box->pack_start($button, $expand, $fill, $padding);
$button->show;
return $box;
}
die "usage: packbox.pl num, where num is 1, 2, or 3.\n"
unless defined $ARGV[0];
# Create our window
$window = Gtk2::Window->new('toplevel');
# You should always remember to connect the delete_event signal
# to the main window. This is very important for proper intuitive
# behavior
$window->signal_connect(delete_event => \&delete_event);
$window->set_border_width(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 = Gtk2::VBox->new(FALSE, 0);
$which = $ARGV[0];
# which example to show. These correspond to the pictures above.
if (1 == $which)
{
# create a new label.
$label = Gtk2::Label->new("Gtk2::HBox->new (FALSE, 0);");
# Align the label to the left side. We'll discuss this function and
# others in the section on Widget Attributes.
$label->set_alignment(0.0, 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.
$box1->pack_start($label, FALSE, FALSE, 0);
# Show the label
$label->show;
# Call our make box function - homogeneous = FALSE, spacing = 0,
# expand = FALSE, fill = FALSE, padding = 0
$box2 = make_box(FALSE, 0, FALSE, FALSE, 0);
$box1->pack_start($box2, FALSE, FALSE, 0);
$box2->show;
# Call our make box function - homogeneous = FALSE, spacing = 0,
# expand = TRUE, fill = FALSE, padding = 0
$box2 = make_box(FALSE, 0, TRUE, FALSE, 0);
$box1->pack_start($box2, FALSE, FALSE, 0);
$box2->show;
# Args are: homogeneous, spacing, expand, fill, padding
$box2 = make_box(FALSE, 0, TRUE, TRUE, 0);
$box1->pack_start($box2, FALSE, FALSE, 0);
$box2->show;
# Creates a separator, we'll learn more about these later,
# but they are quite simple.
$separator = Gtk2::HSeparator->new;
# Pack the separator into the vbox. Remember each of these
# widgets is being packed into a vbox, so they'll be stacked
# vertically.
$box1->pack_start($separator, FALSE, TRUE, 5);
$separator->show;
# Create another new label, and show it.
$label = Gtk2::Label->new("Gtk2::HBox->new (TRUE, 0);");
$label->set_alignment(0.0, 0.0);
$box1->pack_start($label, FALSE, FALSE, 0);
$label->show;
# Args are: homogeneous, spacing, expand, fill, padding
$box2 = make_box(TRUE, 0, TRUE, FALSE, 0);
$box1->pack_start($box2, FALSE, FALSE, 0);
$box2->show;
# Args are: homogeneous, spacing, expand, fill, padding
$box2 = make_box(TRUE, 0, TRUE, TRUE, 0);
$box1->pack_start($box2, FALSE, FALSE, 0);
$box2->show;
# Another new separator.
$separator = Gtk2::HSeparator->new;
# The last 3 arguments to gtk_box_pack_start are:
# expand, fill, padding.
$box1->pack_start($separator, FALSE, TRUE, 5);
$separator->show;
}
elsif (2 == $which)
{
# Create a new label, remember box1 is a vbox as created
# near the beginning
$label = Gtk2::Label->new("Gtk2::HBox->new (FALSE, 10);");
$label->set_alignment(0.0, 0.0);
$box1->pack_start($label, FALSE, FALSE, 0);
$label->show;
# Args are: homogeneous, spacing, expand, fill, padding
$box2 = make_box(FALSE, 10, TRUE, FALSE, 0);
$box1->pack_start($box2, FALSE, FALSE, 0);
$box2->show;
# Args are: homogeneous, spacing, expand, fill, padding
$box2 = make_box(FALSE, 10, TRUE, TRUE, 0);
$box1->pack_start($box2, FALSE, FALSE, 0);
$box2->show;
$separator = Gtk2::HSeparator->new;
# The last 3 arguments to gtk_box_pack_start are:
# expand, fill, padding.
$box1->pack_start($separator, FALSE, TRUE, 5);
$separator->show;
$label = Gtk2::Label->new("Gtk2::HBox->new (FALSE, 0);");
$label->set_alignment(0.0, 0.0);
$box1->pack_start($label, FALSE, FALSE, 0);
$label->show;
# Args are: homogeneous, spacing, expand, fill, padding
$box2 = make_box(FALSE, 0, TRUE, FALSE, 10);
$box1->pack_start($box2, FALSE, FALSE, 0);
$box2->show;
# Args are: homogeneous, spacing, expand, fill, padding
$box2 = make_box(FALSE, 0, TRUE, TRUE, 10);
$box1->pack_start($box2, FALSE, FALSE, 0);
$box2->show;
$separator = Gtk2::HSeparator->new;
# The last 3 arguments to gtk_box_pack_start are:
# expand, fill, padding.
$box1->pack_start($separator, FALSE, TRUE, 5);
$separator->show;
}
elsif (3 == $which)
{
# 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 = Gtk2::Label->new("end");
# Pack it using Gtk2::Box::pack_end(), so it is put on the right
# side of the hbox created in the make_box() call.
$box2->pack_end($label, FALSE, FALSE, 0);
# Show the label.
$label->show;
# Pack box2 into box1 (the vbox remember ? :)
$box1->pack_start($box2, FALSE, FALSE, 0);
$box2->show;
# A separator for the bottom.
$separator = Gtk2::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.
$separator->set_size_request(400, 5);
# pack the separator into the vbox (box1) created near the start
$box1->pack_start($separator, FALSE, TRUE, 5);
$separator->show;
}
# Create another new hbox.. remember we can use as many as we need!
$quitbox = Gtk2::HBox->new(FALSE, 0);
# Our quit button.
$button = Gtk2::Button->new("Quit");
# Setup the signal to terminate the program when the button is clicked
$button->signal_connect(clicked => sub { Gtk2->main_quit; });
# Pack the button into the quitbox.
# The last 3 arguments to gtk_box_pack_start are:
# expand, fill, padding.
$quitbox->pack_start($button, TRUE, FALSE, 0);
# pack the quitbox into the vbox (box1)
$box1->pack_start($quitbox, FALSE, FALSE, 0);
# Pack the vbox (box1) which now contains all our widgets, into the
# main window.
$window->add($box1);
# And show everything left
$button->show;
$quitbox->show;
$box1->show;
# Showing the window last so everything pops up at once.
$window->show;
# And of course, our main function.
Gtk2->main;
# Control returns here when gtk_main_quit() is called, but not when
# exit() is used.
0;
|