« 关于 jpeg 文档的修订 | 返回首页 | 模型顶点数据的压缩 »

X Window 编程的两个小问题

X Window 其实比 Widnows 要好理解的多,设计的也更为合理一些。但是无奈,资料太少、中文的就更少了。搜来搜去就那么几篇,书也没看见几本 :( 所以在 X 下做开发,对于我,比在 Windows 下麻烦了许多。

最近一段时间遇到了许多问题,解决了两个,记录在这里:

截获窗口关闭的消息

Windows 下很简单,WM_CLOSE 消息是也。btw, 一般人也不会理会这个消息大多数情况其实是由 explorer 转发过来的,而不是 GUI 系统直接发进你的窗口 。在你的窗口进程陷入死循环,无法处理窗口消息时,标题栏上的关闭叉叉按纽依然可以工作。

X Window 下,我想当然的从文档中找到一个叫作 DestroyNotiify 的消息,但是写到消息循环中怎么都触发不了。在 X 下,用鼠标点击窗口右上那个叉叉,得到的反应和 Windows 下点了死掉的窗口的关闭一样。会弹出一个对话框,OK 后强行杀掉。

后来才知道:应该先用 XInternAtom 拿到一个叫做 WM_DELETE_WINDOW 的 atom ,用 XSetWMProtocols 设置到窗口上。然后在消息循环中 case ClientMessage 方可查询到这个 atom ,从而得之窗口将被关掉的消息。

X Window 下的键盘自动连发跟 Windows 下行为不一致

当你按住一个键,X Window 和 Windows 都会模拟出一串的连续键击。但 X 下的行为跟 Windows 不同的是:X 会自动生成 key up 的消息 (X 下叫作 KeyRelease )。

在 Windows 下,你只会在真正松开键时得到唯一次 WM_KEYUP 。而在 X 下你会得到一系列的 KeyPress / KeyRelease 对,严格的按照一个 KeyPress 消息、接一个 KeyRelease 消息的来。大多数情况下,X 的处理更为合理。但是对于游戏就有点麻烦,我们无法简单的知道用户是否一直按着一个键不放。

这个问题我很早就遇到了,记得当初不知道 google 了些什么关键词就找到了相关资料。大约记得 X 协议中是可以关闭 X 的自动重复的。今天想把这部分代码补上,又怎么也 google 不到了 :( (该死的 google.cn 就是不给我记录搜索历史!)

最后终于还是从文档中翻出来了:

我们可以用 XAutoRepeatOn / XAutoRepeatOff 开关 autorepeat 的设置。但是简单调用这 API 似乎并不是一个好的方案。因为这个设置居然是影响全局的,甚至在窗口关闭程序退出后,设置都不会还原。

还好在 man XAutoRepeatOff 的时候看到了相关的另一个 api: XQueryKeymap :) 。用这个就够了,它可以查询键盘的真实状态。我们只用在消息循环中响应 KeyRelease 的时候,调用 XQueryKeymap 检查一下对应的按键是否真的被按下就 OK 了。

ps. 有没有 X Window 编程的高手啊,一个人搞这些东西总是很郁闷。

Comments

万恶的ICCCM……
莫非是在为服务器端写UI代码?怎么讨论其xwindows了?
看上去是在直接用xlib做应用程序开发。 下载xorg中doc模块。x11部分。 那是xlib的文档。 找个用gtk做的复杂的应用程序,把x重新编译下,用gdb挂上,可以跟到底层去,用法就明了了。
呵呵,我知道,按你的性子,会比较喜欢玩底层的东西。这样确实会有好处,底层的东西理解透了,上层的东西会很容易。用那些特性丰富的GUI库,也就图个省时省力。
QT 这些都好用 :D 不过以我的性子,学 XWindow ,就好比用 MFC 写 windows 程序前要把 win32 sdk 弄清楚再说。 btw. 游戏跟一般的应用软件还是不一样的,用不了那么些复杂的控件。
QT很好用。 不过做商业软件要付昂贵的许可费。 wxWidgets也很不错,且对于开发商业软件也免费。 QT和wxWidgets的跨平台支持都很出色。
QT很好吗?~!
是喔。我在 dos 时代的时候,看见计算机书店里好多 XLib 和 X 协议的书。大多是类似希望出版社这样的地方出的。 如今在书店里很少看见了。
到华南理工图书馆去找这些老掉牙的XWindow开发书籍。
你可以从国外的开源组织得到帮助。
我记得Xwindow的源码包里的docs下有很多xlib 的 dev guide
国内曾经出版过一套 Xlib的书,已经买不到了。我当初费了好大劲联系到了国内的译者(作者?忘记了),然后从他手里邮购的。 回去我找找看,还有那个地址不。
Xlib的确很复杂.. 可能你因为版权问题,不能用QT或者GTK,建议你用SDL或者参考一下它们的做法。
可以参考一下GDK的源码,它是对XLib的封装。
为何不考虑用Qt呢?
X Window 好底层的东西。好象很多人都用SDL。
风大果然是。。。

Post a comment

非这个主题相关的留言请到:留言本