_NET_ACTIVE_WINDOW和XGetInputFocus()有什么区别?他们总是指向同一个窗口吗?什么时候使用另一个?
感谢。
答案 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。