The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# IUP::Canvas (with scrollbar) example
#
# Virtual space size: 600x400
# The canvas will be a window into that space.
# If canvas is smaller than the virtual space, scrollbars are active.
#  
# The drawing is a red cross from the corners of the virtual space.
# But CD must draw in the canvas space. So the position of the scrollbar
# will define the convertion between canvas space and virtual space.
#

use strict;
use warnings;

use IUP ':all';

sub action_cb {
  my ($self, $posx, $posy) = @_;

  # update CD canvas size
  $self->cdActivate();

  # invert scroll reference (YMAX-DY - POSY)
  $posy = 399 - $self->DY - $posy;
  
  $self->cdClear();
  $self->cdForeground(CD_RED);
  $self->cdLine(0-$posx, 0-$posy, 599-$posx, 399-$posy);
  $self->cdLine(0-$posx, 399-$posy, 599-$posx, 0-$posy);

  return IUP_DEFAULT;
}

sub scroll_cb {
  my ($self, $op, $posx, $posy) = @_;
  action_cb($self, $posx, $posy);
  return IUP_DEFAULT;
}

sub resize_cb {
  my ($self, $w, $h) = @_;

  # update page size, it is always the client size of the canvas
  $self->SetAttribute( DX=>$w, DY=>$h );

  # update CD canvas size
  $self->cdActivate();

  return IUP_DEFAULT;
}

my $canvas = IUP::Canvas->new(
               RASTERSIZE=>"300x200",
               SCROLLBAR=>"YES",
               XMAX=>"599",
               YMAX=>"399",
               SCROLL_CB=>\&scroll_cb,
               RESIZE_CB=>\&resize_cb,
               ACTION=>\&action_cb );
                   
my $dialog = IUP::Dialog->new( child=>$canvas, TITLE=>"Scrollbar Test" );

$dialog->ShowXY(IUP_CENTER, IUP_CENTER);

# release the minimum limitation - must go after ShowXY or Map
$canvas->RASTERSIZE(undef);

IUP->MainLoop();