X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/945f220e022e69c1aeda0ee86558be26f19bdd40..ef6383061bbfefd09bbb28b8ce6e61e7074cce62:/widgets/contrib/kbdlayout.lua diff --git a/widgets/contrib/kbdlayout.lua b/widgets/contrib/kbdlayout.lua index c5242c1..cd753f6 100644 --- a/widgets/contrib/kbdlayout.lua +++ b/widgets/contrib/kbdlayout.lua @@ -1,57 +1,86 @@ -local newtimer = require("lain.helpers").newtimer +--[[ + + Licensed under GNU General Public License v2 + * (c) 2015, Dario Gjorgjevski + +--]] + +local helpers = require("lain.helpers") + +local awful = require("awful") local wibox = require("wibox") -local string = { match = string.match } -local io = { popen = io.popen } +local string = { format = string.format, + match = string.match } +local execute = os.execute local setmetatable = setmetatable -local function worker (args) - local kbdlayout = {} - kbdlayout.widget = wibox.widget.textbox('') +-- Keyboard layout switcher +-- lain.widgets.contrib.kblayout + +local function worker(args) + local kbdlayout = {} + local layouts = args.layouts + local settings = args.settings or function () end + local add_us_secondary = true + local timeout = args.timeout or 5 + local idx = 1 + + if args.add_us_secondary == false then add_us_secondary = false end + + kbdlayout.widget = wibox.widget.textbox() - local settings = args.settings or function () end - local layouts = args.layouts - local idx = 1 - - local function run_settings (layout, variant) + -- 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) + kbdlayout_now = { + layout = string.match(layout, "[^,]+"), -- Make sure to match the primary layout only. + variant = variant + } widget = kbdlayout.widget - kbdlayout_now = { layout=layout, variant=variant } settings() end - - function kbdlayout.update () - local file = assert(io.popen('setxkbmap -query')) - local status = file:read('*all') - file:close() - - run_settings(string.match(status, "layout:%s*([^\n]*)%s*"), - string.match(status, "variant:%s*([^\n]*)%s*")) + + function kbdlayout.update() + helpers.async(string.format("%s -c 'setxkbmap -query'", awful.util.shell), + function(status) + run_settings(string.match(status, "layout:%s*([^\n]*)"), + string.match(status, "variant:%s*([^\n]*)")) + end) end - function kbdlayout.set (i) + function kbdlayout.set(i) idx = ((i - 1) % #layouts) + 1 -- Make sure to wrap around as needed. - local to_execute = 'setxkbmap ' .. layouts[idx].layout + 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 + to_execute = to_execute .. " " .. layouts[idx].variant end - if os.execute(to_execute) then - run_settings(layouts[idx].layout, layouts[idx].variant) + if execute(to_execute) then + run_settings(layouts[idx].layout, layouts[idx].variant) end end - function kbdlayout.next () + function kbdlayout.next() kbdlayout.set(idx + 1) end - function kbdlayout.prev () + function kbdlayout.prev() kbdlayout.set(idx - 1) end - newtimer("kbdlayout", args.timeout or 10, kbdlayout.update) + helpers.newtimer("kbdlayout", timeout, kbdlayout.update) + return setmetatable(kbdlayout, { __index = kbdlayout.widget }) end