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

来源:互联网 发布:linux locale命令i18n 编辑:程序博客网 时间:2024/06/07 10:46
最近在拿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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 老婆用苹果手机共享我的位置怎么办 孕妇餐后2小时血糖偏高怎么办 孕妇血糖餐后2小时数值高怎么办 股市退市的话股民的钱怎么办 美股股票退市了手里的股票怎么办 坐高铁安检时怕把包包弄坏了怎么办 很贵的包包高铁安检怎么办 如果过高铁安检东西被扣留怎么办 邻居家小孩把我家东西弄坏了怎么办 邻居早上6点放音乐扰民怎么办 隔壁楼邻居天天放音乐很吵怎么办 发现老公在卧室安了摄像头怎么办 憋的尿又没有厕所的时候怎么办 一岁宝宝拉屎总是拉出血怎么办 孩子鼻窦炎鼻子堵有白色鼻涕怎么办 家里阳台上老是有蝙蝠趴着怎么办 空调太冷在空调房里该怎么办 分手了怎么办不要挽回要重新吸引 过敏体质没打疫苗的孩子入学怎么办 遇到不认识的小姐姐问我问题怎么办 小孩孑脖子洛忱了痛怎么办 挤奶把乳腺挤肿了不出奶怎么办 遇到好兄弟在背后捅刀子怎么办 面对出轨还不想离婚的老公怎么办 法院执行局把案划错了不承认怎么办 手机nfc功能被手机壳挡住怎么办 飞信短信登录验证码达到上限怎么办 手机自带短信软件没了怎么办 老婆出轨孩子又3个不知道怎么办 骑电动车摔跤小脚趾疼有点肿怎么办 第一次太疼了有心理阴影了怎么办 天梭机械表调了时间忽然慢怎么办 支付宝信用住到酒店没房间怎么办 拳头打在硬上骨头肿了怎么办 领导决策出现了失误你该怎么办 我的直销团队走到瓶颈了怎么办 孕妇8个月便秘大便带血怎么办 爱他美金装冲泡有泡沫怎么办 做雅思听力时理解不了原文怎么办 英国读语言班不想读研了怎么办 英国读研本科学位不够分怎么办