#!perl use strict; use Gtk2 -init; my $window = Gtk2::Window->new (); $window->signal_connect (delete_event => sub { Gtk2->main_quit } ); my $vbox = Gtk2::VBox->new; $window->add ($vbox); my $check = Gtk2::CheckButton->new ("paint on configure in idle?"); $check->set_active (0); $vbox->pack_start ($check, 0, 0, 0); my $but = Gtk2::Button->new ("paint red, now"); $but->signal_connect (clicked => sub {set_to_color ([255*257,0,0])}); $vbox->pack_start ($but, 0, 0, 0); my $draw = Gtk2::DrawingArea->new (); $draw->set_size_request (200, 200); $draw->signal_connect (configure_event => sub { if ($check->get_active ()) { Glib::Idle->add (\&set_to_color, [0, 255*257, 0]); } else { set_to_color ([0, 255*257, 0]); } }); $vbox->pack_start ($draw, 1, 1, 0); $window->show_all; Gtk2->main; sub set_to_color { (my ($r, $g, $b)) = @{$_[0]}; my $cr = Gtk2::Gdk::Cairo::Context->create ($draw->window); $cr->set_source_color (Gtk2::Gdk::Color->new ($r, $g, $b)); $cr->rectangle (0, 0, $draw->allocation->width, $draw->allocation->height); $cr->fill (); $cr = undef; return 0; }