#!/usr/bin/wish -f # This requires GNU date # This code is no longer process intensive! # I added a date command to rhswish which returns # the result of date(NULL) (see date(2)). date # is now used to keep time. set cpld /usr/lib/rhs/control-panel if {[catch {source $cpld/dialog.tcl}] != 0} { puts "Couldn't load dialog.tcl" puts "(normally this is /usr/lib/rhs/control-panel)" exit 0 } set selected_color Red set unselected_color Black set month_length(1) 31 set month_length(2) 28 set month_length(3) 31 set month_length(4) 30 set month_length(5) 31 set month_length(6) 30 set month_length(7) 31 set month_length(8) 31 set month_length(9) 30 set month_length(10) 31 set month_length(11) 30 set month_length(12) 31 set month_name(1) Jan set month_name(2) Feb set month_name(3) Mar set month_name(4) Apr set month_name(5) May set month_name(6) Jun set month_name(7) Jul set month_name(8) Aug set month_name(9) Sep set month_name(10) Oct set month_name(11) Nov set month_name(12) Dec # Update the clock every second proc update_clock {} { global cl_second old_second set new_second [exec date +%s] after 1000 update_clock set inc [expr $new_second - $old_second] set old_second $new_second # The takes care of old_second == 59 and new_second == 0 if {$inc < 0} { incr inc 60 } adj_clock $inc } # Add n seconds to the clock proc adj_clock {n} { global cl_second incr cl_second $n if {$n > 0} { if {$cl_second > 59} { incr cl_second -60 incr_minute } } else { if {$cl_second < 0} { incr cl_second 60 decr_minute } } redraw_clock } proc incr_minute {} { global cl_minute incr cl_minute if {$cl_minute > 59} { set cl_minute 0 incr_hour } } proc decr_minute {} { global cl_minute incr cl_minute -1 if {$cl_minute < 0} { set cl_minute 59 decr_hour } } proc incr_date {} { global cl_date cl_month cl_year cur_month_name month_name incr cl_date if {$cl_date > [days_in_month]} { set cl_date 1 incr cl_month if {$cl_month > 12} { set cl_month 1 incr cl_year } set cur_month_name $month_name($cl_month) } } proc decr_date {} { global cl_date cl_month cl_year cur_month_name month_name incr cl_date -1 if {$cl_date == 0} { incr cl_month -1 if {$cl_month == 0} { set cl_month 12 incr cl_year -1 } set cl_date [days_in_month] set cur_month_name $month_name($cl_month) } } proc incr_hour {} { global cl_hour incr cl_hour if {$cl_hour > 23} { set cl_hour 0 incr_date } } proc decr_hour {} { global cl_hour incr cl_hour -1 if {$cl_hour < 0} { set cl_hour 23 decr_date } } proc sb_adj_hour {n} { if {$n > 0} { decr_hour } else { incr_hour } redraw_clock } proc sb_adj_minute {n} { if {$n > 0} { decr_minute } else { incr_minute } redraw_clock } proc sb_adj_second {n} { adj_clock [expr 0 - $n] # Ne need to redraw since adj_clock does it } proc sb_adj_date {n} { if {$n > 0} { decr_date } else { incr_date } redraw_clock } proc sb_adj_year {n} { global cl_year cl_month cl_date # Only thing to watch out for is if cl_date is 29 and cl_month is 2 # If so, just change it to 28 to be safe if {$cl_month == 2 && $cl_date == 29} { set cl_date 28 } if {$n > 0} { incr cl_year -1 } else { incr cl_year } redraw_clock } proc sb_adj_month {n} { global cl_month cl_date cl_year cur_month_name month_name # Just watch cl_date to see if it goes over days_in_month if {$n > 0} { incr cl_month -1 if {$cl_month == 0} { set cl_month 12 incr cl_year -1 } } else { incr cl_month if {$cl_month == 13} { set cl_month 1 incr cl_year } } # Now check the days in month set d [days_in_month] if {$cl_date > $d} { set cl_date $d } set cur_month_name $month_name($cl_month) redraw_clock } proc sb_dispatch {n} { global selected_item switch -exact $selected_item { .hour {sb_adj_hour $n} .minute {sb_adj_minute $n} .second {sb_adj_second $n} .month {sb_adj_month $n} .date {sb_adj_date $n} .year {sb_adj_year $n} } } proc days_in_month {} { global cl_month cl_year month_length if {$cl_month == 2} { if {[expr $cl_year / 4.0] != [expr $cl_year / 4]} { return 28 } if {[expr $cl_year / 400.0] == [expr $cl_year / 400]} { return 28 } return 29 } else { return $month_length($cl_month) } } proc redraw_clock {} { global cl_year cl_month cl_date cl_hour cl_minute cl_second time_mode cur_month_name # AM/PM if {$cl_hour > 11} { .ampm configure -text " PM" } else { .ampm configure -text " AM" } # Hours if {$time_mode == "military"} { .hour configure -text [format "%02d" $cl_hour] } else { if {$cl_hour > 12} { .hour configure -text [format "%2d" [expr $cl_hour - 12]] } elseif {$cl_hour == 0} { .hour configure -text "12" } else { .hour configure -text [format "%2d" $cl_hour] } } # Minutes and Seconds .minute configure -text [format "%02d" $cl_minute] .second configure -text [format "%02d" $cl_second] # Date .month configure -text $cur_month_name .date configure -text $cl_date .year configure -text $cl_year # Red Hat Software rules spin_hat } proc reset_clock {} { global cl_month cl_date cl_hour cl_minute cl_second cl_year month_name cur_month_name set time [exec /bin/date "+%-m %-d %-H %-M %-S %-Y"] set cl_month [lindex $time 0] set cl_date [lindex $time 1] set cl_hour [lindex $time 2] set cl_minute [lindex $time 3] set cl_second [lindex $time 4] set cl_year [lindex $time 5] set cur_month_name $month_name($cl_month) } proc set_system_time {} { global cl_year cl_month cl_date cl_hour cl_minute cl_second utc_time # Warning set res [rhs_continue_dialog "WARNING!\n\nChanging your system clock can wreak havoc\nwith processes that depend on the time.\n\nIf you continue and reset the clock,\nyou should probably reboot your system."] if {$res == 1} { return } # Set the system time exec /bin/date [format "%02d%02d%02d%02d%04d.%02d" $cl_month $cl_date $cl_hour $cl_minute $cl_year $cl_second] # Write system time to CMOS clock if {$utc_time == 1} { exec /sbin/clock -u -w } else { exec /sbin/clock -w } # This keeps things sane update_clock reset_clock } proc spin_hat {} { global hat_pos cpld incr hat_pos if {$hat_pos > 12} { set hat_pos 1 } .hat configure -bitmap @$cpld/loopy/loopy_$hat_pos.xbm } frame .time -borderwidth 2 -relief groove frame .clock #set font -adobe-times-bold-r-normal--20-100-*-*-p-150-*-* set font -sony-fixed-medium-r-normal--24-170-100-100-c-120-iso8859-1 label .hour -font $font\ -borderwidth 0 -padx 0 -foreground $unselected_color label .hourcolon -text ":" -font $font \ -borderwidth 0 -padx 0 label .minute -font $font \ -borderwidth 0 -padx 0 -foreground $unselected_color label .minutecolon -text ":" -font $font \ -borderwidth 0 -padx 0 label .second -font $font \ -borderwidth 0 -padx 0 -foreground $unselected_color label .ampm -font $font \ -borderwidth 0 -padx 0 pack .hour .hourcolon .minute .minutecolon .second .ampm -side left -in .clock frame .calendar label .month -font $font \ -borderwidth 0 -padx 0 -foreground $unselected_color label .monthspace -text " " -font $font \ -borderwidth 0 -padx 0 label .date -font $font \ -borderwidth 0 -padx 0 -foreground $unselected_color label .datecomma -text ", " -font $font \ -borderwidth 0 -padx 0 label .year -font $font \ -borderwidth 0 -padx 0 -foreground $unselected_color pack .month .monthspace .date .datecomma .year -side left -in .calendar pack .clock .calendar -side top -in .time -padx 4 -pady 1 frame .control -borderwidth 2 -relief groove checkbutton .militarytime -text "24 Hour Time" -variable time_mode -onvalue military -offvalue standard message .msg -text "Click on the part of the time and date you wish to change and use the arrows to adjust it." scrollbar .sb -command sb_dispatch -repeatinterval 50 -width 30 button .reset -text "Reset Time" -command "reset_clock ; redraw_clock" pack .reset .militarytime -side bottom -in .control -pady 2 -ipadx 4 -ipady 1 pack .msg .sb -side left -in .control -padx 2 -pady 2 frame .setf -borderwidth 2 -relief sunken button .set -text "Set System Clock" -command "set_system_time" pack .set -in .setf -padx 4 -pady 2 -ipadx 4 -ipady 1 button .quit -text "Exit Time Machine" -command "exit 0" #label .hat -padx 10 -pady 10 -bitmap [image create photo -file $env(CONTROL_PANEL_LIB_DIR)/loopy/loopy_1.gif] \ # -foreground Red label .hat -padx 10 -pady 10 -bitmap @$cpld/loopy/loopy_1.xbm -foreground Red pack .time .control .setf -side top -padx 4 -pady 2 pack .quit -side top -padx 4 -pady 3 -ipadx 4 -ipady 1 wm title . "Time Machine" proc time_mode_trace {we dont care} { global time_mode if {$time_mode == "military"} { pack unpack .ampm } else { pack .ampm -side left -after .second } redraw_clock } proc select_item {i} { global selected_item unselected_color selected_color if {$selected_item != ""} { $selected_item configure -foreground $unselected_color } set selected_item $i $i configure -foreground $selected_color } proc toggle_hat {} { global hat_up if {$hat_up == 1} { pack unpack .hat set hat_up 0 } else { pack .hat -side top -after .quit set hat_up 1 } } # Set up bindings on items of interest foreach i ".hour .minute .second .month .date .year" { bind $i <1> "select_item $i" } bind .ampm <1> "toggle_hat" if {[exec id -u] != 0} { rhs_error_dialog "You must be root to run the Time Tool." exit 1 } # Find out if we are using UTC or local time set utc_time 1 if {[file isfile "/etc/sysconfig/clock"]} { set fd [open "/etc/sysconfig/clock" r] gets $fd x close $fd if {[regexp ".*GMT.*" $x]} { set utc_time 1 } else { set utc_time 0 } } reset_clock # This keeps track of time on the system clock set old_second [exec date +%s] set time_mode standard trace variable time_mode w time_mode_trace set selected_item "" set hat_pos 1 set hat_up 0 redraw_clock after 1000 update_clock