awesomewm/modules/ibus/util.lua

95 lines
2.4 KiB
Lua

local util = {}
util.current_engine = ""
util.current_engine_index = nil
util.current_xkbmap = ""
-- Update current_engine and current_engine index,
-- call callback() when done.
util.get = function(callback)
-- Get current ibus engine
awful.spawn.easy_async(
"ibus engine",
function(stdout, stderr, exitreason, exitcode)
util.current_engine = string.gsub(stdout, "\n", "")
util.current_engine_index = nil
-- Find the current engine's index in config.ibus.language_list.
-- If it is not there, util.current_engine_index will be nil.
for k, v in pairs(config.ibus.language_list) do
if (v["ibus_engine"] == util.current_engine) then
util.current_engine_index = k
end
end
-- Get current xkbmap
awful.spawn.easy_async(
"setxkbmap -query",
function(stdout, stderr, exitreason, exitcode)
util.current_xkbmap = string.match(stdout, "layout:%s+(%w+)")
-- When everything is done, run callback if it is given.
if callback then
callback()
end
end
)
end
)
end
-- Set engine to language_index.
-- calls util.get(callback) when done.
util.set = function(language_index, callback)
-- engine is an index of the language list above
local engine = config.ibus.language_list[language_index]["ibus_engine"]
-- Get required engine, if one is given
local requires_engine
for k, v in pairs(config.ibus.language_list) do
if (v["ibus_engine"] == engine) then
requires_engine = v["requires_engine"]
end
end
-- If a required xkb engine is given, but it is not active, switch to it before switching to the target
if (requires_engine ~= util.current_engine) and (requires_engine ~= nil) then
awful.spawn.easy_async(
"ibus engine " .. requires_engine,
function(stdout, stderr, exitreason, exitcode)
awful.spawn.easy_async(
"ibus engine " .. engine,
function(stdout, stderr, exitreason, exitcode)
util.get(callback)
end
)
end
)
else
awful.spawn.easy_async(
"ibus engine " .. engine,
function(stdout, stderr, exitreason, exitcode)
util.get(callback)
end
)
end
end
-- Calls util.set(callback) with next language in list.
util.next = function(callback)
if (util.current_engine_index == nil) or (util.current_engine_index == #config.ibus.language_list) then
util.current_engine_index = 1
else
util.current_engine_index = util.current_engine_index + 1
end
util.set(util.current_engine_index, callback)
end
return util