]> www.wagner.pp.ru Git - oss/fubar.git/blob - plugins/acpi
5040d45ddd7b13b8e4a122e44b5fd7fc808c616e
[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         variable colors
88         variable help
89         variable after_id
90         if {[winfo exists .power]} {
91                 destroy .power
92                 if {[info exists after_id]} {
93                         after cancel $after_id
94                 }       
95         }
96         set c [canvas .power -width 62 -height 15 -relief sunken -bd 1]
97         pack $c -side right
98         $c create rectangle 10 3 30 13 -outline black
99         $c create rectangle 30 6 33 10 -outline black -fill black
100
101         $c create rectangle 10 3 30 13 -outline black -stipple @[file join $tk_library demos images gray25.bmp] -fill black -tag energy
102
103         $c create polygon 2 1 6 8 3 8 8 15 6 9 9 9 5 1  -outline red -fill red -tag power
104
105         $c create polygon 35 8 38 5 38 11 -fill black -outline black -tag charge
106         $c create polygon 35 5 35 11 38 8 -fill black -outline black -tag discharge
107         $c create text 61 9 -anchor e -text 100% -font 6x10 -tag pwtext
108         bind .power <Enter> ::power::start_help
109         bind .power <Leave> ::power::cancel_help
110         bind .power <Motion> ::power::reset_help
111         array set colors {
112                 charge black
113                 discharge black
114                 power red
115         }
116         proc toggle_item {tag state} {
117                 variable colors
118                 if {$state} {
119                 .power itemconfig $tag -fill $colors($tag) -outline $colors($tag)
120                 } else {
121                 .power itemconfig $tag -fill {} -outline {}
122             }
123
124         }
125         proc set_power {percent} {
126                 set x [expr 20*$percent/100+10]
127                 .power coords energy 10 3 $x 13
128                 .power itemconfig pwtext -text "$percent%"
129         }
130         proc update {} {
131                 variable after_id
132                 foreach {percent ac charge remain} [get_power_state] break
133                 variable help
134                 set help ""
135                 if {$ac} {
136                    toggle_item power 1
137                 append help "AC " 
138                 } else {
139                    toggle_item power 0
140                 }
141                 toggle_item charge 0
142                 toggle_item discharge 0
143                 if {$charge == -1} {
144                    toggle_item discharge 1
145                    append help "Battery $remain left"
146                 } elseif {$charge == 1} {
147                    toggle_item charge 1
148                    append help "charging $remain left"
149                 }  else {       
150                    append help "not charging"
151                 }   
152                 if {$ac || $percent > 75} {
153                 .power configure -background [lindex [.power configure -background] 3]
154                 } elseif {$percent > 50} {
155
156                 .power configure -background [lindex [.power configure -background] 3]
157                 } elseif {$percent > 25 } {
158                 .power configure -background yellow 
159                 } else {
160                 .power configure -background #ff7777
161                 }
162                 set_power $percent 
163                 set after_id [after 5000 ::power::update]
164         }
165
166         proc cancel_help {} {
167                 variable help_after_id
168                 if [info exists help_after_id] {
169                         after cancel $help_after_id
170                         unset help_after_id
171                 }
172                 if {[wm state .power.help]=="normal"} {
173                         wm withdraw .power.help
174                 }
175         }
176         proc start_help {} {
177                 variable help_after_id
178                 set help_after_id [after 1000 ::power::show_help]
179         }
180         proc reset_help {} {
181                 cancel_help
182                 start_help
183         }
184         proc show_help {} {
185                 wm geometry .power.help +[expr [winfo pointerx .]+2]+[expr [winfo pointery .]+2]
186                 wm deiconify .power.help
187                 raise .power.help
188         }       
189                 
190         toplevel .power.help
191         wm withdraw .power.help
192         wm overrideredirect .power.help y
193         label .power.help.l -textvar ::power::help -background yellow -font 6x10
194         pack .power.help.l -side left
195         unset c
196 }
197 ::power::update