From: copycat-killer Date: Mon, 19 Oct 2015 17:37:39 +0000 (+0200) Subject: Merge branch 'master' of github.com:copycat-killer/lain X-Git-Url: https://git.madduck.net/etc/awesome.git/commitdiff_plain/98977a1888c57a00dbefcbf83c4e598daeab33aa?hp=69ec77e16aa8188062f74ceae785e9f9460006e6 Merge branch 'master' of github.com:copycat-killer/lain --- diff --git a/helpers.lua b/helpers.lua index 4e90e16..503c40e 100644 --- a/helpers.lua +++ b/helpers.lua @@ -76,10 +76,16 @@ end helpers.timer_table = {} -function helpers.newtimer(name, timeout, fun, nostart) - helpers.timer_table[name] = capi.timer({ timeout = timeout }) +function helpers.newtimer(_name, timeout, fun, nostart) + local name = timeout + + if not helpers.timer_table[name] then + helpers.timer_table[name] = capi.timer({ timeout = timeout }) + helpers.timer_table[name]:start() + end + helpers.timer_table[name]:connect_signal("timeout", fun) - helpers.timer_table[name]:start() + if not nostart then helpers.timer_table[name]:emit_signal("timeout") end diff --git a/widgets/abase.lua b/widgets/abase.lua index 98f7818..87af872 100644 --- a/widgets/abase.lua +++ b/widgets/abase.lua @@ -6,9 +6,9 @@ --]] -local newtimer = require("lain.helpers").newtimer -local async = require("lain.asyncshell") -local wibox = require("wibox") +local helpers = require("lain.helpers") +local async = require("lain.asyncshell") +local wibox = require("wibox") local setmetatable = setmetatable @@ -19,21 +19,26 @@ local setmetatable = setmetatable local function worker(args) local abase = {} local args = args or {} - local timeout = args.timeout or 5 + local timeout = args.timeout or 1 local cmd = args.cmd or "" local settings = args.settings or function() end abase.widget = wibox.widget.textbox('') + helpers.set_map(cmd, '') function abase.update() async.request(cmd, function(f) output = f - widget = abase.widget - settings() + + if helpers.get_map(cmd) ~= output then + widget = abase.widget + settings() + helpers.set_map(cmd, output) + end end) end - newtimer(cmd, timeout, abase.update) + helpers.newtimer(cmd, timeout, abase.update) return setmetatable(abase, { __index = abase.widget }) end diff --git a/widgets/alsa.lua b/widgets/alsa.lua index 85d5311..0bb2059 100644 --- a/widgets/alsa.lua +++ b/widgets/alsa.lua @@ -19,11 +19,14 @@ local setmetatable = setmetatable -- ALSA volume -- lain.widgets.alsa -local alsa = {} +local alsa = { + level = "0", + status = "off", +} local function worker(args) local args = args or {} - local timeout = args.timeout or 5 + local timeout = args.timeout or 1 local settings = args.settings or function() end alsa.cmd = args.cmd or "amixer" @@ -54,8 +57,14 @@ local function worker(args) end end - widget = alsa.widget - settings() + if alsa.level ~= volume_now.level or alsa.status ~= volume_now.status + then + widget = alsa.widget + settings() + + alsa.level = volume_now.level + alsa.status = volume_now.status + end end timer_id = string.format("alsa-%s-%s", alsa.cmd, alsa.channel) diff --git a/widgets/alsabar.lua b/widgets/alsabar.lua index c7498d2..fc45c72 100644 --- a/widgets/alsabar.lua +++ b/widgets/alsabar.lua @@ -47,7 +47,8 @@ local alsabar = { }, _current_level = 0, - _muted = false + _muted = false, + _status = "off" } function alsabar.notify() @@ -56,7 +57,7 @@ function alsabar.notify() local preset = { title = "", text = "", - timeout = 5, + timeout = 1, screen = alsabar.notifications.screen, font = alsabar.notifications.font .. " " .. alsabar.notifications.font_size, @@ -94,7 +95,7 @@ end local function worker(args) local args = args or {} - local timeout = args.timeout or 5 + local timeout = args.timeout or 1 local settings = args.settings or function() end local width = args.width or 63 local height = args.heigth or 1 @@ -127,28 +128,33 @@ local function worker(args) -- Capture mixer control state: [5%] ... ... [on] local volu, mute = string.match(mixer, "([%d]+)%%.*%[([%l]*)") - if volu == nil then - volu = 0 - mute = "off" - end + volu = tonumber(volu) or 0 + if mute == "" then mute = "off" - alsabar._current_level = tonumber(volu) - alsabar.bar:set_value(alsabar._current_level / 100) - if not mute and tonumber(volu) == 0 or mute == "off" - then - alsabar._muted = true - alsabar.tooltip:set_text (" [Muted] ") - alsabar.bar:set_color(alsabar.colors.mute) - else - alsabar._muted = false - alsabar.tooltip:set_text(string.format(" %s:%s ", alsabar.channel, volu)) - alsabar.bar:set_color(alsabar.colors.unmute) - end + if alsabar._current_level ~= volu or alsabar._status ~= mute then + + alsabar._current_level = volu + alsabar._status = mute + + alsabar.bar:set_value(alsabar._current_level / 100) - volume_now = {} - volume_now.level = tonumber(volu) - volume_now.status = mute - settings() + if not mute and volu == 0 or mute == "off" + then + alsabar._muted = true + alsabar.tooltip:set_text (" [Muted] ") + alsabar.bar:set_color(alsabar.colors.mute) + else + alsabar._muted = false + alsabar.tooltip:set_text(string.format(" %s:%s ", alsabar.channel, volu)) + alsabar.bar:set_color(alsabar.colors.unmute) + end + + volume_now = {} + volume_now.level = volu + volume_now.status = mute + + settings() + end end alsabar.bar:buttons (awful.util.table.join ( diff --git a/widgets/base.lua b/widgets/base.lua index 2f377f7..88478b0 100644 --- a/widgets/base.lua +++ b/widgets/base.lua @@ -6,9 +6,7 @@ --]] -local newtimer = require("lain.helpers").newtimer -local read_pipe = require("lain.helpers").read_pipe - +local helpers = require("lain.helpers") local wibox = require("wibox") local setmetatable = setmetatable @@ -19,19 +17,24 @@ local setmetatable = setmetatable local function worker(args) local base = {} local args = args or {} - local timeout = args.timeout or 5 + local timeout = args.timeout or 1 local cmd = args.cmd or "" local settings = args.settings or function() end base.widget = wibox.widget.textbox('') + helpers.set_map(cmd, '') function base.update() - output = read_pipe(cmd) - widget = base.widget - settings() + output = helpers.read_pipe(cmd) + + if helpers.get_map(cmd) ~= output then + widget = base.widget + settings() + helpers.set_map(cmd, output) + end end - newtimer(cmd, timeout, base.update) + helpers.newtimer(cmd, timeout, base.update) return setmetatable(base, { __index = base.widget }) end diff --git a/widgets/bat.lua b/widgets/bat.lua index 61828ec..d18af87 100644 --- a/widgets/bat.lua +++ b/widgets/bat.lua @@ -7,9 +7,7 @@ --]] -local newtimer = require("lain.helpers").newtimer -local first_line = require("lain.helpers").first_line - +local helpers = require("lain.helpers") local naughty = require("naughty") local wibox = require("wibox") @@ -48,6 +46,11 @@ local function worker(args) bg = "#FFFFFF" } + helpers.set_map(battery .. "status", "N/A") + helpers.set_map(battery .. "perc", "N/A") + helpers.set_map(battery .. "time", "N/A") + helpers.set_map(battery .. "watt", "N/A") + function update() bat_now = { status = "Not present", @@ -58,22 +61,22 @@ local function worker(args) local bstr = "/sys/class/power_supply/" .. battery - local present = first_line(bstr .. "/present") + local present = helpers.first_line(bstr .. "/present") if present == "1" then - local rate = first_line(bstr .. "/power_now") or - first_line(bstr .. "/current_now") + local rate = helpers.first_line(bstr .. "/power_now") or + helpers.first_line(bstr .. "/current_now") - local ratev = first_line(bstr .. "/voltage_now") + local ratev = helpers.first_line(bstr .. "/voltage_now") - local rem = first_line(bstr .. "/energy_now") or - first_line(bstr .. "/charge_now") + local rem = helpers.first_line(bstr .. "/energy_now") or + helpers.first_line(bstr .. "/charge_now") - local tot = first_line(bstr .. "/energy_full") or - first_line(bstr .. "/charge_full") + local tot = helpers.first_line(bstr .. "/energy_full") or + helpers.first_line(bstr .. "/charge_full") - bat_now.status = first_line(bstr .. "/status") or "N/A" + bat_now.status = helpers.first_line(bstr .. "/status") or "N/A" rate = tonumber(rate) or 1 ratev = tonumber(ratev) @@ -97,7 +100,7 @@ local function worker(args) bat_now.time = string.format("%02d:%02d", hrs, min) - bat_now.perc = first_line(bstr .. "/capacity") + bat_now.perc = helpers.first_line(bstr .. "/capacity") if not bat_now.perc then local perc = (rem / tot) * 100 @@ -115,11 +118,21 @@ local function worker(args) else bat_now.watt = "N/A" end - end - widget = bat.widget - settings() + if bat_now.status ~= helpers.get_map(battery .. "status") + or bat_now.perc ~= helpers.get_map(battery .. "perc") + or bat_now.time ~= helpers.get_map(battery .. "time") + or bat_now.watt ~= helpers.get_map(battery .. "watt") + then + widget = bat.widget + settings() + + helpers.set_map(battery .. "status", bat_now.status) + helpers.set_map(battery .. "perc", bat_now.perc) + helpers.set_map(battery .. "time", bat_now.time) + helpers.set_map(battery .. "watt", bat_now.watt) + end -- notifications for low and critical states if bat_now.status == "Discharging" and notify == "on" and bat_now.perc ~= nil @@ -141,9 +154,9 @@ local function worker(args) end end - newtimer(battery, timeout, update) + helpers.newtimer(battery, timeout, update) - return setmetatable(bat, { __index = bat.widget }) + return bat.widget end -return setmetatable({}, { __call = function(_, ...) return worker(...) end }) +return setmetatable(bat, { __call = function(_, ...) return worker(...) end }) diff --git a/widgets/cpu.lua b/widgets/cpu.lua index ec84101..1554443 100644 --- a/widgets/cpu.lua +++ b/widgets/cpu.lua @@ -7,16 +7,13 @@ --]] -local first_line = require("lain.helpers").first_line -local newtimer = require("lain.helpers").newtimer - +local helpers = require("lain.helpers") local wibox = require("wibox") local math = { ceil = math.ceil } local string = { format = string.format, gmatch = string.gmatch } local tostring = tostring - local setmetatable = setmetatable -- CPU usage @@ -28,16 +25,18 @@ local cpu = { local function worker(args) local args = args or {} - local timeout = args.timeout or 2 + local timeout = args.timeout or 1 local settings = args.settings or function() end cpu.widget = wibox.widget.textbox('') + helpers.set_map("cpuactive", 0) + helpers.set_map("cputotal", 0) function update() -- Read the amount of time the CPUs have spent performing -- different kinds of work. Read the first line of /proc/stat -- which is the sum of all CPUs. - local times = first_line("/proc/stat") + local times = helpers.first_line("/proc/stat") local at = 1 local idle = 0 local total = 0 @@ -54,22 +53,26 @@ local function worker(args) end local active = total - idle - -- Read current data and calculate relative values. - local dactive = active - cpu.last_active - local dtotal = total - cpu.last_total + if helpers.get_map("cpuactive") ~= active + or helpers.get_map("cputotal") ~= total + then + -- Read current data and calculate relative values. + local dactive = active - cpu.last_active + local dtotal = total - cpu.last_total - cpu_now = {} - cpu_now.usage = tostring(math.ceil((dactive / dtotal) * 100)) + cpu_now = {} + cpu_now.usage = tostring(math.ceil((dactive / dtotal) * 100)) - widget = cpu.widget - settings() + widget = cpu.widget + settings() - -- Save current data for the next run. - cpu.last_active = active - cpu.last_total = total + -- Save current data for the next run. + helpers.set_map("cpuactive", active) + helpers.set_map("cputotal", total) + end end - newtimer("cpu", timeout, update) + helpers.newtimer("cpu", timeout, update) return cpu.widget end diff --git a/widgets/fs.lua b/widgets/fs.lua index a1d5d95..8b2886b 100644 --- a/widgets/fs.lua +++ b/widgets/fs.lua @@ -26,7 +26,8 @@ local setmetatable = setmetatable -- File system disk space usage -- lain.widgets.fs local fs = {} -local fs_notification = nil + +local fs_notification = nil function fs:hide() if fs_notification ~= nil then @@ -41,11 +42,11 @@ function fs:show(t_out) local ws = helpers.read_pipe(helpers.scripts_dir .. "dfs"):gsub("\n*$", "") if fs.followmouse then - fs.notification_preset.screen = mouse.screen + fs_notification_preset.screen = mouse.screen end fs_notification = naughty.notify({ - preset = fs.notification_preset, + preset = fs_notification_preset, text = ws, timeout = t_out }) @@ -66,6 +67,7 @@ local function worker(args) fs.widget = wibox.widget.textbox('') helpers.set_map(partition, false) + helpers.set_map("fsused", 0) function update() fs_info = {} @@ -92,8 +94,11 @@ local function worker(args) fs_now.size_mb = tonumber(fs_info[partition .. " size_mb"]) or 0 fs_now.size_gb = tonumber(fs_info[partition .. " size_gb"]) or 0 - widget = fs.widget - settings() + if helpers.get_map("fsused") ~= fs_now.used then + widget = fs.widget + settings() + helpers.set_map("fsused", fs_now.used) + end if fs_now.used >= 99 and not helpers.get_map(partition) then diff --git a/widgets/imap.lua b/widgets/imap.lua index ea763df..350e1ad 100644 --- a/widgets/imap.lua +++ b/widgets/imap.lua @@ -65,8 +65,10 @@ local function worker(args) _, mailcount = string.gsub(f, "%d+", "") _ = nil - widget = imap.widget - settings() + if mailcount ~= helpers.get_map(mail) then + widget = imap.widget + settings() + end if mailcount >= 1 and mailcount > helpers.get_map(mail) then diff --git a/widgets/maildir.lua b/widgets/maildir.lua index eed6138..8cb821d 100644 --- a/widgets/maildir.lua +++ b/widgets/maildir.lua @@ -25,7 +25,7 @@ local setmetatable = setmetatable -- Maildir check -- lain.widgets.maildir -local maildir = {} +local maildir = { total = 0 } local function worker(args) local args = args or {} @@ -65,7 +65,7 @@ local function worker(args) end until line == nil - p:close() + p:close() table.sort(boxes) newmail = "no mail" @@ -88,8 +88,10 @@ local function worker(args) end end - widget = maildir.widget - settings() + if maildir.total ~= total then + widget = maildir.widget + settings() + end end newtimer(mailpath, timeout, update, true) diff --git a/widgets/mem.lua b/widgets/mem.lua index f6213b2..dc72279 100644 --- a/widgets/mem.lua +++ b/widgets/mem.lua @@ -7,27 +7,33 @@ --]] -local newtimer = require("lain.helpers").newtimer +local helpers = require("lain.helpers") +local wibox = require("wibox") -local wibox = require("wibox") +local io = { lines = io.lines } +local math = { floor = math.floor } +local string = { gmatch = string.gmatch } -local io = { lines = io.lines } -local math = { floor = math.floor } -local string = { gmatch = string.gmatch } +local setmetatable = setmetatable -local setmetatable = setmetatable - --- Memory usage (ignoring caches) +-- Memory usage -- lain.widgets.mem local mem = {} local function worker(args) local args = args or {} - local timeout = args.timeout or 2 + local timeout = args.timeout or 1 local settings = args.settings or function() end mem.widget = wibox.widget.textbox('') + helpers.set_map("mem_last_total", 0) + helpers.set_map("mem_last_free", 0) + helpers.set_map("mem_last_buf", 0) + helpers.set_map("mem_last_cache", 0) + helpers.set_map("mem_last_swap", 0) + helpers.set_map("mem_last_swapf", 0) + function update() mem_now = {} for line in io.lines("/proc/meminfo") @@ -44,14 +50,29 @@ local function worker(args) end end - mem_now.used = mem_now.total - (mem_now.free + mem_now.buf + mem_now.cache) - mem_now.swapused = mem_now.swap - mem_now.swapf + if mem_now.total ~= helpers.set_map("mem_last_total") + or mem_now.free ~= helpers.set_map("mem_last_free") + or mem_now.buf ~= helpers.set_map("mem_last_buf") + or mem_now.cache ~= helpers.set_map("mem_last_cache") + or mem_now.swap ~= helpers.set_map("mem_last_swap") + or mem_now.swapf ~= helpers.set_map("mem_last_swapf") + then + mem_now.used = mem_now.total - (mem_now.free + mem_now.buf + mem_now.cache) + mem_now.swapused = mem_now.swap - mem_now.swapf - widget = mem.widget - settings() + widget = mem.widget + settings() + + helpers.set_map("mem_last_total", mem_now.total) + helpers.set_map("mem_last_free", mem_now.free) + helpers.set_map("mem_last_buf", mem_now.buf) + helpers.set_map("mem_last_cache", mem_now.cache) + helpers.set_map("mem_last_swap", mem_now.swap) + helpers.set_map("mem_last_swapf", mem_now.swapf) + end end - newtimer("mem", timeout, update) + helpers.newtimer("mem", timeout, update) return mem.widget end diff --git a/widgets/mpd.lua b/widgets/mpd.lua index c437347..1d2c617 100644 --- a/widgets/mpd.lua +++ b/widgets/mpd.lua @@ -30,7 +30,7 @@ local mpd = {} local function worker(args) local args = args or {} - local timeout = args.timeout or 2 + local timeout = args.timeout or 1 local password = args.password or "" local host = args.host or "127.0.0.1" local port = args.port or "6600" @@ -49,10 +49,11 @@ local function worker(args) mpd_notification_preset = { title = "Now playing", - timeout = 6 + timeout = 5 } - helpers.set_map("current mpd track", nil) + helpers.set_map("current mpd track", "") + helpers.set_map("current mpd file", "") function mpd.update() async.request(echo .. " | curl --connect-timeout 1 -fsm 3 " .. mpdh, function (f) @@ -84,8 +85,13 @@ local function worker(args) mpd_notification_preset.text = string.format("%s (%s) - %s\n%s", mpd_now.artist, mpd_now.album, mpd_now.date, mpd_now.title) - widget = mpd.widget - settings() + + if mpd_now.file ~= helpers.get_map("current mpd file") + then + widget = mpd.widget + settings() + helpers.set_map("current mpd file", mpd_now.file) + end if mpd_now.state == "play" then diff --git a/widgets/net.lua b/widgets/net.lua index a578ae4..983da41 100644 --- a/widgets/net.lua +++ b/widgets/net.lua @@ -21,10 +21,7 @@ local setmetatable = setmetatable -- Network infos -- lain.widgets.net -local net = { - last_t = 0, - last_r = 0 -} +local net = {} function net.get_device() local ws = helpers.read_pipe("ip link show | cut -d' ' -f2,9") @@ -38,7 +35,7 @@ end local function worker(args) local args = args or {} - local timeout = args.timeout or 2 + local timeout = args.timeout or 1 local units = args.units or 1024 --kb local notify = args.notify or "on" local screen = args.screen or 1 @@ -49,35 +46,44 @@ local function worker(args) net.widget = wibox.widget.textbox('') helpers.set_map(iface, true) + helpers.set_map("net_t", 0) + helpers.set_map("net_r", 0) function update() - net_now = {} + net_now = { + sent = "0.0", + received = "0.0" + } if iface == "" or string.match(iface, "network off") then iface = net.get_device() end - net_now.carrier = helpers.first_line('/sys/class/net/' .. iface .. - '/carrier') or "0" - net_now.state = helpers.first_line('/sys/class/net/' .. iface .. - '/operstate') or "down" local now_t = helpers.first_line('/sys/class/net/' .. iface .. '/statistics/tx_bytes') or 0 local now_r = helpers.first_line('/sys/class/net/' .. iface .. '/statistics/rx_bytes') or 0 - net_now.sent = (now_t - net.last_t) / timeout / units - net_now.sent = string.gsub(string.format('%.1f', net_now.sent), ",", ".") + if now_t ~= helpers.get_map("net_t") + or now_r ~= helpers.get_map("net_r") then + net_now.carrier = helpers.first_line('/sys/class/net/' .. iface .. + '/carrier') or "0" + net_now.state = helpers.first_line('/sys/class/net/' .. iface .. + '/operstate') or "down" - net_now.received = (now_r - net.last_r) / timeout / units - net_now.received = string.gsub(string.format('%.1f', net_now.received), ",", ".") + net_now.sent = (now_t - net.last_t) / timeout / units + net_now.sent = string.gsub(string.format('%.1f', net_now.sent), ",", ".") - widget = net.widget - settings() + net_now.received = (now_r - net.last_r) / timeout / units + net_now.received = string.gsub(string.format('%.1f', net_now.received), ",", ".") - net.last_t = now_t - net.last_r = now_r + widget = net.widget + settings() + + helpers.set_map("net_t", now_t) + helpers.set_map("net_r", now_r) + end if net_now.carrier ~= "1" and notify == "on" then @@ -99,7 +105,8 @@ local function worker(args) end end - helpers.newtimer(iface, timeout, update) + helpers.newtimer(iface, timeout, update, false) + return net.widget end diff --git a/widgets/sysload.lua b/widgets/sysload.lua index d8e4713..9472235 100644 --- a/widgets/sysload.lua +++ b/widgets/sysload.lua @@ -7,8 +7,7 @@ --]] -local newtimer = require("lain.helpers").newtimer - +local helpers = require("lain.helpers") local wibox = require("wibox") local io = { open = io.open } @@ -22,10 +21,13 @@ local sysload = {} local function worker(args) local args = args or {} - local timeout = args.timeout or 2 + local timeout = args.timeout or 1 local settings = args.settings or function() end sysload.widget = wibox.widget.textbox('') + helpers.set_map("load_1", 0) + helpers.set_map("load_5", 0) + helpers.set_map("load_15", 0) function update() local f = io.open("/proc/loadavg") @@ -34,11 +36,21 @@ local function worker(args) load_1, load_5, load_15 = string.match(ret, "([^%s]+) ([^%s]+) ([^%s]+)") - widget = sysload.widget - settings() + if load_1 ~= helpers.get_map("load_1") + or load_5 ~= helpers.get_map("load_5") + or load_15 ~= helpers.get_map("load_15") + then + widget = sysload.widget + settings() + + helpers.set_map("load_1", load_1) + helpers.set_map("load_5", load_5) + helpers.set_map("load_15", load_15) + end end - newtimer("sysload", timeout, update) + helpers.newtimer("sysload", timeout, update) + return sysload.widget end diff --git a/widgets/temp.lua b/widgets/temp.lua index 67c9456..6831588 100644 --- a/widgets/temp.lua +++ b/widgets/temp.lua @@ -6,8 +6,7 @@ --]] -local newtimer = require("lain.helpers").newtimer - +local helpers = require("lain.helpers") local wibox = require("wibox") local io = { open = io.open } @@ -21,11 +20,12 @@ local temp = {} local function worker(args) local args = args or {} - local timeout = args.timeout or 2 + local timeout = args.timeout or 1 local tempfile = args.tempfile or "/sys/class/thermal/thermal_zone0/temp" local settings = args.settings or function() end temp.widget = wibox.widget.textbox('') + helpers.set_map("temp_last", 0) function update() local f = io.open(tempfile) @@ -37,11 +37,15 @@ local function worker(args) coretemp_now = "N/A" end - widget = temp.widget - settings() + if helpers.get_map("temp_last") ~= coretemp_now then + widget = temp.widget + settings() + helpers.set_map("temp_last", coretemp_now) + end end - newtimer("coretemp", timeout, update) + helpers.newtimer("coretemp", timeout, update) + return temp.widget end