LINUX.ORG.RU

Получение текущей раскладки

 , ,


1

2

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

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(",");
    XFree(prop_data);
    XCloseDisplay(display);
    return names[xkbState.group];
Переключаю языки через setxkbmap. Косяк в том, что после переключения языка переключения «горячими клавишами» перестает работать. И остается возможность только программно менять раскладку. И наверное вы подумали, а зачем же я переключаю раскладку через setxkbmap? Просто способы переключения через Х11 по типу:
Display *display = XOpenDisplay(NULL);
                XkbLockGroup( display, XkbUseCoreKbd, i );
                XkbStateRec state[1];
                memset(state, 0, sizeof(state));
                XkbGetState(display, XkbUseCoreKbd, state);
отказываются корректно работать.

Стоит гномовская переключалка

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

янихуанепонел.жпг

автору нужна обычная переключалка? ну дак поставь. в любом ДЕ и так есть.

mos ★★☆☆☆
()

Открой сорцы xxkb и посмотри как это делается. Там всё просто, даже школьник справится.

peregrine ★★★★★
()

Переключаю языки через setxkbmap. Косяк в том, что после переключения языка переключения «горячими клавишами» перестает работать.

Типа такого: setxkbmap us? Да, так и должно быть.

Просто способы переключения через Х11 по типу:
отказываются корректно работать.

У меня не на гноме работает. Возможно, связано с этим: Gnome 3.18: внешние переключалки клавиатуры более не работают .

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