Merge pull request #130 from d125q/master
Add keyboard layout widget + abstract out common functionality of reading full output of a pipe
This commit is contained in:
commit
3a056ccaeb
11 changed files with 111 additions and 30 deletions
15
helpers.lua
15
helpers.lua
|
@ -10,7 +10,8 @@ local debug = require("debug")
|
||||||
|
|
||||||
local capi = { timer = timer }
|
local capi = { timer = timer }
|
||||||
local io = { open = io.open,
|
local io = { open = io.open,
|
||||||
lines = io.lines }
|
lines = io.lines,
|
||||||
|
popen = io.popen }
|
||||||
local rawget = rawget
|
local rawget = rawget
|
||||||
|
|
||||||
-- Lain helper functions for internal use
|
-- Lain helper functions for internal use
|
||||||
|
@ -86,6 +87,18 @@ end
|
||||||
|
|
||||||
-- }}}
|
-- }}}
|
||||||
|
|
||||||
|
-- {{{ Pipe operations
|
||||||
|
|
||||||
|
-- read the full output of a pipe (command)
|
||||||
|
function helpers.read_pipe(cmd)
|
||||||
|
local f = assert(io.popen(cmd))
|
||||||
|
local output = f:read("*all")
|
||||||
|
f:close()
|
||||||
|
return output
|
||||||
|
end
|
||||||
|
|
||||||
|
-- }}}
|
||||||
|
|
||||||
-- {{{ A map utility
|
-- {{{ A map utility
|
||||||
|
|
||||||
helpers.map_table = {}
|
helpers.map_table = {}
|
||||||
|
|
|
@ -8,10 +8,10 @@
|
||||||
--]]
|
--]]
|
||||||
|
|
||||||
local newtimer = require("lain.helpers").newtimer
|
local newtimer = require("lain.helpers").newtimer
|
||||||
|
local read_pipe = require("lain.helpers").read_pipe
|
||||||
|
|
||||||
local wibox = require("wibox")
|
local wibox = require("wibox")
|
||||||
|
|
||||||
local io = { popen = io.popen }
|
|
||||||
local string = { match = string.match,
|
local string = { match = string.match,
|
||||||
format = string.format }
|
format = string.format }
|
||||||
|
|
||||||
|
@ -32,9 +32,7 @@ local function worker(args)
|
||||||
alsa.widget = wibox.widget.textbox('')
|
alsa.widget = wibox.widget.textbox('')
|
||||||
|
|
||||||
function alsa.update()
|
function alsa.update()
|
||||||
local f = assert(io.popen(string.format("%s get %s", alsa.cmd, alsa.channel)))
|
local mixer = read_pipe(string.format("%s get %s", alsa.cmd, alsa.channel))
|
||||||
local mixer = f:read("*all")
|
|
||||||
f:close()
|
|
||||||
|
|
||||||
volume_now = {}
|
volume_now = {}
|
||||||
|
|
||||||
|
|
|
@ -8,12 +8,12 @@
|
||||||
--]]
|
--]]
|
||||||
|
|
||||||
local newtimer = require("lain.helpers").newtimer
|
local newtimer = require("lain.helpers").newtimer
|
||||||
|
local read_pipe = require("lain.helpers").read_pipe
|
||||||
|
|
||||||
local awful = require("awful")
|
local awful = require("awful")
|
||||||
local beautiful = require("beautiful")
|
local beautiful = require("beautiful")
|
||||||
local naughty = require("naughty")
|
local naughty = require("naughty")
|
||||||
|
|
||||||
local io = { popen = io.popen }
|
|
||||||
local math = { modf = math.modf }
|
local math = { modf = math.modf }
|
||||||
local mouse = mouse
|
local mouse = mouse
|
||||||
local string = { format = string.format,
|
local string = { format = string.format,
|
||||||
|
@ -122,9 +122,7 @@ local function worker(args)
|
||||||
|
|
||||||
function alsabar.update()
|
function alsabar.update()
|
||||||
-- Get mixer control contents
|
-- Get mixer control contents
|
||||||
local f = assert(io.popen(string.format("%s get %s", alsabar.cmd, alsabar.channel)))
|
local mixer = read_pipe(string.format("%s get %s", alsabar.cmd, alsabar.channel))
|
||||||
local mixer = f:read("*all")
|
|
||||||
f:close()
|
|
||||||
|
|
||||||
-- Capture mixer control state: [5%] ... ... [on]
|
-- Capture mixer control state: [5%] ... ... [on]
|
||||||
local volu, mute = string.match(mixer, "([%d]+)%%.*%[([%l]*)")
|
local volu, mute = string.match(mixer, "([%d]+)%%.*%[([%l]*)")
|
||||||
|
|
|
@ -7,9 +7,10 @@
|
||||||
--]]
|
--]]
|
||||||
|
|
||||||
local newtimer = require("lain.helpers").newtimer
|
local newtimer = require("lain.helpers").newtimer
|
||||||
|
local read_pipe = require("lain.helpers").read_pipe
|
||||||
|
|
||||||
local wibox = require("wibox")
|
local wibox = require("wibox")
|
||||||
|
|
||||||
local io = { popen = io.popen }
|
|
||||||
local setmetatable = setmetatable
|
local setmetatable = setmetatable
|
||||||
|
|
||||||
-- Basic template for custom widgets
|
-- Basic template for custom widgets
|
||||||
|
@ -25,9 +26,7 @@ local function worker(args)
|
||||||
base.widget = wibox.widget.textbox('')
|
base.widget = wibox.widget.textbox('')
|
||||||
|
|
||||||
function base.update()
|
function base.update()
|
||||||
local f = assert(io.popen(cmd))
|
output = read_pipe(cmd)
|
||||||
output = f:read("*all")
|
|
||||||
f:close()
|
|
||||||
widget = base.widget
|
widget = base.widget
|
||||||
settings()
|
settings()
|
||||||
end
|
end
|
||||||
|
|
78
widgets/contrib/kbdlayout.lua
Normal file
78
widgets/contrib/kbdlayout.lua
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
|
||||||
|
--[[
|
||||||
|
|
||||||
|
Licensed under GNU General Public License v2
|
||||||
|
* (c) 2015, Dario Gjorgjevski
|
||||||
|
|
||||||
|
--]]
|
||||||
|
|
||||||
|
local newtimer = require("lain.helpers").newtimer
|
||||||
|
local read_pipe = require("lain.helpers").read_pipe
|
||||||
|
|
||||||
|
local wibox = require("wibox")
|
||||||
|
local awful = require("awful")
|
||||||
|
|
||||||
|
local string = { match = string.match }
|
||||||
|
|
||||||
|
local setmetatable = setmetatable
|
||||||
|
|
||||||
|
local function worker (args)
|
||||||
|
local kbdlayout = {}
|
||||||
|
kbdlayout.widget = wibox.widget.textbox('')
|
||||||
|
|
||||||
|
local layouts = args.layouts
|
||||||
|
local settings = args.settings or function () end
|
||||||
|
local add_us_secondary = args.add_us_secondary or true
|
||||||
|
local timeout = args.timeout or 5
|
||||||
|
|
||||||
|
local idx = 1
|
||||||
|
|
||||||
|
-- Mouse bindings
|
||||||
|
kbdlayout.widget:buttons(awful.util.table.join(
|
||||||
|
awful.button({ }, 1, function () kbdlayout.next() end),
|
||||||
|
awful.button({ }, 3, function () kbdlayout.prev() end)))
|
||||||
|
|
||||||
|
local function run_settings (layout, variant)
|
||||||
|
widget = kbdlayout.widget
|
||||||
|
kbdlayout_now = { layout=string.match(layout, "[^,]+"), -- Make sure to match the primary layout only.
|
||||||
|
variant=variant }
|
||||||
|
settings()
|
||||||
|
end
|
||||||
|
|
||||||
|
function kbdlayout.update ()
|
||||||
|
local status = read_pipe('setxkbmap -query')
|
||||||
|
|
||||||
|
run_settings(string.match(status, "layout:%s*([^\n]*)"),
|
||||||
|
string.match(status, "variant:%s*([^\n]*)"))
|
||||||
|
end
|
||||||
|
|
||||||
|
function kbdlayout.set (i)
|
||||||
|
idx = ((i - 1) % #layouts) + 1 -- Make sure to wrap around as needed.
|
||||||
|
local to_execute = 'setxkbmap ' .. layouts[idx].layout
|
||||||
|
|
||||||
|
if add_us_secondary and not string.match(layouts[idx].layout, ",?us,?") then
|
||||||
|
to_execute = to_execute .. ",us"
|
||||||
|
end
|
||||||
|
|
||||||
|
if layouts[idx].variant then
|
||||||
|
to_execute = to_execute .. ' ' .. layouts[idx].variant
|
||||||
|
end
|
||||||
|
|
||||||
|
if os.execute(to_execute) then
|
||||||
|
run_settings(layouts[idx].layout, layouts[idx].variant)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function kbdlayout.next ()
|
||||||
|
kbdlayout.set(idx + 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
function kbdlayout.prev ()
|
||||||
|
kbdlayout.set(idx - 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
newtimer("kbdlayout", timeout, kbdlayout.update)
|
||||||
|
return setmetatable(kbdlayout, { __index = kbdlayout.widget })
|
||||||
|
end
|
||||||
|
|
||||||
|
return setmetatable({}, { __call = function (_, ...) return worker(...) end })
|
|
@ -38,9 +38,7 @@ end
|
||||||
function fs:show(t_out)
|
function fs:show(t_out)
|
||||||
fs:hide()
|
fs:hide()
|
||||||
|
|
||||||
local f = io.popen(helpers.scripts_dir .. "dfs")
|
local ws = helpers.read_pipe(helpers.scripts_dir .. "dfs"):gsub("\n*$", "")
|
||||||
ws = f:read("*all"):gsub("\n*$", "")
|
|
||||||
f:close()
|
|
||||||
|
|
||||||
if fs.followmouse then
|
if fs.followmouse then
|
||||||
fs.notification_preset.screen = mouse.screen
|
fs.notification_preset.screen = mouse.screen
|
||||||
|
|
|
@ -43,9 +43,7 @@ local function worker(args)
|
||||||
|
|
||||||
if not is_plain
|
if not is_plain
|
||||||
then
|
then
|
||||||
local f = io.popen(password)
|
password = helpers.read_pipe(password):gsub("\n", "")
|
||||||
password = f:read("*all"):gsub("\n", "")
|
|
||||||
f:close()
|
|
||||||
end
|
end
|
||||||
|
|
||||||
imap.widget = wibox.widget.textbox('')
|
imap.widget = wibox.widget.textbox('')
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
--]]
|
--]]
|
||||||
|
|
||||||
local newtimer = require("lain.helpers").newtimer
|
local newtimer = require("lain.helpers").newtimer
|
||||||
|
local read_pipe = require("lain.helpers").read_pipe
|
||||||
|
|
||||||
local wibox = require("wibox")
|
local wibox = require("wibox")
|
||||||
|
|
||||||
|
@ -50,10 +51,9 @@ local function worker(args)
|
||||||
-- match files that begin with a dot.
|
-- match files that begin with a dot.
|
||||||
-- Afterwards the length of this string is the number of
|
-- Afterwards the length of this string is the number of
|
||||||
-- new mails in that box.
|
-- new mails in that box.
|
||||||
local np = io.popen("find " .. line ..
|
local mailstring = read_pipe("find " .. line ..
|
||||||
"/new -mindepth 1 -type f " ..
|
"/new -mindepth 1 -type f " ..
|
||||||
"-not -name '.*' -printf a")
|
"-not -name '.*' -printf a")
|
||||||
local mailstring = np:read("*all")
|
|
||||||
|
|
||||||
-- Strip off leading mailpath.
|
-- Strip off leading mailpath.
|
||||||
local box = string.match(line, mailpath .. "/*([^/]+)")
|
local box = string.match(line, mailpath .. "/*([^/]+)")
|
||||||
|
@ -65,10 +65,11 @@ local function worker(args)
|
||||||
end
|
end
|
||||||
until line == nil
|
until line == nil
|
||||||
|
|
||||||
|
p:close()
|
||||||
table.sort(boxes)
|
table.sort(boxes)
|
||||||
|
|
||||||
newmail = "no mail"
|
newmail = "no mail"
|
||||||
--Count the total number of mails irrespective of where it was found
|
-- Count the total number of mails irrespective of where it was found
|
||||||
total = 0
|
total = 0
|
||||||
|
|
||||||
for box, number in pairs(boxes)
|
for box, number in pairs(boxes)
|
||||||
|
|
|
@ -13,7 +13,6 @@ local notify_fg = require("beautiful").fg_focus
|
||||||
local naughty = require("naughty")
|
local naughty = require("naughty")
|
||||||
local wibox = require("wibox")
|
local wibox = require("wibox")
|
||||||
|
|
||||||
local io = { popen = io.popen }
|
|
||||||
local string = { format = string.format,
|
local string = { format = string.format,
|
||||||
gsub = string.gsub,
|
gsub = string.gsub,
|
||||||
match = string.match }
|
match = string.match }
|
||||||
|
@ -28,9 +27,7 @@ local net = {
|
||||||
}
|
}
|
||||||
|
|
||||||
function net.get_device()
|
function net.get_device()
|
||||||
f = io.popen("ip link show | cut -d' ' -f2,9")
|
local ws = helpers.read_pipe("ip link show | cut -d' ' -f2,9")
|
||||||
ws = f:read("*all")
|
|
||||||
f:close()
|
|
||||||
ws = ws:match("%w+: UP") or ws:match("ppp%w+: UNKNOWN")
|
ws = ws:match("%w+: UP") or ws:match("ppp%w+: UNKNOWN")
|
||||||
if ws ~= nil then
|
if ws ~= nil then
|
||||||
return ws:match("(%w+):")
|
return ws:match("(%w+):")
|
||||||
|
|
|
@ -7,9 +7,12 @@
|
||||||
--]]
|
--]]
|
||||||
|
|
||||||
local newtimer = require("lain.helpers").newtimer
|
local newtimer = require("lain.helpers").newtimer
|
||||||
|
local read_pipe = require("lain.helpers").read_pipe
|
||||||
|
|
||||||
local async = require("lain.asyncshell")
|
local async = require("lain.asyncshell")
|
||||||
local json = require("lain.util").dkjson
|
local json = require("lain.util").dkjson
|
||||||
local lain_icons = require("lain.helpers").icons_dir
|
local lain_icons = require("lain.helpers").icons_dir
|
||||||
|
|
||||||
local naughty = require("naughty")
|
local naughty = require("naughty")
|
||||||
local wibox = require("wibox")
|
local wibox = require("wibox")
|
||||||
|
|
||||||
|
@ -83,9 +86,7 @@ local function worker(args)
|
||||||
if not err and weather_now ~= nil and tonumber(weather_now["cod"]) == 200 then
|
if not err and weather_now ~= nil and tonumber(weather_now["cod"]) == 200 then
|
||||||
weather.notification_text = ''
|
weather.notification_text = ''
|
||||||
for i = 1, weather_now["cnt"] do
|
for i = 1, weather_now["cnt"] do
|
||||||
local f = assert(io.popen(string.format(date_cmd, weather_now["list"][i]["dt"])))
|
day = string.gsub(read_pipe(string.format(date_cmd, weather_now["list"][i]["dt"])), "\n", "")
|
||||||
day = string.gsub(f:read("*all"), "\n", "")
|
|
||||||
f:close()
|
|
||||||
|
|
||||||
tmin = math.floor(weather_now["list"][i]["temp"]["min"])
|
tmin = math.floor(weather_now["list"][i]["temp"]["min"])
|
||||||
tmax = math.floor(weather_now["list"][i]["temp"]["max"])
|
tmax = math.floor(weather_now["list"][i]["temp"]["max"])
|
||||||
|
|
2
wiki
2
wiki
|
@ -1 +1 @@
|
||||||
Subproject commit cec2ebd96e91ef3c2a61e6ea9d41f5c44931ee58
|
Subproject commit 268a2cd3867d890616d6326472372e7168276927
|
Loading…
Add table
Reference in a new issue