如何更改键盘布局(X11 API解决scheme)

我想通过编程来改变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”),这个简单的代码会切换你当前的布局:)