madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

lain.widgets -> lain.widget
[etc/awesome.git] / widget / contrib / tpbat / init.lua
1
2 --[[
3                                                                
4      tpbat.lua                                                 
5      Battery status widget for ThinkPad laptops that use SMAPI 
6      lain.widget.contrib.tpbat                                
7                                                                
8      More on tp_smapi: http://www.thinkwiki.org/wiki/Tp_smapi  
9                                                                
10      Licensed under GNU General Public License v2              
11       * (c) 2013,      Conor Heine                             
12       * (c) 2013,      Luke Bonham                             
13       * (c) 2010-2012, Peter Hofmann                           
14                                                                
15 --]]
16
17 local debug        = { getinfo = debug.getinfo }
18 local newtimer     = require("lain.helpers").newtimer
19 local first_line   = require("lain.helpers").first_line
20 local naughty      = require("naughty")
21 local wibox        = require("wibox")
22 local string       = { format = string.format }
23 local math         = { floor = math.floor }
24 local tostring     = tostring
25 local setmetatable = setmetatable
26 package.path       = debug.getinfo(1,"S").source:match[[^@?(.*[\/])[^\/]-$]] .. "?.lua;" .. package.path
27 local smapi        = require("smapi")
28
29 -- ThinkPad SMAPI-enabled battery info widget
30 -- lain.widget.contrib.tpbat
31 local tpbat = {}
32
33 function tpbat.hide()
34     if not tpbat.notification then return end
35     naughty.destroy(tpbat.notification)
36     tpbat.notification = nil
37 end
38
39 function tpbat.show(t_out)
40     tpbat.hide()
41
42     local bat = tpbat.bat
43
44     if bat == nil or not bat:installed() then return end
45
46     local t_out = t_out or 0
47     local mfgr   = bat:get('manufacturer') or "no_mfgr"
48     local model  = bat:get('model') or "no_model"
49     local chem   = bat:get('chemistry') or "no_chem"
50     local status = bat:get('state') or "nil"
51     local time   = bat:remaining_time()
52     local msg    = "\t"
53
54     if status ~= "idle" and status ~= "nil" then
55         if time == "N/A" then
56             msg = "...Calculating time remaining..."
57         else
58             msg = time .. (status == "charging" and " until charged" or " remaining")
59         end
60     else
61         msg = "On AC Power"
62     end
63
64     local str = string.format("%s : %s %s (%s)\n", bat.name, mfgr, model, chem)
65                 .. string.format("\n%s \t\t\t %s", status:upper(), msg)
66
67     tpbat.notification = naughty.notify({
68         text    = str,
69         timeout = t_out,
70         screen  = client.focus and client.focus.screen or 1
71     })
72 end
73
74 function tpbat.register(args)
75     local args = args or {}
76     local timeout = args.timeout or 30
77     local battery = args.battery or "BAT0"
78     local settings = args.settings or function() end
79
80     tpbat.bat = smapi:battery(battery) -- Create a new battery
81     local bat = tpbat.bat
82
83     tpbat.widget = wibox.widget.textbox()
84
85     bat_notification_low_preset = {
86         title = "Battery low",
87         text = "Plug the cable!",
88         timeout = 15,
89         fg = "#202020",
90         bg = "#CDCDCD"
91     }
92
93     bat_notification_critical_preset = {
94         title = "Battery exhausted",
95         text = "Shutdown imminent",
96         timeout = 15,
97         fg = "#000000",
98         bg = "#FFFFFF"
99     }
100
101     if bat:get('state') == nil
102     then
103         local n = naughty.notify({
104             preset = bat_notification_low_preset,
105             title = "SMAPI Battery Warning: Unable to read battery state!",
106             text = "This widget is intended for ThinkPads. Is tp_smapi installed? Check your configs & paths.",
107             screen = client.focus and client.focus.screen or 1
108         })
109     end
110
111     function tpbat.update()
112         bat_now = {
113             status = "Not present",
114             perc   = "N/A",
115             time   = "N/A",
116             watt   = "N/A"
117         }
118
119         if bat:installed()
120         then
121             bat_now.status = bat:status() or "N/A"
122             bat_now.perc   = bat:percent()
123             bat_now.time   = bat:remaining_time()
124             -- bat_now.watt = string.format("%.2fW", (VOLTS * AMPS) / 1e12)
125
126             -- notifications for low and critical states (when discharging)
127             if bat_now.status == "discharging"
128             then
129                 if bat_now.perc <= 5
130                 then
131                     tpbat.id = naughty.notify({
132                         preset = bat_notification_critical_preset,
133                         replaces_id = tpbat.id,
134                         screen = client.focus and client.focus.screen or 1
135                     }).id
136                 elseif bat_now.perc <= 15
137                 then
138                     tpbat.id = naughty.notify({
139                         preset = bat_notification_low_preset,
140                         replaces_id = tpbat.id,
141                         screen = client.focus and client.focus.screen or 1
142                     }).id
143                 end
144             end
145
146             bat_now.perc = tostring(bat_now.perc)
147         end
148
149         widget = tpbat.widget
150
151         settings()
152     end
153
154     newtimer("tpbat-" .. bat.name, timeout, tpbat.update)
155
156     widget:connect_signal('mouse::enter', function () tpbat.show() end)
157     widget:connect_signal('mouse::leave', function () tpbat.hide() end)
158
159     return tpbat
160 end
161
162 return setmetatable(tpbat, { __call = function(_, ...) return tpbat.register(...) end })