LINUX.ORG.RU

Получить список языков для раскладки из Xkbcommon в Python

 , , ,


0

1

Приветствую. Пишу небольшую утилиту для легкой настройки раскладки клавиатуры в Sway. На Pyside2. Задумка такова: имеется два QComboBox, в одном должен быть список доступных вариантов языка для раскладки, в другом - комбинации клавиш для переключения языка. После применения настроек они будут записываться в конфиг Sway. Нашел модуль python-xkbcommon, но не понимаю как из него получить список языков для раскладки, чтобы поместить в соответствующий QComboBox. Можете подсказать?

★★★★★

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

Всего 1500 строк кода в этом python-xkbcommon. Мог бы и разобраться что там происходит. А если сложно, то бросай программирование, всё равно сейчас там ни работы ни денег нету. А на работника за идею и потому что тебе всё нравится ты не тянешь ИМХО.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)

Я этот libxkbcommon первый раз в глаза вижу, но, судя по всему, тебе нужен ещё и libxkbregistry. Вот что удалось накорябать:

#include <stdio.h>
#include <xkbcommon/xkbregistry.h>
#define rxkb_for_each_layout(ctx, l) \
	for (struct rxkb_layout *l = rxkb_layout_first(ctx); l; l = rxkb_layout_next(l))
int
main(void)
{
	struct rxkb_context *const ctx = rxkb_context_new(RXKB_CONTEXT_NO_FLAGS);
	rxkb_context_parse_default_ruleset(ctx);
	rxkb_for_each_layout(ctx, x)
	{
		const char *name = rxkb_layout_get_name(x),
		           *var = rxkb_layout_get_variant(x),
		           *brief = rxkb_layout_get_brief(x);
		printf("%s  %s  %s\n", name, var ? var : "", brief ? brief : "");
	}
	rxkb_context_unref(ctx);
}
goto-vlad
()

подскажу через xcb api нужно воспользоваться xcb_xkb_get_names

у меня проект есть qxkb5 вот пример оттуда

QStringList XcbConnection::getXkbNames(void) const
{
    auto xcbReply = getReplyFunc2(xcb_xkb_get_names, conn.get(), XCB_XKB_ID_USE_CORE_KBD, XCB_XKB_NAME_DETAIL_GROUP_NAMES | XCB_XKB_NAME_DETAIL_SYMBOLS);

    if(xcbReply.error())
        throw std::runtime_error("xcb_xkb_get_names");

    QStringList res;
    if(auto reply = xcbReply.reply())
    {
        const void *buffer = xcb_xkb_get_names_value_list(reply.get());
        xcb_xkb_get_names_value_list_t list;

        xcb_xkb_get_names_value_list_unpack(buffer, reply->nTypes, reply->indicators, reply->virtualMods,
                                            reply->groupNames, reply->nKeys, reply->nKeyAliases, reply->nRadioGroups, reply->which, & list);
        int groups = xcb_xkb_get_names_value_list_groups_length(reply.get(), & list);

        for(int ii = 0; ii < groups; ++ii)
            res << getAtomName(list.groups[ii]);
    }
    
    return res;
}
anonymous2 ★★★★★
()
Последнее исправление: anonymous2 (всего исправлений: 1)