当我尝试在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,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现已正确标记为已弃用.
如何修复我的代码以警告免费和正确的构建?
谢谢
解决方法
如果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.state & ShiftMask ? 1 : 0);
笔记:
>此chromium bug report讨论了XGetKeyboardMapping和XKB替换解决方案.
> X.org上的XkbKeyCodeToKeysym手册页