Xlib与_NET_ACTIVE_WINDOW和XGetInputFocus之间的区别

时间:2015-08-04 04:46:41

标签: c linux x11 xlib xorg

_NET_ACTIVE_WINDOW和XGetInputFocus()有什么区别?他们总是指向同一个窗口吗?什么时候使用另一个?

感谢。

2 个答案:

答案 0 :(得分:3)

主要区别在于设定比获取更多。设置焦点(激活窗口)时,您更喜欢xlib函数上的原子,因为窗口管理器可能会以不同的方式处理您的请求 - 例如,如果您想要激活当时具有模态对话框的窗口,WM可能会关注该对话框而不是窗口本身,或者如果用户禁用了焦点窃取,WM可能只是突出显示窗口而不是实际聚焦它。

基于相同的想法,在获取方面也存在一些小差异,尽管我不确定所有差异到底是什么,我认为它可能是应用特定的。通过我编写的程序,获取属性和焦点返回相同的窗口。但是对于Firefox,它会返回两个不同的窗口 - 活动窗口是我们期望的窗口,但重点是隐藏窗口。我不知道为什么会那样做,但确实如此。

_NET_ACTIVE_WINDOW比XGetInputFocus更好地隔离了这些应用程序实现细节。像窗口管理器或键盘抓取器之类的东西可能对特定细节感兴趣,但是一个应用程序询问它本身是否处于活动状态(或请求变为活动状态)应该使用原子。

在这里再读一点btw: http://standards.freedesktop.org/wm-spec/wm-spec-latest.html#idm140200472702304

答案 1 :(得分:2)

不,他们并不总是指向同一件事。

_NET_ACTIVE_WINDOW是一个WM的事情。它不会指向不由WM管理的窗口。

输入焦点不知道或不关心WM(除了由WM设置 )。它可以由任何程序随时设置到任何窗口:内部,覆盖 - 重定向甚至是不相关的托管窗口(尽管很少有程序这样做)。

您想要使用的内容取决于您的确切需求。普通应用程序也很难使用。如果要发送键盘事件,请使用XGetInputFocus。在大多数其他情况下,您可能需要_NET_ACTIVE_WINDOW。