replaceXKeycodeToKeysym

当我尝试在Ubuntu 12.04中使用X11头文件构build代码时

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已被正确标记为已弃用。

如何解决我的代码警告自由和正确的构build?

谢谢

如果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); 

笔记:

  • 这个铬缺陷报告讨论了XGetKeyboardMappingXKB替代解决方案。
  • X.org上的XkbKeyCodeToKeysym手册页

告诉你一个例子,你可以做你的来源相同。

更换

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); } 

不要忘记释放返回值。