为什么XKeysymToKeycode()使我的所有键都小写?

时间:2015-02-01 01:33:42

标签: c x11 xlib

我目前遇到Xlib问题,每当我调用XKeysymToKeycode()并传入大写KeySym时,它都会返回小写KeyCode。谷歌似乎并没有真正回答这个问题,或者就我正在使用的功能提供过多的文档。

这是我正在使用的代码:

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>
#include <X11/extensions/XTest.h>

int main(void) {
    Display *display;
    char *ptr;
    char c[2] = {0, 0};
    KeySym ksym;
    KeyCode kcode;

    display = XOpenDisplay(0);
    ptr = "Test";

    while (*ptr) {
        c[0] = *ptr;
        ksym = XStringToKeysym(c);
        printf("Before XKeysymToKeycode(): %s\n", XKeysymToString(ksym));
        kcode = XKeysymToKeycode(display, ksym);
        printf("Key code after XKeysymToKeycode(): %s\n", XKeysymToString(XKeycodeToKeysym(display, kcode, 0)));
        ptr++;
    }

    XCloseDisplay(display);

    return 0;
}    

可以使用gcc -o sendkeys sendkeys_min.c -lX11 -lXtst -g -Wall -Wextra -pedantic -ansi进行编译(假设它已保存为sendkeys_min.c。)

当前输出如下:

Before XKeysymToKeycode(): T
Key code after XKeysymToKeycode(): t
Before XKeysymToKeycode(): e
Key code after XKeysymToKeycode(): e
Before XKeysymToKeycode(): s
Key code after XKeysymToKeycode(): s
Before XKeysymToKeycode(): t
Key code after XKeysymToKeycode(): t

当然,预期的输出是“Test”中的第一个T在经过XKeysymToKeycode()之后仍然是大写的。 (请注意,这不是我的实际程序,而是在此处发布的简化版本。在实际程序中,我使用生成的密钥代码发送关键事件,并且发送的密钥仍然存在此处显示的问题(它们都变为小写))

1 个答案:

答案 0 :(得分:4)

KeySymsKeyCodes在语义上不同,它们之间没有1-1关系。

  • KeyCode是表示键盘上键的任意小整数。 (不是字符。密钥。)Xlib要求密钥代码在[8, 255]范围内,但幸运的是大多数键盘只有100多个密钥。

  • KeySym表示与某个键相关联的某些实际字符。几乎总会有几个:大多数终端布局上的大写字母对应相同的键。

所以没有&#34;大写&#34;或&#34;小写&#34; KeyCode。当你得到与Keysym相对应的KeyCode时,你实际上正在丢失信息。

在Xlib中,给定的键至少有四个对应的KeySyms(小写,大写,备用小写,备用大写),尽管有些可能是未分配的。当您要求KeySym对应KeyCode时,您需要提供索引; index 0(如代码中所示)将获得未经修改的未修改字符。

对于给定的按键,对KeySym的转换将考虑修饰键的状态。其中有八个,包括ShiftLock修饰符。忽略Lock会使情况复杂化,移位修饰键通常会将小写字母转换为大写字母(对于字母键)。

键盘处理比简短的摘要复杂得多,但它只是一个开始。

对于您的任务,您可能应该查看XkbKeysymToModifiers