#!/usr/bin/perl use warnings; use strict; use Glib qw/TRUE FALSE/; use Gtk2 -init; use Goo::Canvas; use Math::Trig qw( atan pi rad2deg ); # to get mouse pointer at anywhere on screen my $s = Gtk2::Gdk::Screen->get_default; my $w = $s->get_root_window; my $last_heading = -90; # account for default starting position my $window = Gtk2::Window->new('toplevel'); $window->signal_connect('delete_event' => sub { Gtk2->main_quit; }); $window->set_size_request(200, 200); my $canvas = Goo::Canvas->new(); $canvas->set_size_request(200, 200); my $white = Gtk2::Gdk::Color->new (0xFFFF,0xFFFF,0xFFFF); $canvas->modify_base('normal',$white ); $window->add($canvas); my $root = $canvas->get_root_item(); my ($midx1, $midy1) = (60,100); my ($midx2, $midy2) = (140,100); my $e0 = Goo::Canvas::Ellipse->new( $root, $midx1, $midy1, 35, 50, # centerx, centery, width, height 'stroke-color' => 'black', 'line-width' => 4 ); my $e1 = Goo::Canvas::Ellipse->new( $root, $midx1, $midy1 - 15, 5, 10, # centerx, centery, width, height 'stroke-color' => 'blue', 'line-width' => 16 ); my $e2 = Goo::Canvas::Ellipse->new( $root, $midx2, $midy2, 35, 50, 'stroke-color' => 'black', 'line-width' => 4 ); my $e3 = Goo::Canvas::Ellipse->new( $root, $midx2, $midy2 - 15, 5, 10, # centerx, centery, width, height 'stroke-color' => 'blue', 'line-width' => 16 ); my $id = Glib::Timeout->add (100, \&track ); $window->show_all(); Gtk2->main; sub track { #$window->get_origin gives a position in root window coordinates, once #you get $widget->window. # account for window being moved my ($xpos, $ypos) = $window->window->get_origin(); my ($xcent, $ycent) = ($xpos + 100, $ypos + 100); #print "$xpos $ypos $xcent $ycent \n"; # get mouse position my (undef, $x, $y, $mask) = $w->get_pointer; #print " $mask $x $y\n"; # compute angle from window center to mouse my $angle = eval{ atan( ( $ycent - $y ) / ( $xcent - $x ) ) } ; $angle += pi if ( $xcent - $x ) >= 0; my $heading = rad2deg($angle); if ( $heading < 0 ) { $heading += 360 } my $delta = $heading - $last_heading; #print "$heading\n"; #print "$delta\n"; $e1->rotate ($delta , $midx1, $midy1); $e3->rotate ($delta , $midx2, $midy2); $last_heading = $heading; return 1; # keep this timer going }