Xlib与_NET_ACTIVE_WINDOW和XGetInputFocus之间的区别

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

谢谢。

不,他们并不总是指向相同的东西。

_NET_ACTIVE_WINDOW是WM的东西。 它不会指向不由WM管理的窗口。

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

你想要使用什么取决于你的确切需求。 正常的应用程序应该几乎不用。 如果您想发送键盘事件,请使用XGetInputFocus。 在大多数情况下,您可能需要_NET_ACTIVE_WINDOW。

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

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

_NET_ACTIVE_WINDOW比XGetInputFocus更好地隔离了这些类型的应用程序实现细节。 像窗口管理器或键盘采集器可能会对特定的细节感兴趣,但是一个应用程序询问它本身是否活动(或要求成为活动)应该使用原子。

这里也多读一点: http : //standards.freedesktop.org/wm-spec/wm-spec-latest.html#idm140200472702304