gpt4 book ai didi

c++ - 与 X11 的 SetForegroundWindow 等效的是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 11:32:34 26 4
gpt4 key购买 nike

我是 SFML Team 的一员我们目前正在研究“请求”窗口焦点的功能。目标是在 Windows、OS X 和 Linux 上获得非常相似的行为。

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

在 OS X 上,可以只获得事件应用程序的焦点,否则让图标弹跳,即通知。

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

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

“用户故事”

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

主要有两种情况需要请求焦点:

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

  • 当一个人正在编写一个支持多窗口的应用程序时,可能会出现应用程序应该决定哪个窗口获得焦点的情况,而且由于该窗口属于同一个应用程序,所以将焦点从一个 GUI 窗口到另一个 GUI 窗口。

  • 此外,如果另一个应用程序获得焦点/正在使用,那么窃取焦点是不对的,因此我们只想引起用户的注意。对于可能是闪烁的任务栏的 Windows,对于可能是跳跃图标的 OS X。

当前的实现似乎在 OS X 和 Windows 上运行良好,但我们不确定 X11 的实现。因此问题是:如果当前获得焦点的窗口是由发出焦点请求的同一个应用程序创建的,那么人们将如何切换窗口焦点,否则会创建某种通知。对于通知,我们/我什至不确定是否有一些使用 X11 的通用方法。

最佳答案

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

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

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

我认为所有这些都已在您链接的线程中进行了讨论。我不太确定哪些问题仍未得到解答。没有什么可以实现与其他窗口系统完全相同的行为,只是因为 X11 不是那些窗口系统,而且它完全可以。 X11、Mac OS X 和 Windows 都有不同的行为,用户知道并期望这一点。如果 X11 上的某些应用程序决定完全像在 Windows 上那样运行,而不是遵从 X11 党的路线,那将永远让我恼火。

关于c++ - 与 X11 的 SetForegroundWindow 等效的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24146903/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com