什么与X11相当于SetForegroundWindow?

时间:2014-06-10 17:03:27

标签: c++ window x11

我是SFML Team的一部分,我们目前正在研究一项功能,以及#34;请求"窗口焦点。目标是在Windows,OS X和Linux上获得非常相似的行为。

对于Windows,可以通过WinAPI获取相当简单的SetForegroundWindow函数,WinAPI有一些关于窗口实际上如何获得焦点的条件。这里要注意的最重要的部分是,只有来自同一个前台进程才能获得焦点。

在OS X上,它可以仅为活动应用程序获得焦点,否则让图标反弹,即通知。

现在出现问题,我们也希望在Linux上获得相同的行为,这意味着如果窗口属于活动/前台进程,窗口应该获得焦点,否则它应该生成通知。与X11最接近的是什么?

SFML的问题跟踪器上已经有few suggestions,但它们都没有实际实现此行为。

"用户故事"

我想开发人员在面对不同的技术名称时可以考虑不同的事情,因此从用户角度来看问题就是这样。

主要有两种情况需要关注:

  • 有时,当启动在后台使用控制台窗口的应用程序时,可以发生控制台窗口获得焦点而不是实际的GUI窗口。当发生这种情况时,对于必须首先点击窗口的用户来说相当烦人。由于控制台窗口和GUI窗口来自同一个应用程序,因此将焦点切换到GUI窗口没有任何害处。

  • 当一个人正在编写一个支持多个窗口的应用程序时,可能会出现这样的情况:应用程序应该决定哪个窗口获得焦点,并且由于该窗口属于同一个应用程序,因此该应用程序无需做任何伤害。将焦点从一个GUI窗口切换到另一个GUI窗口。

  • 此外,如果不同的应用程序具有焦点/正在被使用,那么它不可能窃取焦点,因此我们只是想引起用户的注意。对于可能是闪烁任务栏的Windows或可能是跳转图标的OS X.

当前的实现似乎在OS X和Windows上运行良好,但我们对X11实现不确定。因此问题是:如果当前聚焦的窗口已由发出焦点请求的相同应用程序创建并以其他方式创建某种通知,那么如何切换窗口焦点。对于通知我们/我甚至不确定是否有一些通用的方法来使用X11。

1 个答案:

答案 0 :(得分:1)

在X11中,“焦点”表示“键盘焦点”,即获取键盘输入的窗口。具有焦点的窗口不一定在前景中。这取决于您的窗口管理器焦点策略。大多数可以配置为具有“点击关注”或“点对焦”政策。如果您对键盘焦点感兴趣,请使用XSetInputFocus。如果您想将窗口置于前台,请使用XRaiseWindow

当应用程序启动时,可以调用RaiseWindowXSetInputFocus一次。将窗口带到前景/设置焦点也可以作为对用户与该应用程序的某个或其他窗口的交互的响应。但是作为对某些背景事件(时间过去,文件下载等)的响应,这样做是不可行的。

引起注意窗口的标准X11方法是设置紧急提示。这通常会闪烁或反弹图标,具体取决于您的窗口管理器。当用户最终与窗口交互时,不要忘记取消设置提示。

我认为所有这些都已经在您链接的主题中进行了讨论。我不太确定哪些问题仍未得到答复。没有什么可以实现与其他窗口系统完全相同的行为,因为X11不是那些窗口系统,而且完全没问题。 X11,Mac OS X和Windows的行为都不同,用户也知道并期待这一点。如果X11上的某些应用程序决定与Windows上的应用程序完全一样,而不是使用X11派对线,那将会让我感到烦恼。