Привет обитателям форума. Поставленная мне задача: Нужно сделать индикатор текущей раскладки и при клике по этому индикатору вылазила менюшка, в которой можно выбрать какой-либо язык и программно его переключить на выбранный. То есть, по факту есть две задачи: 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];
Display *display = XOpenDisplay(NULL);
XkbLockGroup( display, XkbUseCoreKbd, i );
XkbStateRec state[1];
memset(state, 0, sizeof(state));
XkbGetState(display, XkbUseCoreKbd, state);