首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何更改键盘布局( X11应用编程接口解决方案)

如何更改键盘布局( X11应用编程接口解决方案)
EN

Stack Overflow用户
提问于 2010-07-13 01:43:15
回答 3查看 5.8K关注 0票数 4

我想通过编程改变Linux中的键盘布局,X11的哪个API函数可以做到这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-18 16:44:35

我找到了一个很好的解决方案。这是一个由Jay Bromley编写的c++类,我可以添加到我的应用程序中并使用它。

source code

它非常容易使用:

代码语言:javascript
运行
复制
#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),并使用如下内容:

代码语言:javascript
运行
复制
g++ *.cpp -o getxkblayout -L/usr/lib -lX11
票数 4
EN

Stack Overflow用户

发布于 2014-05-27 17:19:31

一个纯粹的X11应用程序接口解决方案应该是这样的:

代码语言:javascript
运行
复制
#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)

票数 2
EN

Stack Overflow用户

发布于 2016-12-15 19:39:51

昨天我试着把Google的xsecurelock的自动布局切换到EN。我试着为X11应用程序接口找到一些现有的解决方案,但是...

因此,我决定在S. Razi的帮助下编写自己的代码。代码如下:(用gcc -lX11运行)

代码语言:javascript
运行
复制
#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:”俄语“),这段简单的代码将切换您当前的布局:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3230761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档