LINUX.ORG.RU

Как получить текущую раскладку клавиатуры?

 , ,


0

1

Обживаюсь в теме для awesome wm от Worron, которую нашел в этой теме. В данный момент пытаюсь сделать текстовый виджет, который бы отображал текущую раскладку клавиатуры. Просто две буквы: en, ua или ru. И при этом чтоб не выбивался по стилю. За основу взял виджет textclock (из данной же темы) отредактировал его таким образом, чтобы он просто выводил текст.

Как получить текущую раскладку?

Ниже привожу код виджета.

local setmetatable = setmetatable
local os = os
local textbox = require("wibox.widget.textbox")
local beautiful = require("beautiful")
local tooltip = require("redflat.float.tooltip")
local redutil = require("redflat.util")

-- Initialize tables and vars for module
----------------------------------------------
local mykbind = { mt = {} }

-- Generate default theme vars
----------------------------------------------
local function default_style()
	local style = {
		font  = "Sans 16",
		tooltip = {},
		color = { text = "#aaaaaa" }
	}
	return redutil.table.merge(style, redutil.table.check(beautiful, "widget.mykbind") or {})
end

-- Create a text keybosrd layout indicator widget. It draws the current layout in a textbox.
----------------------------------------------
function mykbind.new(args, style)

	-- Initialize vars
	--------------------------------------
	local args = args or {}
	local style = redutil.table.merge(default_style(), style or {})

	-- Create widget
	--------------------------------------
	local widg = textbox()
	widg:set_font(style.font)

	widg:set_text("ua") -- Static output here :(

	--------------------------------------
	return widg
end

-- Config metatable to call textclock module as function
---------------------------------------------
function mykbind.mt:__call(...)
	return mykbind.new(...)
end

return setmetatable(mykbind, mykbind.mt)


Последнее исправление: pemakhov (всего исправлений: 2)

Ответ на: комментарий от Worron

Спасибо большое за ответ и за возможность пользоваться твоими темами.

Теперь получаю по xkb_get_layout_group номер раскладки и устанавливаю соответствующий этому номеру текст. Понимаю что говнокод, но пока так.

Как сделать, чтобы при переключении раскладки текст виджета обновлялся? Сейчас обновляется при перезапуске осома.

Переключение раскладок задано командой:

setxkbmap -layout "us,ua,ru" -option "grp:alt_shift_toggle"

pemakhov
() автор топика
Ответ на: комментарий от pemakhov

Повесить обновление виджета на сигнал xkb::group_changed. Советую таки посмотреть код по ссылке выше, там все есть.

Worron ★★★
()
Ответ на: комментарий от Worron

Пробую подключить виджет по ссылке. С ходу не заработало.

error: /home/pemakhov/.config/awesome/redflat/widget/keyboard.lua:59: attempt to index a nil value (field '?')

Это место в файле.

	if self.menu.items[1].right_icon then
		self.menu.items[1].right_icon:set_image(style.micon.check)
	end

Не понимаю что с этим делать.

pemakhov
() автор топика
Ответ на: комментарий от pemakhov

Имена раскладок задать.

redflat.widget.keyboard:init({ "English", "Russian" })
local kbindicator = redflat.widget.keyboard()

В девел ветке есть конфиги с использованием этого виджета.

Worron ★★★
()
Ответ на: комментарий от Worron

Спасибо, отлично заработало для трех раскладок.

Хотелось бы еще понять, как иконка получает цвет.

В файле виджета в функции keybd.new(style) указано:

widg:set_color(keybd.style.layout_color[1])

а в функции default_style()

layout_color = { "#a0a0a0", "#b1222b" }

Ни один из двух указанных цветов не соответствует тому, что по факту.

pemakhov
() автор топика
Ответ на: комментарий от pemakhov

Там такая механика, стиль определятся на трех уровнях.

Первый это default_style в самом виджете.

Второй это файл темы, в коде строчка

return redutil.table.merge(style, redutil.table.check(beautiful, "widget.keyboard") or {})

означает что в файле темы нужно смотреть таблицу widget.keyboard. Важно, структура тем в мастер и девел ветке сейчас отличается. В мастер каждый конфиг имеет свой отдельный и единственный файл темы. В девел темы иерархические, например конфиг blue собирает стили по цепочке colorless -> colored -> blue. То есть смотреть нужный стиль нужно в трех темах сверху вниз (значения в каждой последующей теме перезаписывают предыдущие).

Третий уровень (опциональный, нужно смотреть по коду самого виджета) позволяет задать стиль в момент вызова виджета из конфига. Например для индикатора раскладки

redflat.widget.keyboard:init({ "English", "Russian" }, { layout_color = { "#ff0000", "#0000ff" } })
Worron ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.