3 proc getFile {filename} {
4 set f [open $filename r]
5 set data [read -nonewline $f]
9 if {[file exists /proc/apm]} {
10 proc apm_calc_time {power_status} {
11 set units [lindex $power_status 8]
12 set count [lindex $power_status 7]
13 if {![regexp {[0-9]+} $count]} {
16 if {$units == "sec"} {
17 set sec [expr $count % 60]
18 set min1 [expr $count / 60]
19 set min [expr $min1 % 60]
20 set hours [expr $min1 /60]
21 return [format "%d:%02d:%02d" $hours $min $sec]
23 set min [expr $count % 60]
24 set hours [expr $count / 60]
25 return [format "%d:%02d" $hours $min]
28 proc get_power_state {} {
29 set status [getFile /proc/apm]
30 set battery [lindex $status 5]
31 set ac [expr [lindex status 3] == 1]
32 if {$battery !=255 && $battery & 8} {
39 set power [scan [lindex $status 6] "%d%%"
40 return list [$power $ac $charge [apm_calc_time $status]]
44 } elseif {[file isdirectory /sys/class/power_supply]} {
46 if {[file exists /sys/class/power_supply/BAT0/charge_full]} {
51 proc get_power_state {} {
53 set full [getFile /sys/class/power_supply/BAT0/${prefix}_full]
54 set now [getFile /sys/class/power_supply/BAT0/${prefix}_now]
55 set ac [getFile /sys/class/power_supply/AC0/online]
56 set status [getFile /sys/class/power_supply/BAT0/status]
57 if {$status eq "Charging"} {
59 } elseif {$status eq "Discharging"} {
64 # Returns list of percentage of energy in the battery
65 # boolean flag if AC is online
66 # charge flag (-1 if discharging 1 charging 0 not chanrging)
67 # time remaining until full charge/full discharge (in seconds
68 return [list [format %.0f [expr 100.0*$now/$full]] $ac $st ""]
70 } elseif {[file isdirectory /proc/acpi/battery]} {
71 proc get_power_state {} {
72 set ac [string match *on-line* [getFile /proc/acpi/ac_adapter/AC0/state]]
73 regexp -line {last full capacity:\s+(\d+)} [getFile /proc/acpi/battery/BAT0/info] => full
74 set state [getFile /proc/acpi/battery/BAT0/state]
75 regexp -line {remaining capacity:\s+(\d+)} $state => now
76 regexp -line {charging state:\s+(\w+)} $state => charging
77 if {$charging eq "charging"} {
79 } elseif {$charging eq "discharging"} {
84 return [list [expr 100*$now/$full] $ac $st {}]
88 if {$::tk_version >= 8.5} {
97 if {[winfo exists .power]} {
99 if {[info exists after_id]} {
100 after cancel $after_id
103 set c [canvas .power -width 62 -height 15 -relief sunken -bd 1]
105 $c create rectangle 10 3 30 13 -outline black
106 $c create rectangle 30 6 33 10 -outline black -fill black
108 $c create rectangle 10 3 30 13 -outline black -stipple @[file join $tk_library demos images gray25[bmp_ext]] -fill black -tag energy
110 $c create polygon 2 1 6 8 3 8 8 15 6 9 9 9 5 1 -outline red -fill red -tag power
112 $c create polygon 35 8 38 5 38 11 -fill black -outline black -tag charge
113 $c create polygon 35 5 35 11 38 8 -fill black -outline black -tag discharge
114 $c create text 61 9 -anchor e -text 100% -font 6x10 -tag pwtext
115 bind .power <Enter> ::power::start_help
116 bind .power <Leave> ::power::cancel_help
117 bind .power <Motion> ::power::reset_help
123 proc toggle_item {tag state} {
126 .power itemconfig $tag -fill $colors($tag) -outline $colors($tag)
128 .power itemconfig $tag -fill {} -outline {}
132 proc set_power {percent} {
133 set x [expr 20*$percent/100+10]
134 .power coords energy 10 3 $x 13
135 .power itemconfig pwtext -text "$percent%"
139 foreach {percent ac charge remain} [get_power_state] break
149 toggle_item discharge 0
151 toggle_item discharge 1
152 append help "Battery $remain left"
153 } elseif {$charge == 1} {
155 append help "charging $remain left"
157 append help "not charging"
159 if {$ac || $percent > 75} {
160 .power configure -background [lindex [.power configure -background] 3]
161 } elseif {$percent > 50} {
163 .power configure -background [lindex [.power configure -background] 3]
164 } elseif {$percent > 25 } {
165 .power configure -background yellow
167 .power configure -background #ff7777
170 set after_id [after 5000 ::power::update]
173 proc cancel_help {} {
174 variable help_after_id
175 if [info exists help_after_id] {
176 after cancel $help_after_id
179 if {[wm state .power.help]=="normal"} {
180 wm withdraw .power.help
184 variable help_after_id
185 set help_after_id [after 1000 ::power::show_help]
192 wm geometry .power.help +[expr [winfo pointerx .]+2]+[expr [winfo pointery .]+2]
193 wm deiconify .power.help
198 wm withdraw .power.help
199 wm overrideredirect .power.help y
200 label .power.help.l -textvar ::power::help -background yellow -font 6x10
201 pack .power.help.l -side left