]> git.madduck.net Git - etc/awesome.git/blob - widgets/contrib/tpbat/init.lua

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:

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