diff options
Diffstat (limited to 'perl-install/standalone/drakclock')
-rwxr-xr-x | perl-install/standalone/drakclock | 408 |
1 files changed, 211 insertions, 197 deletions
diff --git a/perl-install/standalone/drakclock b/perl-install/standalone/drakclock index 0ca3c5b51..359bc1d2b 100755 --- a/perl-install/standalone/drakclock +++ b/perl-install/standalone/drakclock @@ -6,30 +6,29 @@ use POSIX; use common; # i18n : IMPORTANT to get correct namespace (drakconf instead of libDrakX) BEGIN { unshift @::textdomains, 'drakconf' } -use mygtk2 qw(gtknew); -use ugtk2 qw(:all); +use mygtk3 qw(gtknew); +use ugtk3 qw(:all); use interactive; use standalone; use timezone; my $in = interactive->vnew('su'); -my $pixmap; -my $radius; +my $cairo; +my ($midx, $midy, $radius); my ($dRadians_hour, $dRadians_min, $dRadians_sec); my $Radian; my $timer; my $first = 1; my $its_reset = 0; -$ugtk2::wm_icon = "/usr/share/mcc/themes/default/time-mdk.png"; +$ugtk3::wm_icon = "/usr/share/mcc/themes/default/time-mdk.png"; -my $ntpfile = '/etc/ntp.conf'; -my $ntpdlock = '/var/lock/subsys/ntpd'; -my $ntpdsystemdlock = '/sys/fs/cgroup/systemd/system/ntpd.service'; +my $ntpd = $timezone::ntp . 'd'; +my $ntpfile = '/etc/' . $timezone::ntp . '.conf'; -my $my_win = ugtk2->new(N("Date, Clock & Time Zone Settings")); +my $my_win = ugtk3->new(N("Date, Clock & Time Zone Settings")); -$my_win->{window}->signal_connect(delete_event => sub { ugtk2->exit(0) }); +$my_win->{window}->signal_connect(delete_event => sub { ugtk3->exit(0) }); my $calendar = gtknew('Calendar'); $calendar->signal_connect($_ => \&cal_changed) foreach 'month-changed', 'day-selected', 'day-selected-double-click', 'prev-month', 'next-month', 'prev-year', 'next-year'; @@ -42,13 +41,14 @@ my $button_time = gtknew('Button', text => N("Change Time Zone")); my @timezones = eval { timezone::getTimeZones() }; my $err = $@; $button_time->signal_connect(clicked => sub { - local $::isEmbedded = 0; # to prevent sub window embedding - if ($timezone->{timezone} = $in->ask_from_treelist(N("Timezone - DrakClock"), N("Which is your timezone?"), '/', \@timezones, $timezone->{timezone})) { - $timezone->{UTC} = $in->ask_yesorno(N("GMT - DrakClock"), N("Is your hardware clock set to GMT?"), $timezone->{UTC}); - timezone::write($timezone); - } - $label_timezone->set_text($timezone->{timezone}); - }); + local $::isEmbedded = 0; # to prevent sub window embedding + if (my $tz = $in->ask_from_treelist(N("Timezone - DrakClock"), N("Which is your timezone?"), '/', \@timezones, $timezone->{timezone})) { + $timezone->{timezone} = $tz; + $timezone->{UTC} = $in->ask_yesorno(N("GMT - DrakClock"), N("Is your hardware clock set to GMT?"), $timezone->{UTC}); + timezone::write($timezone); + $label_timezone->set_text($timezone->{timezone}); + } + }); if (!@timezones) { warn "Failed to retrieve timezone list: $err\n"; $button_time->set_sensitive(0); @@ -56,125 +56,130 @@ if (!@timezones) { my $drawing_area; -my $adjh = Gtk2::Adjustment->new(0.0, 0.0, 23.0, 1.0, 5.0, 0.0); -my $adjm = Gtk2::Adjustment->new(0.0, 0.0, 59.0, 1.0, 5.0, 0.0); -my $adjs = Gtk2::Adjustment->new(0.0, 0.0, 59.0, 1.0, 5.0, 0.0); +my $adjh = Gtk3::Adjustment->new(0.0, 0.0, 23.0, 1.0, 5.0, 0.0); +my $adjm = Gtk3::Adjustment->new(0.0, 0.0, 59.0, 1.0, 5.0, 0.0); +my $adjs = Gtk3::Adjustment->new(0.0, 0.0, 59.0, 1.0, 5.0, 0.0); my ($button_reset, $check_ntp, $hb_ntp, $combo_ntpserver, $ntp); -my $mode = 0; +my $mode = is_ntp_daemon_running(); my (undef, undef, $h_old, $old_day, $old_month, $old_year) = localtime(time()); my @image_size = (200, 200); -$my_win->{window}->add(gtknew('VBox', border_width => $::isEmbedded ? 0 : 5, children => [ - 1, gtknew('HBox', children => [ - 1, gtknew('VBox', children => [ - 0, $calendar, - 1, gtknew('Frame', text => N("Network Time Protocol"), shadow_type => 'etched_in', child => - gtknew('VBox', border_width => 5, children => [ - 0, gtknew('Label', text => N("Your computer can synchronize its clock\n with a remote time server using NTP")), - 0, gtksignal_connect(gtkset_active($check_ntp = gtknew('CheckButton', text => N("Enable Network Time Protocol")), $mode), clicked => sub { - $mode = !$mode; - $hb_ntp->set_sensitive($mode); - if ($mode == 1 && !$in->do_pkgs->is_installed('ntp')) { - install_ntp(); - } - }), - 0, $hb_ntp = gtknew('HBox', border_width => 5, children => [ - 0, gtknew('Label', text => N("Server:")), - 1, $combo_ntpserver = Gtk2::Combo->new - ]) - ])) - ]), - 0, gtknew('VBox', children => [ - 0, gtknew('HBox', children => [ - 0, $drawing_area = gtkset_size_request(Gtk2::DrawingArea->new, @image_size), - ]), - 0, my $time_box = gtknew('HBox', homogenous => 1, children => [ - 0, my $spinner_h = Gtk2::SpinButton->new($adjh, 0, 0), - 0, my $spinner_m = Gtk2::SpinButton->new($adjm, 0, 0), - 0, my $spinner_s = Gtk2::SpinButton->new($adjs, 0, 0), - ]), - 1, gtknew('Frame', text => N("Timezone"), shadow_type => 'etched_in', child => - gtknew('VBox', border_width => 5, children_tight => [ - $label_timezone, - $button_time ])), - ]), - ]), - 0, create_okcancel(my $w = - { - cancel_clicked => sub { ugtk2->exit(0) }, - ok_clicked => sub { - my $need_date = 1; - any::disable_x_screensaver(); - if ($check_ntp->get_active) { - my $choosed_serv = $combo_ntpserver->entry->get_text; - $choosed_serv =~ s/^[^:]+: (.+)/$1/; - if (!$choosed_serv) { - err_dialog(N("Error"), N("Please enter a valid NTP server address.")); - return; - } - timezone::set_ntp_server($choosed_serv); - system(qw(/sbin/chkconfig --level 35 ntpd on)); - # FIXME: Change to use systemctl when will not support old iniscript anymore - system(qw(service ntpd stop)); - #verify that we have a valid hostname (thx sam) - $choosed_serv =~ s/[^-a-zA-Z0-9.]//g; - if (!system("/usr/sbin/ntpdate", $choosed_serv)) { - update_time(); #- get the new time before updating the hwclock - # FIXME: Change to use systemctl when will not support old iniscript anymore - system(qw(service ntpd start)); - $need_date = 0; - } else { - $in->ask_from_no_check({ - title => N("Error"), - messages => N("Could not synchronize with %s.", $choosed_serv), - ok => N("Quit"), - cancel => N("Retry"), - }, []) or return; - } - } else { - if (-e $ntpdlock) { - system(qw(service ntpd stop)); - system(qw(/sbin/chkconfig --level 35 ntpd off)); - } - elsif (-e $ntpdsystemdlock) { - system(qw(systemctl stop ntpd.service)); - system(qw(systemctl disable ntpd.service)); - } - } - if ($need_date) { - my ($year, $month, $day) = $calendar->get_date; - $month++; - my ($hour, $min, $sec) = ($adjh->get_value, $adjm->get_value, $adjs->get_value); - system("date " . - join('', map { print_it0($_) } ($month, $day, $hour, $min, $year)) . '.' . print_it0($sec)); - } - -e '/sbin/hwclock' and system('/sbin/hwclock', '--systohc'); - any::enable_x_screensaver(); - system(qw(dcop kicker Panel restart)) if $ENV{DESKTOP} eq 'kde'; - ugtk2->exit(0); - }, - }, - undef, undef, '', - [ N("Reset"), sub { - $its_reset = 1; - $timer = Glib::Timeout->add(120, \&update_time); - Repaint($drawing_area, 1); - $button_reset->set_sensitive(0); - $its_reset = 0; - } ] - ), - ]) - ); +$my_win->{window}->add( + gtknew('VBox', border_width => $::isEmbedded ? 0 : 5, children => [ + 1, gtknew('HBox', children => [ + 1, gtknew('VBox', children => [ + 0, $calendar, + 1, gtknew('Frame', text => N("Network Time Protocol"), shadow_type => 'etched_in', child => + gtknew('VBox', border_width => 5, children => [ + 0, gtknew('Label', text => N("Your computer can synchronize its clock\n with a remote time server using NTP")), + 0, gtksignal_connect(gtkset_active($check_ntp = gtknew('CheckButton', text => N("Enable Network Time Protocol")), $mode), clicked => sub { + $mode = !$mode; + $hb_ntp->set_sensitive($mode); + if ($mode == 1 && !$in->do_pkgs->is_installed('ntp') && !$in->do_pkgs->is_installed('chrony')) { + install_ntp(); + } + }), + 0, $hb_ntp = gtknew('HBox', border_width => 5, children => [ + 0, gtknew('Label', text => N("Server:")), + 1, $combo_ntpserver = Gtk3::ComboBoxText->new + ]) + ])) + ]), + 0, gtknew('VBox', children => [ + 0, my $clock = gtknew('HBox', children => [ + 0, $drawing_area = gtkset_size_request(Gtk3::DrawingArea->new, @image_size), + ]), + 0, my $time_box = gtknew('HBox', homogenous => 1, children => [ + 0, my $spinner_h = Gtk3::SpinButton->new($adjh, 0, 0), + 0, my $spinner_m = Gtk3::SpinButton->new($adjm, 0, 0), + 0, my $spinner_s = Gtk3::SpinButton->new($adjs, 0, 0), + ]), + 1, gtknew('Frame', text => N("Timezone"), shadow_type => 'etched_in', child => + gtknew('VBox', border_width => 5, children_tight => [ + $label_timezone, + $button_time ])), + ]), + ]), + 0, create_okcancel( + my $w = + { + cancel_clicked => sub { ugtk3->exit(0) }, + ok_clicked => sub { + my $need_date = 1; + any::disable_x_screensaver(); + if ($check_ntp->get_active) { + my $choosed_serv = $combo_ntpserver->entry->get_text; + $choosed_serv =~ s/^[^:]+: (.+)/$1/; + if (!$choosed_serv) { + err_dialog(N("Error"), N("Please enter a valid NTP server address.")); + return; + } + timezone::set_ntp_server($choosed_serv); + system('systemctl', 'enable', "$ntpd.service"); + system('systemctl', 'stop', "$ntpd.service"); + #verify that we have a valid hostname (thx sam) + $choosed_serv =~ s/[^-a-zA-Z0-9.]//g; + my $sync_ok; + if ($ntpd eq "chronyd") { + system('systemctl', 'start', "$ntpd.service"); + # Wait up to 30s for sync + $sync_ok = !system('chronyc', 'waitsync', '30', '0.1'); + system('systemctl', 'stop', "$ntpd.service") if !$sync_ok; + } else { + $sync_ok = !system('/usr/sbin/ntpd', '-gqc', '/dev/null', $choosed_serv); + system('systemctl', 'start', "$ntpd.service") if $sync_ok; + } + if ($sync_ok) { + update_time(); #- get the new time before updating the hwclock + $need_date = 0; + } else { + $in->ask_from_no_check({ + title => N("Error"), + messages => N("Could not synchronize with %s.", $choosed_serv), + ok => N("Quit"), + cancel => N("Retry"), + }, []) or return; + } + } else { + if (is_ntp_daemon_running()) { + system('systemctl', 'stop', "$ntpd.service"); + system('systemctl', 'disable', "$ntpd.service"); + } + } + if ($need_date) { + my ($year, $month, $day) = $calendar->get_date; + $month++; + my ($hour, $min, $sec) = ($adjh->get_value, $adjm->get_value, $adjs->get_value); + system("date " . + join('', map { print_it0($_) } ($month, $day, $hour, $min, $year)) . '.' . print_it0($sec)); + } + -e '/sbin/hwclock' and system('/sbin/hwclock', '--systohc'); + any::enable_x_screensaver(); + system(qw(dcop kicker Panel restart)) if $ENV{DESKTOP} eq 'kde'; + ugtk3->exit(0); + }, + }, + undef, undef, '', + [ N("Reset"), sub { + $its_reset = 1; + $timer = Glib::Timeout->add(120, \&update_time); + Repaint(1); + $button_reset->set_sensitive(0); + $its_reset = 0; + } ] + ), + ]) + ); $button_reset = $w->{buttons}{N("Reset")}; $time_box->set_direction('ltr'); my $servers = get_server(); $combo_ntpserver->set_popdown_strings(@$servers); -if (-e $ntpfile && (-e $ntpdsystemdlock || -e $ntpdlock)) { +if (-e $ntpfile && is_ntp_daemon_running()) { $ntp = timezone::ntp_server(); $ntp and ntp_widget_state(1); my $fullntp = $ntp; @@ -188,12 +193,8 @@ if (-e $ntpfile && (-e $ntpdsystemdlock || -e $ntpdlock)) { } else { ntp_widget_state(0) } my $pressed; -$drawing_area->set_events([ 'button_press_mask', 'button_release_mask', "pointer_motion_mask" ]); -$drawing_area->signal_connect(expose_event => \&expose_event); -$drawing_area->signal_connect(realize => sub { - my $window = $drawing_area->window; - $pixmap = Gtk2::Gdk::Pixmap->new($window, @image_size, $window->get_depth); - }); +$drawing_area->set_events(${ Gtk3::Gdk::EventMask->new([ 'button_press_mask', 'button_release_mask', "pointer_motion_mask" ]) }); +$drawing_area->signal_connect(draw => \&draw); $drawing_area->signal_connect(button_press_event => sub { $pressed = 1 }); $drawing_area->signal_connect(button_release_event => sub { $first = 1; $pressed = 0 }); @@ -226,9 +227,8 @@ $timer = Glib::Timeout->add(120, \&update_time); $drawing_area->show; $my_win->{window}->show_all; -my ($midx, $midy) = ($drawing_area->allocation->width/2, $drawing_area->allocation->height/2); $my_win->main; -ugtk2->exit(0); +ugtk3->exit(0); sub ntp_widget_state { my ($state) = @_; @@ -238,26 +238,33 @@ sub ntp_widget_state { } sub install_ntp() { $my_win->{window}->set_sensitive(0); - $in->do_pkgs->ensure_is_installed('ntp') or ntp_widget_state(0); + $in->do_pkgs->ensure_is_installed('chrony') or ntp_widget_state(0); $my_win->{window}->set_sensitive(1); } +sub is_ntp_daemon_running() { + !system("systemctl is-active $ntpd.service >/dev/null"); +} sub get_server() { my $servs = timezone::ntp_servers(); [ map { "$servs->{$_}: $_" } sort { $servs->{$a} cmp $servs->{$b} || $a cmp $b } keys %$servs ]; } sub update_time() { my (undef, undef, undef, $mday, $mon, $year) = localtime(time()); + return 1 if !$cairo; $year += 1900; my $old_its_reset = $its_reset; $its_reset = 1; $calendar->select_day($mday); $calendar->select_month($mon, $year); $its_reset = $old_its_reset; - Repaint($drawing_area, 1); + Repaint(1); } sub cal_changed() { - !$its_reset and $timer and Glib::Source->remove($timer); + if (!$its_reset && $timer) { + Glib::Source->remove($timer); + undef $timer; + } $button_reset->set_sensitive(1); } @@ -272,10 +279,11 @@ sub changed() { } sub spinned() { - Glib::Source->remove($timer); + Glib::Source->remove($timer) if $timer; + undef $timer; $button_reset->set_sensitive(1); time_to_rad($adjs->get_value, $adjm->get_value, $adjh->get_value); - Repaint($drawing_area); + Repaint(); 0; } @@ -283,14 +291,15 @@ sub motion_event { my ($widget, $event) = @_; $pressed or return; if ($first) { - Glib::Source->remove($timer); + Glib::Source->remove($timer) if $timer; + undef $timer; $Radian = determine_radian($event->x, $event->y); $button_reset->set_sensitive(1); } $$Radian = -atan2($event->x - $midx, $event->y - $midy) + $PI; - Repaint($widget); + Repaint(); rad_to_time(); $first = 0; } @@ -308,10 +317,10 @@ sub determine_radian { $r; } -sub expose_event { +sub draw { my ($widget, $event) = @_; - my ($x, $y, $width, $height) = $event->area->values; - $widget->window->draw_drawable($widget->style->fg_gc('normal'), $pixmap, $x, $y, $x, $y, $width, $height); + $cairo = $event; + Repaint(undef, 1); 0; } @@ -332,78 +341,83 @@ sub time_to_rad { } sub Repaint { - my ($drawing_area, $o_update_time) = @_; + my ($o_update_time, $skip_redraw) = @_; my ($sec, $min, $hour) = localtime(time()); time_to_rad($sec, $min, $hour) if $o_update_time; - my ($width, $height) = ($drawing_area->allocation->width, $drawing_area->allocation->height); - my $dRadians_hour_real = $dRadians_hour + $dRadians_min / 12; - my $dRadians_min_real = POSIX::floor($dRadians_min / $PI * 30) * $PI / 30; - my $dRadians_sec_real = $dRadians_sec; - my $gc = $drawing_area->style->white_gc; - # fix race on ugtk2->exit that causes a crash (#33894) - return 0 if !$gc; - $pixmap->draw_rectangle($drawing_area->style->white_gc, 1, 0, 0, $width, $height); - my ($midx, $midy) = ($width / 2, $height / 2); + ($midx, $midy) = ($drawing_area->get_allocated_width/2, $drawing_area->get_allocated_height/2); $radius = ($midx < $midy ? $midx : $midy) - 10; - - my $gray_gc = $drawing_area->style->bg_gc('normal'); - my $black_gc = $drawing_area->style->black_gc; - foreach ([ $gray_gc, 5 ], [ $black_gc, 0 ]) { - &DrawTickAt($pixmap, $_->[0], $midx, $midy, $_->[1]); - &DrawHour($pixmap, $_->[0], $midx, $midy, $dRadians_hour_real, $_->[1]); - &DrawMin($pixmap, $_->[0], $midx, $midy, $dRadians_min_real, $_->[1]); - &DrawSec($pixmap, $_->[0], $midx, $midy, $dRadians_sec_real, $_->[1]); - } - &DrawPointAt($pixmap, $black_gc, $_, $midx, $midy) foreach (1..60); - $drawing_area->queue_draw; + $drawing_area->set_margin_start($clock->get_allocated_width/2 - $midx); + + $cairo->set_antialias('default'); + DrawTicks(); + DrawPoints(); + DrawHour(); + DrawMin(); + DrawSec(); + # Only redraw the clock if there are changes. + # This highly decreases the CPU usage. + $drawing_area->queue_draw unless $skip_redraw; 1; } -sub DrawSec { - my ($pixmap, $gc, $midx, $midy, $dRadians, $dec) = @_; - $pixmap->draw_line($gc, - $midx+$dec, $midy+$dec, - $midx+$dec + (8/10 * $radius * sin($dRadians)), - $midy+$dec - (8/10 * $radius * cos($dRadians))); +sub DrawSec() { + my $dRadians = $dRadians_sec; + $cairo->set_source_rgb(0.9, 0, 0); + $cairo->move_to($midx, $midy); + $cairo->line_to($midx + 85/100 * $radius * sin($dRadians), $midy - 85/100 * $radius * cos($dRadians)); + $cairo->stroke; } -sub DrawMin { - my ($pixmap, $gc, $midx, $midy, $dRadians, $dec) = @_; - $pixmap->draw_polygon($gc, 1, $midx+$dec - 3/100 * $radius * sin($dRadians), $midy+$dec + 3/100 * $radius * cos($dRadians), - $midx+$dec - 3/100 * $radius * sin($dRadians+$PI/2), $midy+$dec + 3/100 * $radius * cos($dRadians+$PI/2), - $midx+$dec + 8/10 * $radius * sin($dRadians), $midy+$dec - 8/10 * $radius * cos($dRadians), - $midx+$dec + 3/100 * $radius * sin($dRadians+$PI/2), $midy+$dec - 3/100 * $radius * cos($dRadians+$PI/2) - ); +sub DrawMin() { + my $dRadians = $dRadians_min; + $cairo->set_source_rgb(0.2, 0.2, 0.2); + $cairo->move_to($midx - 3/100 * $radius * sin($dRadians), $midy + 3/100 * $radius * cos($dRadians)); + $cairo->line_to($midx - 3/100 * $radius * sin($dRadians+$PI/2), $midy + 3/100 * $radius * cos($dRadians+$PI/2)); + $cairo->line_to($midx + 7/10 * $radius * sin($dRadians-0.03), $midy - 7/10 * $radius * cos($dRadians-0.03)); + $cairo->line_to($midx + 8/10 * $radius * sin($dRadians), $midy - 8/10 * $radius * cos($dRadians)); + $cairo->line_to($midx + 7/10 * $radius * sin($dRadians+0.03), $midy - 7/10 * $radius * cos($dRadians+0.03)); + $cairo->line_to($midx + 3/100 * $radius * sin($dRadians+$PI/2), $midy - 3/100 * $radius * cos($dRadians+$PI/2)); + $cairo->fill; } -sub DrawHour { - my ($pixmap, $gc, $midx, $midy, $dRadians, $dec) = @_; - $pixmap->draw_polygon($gc, 1, $midx+$dec - 5/100 * $radius * sin($dRadians), $midy+$dec + 5/100 * $radius * cos($dRadians), - $midx+$dec - 5/100 * $radius * sin($dRadians+$PI/2), $midy+$dec + 5/100 * $radius * cos($dRadians+$PI/2), - $midx+$dec + 6/10 * $radius * sin($dRadians), $midy+$dec - 6/10 * $radius * cos($dRadians), - $midx+$dec + 5/100 * $radius * sin($dRadians+$PI/2), $midy+$dec - 5/100 * $radius * cos($dRadians+$PI/2) - ); +sub DrawHour() { + my $dRadians = $dRadians_hour + $dRadians_min / 12; + $cairo->set_source_rgb(0.2, 0.2, 0.2); + $cairo->move_to($midx - 4/100 * $radius * sin($dRadians), $midy + 4/100 * $radius * cos($dRadians)); + $cairo->line_to($midx - 4/100 * $radius * sin($dRadians+$PI/2), $midy + 4/100 * $radius * cos($dRadians+$PI/2)); + $cairo->line_to($midx + 5/10 * $radius * sin($dRadians-0.05), $midy - 5/10 * $radius * cos($dRadians-0.05)); + $cairo->line_to($midx + 6/10 * $radius * sin($dRadians), $midy - 6/10 * $radius * cos($dRadians)); + $cairo->line_to($midx + 5/10 * $radius * sin($dRadians+0.05), $midy - 5/10 * $radius * cos($dRadians+0.05)); + $cairo->line_to($midx + 4/100 * $radius * sin($dRadians+$PI/2), $midy - 4/100 * $radius * cos($dRadians+$PI/2)); + $cairo->fill; } -sub DrawTickAt { - my ($pixmap, $gc, $cx, $cy, $dec) = @_; +sub DrawTicks() { + $cairo->set_source_rgb(1, 1, 1); + $cairo->new_sub_path; + $cairo->arc($midx, $midy, $radius, 0, 2 * $PI); + $cairo->fill_preserve; + $cairo->set_source_rgb(0, 0, 0); + $cairo->stroke; + foreach my $nHour (1..12) { - my $dRadians = $nHour * $PI / 6.0; - $pixmap->draw_line($gc, - $cx + $dec + 9/10 * $radius * sin($dRadians), - $cy + $dec - 9/10 * $radius * cos($dRadians), - $cx + $dec + 1 * $radius * sin($dRadians), - $cy + $dec - 1 * $radius * cos($dRadians)); + my $dRadians = $nHour * $PI / 6.0; + $cairo->move_to($midx + 9/10 * $radius * sin($dRadians), + $midy - 9/10 * $radius * cos($dRadians)); + $cairo->line_to($midx + 1 * $radius * sin($dRadians), + $midy - 1 * $radius * cos($dRadians)); } + $cairo->stroke; } -sub DrawPointAt { - my ($pixmap, $black_gc, $nHour, $cx, $cy) = @_; - my $dRadians = $nHour * $PI / 30; - - $pixmap->draw_points($black_gc, - $cx + 95/100 * $radius * sin($dRadians), - $cy - 95/100 * $radius * cos($dRadians)); +sub DrawPoints() { + $cairo->set_source_rgb(0, 0, 0); + foreach my $nMin (1..60) { + my $dRadians = $nMin * $PI / 30; + $cairo->move_to($midx + 95/100 * $radius * sin($dRadians), $midy - 95/100 * $radius * cos($dRadians)); + $cairo->line_to($midx + 90/100 * $radius * sin($dRadians), $midy - 90/100 * $radius * cos($dRadians)); + } + $cairo->stroke; } |