1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
|
--------------------------------
-- Author: Gregor Best --
-- Copyright 2009 Gregor Best --
--------------------------------
local tonumber = tonumber
local tostring = tostring
local setmetatable = setmetatable
local io = {
popen = io.popen
}
local os = {
execute = os.execute
}
local capi = {
widget = widget,
mouse = mouse
}
local naughty = require("naughty")
local awful = require("awful")
local lib = {
hooks = require("obvious.lib.hooks"),
markup = require("obvious.lib.markup")
}
module("obvious.battery")
widget = capi.widget({
type = "textbox",
name = "tb_battery",
align = "right"
})
status = {
["charged"] = "↯",
["full"] = "↯",
["discharging"] = "▼",
["charging"] = "▲",
["unknown"] = "⌁"
}
local backend = "acpi"
get_data = nil
local function init()
local rv = os.execute("acpitool")
if rv == 0 then
backend = "acpitool"
return
end
rv = os.execute("acpi")
if rv == 0 then
backend = "acpi"
return
end
rv = os.execute("apm")
if rv == 0 then
backend = "apm"
return
end
backend = "none"
end
function get_data()
if backend == "acpi" or backend == "acpitool" then
local rv = { }
local fd = io.popen(backend .. " -b")
if not fd then return end
local line = fd:read("*l")
while line do
local data = line:match("Battery #?[0-9] *: ([^\n]*)")
rv.state = data:match("([%a]*),.*"):lower()
rv.charge = tonumber(data:match(".*, ([%d]?[%d]?[%d]%.?[%d]?[%d]?)%%"))
rv.time = data:match(".*, ([%d]?[%d]?:?[%d][%d]:[%d][%d])")
if not rv.state:match("unknown") then break end
line = fd:read("*l")
end
fd:close()
return rv
elseif backend == "apm" then
local rv = { }
local fd = io.popen("apm")
if not fd then return end
local data = fd:read("*all")
if not data then return end
rv.state = data:match("battery ([a-z]+):")
rv.charge = tonumber(data:match(".*, .*: (%d?%d?%d)%%"))
rv.time = data:match("%((.*)%)$")
return rv
end
local rv = { }
rv.state = "unknown"
rv.charge = 0
rv.time = "00:00"
return rv
end
local function update()
local battery_status = ""
local bat = get_data()
if not bat then
widget.text = "no data"
return
end
local color = "#900000"
if not bat.charge then
widget.text = lib.markup.fg.color("#009000", status.charged) .. " A/C"
return
elseif bat.charge > 35 and bat.charge < 60 then
color = "#909000"
elseif bat.charge >= 40 then
color = "#009000"
end
local state = bat.state
if not status[state] then
state = "unknown"
end
state = status[state]
battery_status = lib.markup.fg.color(color, state) .. " " .. awful.util.escape(tostring(bat.charge)) .. "%"
if bat.time then
battery_status = battery_status .. " " .. awful.util.escape(bat.time)
end
widget.text = battery_status
end
local function detail ()
local fd = nil
if backend == "acpi" then
fd = io.popen("acpi -bta")
elseif backend == "acpitool" then
fd = io.popen("acpitool")
elseif backend == "apm" then
fd = io.popen("apm")
else
naughty.notify({ text = "unknown backend: " .. backend })
end
local d = fd:read("*all"):gsub("\n+$", "")
fd:close()
naughty.notify({
text = d,
screen = capi.mouse.screen
})
update()
end
widget:buttons(awful.util.table.join(
awful.button({ }, 1, detail)
))
init()
update()
lib.hooks.timer.register(60, 300, update)
lib.hooks.timer.start(update)
setmetatable(_M, { __call = function () return widget end })
|