]> www.wagner.pp.ru Git - oss/fubar.git/blob - plugins/acpi
fixed file names under tk 8.5 and above
[oss/fubar.git] / plugins / acpi
1 #!/usr/bin/wish
2 namespace eval power {
3         proc getFile {filename} {
4                 set f [open $filename r]
5                 set data [read -nonewline $f]
6                 close $f
7                 return $data
8         }       
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]} {
14                         return ??
15                 }       
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]
22                 } else {
23                         set min [expr $count % 60]
24                         set hours [expr $count / 60]
25                         return [format "%d:%02d" $hours $min]
26                 }       
27         }
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} {
33                         set charge 1
34                 } elseif {!$ac} {
35                         set charge -1
36                 } else {
37                         set charge 0
38                 }       
39                 set power [scan [lindex $status 6] "%d%%"
40                 return list [$power $ac $charge [apm_calc_time $status]]
41
42                 
43         }
44 } elseif {[file isdirectory /sys/class/power_supply]} {
45         variable prefix
46         if {[file exists /sys/class/power_supply/BAT0/charge_full]} {
47                 set prefix charge
48         } else { 
49                 set prefix energy
50         }       
51         proc get_power_state {} {
52                 variable prefix
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"} {
58                         set st 1
59                 } elseif {$status eq "Discharging"} {
60                         set st -1
61                 } else {
62                         set st 0
63                 }       
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 ""]
69         }
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"} {
78                         set st 1
79                 } elseif {$charging eq "discharging"} {
80                         set st -1
81                 } else {
82                         set st 0
83                 }
84                 return [list [expr 100*$now/$full] $ac $st {}]
85         }
86 }
87 proc bmp_ext {} {
88  if {$::tk_version >= 8.5} {
89         return ".xbm"
90  } else {
91         return ".bmp"
92  }
93 }
94         variable colors
95         variable help
96         variable after_id
97         if {[winfo exists .power]} {
98                 destroy .power
99                 if {[info exists after_id]} {
100                         after cancel $after_id
101                 }       
102         }
103         set c [canvas .power -width 62 -height 15 -relief sunken -bd 1]
104         pack $c -side right
105         $c create rectangle 10 3 30 13 -outline black
106         $c create rectangle 30 6 33 10 -outline black -fill black
107
108         $c create rectangle 10 3 30 13 -outline black -stipple @[file join $tk_library demos images gray25[bmp_ext]] -fill black -tag energy
109
110         $c create polygon 2 1 6 8 3 8 8 15 6 9 9 9 5 1  -outline red -fill red -tag power
111
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
118         array set colors {
119                 charge black
120                 discharge black
121                 power red
122         }
123         proc toggle_item {tag state} {
124                 variable colors
125                 if {$state} {
126                 .power itemconfig $tag -fill $colors($tag) -outline $colors($tag)
127                 } else {
128                 .power itemconfig $tag -fill {} -outline {}
129             }
130
131         }
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%"
136         }
137         proc update {} {
138                 variable after_id
139                 foreach {percent ac charge remain} [get_power_state] break
140                 variable help
141                 set help ""
142                 if {$ac} {
143                    toggle_item power 1
144                 append help "AC " 
145                 } else {
146                    toggle_item power 0
147                 }
148                 toggle_item charge 0
149                 toggle_item discharge 0
150                 if {$charge == -1} {
151                    toggle_item discharge 1
152                    append help "Battery $remain left"
153                 } elseif {$charge == 1} {
154                    toggle_item charge 1
155                    append help "charging $remain left"
156                 }  else {       
157                    append help "not charging"
158                 }   
159                 if {$ac || $percent > 75} {
160                 .power configure -background [lindex [.power configure -background] 3]
161                 } elseif {$percent > 50} {
162
163                 .power configure -background [lindex [.power configure -background] 3]
164                 } elseif {$percent > 25 } {
165                 .power configure -background yellow 
166                 } else {
167                 .power configure -background #ff7777
168                 }
169                 set_power $percent 
170                 set after_id [after 5000 ::power::update]
171         }
172
173         proc cancel_help {} {
174                 variable help_after_id
175                 if [info exists help_after_id] {
176                         after cancel $help_after_id
177                         unset help_after_id
178                 }
179                 if {[wm state .power.help]=="normal"} {
180                         wm withdraw .power.help
181                 }
182         }
183         proc start_help {} {
184                 variable help_after_id
185                 set help_after_id [after 1000 ::power::show_help]
186         }
187         proc reset_help {} {
188                 cancel_help
189                 start_help
190         }
191         proc show_help {} {
192                 wm geometry .power.help +[expr [winfo pointerx .]+2]+[expr [winfo pointery .]+2]
193                 wm deiconify .power.help
194                 raise .power.help
195         }       
196                 
197         toplevel .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
202         unset c
203 }
204 ::power::update