我想通过编程来改变Linux的键盘布局,X11的API函数是做什么的?
我找到了一个好的解决方案 这是由Jay Bromley撰写的c ++类文章,我可以添加到我的应用程序中并使用它。
源代码
这非常容易使用:
#include "XKeyboard.h" XKeyboard xkb; std::string cGrpName=xkb.currentGroupName(); //return somethings like "USA" std::string cGrpSymb=xkb.currentGroupSymbol(); //return somethings like "us" xkb.setGroupByNum(0);//set keyboard layout to first layout in available ones
你可以阅读源代码,并找到一些其他有用的功能。 要编译独立版本,您需要取消注释“XKeyboard.cpp”中的“int main”函数(或者编写自己的main.cpp),并使用下面的方法:
g++ *.cpp -o getxkblayout -L/usr/lib -lX11
我不知道X11库函数是什么,但setxkbmap是我用来实现它的bash命令。 也许沿着这些线查找就可以找到你想要的东西(或者只需要执行bash命令即可)。
例
setxkbmap dvorak setxkbmap us
编辑:在strax的setxkbmap后,没有什么有用的,我建议只是调用:
system(“setxkbmap us”);
一个纯粹的X11 API解决方案应该是这样的:
#include <stdio.h> #include <X11/XKBlib.h> int main() { Display* _display; char* displayName = ""; _display = XOpenDisplay(displayName); XkbDescRec* _kbdDescPtr = XkbAllocKeyboard(); XkbGetNames(_display, XkbSymbolsNameMask, _kbdDescPtr); Atom symName = _kbdDescPtr -> names -> symbols; char* layoutString = XGetAtomName(_display, symName); XCloseDisplay(_display); printf("%s\n", layoutString); }
用-lX11
标志编译
这将打印一些像pc+us+inet(evdev)
英语(美国)qwerty布局, pc+ru+us:2+inet(evdev)
为俄罗斯©版权所有布局, pc+us(dvorak)+us:2+inet(evdev)
英文版dvorak。
昨天,我正试图让Google的xsecurelock的auto layuout切换到EN。 我试图找到一些现有的X11 API的解决方案,但…
所以我决定在S. Razi的帮助下写我自己的。 这里是代码:(用gcc -lX11运行)
#include <stdio.h> #include <stdlib.h> #include <X11/XKBlib.h> int main(){ Display* _display; char* displayName = ""; _display = XOpenDisplay(displayName); int _deviceId = XkbUseCoreKbd; int i = 0; int _groupCount = 0; XkbDescRec* kbdDescPtr = XkbAllocKeyboard(); if (kbdDescPtr == NULL) { printf("%s\n", "Failed to get keyboard description."); return False; } kbdDescPtr->dpy = _display; if (_deviceId != XkbUseCoreKbd) { kbdDescPtr->device_spec = _deviceId; } XkbGetControls(_display, XkbAllControlsMask, kbdDescPtr); XkbGetNames(_display, XkbSymbolsNameMask, kbdDescPtr); XkbGetNames(_display, XkbGroupNamesMask, kbdDescPtr); /* count groups */ Atom* groupSource = kbdDescPtr->names->groups; if (kbdDescPtr->ctrls != NULL) { _groupCount = kbdDescPtr->ctrls->num_groups; } else { _groupCount = 0; while (_groupCount < XkbNumKbdGroups && groupSource[_groupCount] != 0) { _groupCount++; } } /* get group names */ Atom* tmpGroupSource = kbdDescPtr->names->groups; Atom curGroupAtom; char* groupName; for (i = 0; i < _groupCount; i++) { if ((curGroupAtom = tmpGroupSource[i]) != None) { char* groupNameC = XGetAtomName(_display, curGroupAtom); if (groupNameC == NULL) { continue; } else { groupName = groupNameC; char *temp = "English"; if (strncmp(temp, groupName, 7) == 0){ printf ("%s\n", groupName); printf ("%d\n", i); XkbLockGroup(_display, _deviceId, i); XFree(groupNameC); XCloseDisplay(_display); } return 0; } } } }
在这里你可以把char * temp =“English”更改为布局组的名字(exmp:“Russian”),这个简单的代码会切换你当前的布局:)