c++ - XKB - 获取大写锁定掩码

标签 c++ xlib capslock

我一直在尝试编写一个启用/禁用不同锁定(数字锁定、大写锁定、滚动锁定)的程序,但我一直遇到大写锁定问题。由于某种原因,XKB 不知道“CapsLock”vmod,但它确实知道 ScrollLock 和 NumLock。

如何获得大写锁定 mask ?


我的函数是这样的(几乎直接从numlockx复制):

unsigned int KL_Modifier::get_mask(const char* name) {
    XkbDescPtr xkb;
    if ((xkb = XkbGetKeyboard(this->disp, XkbAllComponentsMask, XkbUseCoreKbd)) != NULL) {
            int i;
            unsigned int mask = 0;
            if (!xkb || !xkb->names) {
                    mask = 0;
                    goto end;
            }
            for (i = 0; i < XkbNumVirtualMods; i++) {
                    char* mod_str = XGetAtomName(this->disp, xkb->names->vmods[i]);
                    std::cout << mod_str << " " << name << std::endl;
                    if (mod_str != NULL && strcmp(name, mod_str) == 0) {
                            XkbVirtualModsToReal(xkb, 1 << i, &mask);
                            //break;
                    }
            }
end:
            XkbFreeKeyboard(xkb, 0, True);
            return mask;
    }
    return 0;
}

我这样调用它:

unsigned int mask = this->get_mask("CapsLock");
assert(mask != 0);

最佳答案

我不知道我的问题是什么,但我找到了解决方案:使用 XkbKeysymToModifiers 代替,如下所示:

unsigned int mask = XkbKeysymToModifiers(display, XK_Caps_Lock);

其中 displayDisplay*。通过此解决方案,我能够将其他锁的 XK_Caps_Lock 切换为 XK_Num_LockXK_Scroll_Lock

关于c++ - XKB - 获取大写锁定掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15689240/

相关文章:

linux - 如何在 Linux 上使用 xlib 监听屏幕分辨率变化

javascript - 如何在不等待用户使用 JavaScript 键入字符的情况下检查大写锁定是否打开?

c++ - 如何获取游戏 Controller 名称(Windows 10/C++)

c++ - C++ 标准的第 3 方库

linux - x11 - 在不移动指针的情况下发送鼠标点击

c++ - 除非调整大小,否则 XLib 应用程序不会重绘

jquery - 使用 jQuery 检测大写锁定打开/关闭

macos - 有谁知道 OSX 将系统偏好设置 > 键盘 > 修饰键中的设置存储在哪里?

c++ - 解析 Clang AST - 缩进级别和起始符号

c++ - 如果我调用 new 和 delete,管理 dll 类的内存是否安全?