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), а необходимо получать полное. Буду очень благодарен за помощь! С данной библиотекой никогда ранее не сталкивался, поэтому плохо понимаю, как ей пользоваться адекватно

Ответ на: комментарий от 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
() автор топика
Ответ на: комментарий от boganet9993

The following members of class QApplication are obsolete. They are provided to keep old source code working. We strongly advise against using them in new code.

(obsolete) QLocale keyboardInputLocale()

QLocale QApplication::keyboardInputLocale()

Returns the current keyboard input locale. Replaced with QInputMethod::locale()

Я не знаю, что это все должно возвращать вообще. Локаль?

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

Как я понял, возвращает строку с названием текущего языка, но только компилятор выдает только ругань и непонимание, что от него хотят))

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

Как я понял, возвращает строку с названием текущего языка, но только компилятор выдает только ругань и непонимание, что от него хотят))

Так какого языка? Не факт, что эта функция для X11 реализована вообще. Смотря чем ругается компилятор.

Если ты уж лезешь в XKB, то почему оттуда же взять текущую раскладку не хочешь? XkbGetState.

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