# Copyright (C) 2008, The Perl Foundation.
# $Id: /mirror/trunk/examples/nci/xlibtest.nqp 30963 2008-09-09T16:43:38.382745Z moritz  $

=head1 TITLE

xlibtest.pl - A test of Xlib.pir usage from nqp

=head1 SYNOPSYS

This is an initial version, be careful and not expect too much.

Compile Xlib.pir to Xlib.pbc before usage:

    ../../parrot -o Xlib.pbc Xlib.pir

To run this file, execute the following command from the
current directory:

    ../../parrot ../../compilers/nqp/nqp.pbc xlibtest.nqp

Press any key to exit.

=cut

PIR q< load_bytecode 'Xlib.pbc' >;

my $a := Xlib::DisplayName();
say("Display: ", Xlib::DisplayName());

my $display := Xlib::OpenDisplay('');

say("Default screen: ", $display.DefaultScreen());

$display.hello();

my $white := $display.WhitePixel(0);
my $root := $display.RootWindow();
my $window := $display.CreateSimpleWindow($root, 0, 0, 600, 400, 0, 0, $white);
$window.StoreName("Hello, nqp");
$window.SelectInput(163919);
$window.Map();

my $event := Xlib::newEvent();

my $type := 0;

my $x := 0;
my $y := 0;
my $lastx := 0;
my $lasty := 0;
my $pressed := 0;

my @points;
my @lines;

while ($type != 17) {
    $display.NextEvent($event);
    $type := $event.type();
    if ($type == 4) {
        $x := $event.x();
        $y := $event.y();
        $window.DrawPoint($x, $y);
        @points.push($x);
        @points.push($y);
    $lastx := $x;
    $lasty := $y;
    $pressed := 1;
    }
    if ($type == 5) {
        $pressed := 0;
    }
    elsif ($type == 6 && $pressed) {
        $x := $event.x();
        $y := $event.y();
        $window.DrawLine($lastx, $lasty, $x, $y);
        @lines.push($lastx);
        @lines.push($lasty);
        @lines.push($x);
        @lines.push($y);
        $lastx := $x;
        $lasty := $y;
    }
    elsif ($type == 2) {
        $window.Unmap();
        $window.Destroy();
    }
    elsif ($type == 33) {
        $window.Unmap();
        $window.Destroy();
    }
    elsif $type == 12 {
        say("Redrawing...");
        my $i := 0;
        while ($i < @points) {
            $window.DrawPoint(@points[$i], @points[$i+1]);
            $i :=  $i + 2;
        }
        $i := 0;
        while ($i < @lines) {
            $window.DrawLine(@lines[$i], @lines[$i+1],
                             @lines[$i+2], @lines[$i+3]);
            $i := $i + 4;
        }
    }
}

$display.Close();

say("Bye");


# vim: expandtab shiftwidth=4 ft=perl6:
