From 233768f0963167af1d2621d10157cd64a87c904c Mon Sep 17 00:00:00 2001 From: lcpz Date: Wed, 28 Nov 2018 19:43:04 +0000 Subject: [PATCH] API change: lain.widget.contrib.tpbat has been rewritten and renamed to lain.widget.contrib.tp_smapi lain.widget.cal: honour followtag argument lightened calls to libraries --- layout/termfair.lua | 4 +- util/quake.lua | 15 ++- util/separators.lua | 4 +- widget/alsa.lua | 3 +- widget/alsabar.lua | 14 +-- widget/bat.lua | 16 ++-- widget/cal.lua | 3 +- widget/contrib/moc.lua | 5 +- widget/contrib/redshift.lua | 1 + widget/contrib/smapi.lua | 145 +++++++++++++++++++++++++++++ widget/contrib/task.lua | 20 ++-- widget/contrib/tpbat/init.lua | 163 --------------------------------- widget/contrib/tpbat/smapi.lua | 98 -------------------- widget/cpu.lua | 5 +- widget/imap.lua | 5 +- widget/mpd.lua | 18 ++-- widget/net.lua | 2 +- widget/pulse.lua | 6 +- widget/pulsebar.lua | 14 +-- widget/weather.lua | 6 +- wiki | 2 +- 21 files changed, 213 insertions(+), 336 deletions(-) create mode 100644 widget/contrib/smapi.lua delete mode 100644 widget/contrib/tpbat/init.lua delete mode 100644 widget/contrib/tpbat/smapi.lua diff --git a/layout/termfair.lua b/layout/termfair.lua index f57f715..e33894e 100644 --- a/layout/termfair.lua +++ b/layout/termfair.lua @@ -8,9 +8,7 @@ --]] -local math = { ceil = math.ceil, - floor = math.floor, - max = math.max } +local math = math local screen = screen local tonumber = tonumber diff --git a/util/quake.lua b/util/quake.lua index 64aaca5..f41447f 100644 --- a/util/quake.lua +++ b/util/quake.lua @@ -7,14 +7,11 @@ --]] local awful = require("awful") -local capi = { client = client } - -local math = { floor = math.floor } -local string = { format = string.format } - +local client = client +local math = math +local string = string local pairs = pairs local screen = screen - local setmetatable = setmetatable -- Quake-like Dropdown application spawn @@ -80,7 +77,7 @@ function quake:display() client:raise() self.last_tag = self.screen.selected_tag client:tags({self.screen.selected_tag}) - capi.client.focus = client + client.focus = client else client.hidden = true local ctags = client:tags() @@ -140,12 +137,12 @@ function quake:new(config) local dropdown = setmetatable(conf, { __index = quake }) - capi.client.connect_signal("manage", function(c) + client.connect_signal("manage", function(c) if c.instance == dropdown.name and c.screen == dropdown.screen then dropdown:display() end end) - capi.client.connect_signal("unmanage", function(c) + client.connect_signal("unmanage", function(c) if c.instance == dropdown.name and c.screen == dropdown.screen then dropdown.visible = false end diff --git a/util/separators.lua b/util/separators.lua index e45b954..465132d 100644 --- a/util/separators.lua +++ b/util/separators.lua @@ -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 diff --git a/widget/alsa.lua b/widget/alsa.lua index 2d4891d..3b6c6d6 100644 --- a/widget/alsa.lua +++ b/widget/alsa.lua @@ -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 diff --git a/widget/alsabar.lua b/widget/alsabar.lua index ea78ec5..9b9f4b9 100644 --- a/widget/alsabar.lua +++ b/widget/alsabar.lua @@ -6,12 +6,14 @@ --]] -local helpers = require("lain.helpers") -local awful = require("awful") -local naughty = require("naughty") -local wibox = require("wibox") - -local math, string, type, tonumber = math, string, 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 diff --git a/widget/bat.lua b/widget/bat.lua index b654948..5a301b5 100644 --- a/widget/bat.lua +++ b/widget/bat.lua @@ -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 diff --git a/widget/cal.lua b/widget/cal.lua index 50426ba..47e91a9 100644 --- a/widget/cal.lua +++ b/widget/cal.lua @@ -79,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 @@ -95,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 } diff --git a/widget/contrib/moc.lua b/widget/contrib/moc.lua index 027cec3..f429c77 100644 --- a/widget/contrib/moc.lua +++ b/widget/contrib/moc.lua @@ -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 diff --git a/widget/contrib/redshift.lua b/widget/contrib/redshift.lua index 7b54611..d0e5eed 100644 --- a/widget/contrib/redshift.lua +++ b/widget/contrib/redshift.lua @@ -1,6 +1,7 @@ --[[ Licensed under GNU General Public License v2 + * (c) 2017, Luca CPZ * (c) 2014, blueluke --]] diff --git a/widget/contrib/smapi.lua b/widget/contrib/smapi.lua new file mode 100644 index 0000000..06b3cbd --- /dev/null +++ b/widget/contrib/smapi.lua @@ -0,0 +1,145 @@ +--[[ + + 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 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/tp_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("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/task.lua b/widget/contrib/task.lua index 7e1f3d8..536e006 100644 --- a/widget/contrib/task.lua +++ b/widget/contrib/task.lua @@ -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/tpbat/init.lua b/widget/contrib/tpbat/init.lua deleted file mode 100644 index c62acd1..0000000 --- a/widget/contrib/tpbat/init.lua +++ /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 index a8867e4..0000000 --- a/widget/contrib/tpbat/smapi.lua +++ /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 diff --git a/widget/cpu.lua b/widget/cpu.lua index 6c6e77a..81638c2 100644 --- a/widget/cpu.lua +++ b/widget/cpu.lua @@ -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 diff --git a/widget/imap.lua b/widget/imap.lua index 75270f1..b3d9dc7 100644 --- a/widget/imap.lua +++ b/widget/imap.lua @@ -66,7 +66,7 @@ local function factory(args) helpers.async(curl, function(f) imap_now = { ["MESSAGES"] = 0, ["RECENT"] = 0, ["UNSEEN"] = 0 } - for s, d in f:gmatch("(%w+)%s+(%d+)") do imap_now[s] = tonumber(d) end + 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 @@ -79,7 +79,8 @@ local function factory(args) text = string.format("%s has %d 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 diff --git a/widget/mpd.lua b/widget/mpd.lua index ff45179..01f28e6 100644 --- a/widget/mpd.lua +++ b/widget/mpd.lua @@ -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 diff --git a/widget/net.lua b/widget/net.lua index 987f047..805b577 100644 --- a/widget/net.lua +++ b/widget/net.lua @@ -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 diff --git a/widget/pulse.lua b/widget/pulse.lua index d37e83a..f63fe55 100644 --- a/widget/pulse.lua +++ b/widget/pulse.lua @@ -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 diff --git a/widget/pulsebar.lua b/widget/pulsebar.lua index a7c0666..317468f 100644 --- a/widget/pulsebar.lua +++ b/widget/pulsebar.lua @@ -6,12 +6,14 @@ --]] -local helpers = require("lain.helpers") -local awful = require("awful") -local naughty = require("naughty") -local wibox = require("wibox") - -local math, string, type, tonumber = math, string, 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 diff --git a/widget/weather.lua b/widget/weather.lua index a9b886a..f35ca68 100644 --- a/widget/weather.lua +++ b/widget/weather.lua @@ -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 39799f8..f52c906 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit 39799f8b08f55f567fd3f31db447d35f211bb5ce +Subproject commit f52c9068f4e64effe8a3f38e7531beef3fec3388 -- 2.39.5