关于xlib按键事件(KeyPress, KeyRelease)自动重复的解决方法

最近在拿cpp重构之前写的为游戏引擎准备的api。
为了跨lin和win这两个平台,需要使用跨平台的窗口管理库或抽象出自己的独立于系统的接口。
因为暂时不想去接触那些重量级的库,我选择了后者。linux下的窗口管理用的是xlib。

没有太过系统地去看过xlib的文档,初始代码用的是lin下codeblock建立opengl工程的自带代码。
编写途中遇到一个问题,就是KeyPress、KeyRelease这两个事件会在按键按下并开启了XAutoRepeat的情况下多次触发。
为了能检测按键物理状态和检测类似双击按键的操作,就不得不解决这个问题。

方案1:

使用XAutoRepeatOff()关闭X-Window的按键自动重复,但这会影响到整个系统,如果不调用XAutoRepeatOn(),这个影响在程序关闭之后还会存在==|||。可以在窗口获取焦点的时候调用XAutoRepeatOff(),并在失去焦点的时候调用XAutoRepeatOn(),但这种方法实在显得很笨拙且易导致问题。


方案2:

来源: http://stackoverflow.com/questions/2100654/ignore-auto-repeat-in-x11-applications
搜了好久才搜到的这个方案,还是google比较好用==。
具体思路是在KeyRelease事件触发时判断是否与之前的KeyRelease事件为同一keycode和同一time。
是则说明为重复触发并将紧接着的重复的KeyPress事件提取出来。
这个方法效果非常好,几经测试没有出任何问题。代码见来源网址。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值