package PDL::Graphics::TriD::GL::GLX; use strict; use warnings; use OpenGL qw/ :glxconstants /; our @ISA = qw(PDL::Graphics::TriD::GL); sub new { my ($class,$options,$window_obj) = @_; my @db = OpenGL::GLX_DOUBLEBUFFER; if ($PDL::Graphics::TriD::offline) {$options->{x} = -1; @db=()} $options->{attributes} = [GLX_RGBA, @db, GLX_RED_SIZE,1, GLX_GREEN_SIZE,1, GLX_BLUE_SIZE,1, GLX_DEPTH_SIZE,1, # Alpha size? ] unless defined $options->{attributes}; $options->{mask} = (KeyPressMask | ButtonPressMask | ButtonMotionMask | ButtonReleaseMask | ExposureMask | StructureNotifyMask | PointerMotionMask) unless defined $options->{mask}; my $self = $class->SUPER::new($options,$window_obj); print STDERR "Creating X11 OO window\n" if $PDL::Graphics::TriD::verbose; my $p = $self->{Options}; my $win = OpenGL::glpcOpenWindow( $p->{x},$p->{y},$p->{width},$p->{height}, $p->{parent},$p->{mask}, $p->{steal}, @{$p->{attributes}}); @$self{keys %$win} = values %$win; $self; } sub event_pending { my ($self) = @_; OpenGL::XPending($self->{Display}); } my %ev2str = ( VisibilityNotify() => 'visible', Expose() => 'visible', ConfigureNotify() => 'reshape', DestroyNotify() => 'destroy', KeyPress() => 'keypress', MotionNotify() => 'motion', ButtonPress() => 'buttonpress', ButtonRelease() => 'buttonrelease', ); sub next_event { my ($self) = @_; my @e = OpenGL::glpXNextEvent($self->{Display}); if ($e[0] == MotionNotify) { my $but = -1; SWITCH: { $but = 0, last SWITCH if $e[1] & Button1Mask; $but = 1, last SWITCH if $e[1] & Button2Mask; $but = 2, last SWITCH if $e[1] & Button3Mask; $but = 3, last SWITCH if $e[1] & Button4Mask; print "No button pressed...\n" if $PDL::Graphics::TriD::verbose; } $e[1] = $but; } $e[0] = $ev2str{$e[0]}; @e; } sub swap_buffers { my ($this) = @_; OpenGL::glXSwapBuffers($this->{Window},$this->{Display}); # Notice win and display reversed [sic] } 1;