#!/usr/bin/perl use Data::Dumper; use Gtk; init Gtk; $::isEmbedded = ($::XID, $::CCPID) = "@ARGV" =~ /--embedded (\w+) (\w+)/; my $pi=3.141592653589; my $pixmap; my $radius; my $window = $::isEmbedded ? new Gtk::Plug ($::XID) : new Gtk::Window -toplevel; my $vbox = new Gtk::VBox(0,0); $window->add($vbox); $window->signal_connect ( delete_event => \&quit_global ); my $drawing_area = new Gtk::DrawingArea; $drawing_area->size(200,200); $vbox->pack_start($drawing_area, 1, 1, 0); $drawing_area->signal_connect ( expose_event => \&expose_event ); $drawing_area->signal_connect ( configure_event => \&configure_event ); $window->show_all; Gtk->timeout_add(120, [\&Repaint, $drawing_area]); Gtk->main; sub quit_global { $::isEmbedded ? kill(USR1, $::CCPID) : Gtk->exit(0); } sub expose_event { my ($widget) = @_; $widget->window->draw_pixmap ( $widget->style->fg_gc('normal'), $pixmap, 0, 0, 0, 0, $widget->allocation->[2], $widget->allocation->[3]); } sub configure_event { my ($widget) = @_; $pixmap = new Gtk::Gdk::Pixmap ($widget->window, $widget->allocation->[2], $widget->allocation->[3], -1); } sub Repaint { my ($drawing_area) = @_; my $update_rect = Gtk::Gdk::Rectangle; $pixmap->draw_rectangle($drawing_area->style->white_gc, 1, 0, 0, $drawing_area->allocation->[2], $drawing_area->allocation->[3]); my $midx = $drawing_area->allocation->[2] / 2; my $midy = $drawing_area->allocation->[3] / 2; $radius = $midx < $midy ? $midx : $midy; my $nHour; my $gray_gc = $drawing_area->style->bg_gc('normal'); my $black_gc = $drawing_area->style->black_gc; foreach $i ([\&DrawTickAt, 12], [\&DrawPointAt, 60]) { $i->[0]($pixmap, $black_gc, $gray_gc, $_, $midx, $midy) foreach (1..$i->[1]) } my $now = time; ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);# now_tm = localtime (&now); my $dRadians; foreach ([$gray_gc, 5], [$black_gc, 0]) { $dRadians = ($hour % 12) * $pi / 6.0 + ($pi * $min / 360.0); DrawHour ($pixmap, $_->[0], $midx, $midy, $dRadians, $_->[1]); $dRadians = ($min * $pi / 30.0) + ($pi * $sec / 1800.0); DrawMin ($pixmap, $_->[0], $midx, $midy, $dRadians, $_->[1]); $dRadians = $sec * $pi / 30.0; DrawSec ($pixmap, $_->[0], $midx, $midy, $dRadians, $_->[1]); } $update_rect->[0] = $update_rect->[1] = 0; $update_rect->[$_] = $drawing_area->allocation->[$_] foreach (2,3); $drawing_area->draw($update_rect); 1; } sub DrawSec { my ($pixmap, $gc, $midx, $midy, $dRadians, $dec) = @_; $pixmap->draw_line ($gc, $midx+$dec, $midy+$_->[1], $midx+$dec + (0.80 * $radius * sin ($dRadians)), $midy+$dec - (0.80 * $radius * cos ($dRadians))) } sub DrawMin { my ($pixmap, $gc, $midx, $midy, $dRadians, $dec) = @_; $pixmap->draw_polygon ($gc, 1, $midx+$dec - 0.03 * $radius * sin ($dRadians), $midy+$dec + 0.03 * $radius * cos ($dRadians), $midx+$dec - 0.03 * $radius * sin ($dRadians+$pi/2), $midy+$dec + 0.03 * $radius * cos ($dRadians+$pi/2), $midx+$dec + 0.80 * $radius * sin ($dRadians), $midy+$dec - 0.80 * $radius * cos ($dRadians), $midx+$dec + 0.03 * $radius * sin ($dRadians+$pi/2), $midy+$dec - 0.03 * $radius * cos ($dRadians+$pi/2)); } sub DrawHour { my ($pixmap, $gc, $midx, $midy, $dRadians, $dec) = @_; $pixmap->draw_polygon ($gc, 1, $midx+$dec - 0.05 * $radius * sin ($dRadians), $midy+$dec + 0.05 * $radius * cos ($dRadians), $midx+$dec - 0.05 * $radius * sin ($dRadians+$pi/2), $midy+$dec + 0.05 * $radius * cos ($dRadians+$pi/2), $midx+$dec + 0.70 * $radius * sin ($dRadians), $midy+$dec - 0.70 * $radius * cos ($dRadians), $midx+$dec + 0.05 * $radius * sin ($dRadians+$pi/2), $midy+$dec - 0.05 * $radius * cos ($dRadians+$pi/2)); } sub DrawTickAt { my ($pixmap, $black_gc, $gray_gc, $nHour, $cx, $cy) = @_; my $dRadians = $nHour * $pi / 6.0; $pixmap->draw_line ($_->[0], $cx+$_->[1] + 0.90 * $radius * sin ($dRadians), $cy+$_->[1] - 0.90 * $radius * cos ($dRadians), $cx+$_->[1] + 1.0 * $radius * sin ($dRadians), $cy+$_->[1] - 1.0 * $radius * cos ($dRadians)) foreach ([$gray_gc, 5], [$black_gc, 0]); } sub DrawPointAt { my ($pixmap, $black_gc, $gray_gc, $nHour, $cx, $cy) = @_; my $dRadians = $nHour * $pi / 30.0; $pixmap->draw_point ($black_gc, $cx + 0.95 * $radius * sin ($dRadians), $cy - 0.95 * $radius * cos ($dRadians)) }