Add keyboard layout widget + abstract out common functionality of reading full output of a pipe
local capi = { timer = timer }
local io = { open = io.open,
- lines = io.lines }
+ lines = io.lines,
+ popen = io.popen }
local rawget = rawget
-- Lain helper functions for internal use
-- }}}
+-- {{{ 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
helpers.map_table = {}
--]]
local newtimer = require("lain.helpers").newtimer
+local read_pipe = require("lain.helpers").read_pipe
local wibox = require("wibox")
-local io = { popen = io.popen }
local string = { match = string.match,
format = string.format }
alsa.widget = wibox.widget.textbox('')
function alsa.update()
- local f = assert(io.popen(string.format("%s get %s", alsa.cmd, alsa.channel)))
- local mixer = f:read("*all")
- f:close()
+ local mixer = read_pipe(string.format("%s get %s", alsa.cmd, alsa.channel))
volume_now = {}
--]]
local newtimer = require("lain.helpers").newtimer
+local read_pipe = require("lain.helpers").read_pipe
local awful = require("awful")
local beautiful = require("beautiful")
local naughty = require("naughty")
-local io = { popen = io.popen }
local math = { modf = math.modf }
local mouse = mouse
local string = { format = string.format,
function alsabar.update()
-- Get mixer control contents
- local f = assert(io.popen(string.format("%s get %s", alsabar.cmd, alsabar.channel)))
- local mixer = f:read("*all")
- f:close()
+ local mixer = read_pipe(string.format("%s get %s", alsabar.cmd, alsabar.channel))
-- Capture mixer control state: [5%] ... ... [on]
local volu, mute = string.match(mixer, "([%d]+)%%.*%[([%l]*)")
--]]
local newtimer = require("lain.helpers").newtimer
+local read_pipe = require("lain.helpers").read_pipe
+
local wibox = require("wibox")
-local io = { popen = io.popen }
local setmetatable = setmetatable
-- Basic template for custom widgets
base.widget = wibox.widget.textbox('')
function base.update()
- local f = assert(io.popen(cmd))
- output = f:read("*all")
- f:close()
+ output = read_pipe(cmd)
widget = base.widget
settings()
end
--- /dev/null
+
+--[[
+
+ 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 })
function fs:show(t_out)
fs:hide()
- local f = io.popen(helpers.scripts_dir .. "dfs")
- ws = f:read("*all"):gsub("\n*$", "")
- f:close()
+ local ws = helpers.read_pipe(helpers.scripts_dir .. "dfs"):gsub("\n*$", "")
if fs.followmouse then
fs.notification_preset.screen = mouse.screen
if not is_plain
then
- local f = io.popen(password)
- password = f:read("*all"):gsub("\n", "")
- f:close()
+ password = helpers.read_pipe(password):gsub("\n", "")
end
imap.widget = wibox.widget.textbox('')
--]]
local newtimer = require("lain.helpers").newtimer
+local read_pipe = require("lain.helpers").read_pipe
local wibox = require("wibox")
-- match files that begin with a dot.
-- Afterwards the length of this string is the number of
-- new mails in that box.
- local np = io.popen("find " .. line ..
+ local mailstring = read_pipe("find " .. line ..
"/new -mindepth 1 -type f " ..
"-not -name '.*' -printf a")
- local mailstring = np:read("*all")
-- Strip off leading mailpath.
local box = string.match(line, mailpath .. "/*([^/]+)")
end
until line == nil
+ p:close()
table.sort(boxes)
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
for box, number in pairs(boxes)
local naughty = require("naughty")
local wibox = require("wibox")
-local io = { popen = io.popen }
local string = { format = string.format,
gsub = string.gsub,
match = string.match }
}
function net.get_device()
- f = io.popen("ip link show | cut -d' ' -f2,9")
- ws = f:read("*all")
- f:close()
+ local ws = helpers.read_pipe("ip link show | cut -d' ' -f2,9")
ws = ws:match("%w+: UP") or ws:match("ppp%w+: UNKNOWN")
if ws ~= nil then
return ws:match("(%w+):")
--]]
local newtimer = require("lain.helpers").newtimer
+local read_pipe = require("lain.helpers").read_pipe
+
local async = require("lain.asyncshell")
local json = require("lain.util").dkjson
local lain_icons = require("lain.helpers").icons_dir
+
local naughty = require("naughty")
local wibox = require("wibox")
if not err and weather_now ~= nil and tonumber(weather_now["cod"]) == 200 then
weather.notification_text = ''
for i = 1, weather_now["cnt"] do
- local f = assert(io.popen(string.format(date_cmd, weather_now["list"][i]["dt"])))
- day = string.gsub(f:read("*all"), "\n", "")
- f:close()
+ day = string.gsub(read_pipe(string.format(date_cmd, weather_now["list"][i]["dt"])), "\n", "")
tmin = math.floor(weather_now["list"][i]["temp"]["min"])
tmax = math.floor(weather_now["list"][i]["temp"]["max"])
-Subproject commit cec2ebd96e91ef3c2a61e6ea9d41f5c44931ee58
+Subproject commit 268a2cd3867d890616d6326472372e7168276927