替换XKeycodeToKeysym

问题描述 投票:7回答:3

当我尝试在Ubuntu 12.04中使用X11标头构建我的代码时

    case KeyPress:
        xcommon_update_server_time( event.xkey.time );
        /* if( event.xkey.state & ShiftMask ) arg |= I_SHIFT; */
        /* this alternate approach allows handling of keys like '<' and '>' -- mrallen */
        if( event.xkey.state & ShiftMask ) {
            mykey = XKeycodeToKeysym( display, event.xkey.keycode, 1 );
        } else {
            mykey = XKeycodeToKeysym( display, event.xkey.keycode, 0 );
        }

预期结果是什么?编译。

会发生什么?

warning: 'XKeycodeToKeysym' is deprecated (declared at /usr/include/X11/Xlib.h:1695) [-Wdeprecated-declarations]

由于https://bugs.freedesktop.org/show_bug.cgi?id=5349 XKeycodeToKeysym现已正确标记为已弃用。

如何修复我的代码以警告免费和正确的构建?

谢谢

c linux x11
3个回答
9
投票

如果XKB可用,那么XKeycodeToKeysym最简单的替代品是:

#include <X11/XKBlib.h>
/* which declares:
     KeySym XkbKeycodeToKeysym(Display *dpy, KeyCode kc,
                               unsigned int group, unsigned int level); */

...然后原始问题的代码可能变成:

    mykey = XkbKeycodeToKeysym( display, event.xkey.keycode, 
                                0, event.xkey.state & ShiftMask ? 1 : 0);

笔记:


6
投票

给你举个例子,你可以在你的来源上做同样的事情。

更换

keysym = XKeycodeToKeysym(dpy,xe->xkey.keycode,0)

{
    int keysyms_per_keycode_return;
    KeySym *keysym = XGetKeyboardMapping(dpy,
        xe->xkey.keycode,
        1,
        &keysyms_per_keycode_return);

    /* do something with keysym[0] */

    XFree(keysym);
}

不要忘记释放返回值。


0
投票

XStringToKeysym()可用于此目的。将您的密钥代码值转换为十六进制字符串,并添加“0x”前缀,它将返回正确的密钥符号值。

// 0xffbe = F1 
KeySym keysym = XStringToKeysym("0xffbe");
© www.soinside.com 2019 - 2024. All rights reserved.