我想通过编程改变Linux中的键盘布局, X11的API函数是做什么的?
答案 0 :(得分:4)
我找到了一个很好的解决方案。 这是Jay Bromley的c ++类wrriten,我可以添加到我的应用程序并使用它。
它非常易于使用:
#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
答案 1 :(得分:2)
我不确定X11库函数是什么,但setxkbmap是我用来实现它的bash命令。也许沿着这些方向搜索可以找到你想要的东西(或者你可以只是执行bash命令)。
实施例
setxkbmap dvorak
setxkbmap us
修改: 在setxkbmap的一串之后没有出现任何有用的东西我建议只是打电话:
system(“setxkbmap us”);
答案 2 :(得分:2)
纯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
标志
这将为英语(美国)qwerty布局打印pc+us+inet(evdev)
,为俄语йцукен布局打印pc+ru+us:2+inet(evdev)
,为英语dvorak布局打印pc+us(dvorak)+us:2+inet(evdev)
。
答案 3 :(得分:0)
昨天我试图为Google的xsecurelock制作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”),这个简单的代码将切换你当前的布局:)