LINUX.ORG.RU

Библиотека X11 и получение списка языков

 , ,


0

1

Привет всем. Мне необходимо получить список языков установленных в системе. С помощью кода, который привел ниже я могу получать текущий язык раскладки, а как получить список установленных языков ввода - ума не приложу.

XkbStateRec xkbState;
    Display *display = XOpenDisplay(NULL);
    XkbGetState(display, XkbUseCoreKbd, &xkbState);

    Atom real_prop_type; int fmt;
    unsigned long nitems, extra_bytes;
    char *prop_data = NULL;
    Atom rules_atom = XInternAtom(display, "_XKB_RULES_NAMES", False);
    XGetWindowProperty(display, DefaultRootWindow(display), rules_atom, 0L, 1024,
        False, XA_STRING, &real_prop_type, &fmt, &nitems, &extra_bytes, (unsigned char **) (void *) &prop_data);

    QStringList names;
    for(char* p=prop_data; p-prop_data < (long)nitems && p != NULL; p += strlen(p)+1) names.append( p );
    if (names.count() > 3 ) names = names[2].split(",");
    qDebug()<<names;
    qDebug()<<names[xkbState.group];
    XFree(prop_data);
    XCloseDisplay(display);
    languageLabel->setText(names[xkbState.group]);

И таким образом я получаю только сокращенное название языка (us,by,ru), а необходимо получать полное. Буду очень благодарен за помощь! С данной библиотекой никогда ранее не сталкивался, поэтому плохо понимаю, как ей пользоваться адекватно

Мне что-то кажется, что ты решаешь какую-то неправильную задачу. А зачем ты лезешь в раскладки клавиатуры? Может. тебе locale (локали) нужны, которые в системе сгененрированы? Расскажи, что за задача?

Но раз ты хочешь имя раскладки, то вроде бы функция xkbGetNames, в аргументах который надо указать XkbGroupNames (типа LISTofATOMS) и тогда в структуре ответа прибегут прибегут полные имена раскладки на английском языке типа «Russian (typewriter)». По-моему, так.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

XkbGroupNames (типа LISTofATOMS)

XkbGroupNamesMask указать то есть.

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

Я научился получать список языков, но выходит один косяк. Оно странно как-то их определяет. Допустим,что у меня установлено четыре языка ввода. Русский, Английский, Немецкий, Белорусский. Если активен русский - оно определяет два языка (Англ и Русс) Если активен англ - оно определяет два языка (Англ и Русс) Если активен Немецкий - оно определяет три языка (Англ, Русс и Нем) Если активен бел - оно определяет три языка (Англ, Русс и бел) Почему так происходит? (ниже кусок кода, где я получаю список языков)

display = XOpenDisplay(NULL);
    XkbDescRec desc[1];char *names_[XkbNumKbdGroups];
    int gc;
    memset(desc, 0, sizeof(desc));
    desc->device_spec = XkbUseCoreKbd;
    XkbGetControls(display, XkbGroupsWrapMask, desc);
    XkbGetNames(display, XkbGroupNamesMask, desc);
    XGetAtomNames(display, desc->names->groups, gc = desc->ctrls->num_groups, names_);
    numberLang=gc;
    XkbFreeControls(desc, XkbGroupsWrapMask, True);
    XkbFreeNames(desc, XkbGroupNamesMask, True);

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

«Расскажи, что за задача?»

Необходимо получить установленные в системе языки ввода. А дальше поместить их в всплывающее меню и программно переключать язык ввода.

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

XkbGetControls(display, XkbGroupsWrapMask, desc);

А ты уверен, что тут возвращается правильное число групп? Может, имен-то всегда четыре, а ты выводишь столько, сколько тут пришло в ctrls->num_groups? Проверь, может, четыре имени в раельности возвращаются?

Сам понимаешь, что с XKB тут две с половиной калеки работало (очень сомневаюсь, что svu что-то вспомнит). Задача редкая. И для того, чтобы понять, надо самому код запускать и читать спеки. Но ты в правильном направлении пошел - XkbGetNames.

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

Ну ты говоришь, то тебе приходит то два, то три имени на запрос. Ты откуда определяешь их количество? Если из переменной ctrls->num_groups, то вдруг там не то число? Вдруг в реальности возратилось четыре имени из XkbGetNames, но счетчик возвращает то 2, то 3? Короче, попробуй четыре имени прочесть принудительно.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

«Короче, попробуй четыре имени прочесть принудительно.» Тогда выводит так же русский и англ и две пустые строки:(

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

А в твоей системе стоит какая-нибудь переключалка языков из твоего DE (гномопереключалка, кдепереключалка и т. д)? Если есть, то убери на всякий случай. Лучше даже в чистых иксах попробовать запустить. Если снова будет такое, то будем думать.

Zubok ★★★★★
()
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <X11/Xlib.h>
#include <X11/XKBlib.h>
#include <X11/extensions/XKB.h>

/* X related stuff */
#define OurXkbKbdDevice     3
int evBase, errBase;

#define UNUSED(param) ((void)param)

Display* init_xkb(void)
{
    int i1;

    Display *dpy;
    int major, minor, error;

    major = XkbMajorVersion;
    minor = XkbMinorVersion;

    if ((dpy = XkbOpenDisplay(NULL, &evBase, &errBase, &major, &minor, &error)) == NULL) {
        fprintf(stderr, "XkbOpenDisplay() failed\n");
        return NULL;
    }

    if (!XkbQueryExtension(dpy,&i1, &evBase, &errBase, &major, &minor)) {
        fprintf(stderr, "XKB not supported by X-server\n");
        return NULL;
    }

    return dpy;
}

int get_num_groups(Display *xkbdpy)
{
    int groups;
    XkbDescRec* kbdDescPtr;

    kbdDescPtr = XkbAllocKeyboard();

    if (kbdDescPtr == NULL) {
        XCloseDisplay(xkbdpy);
        fprintf(stderr, "%s: Failed to get keyboard description.\n", __func__);
        return -1;
    }

    kbdDescPtr->device_spec = OurXkbKbdDevice;

    XkbGetControls(xkbdpy, XkbAllControlsMask, kbdDescPtr);
    groups = kbdDescPtr->ctrls->num_groups;

    XFree(kbdDescPtr);

    return groups;
}

int list_groups(Display *xkbdpy)                                                                                                                                                     
{                                                                                                                                                                                    
	int i;                                                                                                                                                                           
	int groups;                                                                                                                                                                      
	int active;                                                                                                                                                                      

	Atom groupsAtom;                                                                                                                                                                 
	char* groupsString;                                                                                                                                                              

	XkbDescRec* kbdDescPtr;                                                                                                                                                          
	XkbStateRec kbd_state;                                                                                                                                                           

	kbdDescPtr = XkbAllocKeyboard();                                                                                                                                                 

	if (kbdDescPtr == NULL) {                                                                                                                                                        
		XCloseDisplay(xkbdpy);                                                                                                                                                       
		fprintf(stderr, "%s: Failed to get keyboard description.\n", __func__);                                                                                                      
	}                                                                                                                                                                                

	kbdDescPtr->device_spec = OurXkbKbdDevice;                                                                                                                                       

#if 0                                                                                                                                                                                
	XkbGetControls(xkbdpy, XkbAllControlsMask, kbdDescPtr);                                                                                                                          
	groups = kbdDescPtr->ctrls->num_groups;                                                                                                                                          
#endif                                                                                                                                                                               

	groups = get_num_groups(xkbdpy);                                                                                                                                                 

	XkbGetNames(xkbdpy, XkbGroupNamesMask, kbdDescPtr);                                                                                                                              

	fprintf(stdout, "%s: Number of groups = %d\n", __func__, groups);                                                                                                                

	/* Get current configured group */                                                                                                                                               
	XkbGetState(xkbdpy, OurXkbKbdDevice, &kbd_state);                                                                                                                                

	active = kbd_state.group;                                                                                                                                                        

	for (i = 0; i < groups; i++) {                                                                                                                                                   
		groupsAtom  = kbdDescPtr->names->groups[i];                                                                                                                                  
		groupsString = XGetAtomName(xkbdpy, groupsAtom);                                                                                                                             
		fprintf(stdout, "%c %d) %s\n", (i == active) ? '*': ' ', i, groupsString);                                                                                                   

		free(groupsString);
	}

	XFree(kbdDescPtr);

	return 0;
}

int main(int argc, char *argv[])
{
	Display *xkbdpy;
        UNUSED(argc);

	xkbdpy = init_xkb();

	if (!xkbdpy) return 1;

	list_groups(xkbdpy);

    //parse_options(argc, argv);

    return 0;
}

Собирать с -lX11.

uglym8
()

2018
Не xcb
Вообще завязываться на иксы

anonymous
()
Ответ на: комментарий от Zubok

А в твоей системе стоит какая-нибудь переключалка языков из твоего DE (гномопереключалка, кдепереключалка и т. д)?

Нет, все с начала установки ubuntu оставалось неизменным

boganet9993
() автор топика

Нет, все с начала установки ubuntu оставалось неизменным

Ну так в убунте есть переключалка своя. Есть вероятность, что с ней конфликт. Пробуй в голых иксах для начала. Это самый чистый эксперимент. см. startx, xinit. в терминале запусти сво программу.

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

Ответ: $ setxkbmap -layout us,ru,il,de -option grp:alt_shift_toggle

После этого выводит указанные языки, но... Если закрыть программу, переключить язык и вновь ее запустить, то снова определяет лишь два языка

boganet9993
() автор топика
Ответ на: Ответ: Выхлоп от команды $ setxkbmap -query от boganet9993

Ну это из-за переключалки Ubuntu очевидно. Если ты уверен, что добавил четыре раскладки через нее, то есть вероятность, что Ubuntu как-то динамически из подключает по одной, а две первые всегда стабильно держит статически. Все четыре не подключает. То есть не статически их держит. Уверен, что проблема в переключалке.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: Ответ: Выхлоп от команды $ setxkbmap -query от boganet9993

layout: ru,us

Ну а каких вы еще групп ожидаете, имея лишь две в наличии?:)

Вы хотели способ через X11 получить список layouts, вы его получили
Почему ubuntu так чудит это уже отдельный вопрос.

Какая версия ubuntu?
Какой DE (Gnome, KDE, MATE, Xfce, что-то развеселое и тайлинговое)?

Завтра вечером могу поднять виртуалку и посмотреть, что там за напасть такая:)

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

Ну а каких вы еще групп ожидаете, имея лишь две в наличии?:)

У него добавлены четыре языка. И когда он подключает другие, то они по одному появляются. Вот сообщение: Библиотека X11 и получение списка языков (комментарий)

Очевидно, что Ubuntu (что там у него, не знаю) держит ru, en всегда, а by или de подключает динамически. Как только ушли на ru или en, то она by\de снова удаляет. Если сконфигурировать через иксы, то подозреваю, что Ubuntu снова все перетрет и будет делать по-своему.

UPD какбэ подтверждаэ:

После этого выводит указанные языки, но... Если закрыть программу, переключить язык и вновь ее запустить, то снова определяет лишь два языка

Если он делает сам себе переключалку самопальную, то лучше просто из Ubuntu переключалку удалить, если это вообще возможно. Если нет, то , скорее всего, там есть специфичный интерфейс dbus (не уверен, что уже есть какие-то стандарты между DE, сейчас в стандарты стало не модно).

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 4)
Ответ на: комментарий от boganet9993

Необходимо получить установленные в системе языки ввода. А дальше поместить их в всплывающее меню и программно переключать язык ввода.

То есть основная переключалка языков тебе все равно нужна? Смотри. Варианты такие:

1. Ты читаешь много интернета, выясняешь, где у переключалки выключение и выключаешь. Вместо нее настраиваешь все через иксы. Тогда у тебя будет все корректно. Если ты продолжаешь работать с переключалкой Unity, то всегда будешь получать, что и получаешь - 2 или 3 языка.

2. Если тебе нужна родная переключалка, то тогда ничего не остается, как искать, как можно с ней взаимодействовать. Я подозреваю, что есть какой-то интерфейс dbus, по которому можно выяснить, какие языки в системе и переключить их. Но это решение, скорее всего, будет Unity-специфичное. Еще раз повторю, что не уверен, что интерфейсы dbus стандартизированы.

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

... или еще через gsettings возможно узнать список языков.

Zubok ★★★★★
()

Посмотреть сконфигурированные layouts (в терминологии unity (или gnome) sources):

$ dconf read /org/gnome/desktop/input-sources/sources

Какой source является активный в настоящий момент:

$ dconf read /org/gnome/desktop/input-sources/current

Дополнительная информация по переключению раскладок в ubuntu:
https://askubuntu.com/questions/451945/permanently-set-keyboard-layout-option...

Я бы забил бы на переключение при помощи Unity и сконфигурировал бы переключение через X (например, при помощи setxkbmap)

Если хочется помучиться, то можно и с Unity: перехватить добавление (вернее изменение /org/gnome/desktop/input-sources/sources) можно, с установкой layout надо разбираться, поскольку установка current при помощи dconf write, естественно ничего не даст:)

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

Посмотреть сконфигурированные layouts (в терминологии unity (или gnome) sources):

Я полный ноль в GNOME и Unity, так как никогда ими не пользовался. Это автору топика надо.

Я бы забил бы на переключение при помощи Unity и сконфигурировал бы переключение через X (например, при помощи setxkbmap)

Я бы тоже забил. Но в этом месте, наверное, надо разобраться, потому что чтобы работала иксовая переключалка, надо отключить убунтяшную в Unity. Где это делается, не знаю. Я ставил когда-то другим Ubuntu, но там был еще GNOME 2. Если я помню правильно, то в настройке раскладок клавиатуры была галка типа (по памяти и не дословно) «Use system settings». То есть если клавиатура сконфигурирована через иксы, то апплет на панели будет использовать эти настройки. Вроде так.

(например, при помощи setxkbmap)

В ubuntu 16.04 должен работать

# dpkg-reconfigure keyboard-configuration

Он добавит языки в /etc/default/keyboard для иксов.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 4)
Ответ на: комментарий от Zubok

Если я помню правильно, то в настройке раскладок клавиатуры была галка типа (по памяти и не дословно) «Use system settings».

Или это в Xubuntu (XFCE) было?.. Не помню.

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

Или это в Xubuntu (XFCE) было?.. Не помню.

Вроде как с версии GNOME 2.12 (так я в gconf узнал в интернете) чтобы использоваться системные настройки, надо сконфигурировать их через иксы и удалить языки, опции и флаги всякие в настройке переключалки. Тогда будут работать иксовые. Вполне может быть, что так и надо делать.

До GNOME 2.12 был флаг в gconf для override.

schemas/desktop/gnome/peripherals/keyboard/kbd/overrideSettings

Very soon, keyboard settings in gconf will be overridden (from the system configuration) This key has been deprecated since GNOME 2.12, please unset the model, layouts and options keys to get the default system configuration.

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

Если в терминале написать

setxkbmap -layout "us,ru,de"
, то будет определять три эти языка. Но мне то нужно, чтобы программа определяла какие у пользователя стоят языки ввода и вряд ли пользователь будет таким образом их добавлять к себе)

А таким образом там настраиваются только языки раскладок по странам, т.е. если Россия, то оно оставляет два возможных языка ввода англ и рус

# dpkg-reconfigure keyboard-configuration

Результат данной команды

dconf read /org/gnome/desktop/input-sources/sources
: [('xkb', 'us'), ('xkb', 'ru'), ('xkb', 'de')]

Результат данной команды

dconf read /org/gnome/desktop/input-sources/current
:uint32 0

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

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

А таким образом там настраиваются только языки раскладок по странам, т.е. если Россия, то оно оставляет два возможных языка ввода англ и рус

Ну я там не помню, как делается, но ты можешь зайти в сгенерированный там файл /etc/default/keyboard и прямо руками исправить переменные, через запятую прописав что тебе нужно. Формат стандартный иксовый, как опции для клавиатуры в xorg.conf

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от boganet9993

, то будет определять три эти языка. Но мне то нужно, чтобы программа определяла какие у пользователя стоят языки ввода и вряд ли пользователь будет таким образом их добавлять к себе)

Так ты для себя пишешь или для всех? Если для всех, то тогда тебе придется сношаться с правилами доморощенных переключалок Ubuntu/Unity и всех других систем (если ты вообще какую-то универсальную программу пишешь, которая и в KDE должна работать). Они переопределяют настройки иксов, пока их не попросить этого не делать.

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

У меня есть подозрение что ru, en у тебя стабильно стоят и не исчезают, потому что они как раз были на этапе установки системы прописаны в /etc/default/keyboard, которая сконфигурировала XKB. А те, что ты добавил через переключалку Unity (by и de), то исчезают из списка, то появляются. Можно проверить гипотезу, прописав в /etc/default/keyboard XKBLAYOUT=«us,ru,by,de». Инетересно, что на это скажет переключалка Unity.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от boganet9993

Ну, ты запрашиваешь командой dconf read /org/gnome/desktop/input-sources/sources список раскладок, получаешь массив 0=>en, 1=>ru, 2=>de
Далее командой dconf read /org/gnome/desktop/input-sources/current получаешь индекс активной в данный момент раскладки, по которому текущую раскладку можно достать из выхлопа предыдущей команды.

Осталось найти, как сменить раскладку. Я бы на твоём месте попробовал тупо в лоб записать 3 в /org/gnome/desktop/input-sources/current (гугл подскажет как записывать в dconf) и смотрел, сменилась ли раскладка на немецкую.

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

Делал? Или перезагрузка.

man keyboard:

In Debian systems, changes in /etc/default/keyboard do not become imme‐
diately visible to X.  You should either reboot the system, or use

udevadm trigger --subsystem-match=input --action=change

И иксы на всякий случай перезапусти.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от boganet9993

НУ а следующим шагом удали все добавленные языки в конфигурации Unity и все остальные параметры в дефолт поставь. Или посмотри, нет ли там какой галки, которая использует системные настройки. При этом настройку в /etc/default/keyboard оставь на четыре языка. Перегрузи иксы. И снова проверь.

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

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

А есть ли возможность получить список раскладок иным способом (не через x11) тогда? Через файл какой либо может? Который стандартный для любой системы линукс?

anonymous
()
Ответ на: комментарий от Zubok

Я обновил систему до 18.04 и произошли некоторые изменения. Теперь в файле /etc/default/keyboard при добавлении новой раскладки она так же стала добавляться. А что, если я буду считывать список языков из файла /etc/default/keyboard? Таким образом я могу получить их краткое название, но тогда возникает проблема с переключением выбранного языка. Как, зная краткое название языка, переключить раскладку?

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

Я обновил систему до 18.04 и произошли некоторые изменения. Теперь в файле /etc/default/keyboard при добавлении новой раскладки она так же стала добавляться

Это потому, что в 18.04 уже GNOME и другая переключалка вообще, которая по другим правилам работает, по своим. Может, даже системную нормально принимает.

А что, если я буду считывать список языков из файла /etc/default/keyboard?

Нет, этот файл только для Debian и производных дистрибутивов и клавиатура не обязана быть сконфигурирована именно там. Она может быть сконфигурирована в xorg.conf. (если мы говорим об иксах) или в переключалке из DE. Это обычный конфигуратор XKB из Debian, поэтому через XKB ты можешь прочесть, что сконфигурировано. Но надо иметь в виду, что DE может иметь свою настройку и все испортить. Про Гном, кстати, написано явно, что если ничего не конфигурировать в переключалке GNOME, то будет использоваться умолчательная конфигурация XKB. Но если сконфигурировал в GNOME по-другому (проведи эксперименты со своей программкой), то вроде будет GNOME управлять.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 3)
Ответ на: комментарий от Zubok

Я уже потихоньку начинаю с ума сходить, мне кажется)))) Теперь при использовании команды

setxkbmap -query
выводит
rules:      evdev
model:      pc105
layout:     us,ru,by,us
variant:    ,,,
options:    grp:alt_shift_toggle,grp_led:scroll

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

На самом деле, проблема в твоем случае не в том, что переключалка DE что-то переопределила. Если она работает через XKB и сообщила в XKB о всех сконфигурированных раскладках, то твоя программа не будет иметь проблем определением, какие языки используются. Проблемы могут быть при переключении раскладки, если ты попытаешься ее напрямую через XKB переключить. Тогда аплет DE может не понять этого и флажок или надпись не поменяет. Я не знаю, как там будет.

Поэтому в случае присутствия переключалок DE надо бы рассмотреть способ переключения через эту переключалку, через ее интерфейс, если он вообще есть. Стандартов в этом вопросе вроде как нет для DE. В KDE уже все будет по-другому. В XFCE тоже. Но если просить переключалку DE системную конфигурацию, то можно через XKB. Вот, например, такая галка была (есть?) в XFCE: https://i.stack.imgur.com/gedBd.png . Если ее нажать, то возможность конфигурирования через это меню заблокируется и будут использованы настройки XKB.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от boganet9993

Я уже потихоньку начинаю с ума сходить, мне кажется)))) Теперь при использовании команды

Если я правильно понял возмущение, то переключалка GNOME тоже, очевидно, динамически управляет этим списком. Добро пожаловать в новую реальность — мир без стандартов и мир так называемых экосистем. :) Теперь у каждого своя песочница. В общем, пиши свою программу для каждого DE теперь. :/

В системах без DE, которые используют просто WM без DE (openbox и т . д) обычно используются настройка XKB и у тебя не будет проблем, а здесь...

Короче, попробуй удалить конфигурацию в GNOME и оставить в /etc/default/keyboard. Проверь, правильно ли в этом случае выводится все? Только после удаления перегрузи Гном.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от boganet9993

Вот еще знаешь что? Попробуй взглянуть на библиотеку libxklavier. Ее вроде как использует (смотрю по зависимостям Debian) GNOME (libgnomekbd8), XFCE (xfce4-settings, xfce4-xkb-plugin), MATE (libmatekbd4 и еще там), CINNAMON. Я не знаю, какое там API (это как раз svu знал, так как он один из ее разработчиков был), но надо все равно посмотреть API. Вроде KDE не использует ее (вероятно из-за того, что использует GObject).

Вот что сделай - поставь маленькую переключалку gxkb (она использует libxklavier) и посмотри, какие языки она увидит (флажки в tray). Но предполагаю, что увидит то же. что и твоя программа (наверняка тоже лезет в XKB). Проверишь - отпишись.

UPD. Да, и проверь с вариантами:

1. В файле /etc/default/keyboard есть конфигурация и в GNOME тоже сконфигурировано.

2. В файле /etc/default/keyboard нет конфигурации, а есть только в GNOME

3. В файле /etc/default/keyboard есть конфигурация, а в GNOME не сконфигурировано.

Не забывай обновлять udevadm и перегружать графику.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 4)
Ответ на: комментарий от Zubok

Ну допустим я получаю список языков и меня все устраивает. Как, зная краткое название языка, переключить раскладку тогда? Через setxkbmap не варик, ибо оно убирает все остальные раскладки.

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

Или хотя бы как получить текущую раскладку клавы

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

Мы говорим по-прежнему про XKB-way и через написание своей программы с xlib? Тогда XkbLockGroup, но только по индексу, который надо узнать, не по краткому названию языка.

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

Я уже это сделал. Осталось решить проблему с текущей раскладкой. На вызов QApplication::keyboardInputLocale().name(); почему-то ругается

boganet9993
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.