AwesomeWM: виджет индикатор раскладки своими руками

test
Надоело без виджета раскладки клавиатуры, да и хотелось сделать свой виджет для Awesome WM. Версия Awesome WM 3.5.

Немного о самом виджете

Виджет использует только доступные в системе команды. Специально не делал завязку на другие программы типа kbdd и skb, так как их может не быть в системе по умолчанию. Весь код ниже идет с комментариями почти каждой строки, объясняющей что к чему и почему.

Создаем виджет

Качаем иконки
Распаковываем сами картинки(размером 48 пикселей), нужные для наших раскладок в ~/.config/awesome/keyboard/flags, предварительно создав нужные папки keyboard/flags.

В общем, если в двух словах, нам нужно создать виджет до добавления всех виджетов на панель, а потом разместить в нужном месте вместе с другими виджетами.
Код размещения виджетов выглядит приблизительно так:
-- add the widget to your wibox
for s = 1, screen.count() do

    mywibox[s] = awful.wibox({ position = "top", screen = s })

    ...
    -- Widgets that are aligned to the right
    local right_layout = wibox.layout.fixed.horizontal()
    right_layout:add(kbdcfg.widget)
    ...

    -- Now bring it all together
    local layout = wibox.layout.align.horizontal()
    layout:set_left(left_layout)
    layout:set_right(right_layout)

    mywibox[s]:set_widget(layout)
end

Имея это ввиду нам нужно разместить код нашего виджета до этого кода. Что мы и сделаем в конце. А сейчас, код самого виджета:
-- {{MY KEYBOARD INDICATOR
-- создаем виджет содержащий картинку
mykeyboardindicator = wibox.widget.imagebox()
-- путь к нашим флажкам
mkbihome_path_flags  = os.getenv('HOME') .. '/.config/awesome/keyboard/flags/'

--функция обновления нашего виджета
function mykey_update(key_layout)
--меняем картинку в зависимости от раскладки
    mykeyboardindicator:set_image(mkbihome_path_flags .. key_layout .. ".png")
    return
end

-- эта функция у нас будет выполнять команду в консоль
-- и возвращать ответ
function os.capture(cmd, raw)
  local f = assert(io.popen(cmd, 'r'))
  local s = assert(f:read('*a'))
  f:close()
  if raw then return s end
  s = string.gsub(s, '^%s+', '')
  s = string.gsub(s, '%s+$', '')
  s = string.gsub(s, '[\n\r]+', ' ')
  return s
end

-- очень криво, проверка по состоянию переключателя(лампочки)
-- более-менее работает когда только две расскладки.
-- нормальных вариантов для получения раскладки к сожалению нету
function getCurrentLayout()
-- команда в консоли которая вернет нам нужный язык
    result = os.capture("xset -q | awk 'BEGIN { a[1]="ru"; a[0]="us"; } /LED/ { print a[$10 && 32]; }'",true);
-- обрезаем перенос строки
    return result:gsub("\n","")
end;

-- создаем таймер
-- timeout это соответственно наша задержка для таймера
mykbitimer = timer({ timeout = 0.2 })
-- при наступлении события таймаута таймера
-- вызывается функция
mykbitimer:connect_signal("timeout", function() layout = getCurrentLayout(); mykey_update(layout) ; end)
mykbitimer:start() --запускаем таймер
-- }}MY KEYBOARD INDICATOR

Вот и весь наш виджет. Просто и придерживается правила - одна программа - одна функция )) В нашем случае выводим флажок раскладки.

Теперь добавим его на нашу панель. Для этого ищем в коде строки которые добавляют виджет на панель и добавляем наш виджет:
right_layout:add(clockicon)
    right_layout:add(mytextclock)
-- ...
    right_layout:add(mykeyboardindicator) -- вот так

Перезапускаем AwesomeWM командой ModKey+Ctrl+R
Все. Как выглядит наш виджет видно на скриншоте в начале статьи. Дальше используя этот каркас можно создавать и другие виджеты.
Категория: 
Share/Save

Делитесь с друзьями в социальных сетях! Оставляйте комментарии!

Share/Save

Это Вам так же может быть интересно!