Object +-- Widget +-- Container +-- Bin +-- EventBox
Certains widgets GTK n'ont pas de fenêtre X associée donc ils dessinent juste sur leurs parents. En raison de cela, ils ne peuvent recevoir d'évènements et s'ils sont incorrectement dimensionnés, ils ne se retaillent pas de sorte que vous pouvez rencontrer des recouvrements désastreux, etc... Si vous voulez tirer plus de ces widgets, la boîte à évènements est faîte pour vous.
Au premier regard, le widget Boîte à évènements peut apparaître totalement inutile. Il ne dessine rien à l'écran et ne répond à aucun évènement. En revanche, il sert une fonction - il fournit une fenêtre X pour ses widgets enfants. C'est important en raison du nombre de widgets qui n'ont pas de fenêtre X associée. Ne pas avoir de fenêtre X sauve de la mémoire et améliore les performances, mais il y a tout de même quelques bémols. Un widget sans fenêtre ne peut pas recevoir d'évènements, et ne peut pas retailler ses contenus. Bien que le nom boîte à évènements insiste sur le côté manipulation des évènements, on peut également l'utiliser pour retailler ( et plus, voir l'exemple ci-dessous ).
Pour créer une nouvelle boîte à évènements :
new Gtk::EventBox();
Un enfant peut être ajouté à cette boîte à évènements grâce à :
$event_box->add($child_widget);
L'exemple suivant illustre les deux usages d'une boîte à évènements - un label est créé et est retaillé pour entrer dans une petite boîte, et on déclare qu'un clic de souris sur le label sort du programme. Redimensionner la fenêtre révèle les quantités variables du label.
#!/usr/bin/perl -wuse Gtk;
use strict;
init Gtk;
my $false = 0;
my $true = 1;
my $window;
my $event_box;
my $label;
$window = new Gtk::Window( "toplevel" );
$window->set_title( "Event Box" );
$window->signal_connect( "destroy", sub { Gtk->exit( 0 ); } );
$window->border_width( 10 );
# Crée une boîte à évènements et l'ajoute à notre fenêtre Top Level
$event_box = new Gtk::EventBox();
$window->add( $event_box );
$event_box->show();
# Crée un long label
$label = new Gtk::Label( "Click here to quit, quit, quit, quit, quit" );
$event_box->add( $label );
$label->show();
# Le raccourcit
$label->set_usize( 110, 20 );
# On le relie à une action
$event_box->set_events( 'button_press_mask' );
$event_box->signal_connect( "button_press_event", sub { Gtk->exit( 0 ); } );
# Encore une chose supplémentaire pour laquelle vous avez besoin d'une fenêtre
# X window
$event_box->realize();
# 58 est le nombre pour 'hand1' ce qui ne marche pas pour plusieurs raisons
$event_box->window->set_cursor( new Gtk::Gdk::Cursor( 58 ) );
$window->show();
main Gtk;
exit( 0 );