#!/usr/bin/perl -w use Gtk; use strict; set_locale Gtk; init Gtk; unless ( $ARGV[0] ) { print( "usage: packbox num, where num is 1, 2, or 3.\n" ); Gtk->exit( 1 ); exit( 1 ); } my $false = 0; my $true = 1; my $which = $ARGV[0]; my $window; my $box1; my $box2; my $label; my $separator; my $quitbox; my $button; # You should always remember to connect the delete_event signal # to the main window. This is very important for proper intuitive # behavior $window = new Gtk::Window( "toplevel" ); $window->signal_connect( "delete_event", sub { Gtk->exit( 0 ); } ); $window->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 = new Gtk::VBox( $false, 0 ); # which example to show. These correspond to the pictures above. if ( $which == 1 ) { # create a new label. $label = new Gtk::Label( 'new Gtk::HBox( $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 ); # 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 = new Gtk::HSeparator(); # 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 = new Gtk::Label( 'new Gtk::HBox( $true, 0 );' ); $label->set_alignment( 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 = new Gtk::HSeparator(); # The last 3 arguments to gtk_box_pack_start are: # expand, fill, padding. $box1->pack_start( $separator, $false, $true, 5 ); $separator->show(); } elsif ( $which == 2 ) { # Create a new label, remember box1 is a vbox as created near # the beginning of main() $label = new Gtk::Label( 'new Gtk::HBox( $false, 10 );' ); $label->set_alignment( 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 = new Gtk::HSeparator(); # The last 3 arguments to gtk_box_pack_start are: expand, fill, # and padding. $box1->pack_start( $separator, $false, $true, 5 ); $separator->show(); $label = new Gtk::Label( 'new Gtk::HBox( $false, 0 );' ); $label->set_alignment( 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 = new Gtk::HSeparator(); # The last 3 arguments to pack_start are: expand, fill, # and padding. $box1->pack_start( $separator, $false, $true, 5); $separator->show(); } elsif ( $which == 3 ) { # This demonstrates the ability to use 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 = new Gtk::Label( "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. $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 = new Gtk::HSeparator(); # 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_usize( 400, 5 ); # pack the separator into the vbox (box1) created near the start # of main() $box1->pack_start( $separator, $false, $true, 5 ); $separator->show(); } # Create another new hbox.. remember we can use as many as we need! $quitbox = new Gtk::HBox( $false, 0 ); # Our quit button. $button = new Gtk::Button( "Quit" ); # Setup the signal to terminate the program when the button is # clicked $button->signal_connect( "clicked", sub { Gtk->exit( 0 ); } ); # 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. main Gtk; exit( 0 ); ### Subroutines # 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 my $box = new Gtk::HBox( $homogeneous, $spacing ); $button = new Gtk::Button( '$box->' ); $box->pack_start( $button, $expand, $fill, $padding ); $button->show(); # Create a series of buttons with the appropriate settings $button = new Gtk::Button( "pack" ); $box->pack_start( $button, $expand, $fill, $padding ); $button->show(); $button = new Gtk::Button( '( $button,' ); $box->pack_start( $button, $expand, $fill, $padding ); $button->show(); # Create a button with the label depending on the value of # expand. if ( $expand ) { $button = new Gtk::Button( '$true,' ); } else { $button = new Gtk::Button( '$false,' ); } $box->pack_start( $button, $expand, $fill, $padding ); $button->show(); # This is the same as the button creation for "expand" if ( $fill ) { $button = new Gtk::Button( '$true,' ); } else { $button = new Gtk::Button( '$false,' ); } $box->pack_start( $button, $expand, $fill, $padding ); $button->show(); $button = new Gtk::Button( "$padding );" ); $box->pack_start( $button, $expand, $fill, $padding ); $button->show(); return ( $box ); } # END EXAMPLE PROGRAM