The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use IUP ':all';
use OpenGL ':all';

my $cnv = IUP::GL::CanvasBox->new(BUFFER => "DOUBLE",
                                  RASTERSIZE => "500x300",
                                  ACTION => sub {
                                    my ($self, $x, $y) = @_;
                                    #warn "ACTION: x=$x y=$y\n";
                                    $self->GLMakeCurrent();
                                    glClearColor(1.0, 1.0, 1.0, 1.0);
                                    glClear(GL_COLOR_BUFFER_BIT);
                                    glBegin(GL_LINES);
                                      glColor3f(1.0, 0.0, 0.0);
                                      glVertex2f(0.0, 0.0);
                                      glVertex2f(10.0, 10.0);
                                    glEnd();
                                    $self->GLSwapBuffers();
                                    return IUP_DEFAULT;
                                  },
                                  K_ANY => sub {
                                    my ($self, $c) = @_;
                                    #warn sprintf("K_ANY: c=%x\n", $c);
                                    if ($c == K_q || $c == K_ESC) {
                                      return IUP_CLOSE;
                                    }
                                    else {
                                      return IUP_DEFAULT;
                                    }
                                  },
                                  RESIZE_CB => sub {
                                    my ($self, $width, $height) = @_;
                                    #warn "RESIZE_CB: width=$width height=$height\n";
                                    $self->GLMakeCurrent();
                                    glViewport(0, 0, $width, $height); 
                                    glMatrixMode(GL_PROJECTION);
                                    glLoadIdentity();
                                    glMatrixMode(GL_MODELVIEW);
                                    glLoadIdentity();
                                    return IUP_DEFAULT;
                                  },
);

my $img_release = IUP::Image->new( pixels=>
     [[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
      [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2],
      [1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2],
      [1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2],
      [1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2],
      [1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2],
      [1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2],
      [1,1,3,3,3,3,3,3,4,4,3,3,3,3,2,2],
      [1,1,3,3,3,3,3,4,4,4,4,3,3,3,2,2],
      [1,1,3,3,3,3,3,4,4,4,4,3,3,3,2,2],
      [1,1,3,3,3,3,3,3,4,4,3,3,3,3,2,2],
      [1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2],
      [1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2],
      [1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2],
      [1,1,3,3,3,3,3,3,3,3,3,3,3,3,2,2],
      [1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],
      [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]],
      colors => [ "215 215 215", "40 40 40", "30 50 210", "240 0 0" ],
);

my $glabel   = IUP::GL::Label->new(TITLE => "Label", FONT => "Arial, 18", IMAGE => $img_release);
my $gbutton1 = IUP::GL::Button->new(TITLE => "Button", IMAGE => $img_release,  TIP => "Button Tip", PADDING => "5x5");
my $gtoggle  = IUP::GL::Toggle->new(TITLE => "Toggle", PADDING => "5x5");
my $gtoggle1 = IUP::GL::Toggle->new(PADDING => "5x5", IMAGE => $img_release);
my $gsep1    = IUP::GL::Separator->new();
my $glink    = IUP::GL::Link->new(URL => "http://www.tecgraf.puc-rio.br/iup", TITLE => "IUP Toolkit");
my $pbar1    = IUP::GL::ProgressBar->new(VALUE => "0.3", SHOW_TEXT => "Yes");
my $gval1    = IUP::GL::Val->new(VALUE => "0.3", TIP => "Val Tip");

my $hbox     = IUP::Hbox->new(child=>[$glabel, $gsep1, $gbutton1, $gtoggle, $glink, $pbar1, $gval1],
                              ALIGNMENT => "ACENTER", MARGIN => "5x5", GAP => "5");

my $gframe   = IUP::GL::Frame->new(child=>$hbox, TITLE => "frame",
                                   HORIZONTALALIGN => "ACENTER", VERTICALALIGN => "ATOP");

$cnv->Append($gframe);

my $dlg = IUP::Dialog->new(child=>$cnv, TITLE=>"IUP::GL::CanvasBox Example");

# Shows dialog in the center of the screen
$dlg->ShowXY(IUP_CENTER, IUP_CENTER);
$cnv->RASTERSIZE(undef); # reset minimum limitation
IUP->MainLoop;