338 lines
12 KiB
Lua
338 lines
12 KiB
Lua
------------------------------
|
|
-- This is the audio widget --
|
|
------------------------------
|
|
|
|
-- Awesome Libs
|
|
local awful = require("awful")
|
|
local color = require("theme.crylia.colors")
|
|
local dpi = require("beautiful").xresources.apply_dpi
|
|
local gears = require("gears")
|
|
local wibox = require("wibox")
|
|
require("main.signals")
|
|
|
|
-- Icon directory path
|
|
local icondir = awful.util.getdir("config") .. "theme/crylia/assets/icons/kblayout/"
|
|
|
|
return function ()
|
|
local kblayout_widget = wibox.widget{
|
|
{
|
|
{
|
|
{
|
|
{
|
|
{
|
|
id = "icon",
|
|
widget = wibox.widget.imagebox,
|
|
resize = false,
|
|
image = gears.color.recolor_image(icondir .. "keyboard.svg", color.color["Grey900"])
|
|
},
|
|
id = "icon_layout",
|
|
widget = wibox.container.place
|
|
},
|
|
top = dpi(2),
|
|
widget = wibox.container.margin,
|
|
id = "icon_margin"
|
|
},
|
|
spacing = dpi(6),
|
|
{
|
|
id = "label",
|
|
align = "center",
|
|
valign = "center",
|
|
widget = wibox.widget.textbox
|
|
},
|
|
id = "kblayout_layout",
|
|
layout = wibox.layout.fixed.horizontal
|
|
},
|
|
id = "container",
|
|
left = dpi(5),
|
|
right = dpi(10),
|
|
widget = wibox.container.margin
|
|
},
|
|
bg = color.color["Green200"],
|
|
fg = color.color["Grey900"],
|
|
shape = function (cr, width, height)
|
|
gears.shape.rounded_rect(cr, width, height, 5)
|
|
end,
|
|
widget = wibox.widget.background
|
|
}
|
|
|
|
local layout = "";
|
|
local get_kblayout = function ()
|
|
awful.spawn.easy_async_with_shell(
|
|
[[ setxkbmap -query | grep layout | awk '{print $2}' ]],
|
|
function (stdout)
|
|
layout = stdout
|
|
kblayout_widget.container.kblayout_layout.label.text = stdout
|
|
return stdout
|
|
end
|
|
)
|
|
return layout
|
|
end
|
|
|
|
|
|
local function create_kb_layout_item (keymap)
|
|
-- TODO: Add more, too lazy rn
|
|
local longname, shortname
|
|
|
|
local xkeyboard_country_code = {
|
|
{"ad", "", "AND"}, -- Andorra
|
|
{"af", "", "AFG"}, -- Afganistan
|
|
{"al", "", "ALB"}, -- Albania
|
|
{"am", "", "ARM"}, -- Armenia
|
|
{"ara", "", "ARB"}, -- Arabic
|
|
{"at", "", "AUT"}, -- Austria
|
|
{"az", "", "AZE"}, -- Azerbaijan
|
|
{"ba", "", "BIH"}, -- Bosnia and Herzegovina
|
|
{"bd", "", "BGD"}, -- Bangladesh
|
|
{"be", "", "BEL"}, -- Belgium
|
|
{"bg", "", "BGR"}, -- Bulgaria
|
|
{"br", "", "BRA"}, -- Brazil
|
|
{"bt", "", "BTN"}, -- Bhutan
|
|
{"bw", "", "BWA"}, -- Botswana
|
|
{"by", "", "BLR"}, -- Belarus
|
|
{"ca", "", "CAN"}, -- Canada
|
|
{"cd", "", "COD"}, -- Congo
|
|
{"ch", "", "CHE"}, -- Switzerland
|
|
{"cm", "", "CMR"}, -- Cameroon
|
|
{"cn", "", "CHN"}, -- China
|
|
{"cz", "", "CZE"}, -- Czechia
|
|
{"de", "Deutsch (Germany)", "GER"}, -- Germany
|
|
{"dk", "", "DNK"}, -- Denmark
|
|
{"ee", "", "EST"}, -- Estonia
|
|
{"es", "", "ESP"}, -- Spain
|
|
{"et", "", "ETH"}, -- Ethiopia
|
|
{"eu", "?", "?"}, -- EurKey
|
|
{"fi", "", "FIN"}, -- Finland
|
|
{"fo", "", "FRO"}, -- Faroe Islands
|
|
{"fr", "", "FRA"}, -- France
|
|
{"gb", "English (Bri'ish)", "ENG"}, -- United Kingdom
|
|
{"ge", "", "GEO"}, -- Georgia
|
|
{"gh", "", "GHA"}, -- Ghana
|
|
{"gn", "", "GIN"}, -- Guinea
|
|
{"gr", "", "GRC"}, -- Greece
|
|
{"hr", "", "HRV"}, -- Croatia
|
|
{"hu", "", "HUN"}, -- Hungary
|
|
{"ie", "", "IRL"}, -- Ireland
|
|
{"il", "", "ISR"}, -- Israel
|
|
{"in", "", "IND"}, -- India
|
|
{"iq", "", "IRQ"}, -- Iraq
|
|
{"ir", "", "IRN"}, -- Iran
|
|
{"is", "", "ISL"}, -- Iceland
|
|
{"it", "", "ITA"}, -- Italy
|
|
{"jp", "", "JPN"}, -- Japan
|
|
{"ke", "", "KEN"}, -- Kenya
|
|
{"kg", "", "KGZ"}, -- Kyrgyzstan
|
|
{"kh", "", "KHM"}, -- Cambodia
|
|
{"kr", "", "KOR"}, -- Korea
|
|
{"kz", "", "KAZ"}, -- Kazakhstan
|
|
{"la", "", "LAO"}, -- Laos
|
|
{"latam", "?", "?"}, -- Latin America
|
|
{"latin", "?", "?"}, -- Latin
|
|
{"lk", "", "LKA"}, -- Sri Lanka
|
|
{"lt", "", "LTU"}, -- Lithuania
|
|
{"lv", "", "LVA"}, -- Latvia
|
|
{"ma", "", "MAR"}, -- Morocco
|
|
{"mao", "?", "?"}, -- Maori
|
|
{"me", "", "MNE"}, -- Montenegro
|
|
{"mk", "", "MKD"}, -- Macedonia
|
|
{"ml", "", "MLI"}, -- Mali
|
|
{"mm", "", "MMR"}, -- Myanmar
|
|
{"mn", "", "MNG"}, -- Mongolia
|
|
{"mt", "", "MLT"}, -- Malta
|
|
{"mv", "", "MDV"}, -- Maldives
|
|
{"ng", "", "NGA"}, -- Nigeria
|
|
{"nl", "", "NLD"}, -- Netherlands
|
|
{"no", "", "NOR"}, -- Norway
|
|
{"np", "", "NRL"}, -- Nepal
|
|
{"ph", "", "PHL"}, -- Philippines
|
|
{"pk", "", "PAK"}, -- Pakistan
|
|
{"pl", "", "POL"}, -- Poland
|
|
{"pt", "", "PRT"}, -- Portugal
|
|
{"ro", "", "ROU"}, -- Romania
|
|
{"rs", "", "SRB"}, -- Serbia
|
|
{"ru", "Русски (Russia)", "RUS"}, -- Russia
|
|
{"se", "", "SWE"}, -- Sweden
|
|
{"si", "", "SVN"}, -- Slovenia
|
|
{"sk", "", "SVK"}, -- Slovakia
|
|
{"sn", "", "SEN"}, -- Senegal
|
|
{"sy", "", "SYR"}, -- Syria
|
|
{"th", "", "THA"}, -- Thailand
|
|
{"tj", "", "TJK"}, -- Tajikistan
|
|
{"tm", "", "TKM"}, -- Turkmenistan
|
|
{"tr", "", "TUR"}, -- Turkey
|
|
{"tw", "", "TWN"}, -- Taiwan
|
|
{"tz", "", "TZA"}, -- Tanzania
|
|
{"ua", "", "UKR"}, -- Ukraine
|
|
{"us", "English (United States)", "USA"}, -- USA
|
|
{"uz", "", "UZB"}, -- Uzbekistan
|
|
{"vn", "", "VNM"}, -- Vietnam
|
|
{"za", "", "ZAF"} -- South Africa
|
|
}
|
|
|
|
for i, c in ipairs(xkeyboard_country_code) do
|
|
if c[1] == keymap then
|
|
longname = c[2]
|
|
shortname = c[3]
|
|
end
|
|
end
|
|
|
|
local kb_layout_item = wibox.widget{
|
|
{
|
|
{
|
|
{
|
|
-- Short name e.g. GER, ENG, RUS
|
|
{
|
|
{
|
|
text = shortname,
|
|
widget = wibox.widget.textbox,
|
|
font = "JetBrains Mono ExtraBold, 12",
|
|
id = "kbmapname"
|
|
},
|
|
widget = wibox.container.margin,
|
|
id = "margin2"
|
|
},
|
|
nil,
|
|
{
|
|
{
|
|
text = longname,
|
|
widget = wibox.widget.textbox,
|
|
font = "JetBrains Mono Bold, 12",
|
|
|
|
},
|
|
widget = wibox.container.margin
|
|
},
|
|
spacing = dpi(15),
|
|
layout = wibox.layout.fixed.horizontal,
|
|
id = "container"
|
|
},
|
|
margins = dpi(10),
|
|
widget = wibox.container.margin,
|
|
id = "margin"
|
|
},
|
|
shape = function (cr, width, height)
|
|
gears.shape.rounded_rect(cr, width, height, 10)
|
|
end,
|
|
bg = color.color["Grey800"],
|
|
fg = color.color["White"],
|
|
widget = wibox.container.background,
|
|
id = "background"
|
|
},
|
|
margins = dpi(5),
|
|
widget = wibox.container.margin
|
|
}
|
|
hover_signal(kb_layout_item.background, color.color["White"], color.color["Grey900"])
|
|
kb_layout_item:connect_signal(
|
|
"button::press",
|
|
function ()
|
|
awful.spawn.easy_async_with_shell(
|
|
"setxkbmap " .. keymap,
|
|
function (stdout)
|
|
awesome.emit_signal("kblayout::hide:kbmenu")
|
|
get_kblayout()
|
|
end
|
|
)
|
|
end
|
|
)
|
|
return kb_layout_item
|
|
end
|
|
|
|
local function get_kblist()
|
|
local kb_layout_items = {
|
|
layout = wibox.layout.fixed.vertical
|
|
}
|
|
for i, keymap in pairs(user_vars.vars.kblayout) do
|
|
kb_layout_items[i] = create_kb_layout_item(keymap)
|
|
end
|
|
return kb_layout_items
|
|
end
|
|
|
|
local kb_menu_widget = awful.popup{
|
|
shape = function (cr, width, height)
|
|
gears.shape.rounded_rect(cr, width, height, 5)
|
|
end,
|
|
widget = wibox.container.background,
|
|
bg = color.color["Grey900"],
|
|
fg = color.color["White"],
|
|
width = dpi(100),
|
|
max_height = dpi(600),
|
|
visible = false,
|
|
ontop = true,
|
|
placement = function (c) awful.placement.align(c, {position = "top_right", margins = {right = dpi(255), top = dpi(60)}}) end
|
|
}
|
|
|
|
kb_menu_widget:setup(
|
|
get_kblist()
|
|
)
|
|
|
|
local function toggle_kb_layout()
|
|
awful.spawn.easy_async_with_shell(
|
|
"setxkbmap -query | grep layout: | awk '{print $2}'",
|
|
function (stdout)
|
|
for j, n in ipairs(user_vars.vars.kblayout) do
|
|
if stdout:match(n) then
|
|
if j == #user_vars.vars.kblayout then
|
|
awful.spawn.easy_async_with_shell(
|
|
"setxkbmap " .. user_vars.vars.kblayout[1],
|
|
function ()
|
|
get_kblayout()
|
|
end
|
|
)
|
|
else
|
|
awful.spawn.easy_async_with_shell(
|
|
"setxkbmap " .. user_vars.vars.kblayout[j + 1],
|
|
function ()
|
|
get_kblayout()
|
|
end
|
|
)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
)
|
|
end
|
|
|
|
awesome.connect_signal(
|
|
"kblayout::toggle",
|
|
function ()
|
|
toggle_kb_layout()
|
|
end
|
|
)
|
|
|
|
--kb_menu_widget:move_next_to(mouse.current_widget_geometry)
|
|
-- Signals
|
|
hover_signal(kblayout_widget, color.color["Green200"])
|
|
|
|
local kblayout_keygrabber = awful.keygrabber{
|
|
autostart = false,
|
|
stop_event = 'release',
|
|
keypressed_callback = function (self, mod, key, command)
|
|
if key == 'Escape' then
|
|
awesome.emit_signal("kblayout::hide:kbmenu")
|
|
end
|
|
end
|
|
}
|
|
|
|
kblayout_widget:connect_signal(
|
|
"button::press",
|
|
function ()
|
|
if kb_menu_widget.visible then
|
|
kb_menu_widget.visible = false
|
|
kblayout_keygrabber:stop()
|
|
else
|
|
kb_menu_widget.visible = true
|
|
kblayout_keygrabber:start()
|
|
end
|
|
end
|
|
)
|
|
|
|
awesome.connect_signal(
|
|
"kblayout::hide:kbmenu",
|
|
function ()
|
|
kb_menu_widget.visible = false
|
|
kblayout_keygrabber:stop()
|
|
end
|
|
)
|
|
|
|
get_kblayout()
|
|
kb_menu_widget.visible = false
|
|
return kblayout_widget
|
|
end |