当我尝试使用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 );
}
Run Code Online (Sandbox Code Playgroud)
预期结果是什么?编译.
会发生什么?
warning: 'XKeycodeToKeysym' is deprecated (declared at /usr/include/X11/Xlib.h:1695) [-Wdeprecated-declarations]
Run Code Online (Sandbox Code Playgroud)
由于https://bugs.freedesktop.org/show_bug.cgi?id=5349 XKeycodeToKeysym现已正确标记为已弃用.
如何修复我的代码以警告免费和正确的构建?
谢谢
hum*_*tim 10
提供的XKB是最简单的替代品XKeycodeToKeysym是:
#include <X11/XKBlib.h>
/* which declares:
KeySym XkbKeycodeToKeysym(Display *dpy, KeyCode kc,
unsigned int group, unsigned int level); */
Run Code Online (Sandbox Code Playgroud)
...然后原始问题的代码可能变成:
mykey = XkbKeycodeToKeysym( display, event.xkey.keycode,
0, event.xkey.state & ShiftMask ? 1 : 0);
Run Code Online (Sandbox Code Playgroud)
笔记:
XGetKeyboardMapping了XKB替代解决方案和替代解决方案.小智 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);
}
Run Code Online (Sandbox Code Playgroud)
不要忘记释放返回值.