]> git.madduck.net Git - etc/awesome.git/commitdiff

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:

Merge branch 'master' of github.com:lcpz/lain
authorLuca CPZ <luca.cpz@gmail.com>
Fri, 21 Dec 2018 16:19:21 +0000 (17:19 +0100)
committerLuca CPZ <luca.cpz@gmail.com>
Fri, 21 Dec 2018 16:19:21 +0000 (17:19 +0100)
22 files changed:
layout/termfair.lua
util/init.lua
util/quake.lua
util/separators.lua
widget/alsa.lua
widget/alsabar.lua
widget/bat.lua
widget/cal.lua
widget/contrib/moc.lua
widget/contrib/redshift.lua
widget/contrib/task.lua
widget/contrib/tp_smapi.lua [new file with mode: 0644]
widget/contrib/tpbat/init.lua [deleted file]
widget/contrib/tpbat/smapi.lua [deleted file]
widget/cpu.lua
widget/imap.lua
widget/mpd.lua
widget/net.lua
widget/pulse.lua
widget/pulsebar.lua
widget/weather.lua
wiki

index f57f7158101af2daa0d37d2f841a5eb246844de0..e33894e11777ad85031ed6d9c1e21577869cc063 100644 (file)
@@ -8,9 +8,7 @@
 
 --]]
 
-local math     = { ceil  = math.ceil,
-                   floor = math.floor,
-                   max   = math.max }
+local math     = math
 local screen   = screen
 local tonumber = tonumber
 
index 8b8e719b3b7af6d835129185ae034cfe6ece0358..55bfa26a557d7676331b7472a304bae0204372e2 100644 (file)
@@ -158,9 +158,10 @@ end
 -- }}}
 
 -- On the fly useless gaps change
-function util.useless_gaps_resize(thatmuch)
-    local scr = awful.screen.focused()
-    scr.selected_tag.gap = scr.selected_tag.gap + tonumber(thatmuch)
+function util.useless_gaps_resize(thatmuch, s, t)
+    local scr = s or awful.screen.focused()
+    local tag = t or scr.selected_tag
+    tag.gap = tag.gap + tonumber(thatmuch)
     awful.layout.arrange(scr)
 end
 
index 64aaca5f956117e112e31b6b9ee4ede690283b86..01891b037aba4ea34ab4d48b7aba365b8aa48568 100644 (file)
@@ -8,13 +8,10 @@
 
 local awful        = require("awful")
 local capi         = { client = client }
-
-local math         = { floor  = math.floor }
-local string       = { format = string.format }
-
+local math         = math
+local string       = string
 local pairs        = pairs
 local screen       = screen
-
 local setmetatable = setmetatable
 
 -- Quake-like Dropdown application spawn
index 29d3005fa46f6feb2fb0ee2a2f58c8f916533e9b..465132d56193d6de9d7098c6ec66f8a948b2c040 100644 (file)
@@ -6,8 +6,8 @@
 
 --]]
 
-local wibox     = require("wibox")
-local gears     = require("gears")
+local wibox = require("wibox")
+local gears = require("gears")
 
 -- Lain Cairo separators util submodule
 -- lain.util.separators
@@ -18,14 +18,22 @@ local separators = { height = 0, width = 9 }
 -- Right
 function separators.arrow_right(col1, col2)
     local widget = wibox.widget.base.make_widget()
+    widget.col1 = col1
+    widget.col2 = col2
 
     widget.fit = function(m, w, h)
         return separators.width, separators.height
     end
 
+    widget.update = function(col1, col2)
+        widget.col1 = col1
+        widget.col2 = col2
+        widget:emit_signal("widget::redraw_needed")
+    end
+
     widget.draw = function(mycross, wibox, cr, width, height)
-        if col2 ~= "alpha" then
-            cr:set_source_rgb(gears.color.parse_color(col2))
+        if widget.col2 ~= "alpha" then
+            cr:set_source_rgb(gears.color.parse_color(widget.col2))
             cr:new_path()
             cr:move_to(0, 0)
             cr:line_to(width, height/2)
@@ -41,8 +49,8 @@ function separators.arrow_right(col1, col2)
             cr:fill()
         end
 
-        if col1 ~= "alpha" then
-            cr:set_source_rgb(gears.color.parse_color(col1))
+        if widget.col1 ~= "alpha" then
+            cr:set_source_rgb(gears.color.parse_color(widget.col1))
             cr:new_path()
             cr:move_to(0, 0)
             cr:line_to(width, height/2)
@@ -58,14 +66,22 @@ end
 -- Left
 function separators.arrow_left(col1, col2)
     local widget = wibox.widget.base.make_widget()
+    widget.col1 = col1
+    widget.col2 = col2
 
     widget.fit = function(m, w, h)
         return separators.width, separators.height
     end
 
+    widget.update = function(col1, col2)
+        widget.col1 = col1
+        widget.col2 = col2
+        widget:emit_signal("widget::redraw_needed")
+    end
+
     widget.draw = function(mycross, wibox, cr, width, height)
-        if col1 ~= "alpha" then
-            cr:set_source_rgb(gears.color.parse_color(col1))
+        if widget.col1 ~= "alpha" then
+            cr:set_source_rgb(gears.color.parse_color(widget.col1))
             cr:new_path()
             cr:move_to(width, 0)
             cr:line_to(0, height/2)
@@ -81,14 +97,14 @@ function separators.arrow_left(col1, col2)
             cr:fill()
         end
 
-        if col2 ~= "alpha" then
+        if widget.col2 ~= "alpha" then
             cr:new_path()
             cr:move_to(width, 0)
             cr:line_to(0, height/2)
             cr:line_to(width, height)
             cr:close_path()
 
-            cr:set_source_rgb(gears.color.parse_color(col2))
+            cr:set_source_rgb(gears.color.parse_color(widget.col2))
             cr:fill()
         end
    end
index 2d4891d29abb990aa12adea61d055d39c8f08efd..3b6c6d6d2e87ce69234e02a571e6c4bd9193a833 100644 (file)
@@ -9,8 +9,7 @@
 local helpers = require("lain.helpers")
 local shell   = require("awful.util").shell
 local wibox   = require("wibox")
-local string  = { match  = string.match,
-                  format = string.format }
+local string  = string
 
 -- ALSA volume
 -- lain.widget.alsa
index 557e97b8d31486116723c0ba39866adfb2d7a10d..9b9f4b97a21dec7a43bdba2a23d42d0137a11715 100644 (file)
@@ -6,15 +6,14 @@
 
 --]]
 
-local helpers        = require("lain.helpers")
-local awful          = require("awful")
-local naughty        = require("naughty")
-local wibox          = require("wibox")
-local math           = { modf   = math.modf }
-local string         = { format = string.format,
-                         match  = string.match,
-                         rep    = string.rep }
-local type, tonumber = type, tonumber
+local helpers  = require("lain.helpers")
+local awful    = require("awful")
+local naughty  = require("naughty")
+local wibox    = require("wibox")
+local math     = math
+local string   = string
+local type     = type
+local tonumber = tonumber
 
 -- ALSA volume bar
 -- lain.widget.alsabar
@@ -36,6 +35,8 @@ local function factory(args)
     local settings   = args.settings or function() end
     local width      = args.width or 63
     local height     = args.height or 1
+    local margins    = args.margins or 1
+    local paddings   = args.paddings or 1
     local ticks      = args.ticks or false
     local ticks_size = args.ticks_size or 7
 
@@ -59,12 +60,12 @@ local function factory(args)
     end
 
     alsabar.bar = wibox.widget {
-        forced_height    = height,
-        forced_width     = width,
         color            = alsabar.colors.unmute,
         background_color = alsabar.colors.background,
-        margins          = 1,
-        paddings         = 1,
+        forced_height    = height,
+        forced_width     = width,
+        margins          = margins,
+        paddings         = margins,
         ticks            = ticks,
         ticks_size       = ticks_size,
         widget           = wibox.widget.progressbar
index b65494811286e4a5e8087ef413e16e698e506ba7..5a301b50a266c1680e4d2540ef43d6da2b1525d6 100644 (file)
@@ -6,14 +6,14 @@
 
 --]]
 
-local helpers    = require("lain.helpers")
-local fs         = require("gears.filesystem")
-local naughty    = require("naughty")
-local wibox      = require("wibox")
-local math       = math
-local string     = string
-local ipairs     = ipairs
-local tonumber   = tonumber
+local helpers  = require("lain.helpers")
+local fs       = require("gears.filesystem")
+local naughty  = require("naughty")
+local wibox    = require("wibox")
+local math     = math
+local string   = string
+local ipairs   = ipairs
+local tonumber = tonumber
 
 -- Battery infos
 -- lain.widget.bat
index 326dc00e203c67fd307f6b7acce41c8a3595c82d..47e91a979889739046d314d4251da11a2f056458 100644 (file)
@@ -47,6 +47,7 @@ local function factory(args)
             strx = string.format("%s%s", string.rep(" ", 3 - tostring(x):len()), strx)
             notifytable[#notifytable+1] = string.format("%-4s%s", strx, (x+st_day)%7==0 and x ~= mth_days and "\n" or "")
         end
+        if string.len(cal.icons or "") > 0 and today then cal.icon = cal.icons .. today .. ".png" end
         cal.month, cal.year = d.month, d.year
         return notifytable
     end
@@ -78,7 +79,7 @@ local function factory(args)
         cal.notification = nil
     end
 
-    function cal.show(timeout, month, year)
+    function cal.show(timeout, month, year, scr)
         cal.notification_preset.text = tconcat(cal.build(month, year))
 
         if cal.three then
@@ -94,6 +95,7 @@ local function factory(args)
         cal.hide()
         cal.notification = naughty.notify {
             preset  = cal.notification_preset,
+            screen  = cal.followtag and awful.screen.focused() or scr or 1,
             icon    = cal.icon,
             timeout = timeout or cal.notification_preset.timeout or 5
         }
index 027cec36cb7032b5971751dd3c0cb08b378f7b83..f429c7782fb277d2a4978fb0dd06678b5d5176a6 100644 (file)
@@ -11,9 +11,8 @@ local focused      = require("awful.screen").focused
 local escape_f     = require("awful.util").escape
 local naughty      = require("naughty")
 local wibox        = require("wibox")
-local os           = { getenv = os.getenv }
-local string       = { format = string.format,
-                       gmatch = string.gmatch }
+local os           = os
+local string       = string
 
 -- MOC audio player
 -- lain.widget.contrib.moc
index 7b546116820246bd57af92812ad63fe336c2d56b..d0e5eed77f47d01d7eb623c36f16fde8fce5bb6b 100644 (file)
@@ -1,6 +1,7 @@
 --[[
 
      Licensed under GNU General Public License v2
+      * (c) 2017, Luca CPZ
       * (c) 2014, blueluke <http://github.com/blueluke>
 
 --]]
index 7e1f3d899b634d4c904e812abf935c4edd2b38d6..536e0063087abd4b5152516dbbc218be735fd7ed 100644 (file)
@@ -10,7 +10,7 @@ local markup  = require("lain.util").markup
 local awful   = require("awful")
 local naughty = require("naughty")
 local mouse   = mouse
-local string  = { format = string.format, gsub = string.gsub }
+local string  = string
 
 -- Taskwarrior notification
 -- lain.widget.contrib.task
@@ -23,11 +23,7 @@ function task.hide()
 end
 
 function task.show(scr)
-    if task.followtag then
-        task.notification_preset.screen = awful.screen.focused()
-    elseif scr then
-        task.notification_preset.screen = scr
-    end
+    task.notification_preset.screen = task.followtag and awful.screen.focused() or scr or 1
 
     helpers.async({ awful.util.shell, "-c", task.show_cmd }, function(f)
         local widget_focused = true
@@ -44,12 +40,12 @@ function task.show(scr)
 
         if widget_focused then
             task.hide()
-            task.notification = naughty.notify({
-                    preset = task.notification_preset,
-                    title  = "task next",
-                    text   = markup.font(task.notification_preset.font,
-                             awful.util.escape(f:gsub("\n*$", "")))
-                })
+            task.notification = naughty.notify {
+                preset = task.notification_preset,
+                title  = "task next",
+                text   = markup.font(task.notification_preset.font,
+                         awful.util.escape(f:gsub("\n*$", "")))
+            }
         end
     end)
 end
diff --git a/widget/contrib/tp_smapi.lua b/widget/contrib/tp_smapi.lua
new file mode 100644 (file)
index 0000000..4f43e44
--- /dev/null
@@ -0,0 +1,146 @@
+--[[
+
+     Licensed under GNU General Public License v2
+      * (c) 2018, Luca CPZ
+      * (c) 2013, Conor Heine
+
+--]]
+
+local helpers = require("lain.helpers")
+local focused = require("awful.screen").focused
+local gears   = require("gears")
+local naughty = require("naughty")
+local wibox   = require("wibox")
+local string  = string
+
+-- ThinkPad battery infos and widget creator
+-- http://www.thinkwiki.org/wiki/Tp_smapi
+-- lain.widget.contrib.tp_smapi
+
+local function factory(apipath)
+    local tp_smapi = {
+        path = apipath or "/sys/devices/platform/smapi"
+    }
+
+    function tp_smapi.get(batid, feature)
+        return helpers.first_line(string.format("%s/%s/%s", tp_smapi.path, batid or "BAT0", feature or ""))
+    end
+
+    function tp_smapi.installed(batid)
+        return tp_smapi.get(batid, "installed") == "1"
+    end
+
+    function tp_smapi.status(batid)
+        return tp_smapi.get(batid, "state")
+    end
+
+    function tp_smapi.percentage(batid)
+        return tp_smapi.get(batid, "remaining_percent")
+    end
+
+    -- either running or charging time
+    function tp_smapi.time(batid)
+        local status = tp_smapi.status(batid)
+        local mins_left = tp_smapi.get(batid, string.match(string.lower(status), "discharging") and "remaining_running_time" or "remaining_charging_time")
+        if not string.find(mins_left, "^%d+") then return "N/A" end
+        return string.format("%02d:%02d", math.floor(mins_left / 60), mins_left % 60) -- HH:mm
+    end
+
+    function tp_smapi.hide()
+        if not tp_smapi.notification then return end
+        naughty.destroy(tp_smapi.notification)
+        tp_smapi.notification = nil
+    end
+
+    function tp_smapi.show(batid, seconds, scr)
+        if not tp_smapi.installed(batid) then return end
+
+        local mfgr   = tp_smapi.get(batid, "manufacturer") or "no_mfgr"
+        local model  = tp_smapi.get(batid, "model") or "no_model"
+        local chem   = tp_smapi.get(batid, "chemistry") or "no_chem"
+        local status = tp_smapi.get(batid, "state")
+        local time   = tp_smapi.time(batid)
+        local msg    = ""
+
+        if status and status ~= "idle" then
+            msg = string.format("[%s] %s %s", status, time ~= "N/A" and time or "unknown remaining time",
+                  string.lower(status):gsub(" ", ""):gsub("\n", "") == "charging" and " until charged" or " remaining")
+        else
+            msg = "On AC power"
+        end
+
+        tp_smapi.hide()
+        tp_smapi.notification = naughty.notify {
+            title   = string.format("%s: %s %s (%s)", batid, mfgr, model, chem),
+            text    = msg,
+            timeout = seconds or 0,
+            screen  = scr or focused()
+        }
+    end
+
+    function tp_smapi.create_widget(args)
+        local args      = args or {}
+        local pspath    = args.pspath or "/sys/class/power_supply/"
+        local batteries = args.batteries or (args.battery and {args.battery}) or {}
+        local timeout   = args.timeout or 30
+        local settings  = args.settings or function() end
+
+        if #batteries == 0 then
+            helpers.line_callback("ls -1 " .. pspath, function(line)
+                local bstr = string.match(line, "BAT%w+")
+                if bstr then batteries[#batteries + 1] = bstr end
+            end)
+        end
+
+        local all_batteries_installed = true
+
+        for i, battery in ipairs(batteries) do
+            if not tp_smapi.installed(battery) then
+                naughty.notify {
+                    preset = naughty.config.critical,
+                    title  = "tp_smapi: error while creating widget",
+                    text   = string.format("battery %s is not installed", battery)
+                }
+                all_batteries_installed = false
+                break
+            end
+        end
+
+        if not all_batteries_installed then return end
+
+        tpbat = {
+            batteries = batteries,
+            widget    = args.widget or wibox.widget.textbox()
+        }
+
+        function tpbat.update()
+            tpbat_now = {
+                n_status = {},
+                n_perc   = {},
+                n_time   = {},
+                status   = "N/A"
+            }
+
+            for i = 1, #batteries do
+                tpbat_now.n_status[i] = tp_smapi.status(batteries[i]) or "N/A"
+                tpbat_now.n_perc[i] = tp_smapi.percentage(batteries[i])
+                tpbat_now.n_time[i] = tp_smapi.time(batteries[i]) or "N/A"
+
+                if not tpbat_now.n_status[i]:lower():match("full") then
+                    tpbat_now.status = tpbat_now.n_status[i]
+                end
+            end
+
+            widget = tpbat.widget -- backwards compatibility
+            settings()
+        end
+
+        helpers.newtimer("thinkpad-batteries", timeout, tpbat.update)
+
+        return tpbat
+    end
+
+    return tp_smapi
+end
+
+return factory
diff --git a/widget/contrib/tpbat/init.lua b/widget/contrib/tpbat/init.lua
deleted file mode 100644 (file)
index c62acd1..0000000
+++ /dev/null
@@ -1,163 +0,0 @@
---[[
-
-     tpbat.lua
-     Battery status widget for ThinkPad laptops that use SMAPI
-     lain.widget.contrib.tpbat
-
-     More on tp_smapi: http://www.thinkwiki.org/wiki/Tp_smapi
-
-     Licensed under GNU General Public License v2
-      * (c) 2013,      Conor Heine
-      * (c) 2013,      Luca CPZ
-      * (c) 2010-2012, Peter Hofmann
-
---]]
-
-local debug        = { getinfo = debug.getinfo }
-local newtimer     = require("lain.helpers").newtimer
-local first_line   = require("lain.helpers").first_line
-local naughty      = require("naughty")
-local wibox        = require("wibox")
-local string       = { format = string.format }
-local math         = { floor = math.floor }
-local tostring     = tostring
-local setmetatable = setmetatable
-package.path       = debug.getinfo(1,"S").source:match[[^@?(.*[\/])[^\/]-$]] .. "?.lua;" .. package.path
-local smapi        = require("smapi")
-
--- ThinkPad SMAPI-enabled battery info widget
--- lain.widget.contrib.tpbat
-local tpbat = {}
-
-function tpbat.hide()
-    if not tpbat.notification then return end
-    naughty.destroy(tpbat.notification)
-    tpbat.notification = nil
-end
-
-function tpbat.show(t_out)
-    tpbat.hide()
-
-    local bat = tpbat.bat
-
-    if bat == nil or not bat:installed() then return end
-
-    local t_out = t_out or 0
-    local mfgr   = bat:get('manufacturer') or "no_mfgr"
-    local model  = bat:get('model') or "no_model"
-    local chem   = bat:get('chemistry') or "no_chem"
-    local status = bat:get('state') or "nil"
-    local time   = bat:remaining_time()
-    local msg    = "\t"
-
-    if status ~= "idle" and status ~= "nil" then
-        if time == "N/A" then
-            msg = "...Calculating time remaining..."
-        else
-            msg = time .. (status == "charging" and " until charged" or " remaining")
-        end
-    else
-        msg = "On AC Power"
-    end
-
-    local str = string.format("%s : %s %s (%s)\n", bat.name, mfgr, model, chem)
-                .. string.format("\n%s \t\t\t %s", status:upper(), msg)
-
-    tpbat.notification = naughty.notify({
-        text    = str,
-        timeout = t_out,
-        screen  = client.focus and client.focus.screen or 1
-    })
-end
-
-function tpbat.register(args)
-    local args = args or {}
-    local timeout = args.timeout or 30
-    local battery = args.battery or "BAT0"
-    local bat_low_perc = args.bat_low_perc or 15
-    local bat_critical_perc = args.bat_critical_perc or 5
-    local settings = args.settings or function() end
-
-    tpbat.bat = smapi:battery(battery) -- Create a new battery
-    local bat = tpbat.bat
-
-    tpbat.widget = wibox.widget.textbox()
-
-    bat_notification_low_preset = {
-        title = "Battery low",
-        text = "Plug the cable!",
-        timeout = 15,
-        fg = "#202020",
-        bg = "#CDCDCD"
-    }
-
-    bat_notification_critical_preset = {
-        title = "Battery exhausted",
-        text = "Shutdown imminent",
-        timeout = 15,
-        fg = "#000000",
-        bg = "#FFFFFF"
-    }
-
-    if bat:get('state') == nil
-    then
-        local n = naughty.notify({
-            preset = bat_notification_low_preset,
-            title = "SMAPI Battery Warning: Unable to read battery state!",
-            text = "This widget is intended for ThinkPads. Is tp_smapi installed? Check your configs & paths.",
-            screen = client.focus and client.focus.screen or 1
-        })
-    end
-
-    function tpbat.update()
-        bat_now = {
-            status = "Not present",
-            perc   = "N/A",
-            time   = "N/A",
-            watt   = "N/A"
-        }
-
-        if bat:installed()
-        then
-            bat_now.status = bat:status() or "N/A"
-            bat_now.perc   = bat:percent()
-            bat_now.time   = bat:remaining_time()
-            -- bat_now.watt = string.format("%.2fW", (VOLTS * AMPS) / 1e12)
-
-            -- notifications for low and critical states (when discharging)
-            if bat_now.status == "discharging"
-            then
-                if bat_now.perc <= bat_critical_perc
-                then
-                    tpbat.id = naughty.notify({
-                        preset = bat_notification_critical_preset,
-                        replaces_id = tpbat.id,
-                        screen = client.focus and client.focus.screen or 1
-                    }).id
-                elseif bat_now.perc <= bat_low_perc
-                then
-                    tpbat.id = naughty.notify({
-                        preset = bat_notification_low_preset,
-                        replaces_id = tpbat.id,
-                        screen = client.focus and client.focus.screen or 1
-                    }).id
-                end
-            end
-
-            bat_now.perc = tostring(bat_now.perc)
-        end
-
-        widget = tpbat.widget
-
-        settings()
-    end
-
-    newtimer("tpbat-" .. bat.name, timeout, tpbat.update)
-
-    widget:connect_signal('mouse::enter', function () tpbat.show() end)
-    widget:connect_signal('mouse::leave', function () tpbat.hide() end)
-
-    return tpbat
-end
-
-return setmetatable(tpbat, { __call = function(_, ...) return tpbat.register(...) end })
diff --git a/widget/contrib/tpbat/smapi.lua b/widget/contrib/tpbat/smapi.lua
deleted file mode 100644 (file)
index a8867e4..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
---[[
-
-     smapi.lua
-     Interface with thinkpad battery information
-
-     Licensed under GNU General Public License v2
-      * (c) 2013, Conor Heine
-
---]]
-
-local first_line   = require("lain.helpers").first_line
-
-local string       = { format = string.format }
-local tonumber     = tonumber
-local setmetatable = setmetatable
-
-local smapi = {}
-local apipath = "/sys/devices/platform/smapi"
-
--- Most are readable values, but some can be written to (not implemented, yet?)
-local readable = {
-    barcoding                  = true,
-    charging_max_current       = true,
-    charging_max_voltage       = true,
-    chemistry                  = true,
-    current_avg                = true,
-    current_now                = true,
-    cycle_count                = true,
-    design_capacity            = true,
-    design_voltage             = true,
-    dump                       = true,
-    first_use_date             = true,
-    force_discharge            = false,
-    group0_voltage             = true,
-    group1_voltage             = true,
-    group2_voltage             = true,
-    group3_voltage             = true,
-    inhibit_charge_minutes     = false,
-    installed                  = true,
-    last_full_capacity         = true,
-    manufacture_date           = true,
-    manufacturer               = true,
-    model                      = true,
-    power_avg                  = true,
-    power_now                  = true,
-    remaining_capacity         = true,
-    remaining_charging_time    = true,
-    remaining_percent          = true,
-    remaining_percent_error    = true,
-    remaining_running_time     = true,
-    remaining_running_time_now = true,
-    serial                     = true,
-    start_charge_thresh        = false,
-    state                      = true,
-    stop_charge_thresh         = false,
-    temperature                = true,
-    voltage                    = true
-}
-
-function smapi:battery(name)
-    local bat = {}
-
-    bat.name = name
-    bat.path = apipath .. "/" .. name
-
-    function bat:get(item)
-        return self.path ~= nil and readable[item] and first_line(self.path .. "/" .. item) or nil
-    end
-
-    function bat:installed()
-        return self:get("installed") == "1"
-    end
-
-    function bat:status()
-        return self:get('state')
-    end
-
-    -- Remaining time can either be time until battery dies or time until charging completes
-    function bat:remaining_time()
-        local time_val = bat_now.status == 'discharging' and 'remaining_running_time' or 'remaining_charging_time'
-        local mins_left = self:get(time_val)
-
-        if not mins_left:find("^%d+") then return "N/A" end
-
-        local hrs = math.floor(mins_left / 60)
-        local min = mins_left % 60
-
-        return string.format("%02d:%02d", hrs, min)
-    end
-
-    function bat:percent()
-        return tonumber(self:get("remaining_percent"))
-    end
-
-    return setmetatable(bat, {__metatable = false, __newindex = false})
-end
-
-return smapi
index 6c6e77a9cde04826c9fb5bb76f3b3a3f85253c01..81638c280eda1c2539ef9923db8cd2bb76b8ce6e 100644 (file)
@@ -8,9 +8,8 @@
 
 local helpers  = require("lain.helpers")
 local wibox    = require("wibox")
-local math     = { ceil   = math.ceil }
-local string   = { format = string.format,
-                   gmatch = string.gmatch }
+local math     = math
+local string   = string
 local tostring = tostring
 
 -- CPU usage
index 7e83d36e46d798debfcfe30dcc69fd19e1c3cfde..b3d9dc7d0d65965a1eea3bcb841cedefa763c2cd 100644 (file)
@@ -17,63 +17,75 @@ local tonumber = tonumber
 -- lain.widget.imap
 
 local function factory(args)
-    local imap      = { widget = wibox.widget.textbox() }
-    local args      = args or {}
-    local server    = args.server
-    local mail      = args.mail
-    local password  = args.password
-    local port      = args.port or 993
-    local timeout   = args.timeout or 60
-    local is_plain  = args.is_plain or false
-    local followtag = args.followtag or false
-    local notify    = args.notify or "on"
-    local settings  = args.settings or function() end
+    local imap       = { widget = wibox.widget.textbox() }
+    local args       = args or {}
+    local server     = args.server
+    local mail       = args.mail
+    local password   = args.password
+    local port       = args.port or 993
+    local timeout    = args.timeout or 60
+    local pwdtimeout = args.pwdtimeout or 10
+    local is_plain   = args.is_plain or false
+    local followtag  = args.followtag or false
+    local notify     = args.notify or "on"
+    local settings   = args.settings or function() end
 
     local head_command = "curl --connect-timeout 3 -fsm 3"
-    local request = "-X 'SEARCH (UNSEEN)'"
+    local request = "-X 'STATUS INBOX (MESSAGES RECENT UNSEEN)'"
 
     if not server or not mail or not password then return end
 
+    mail_notification_preset = {
+        icon     = helpers.icons_dir .. "mail.png",
+        position = "top_left"
+    }
+
     helpers.set_map(mail, 0)
 
     if not is_plain then
         if type(password) == "string" or type(password) == "table" then
             helpers.async(password, function(f) password = f:gsub("\n", "") end)
         elseif type(password) == "function" then
-            local p = password()
+            imap.pwdtimer = helpers.newtimer(mail .. "-password", pwdtimeout, function()
+                local retrieved_password, try_again = password()
+                if not try_again then
+                    imap.pwdtimer:stop() -- stop trying to retrieve
+                    password = retrieved_password or "" -- failsafe
+                end
+            end, true, true)
         end
     end
 
-    function update()
-        mail_notification_preset = {
-            icon     = helpers.icons_dir .. "mail.png",
-            position = "top_left"
-        }
-
-        if followtag then
-            mail_notification_preset.screen = awful.screen.focused()
-        end
+    function imap.update()
+        -- do not update if the password has not been retrieved yet
+        if type(password) ~= "string" then return end
 
-        local curl = string.format("%s --url imaps://%s:%s/INBOX -u %s:%q %s -k",
+        local curl = string.format("%s --url imaps://%s:%s/INBOX -u %s:'%s' %s -k",
                      head_command, server, port, mail, password, request)
 
         helpers.async(curl, function(f)
-            mailcount = tonumber(f:match("UNSEEN (%d+)"))
+            imap_now = { ["MESSAGES"] = 0, ["RECENT"] = 0, ["UNSEEN"] = 0 }
+
+            for s,d in f:gmatch("(%w+)%s+(%d+)") do imap_now[s] = tonumber(d) end
+            mailcount = imap_now["UNSEEN"] -- backwards compatibility
             widget = imap.widget
+
             settings()
 
             if notify == "on" and mailcount and mailcount >= 1 and mailcount > helpers.get_map(mail) then
-                local nt = mail .. " has <b>" .. mailcount .. "</b> new message"
-                if mailcount >= 1 then nt = nt .. "s" end
-                naughty.notify { preset = mail_notification_preset, text = nt }
+                if followtag then mail_notification_preset.screen = awful.screen.focused() end
+                naughty.notify {
+                    preset = mail_notification_preset,
+                    text   = string.format("%s has <b>%d</b> new message%s", mail, mailcount, mailcount == 1 and "" or "s")
+                }
             end
 
-            helpers.set_map(mail, mailcount)
+            helpers.set_map(mail, imap_now["UNSEEN"])
         end)
 
     end
 
-    imap.timer = helpers.newtimer(mail, timeout, update, true, true)
+    imap.timer = helpers.newtimer(mail, timeout, imap.update, true, true)
 
     return imap
 end
index ff451797e96924ddac126c435db7311ebdf1ef99..01f28e633e271c0fc617e7af454d2ab4c6732ad7 100644 (file)
@@ -6,16 +6,14 @@
 
 --]]
 
-local helpers      = require("lain.helpers")
-local shell        = require("awful.util").shell
-local escape_f     = require("awful.util").escape
-local focused      = require("awful.screen").focused
-local naughty      = require("naughty")
-local wibox        = require("wibox")
-local os           = { getenv = os.getenv }
-local string       = { format = string.format,
-                       gmatch = string.gmatch,
-                       match  = string.match }
+local helpers  = require("lain.helpers")
+local shell    = require("awful.util").shell
+local escape_f = require("awful.util").escape
+local focused  = require("awful.screen").focused
+local naughty  = require("naughty")
+local wibox    = require("wibox")
+local os       = os
+local string   = string
 
 -- MPD infos
 -- lain.widget.mpd
index 987f047ec3137da0dd15164c5ceff1dd6638ed86..805b5778f1199caad96390e9cf7f4ccc8f548a01 100644 (file)
@@ -9,7 +9,7 @@
 local helpers = require("lain.helpers")
 local naughty = require("naughty")
 local wibox   = require("wibox")
-local string  = { format = string.format, match = string.match }
+local string  = string
 
 -- Network infos
 -- lain.widget.net
index d37e83aca12e0ab0d2e537118481ae6d85183412..f63fe55c3b146b548a348176b9d05d44112a1796 100644 (file)
@@ -8,10 +8,8 @@
 local helpers = require("lain.helpers")
 local shell   = require("awful.util").shell
 local wibox   = require("wibox")
-local string  = { gmatch = string.gmatch,
-                  match  = string.match,
-                  format = string.format }
-local type = type
+local string  = string
+local type    = type
 
 -- PulseAudio volume
 -- lain.widget.pulse
index 158e639cb9e17a2e893beb0304e3e7068dfbfe68..317468f46ce6e90c462c670e719ffcbb81825240 100644 (file)
@@ -6,16 +6,14 @@
 
 --]]
 
-local helpers        = require("lain.helpers")
-local awful          = require("awful")
-local naughty        = require("naughty")
-local wibox          = require("wibox")
-local math           = { modf   = math.modf }
-local string         = { format = string.format,
-                         match  = string.match,
-                         gmatch = string.gmatch,
-                         rep    = string.rep }
-local type, tonumber = type, tonumber
+local helpers  = require("lain.helpers")
+local awful    = require("awful")
+local naughty  = require("naughty")
+local wibox    = require("wibox")
+local math     = math
+local string   = string
+local type     = type
+local tonumber = tonumber
 
 -- PulseAudio volume bar
 -- lain.widget.pulsebar
@@ -37,7 +35,9 @@ local function factory(args)
     local timeout    = args.timeout or 5
     local settings   = args.settings or function() end
     local width      = args.width or 63
-    local height     = args.heigth or 1
+    local height     = args.height or 1
+    local margins    = args.margins or 1
+    local paddings   = args.paddings or 1
     local ticks      = args.ticks or false
     local ticks_size = args.ticks_size or 7
 
@@ -54,12 +54,12 @@ local function factory(args)
     end
 
     pulsebar.bar = wibox.widget {
-        forced_height    = height,
-        forced_width     = width,
         color            = pulsebar.colors.unmute,
         background_color = pulsebar.colors.background,
-        margins          = 1,
-        paddings         = 1,
+        forced_height    = height,
+        forced_width     = width,
+        margins          = margins,
+        paddings         = paddings,
         ticks            = ticks,
         ticks_size       = ticks_size,
         widget           = wibox.widget.progressbar,
index a9b886a12f9ea3df7774595e8b96c18f00bcb45f..f35ca68b2e72ffb7e6326744197753d117ffcc62 100644 (file)
@@ -10,8 +10,10 @@ local json     = require("lain.util").dkjson
 local focused  = require("awful.screen").focused
 local naughty  = require("naughty")
 local wibox    = require("wibox")
-
-local math, os, string, tonumber = math, os, string, tonumber
+local math     = math
+local os       = os
+local string   = string
+local tonumber = tonumber
 
 -- OpenWeatherMap
 -- current weather and X-days forecast
diff --git a/wiki b/wiki
index 1acb69eb3cf431b9102978c6117144980e8a2939..11ea6b6bc6661396e6d29f362f94c5561a94eb44 160000 (submodule)
--- a/wiki
+++ b/wiki
@@ -1 +1 @@
-Subproject commit 1acb69eb3cf431b9102978c6117144980e8a2939
+Subproject commit 11ea6b6bc6661396e6d29f362f94c5561a94eb44