最近在拿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事件提取出来。
这个方法效果非常好,几经测试没有出任何问题。代码见来源网址。
为了跨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事件提取出来。
这个方法效果非常好,几经测试没有出任何问题。代码见来源网址。