如何激活应用程序并将小部件聚焦在 gtk/ubuntu 上?

How to activate application and focus a widget on gtk/ubuntu?

在带有 Unity 桌面管理器的最新版本的 Ubuntu 上,如何激活您的 运行 应用程序并以编程方式将其置于前台?

也就是说,假设您将图形应用程序中的计时器设置为 3 分钟。有没有办法激活您的应用程序,将其置于前台,并在计时器到期时为其设置焦点?

我四处寻找 API 来帮助解决这个问题。

gtk_window_present() 实际上并没有使我的应用程序成为活动应用程序。当我调用它时,活动应用程序保持不变。

接下来我应该尝试什么?

问得好,但我认为你应该采取不同的方法。以编程方式将应用程序带到前台是一种安全风险。例如,当您的 window 跳到前台并抓住键盘焦点时,用户可能正要在其网上银行登录页面中输入密码。

这确实发生在我身上——幸运的是,我没有使用网上银行密码——从那以后,如果可以的话,我通常只是停止使用弹出到前面的应用程序。

相反,我认为您应该使用 g_application_send_notification() 来通知用户操作已完成。在大多数桌面上,单击通知会将 window 带到前台,因此您将获得基本相同的效果而不会让用户感到意外。

致 ptomato,在我的真实案例中,我的应用程序需要根据全局热键弹出一个屏幕。当按下热键时,我的应用程序会截取屏幕截图,然后允许用户裁剪他们的选择并将其保存到 url。所以是的,我需要弹出我的背景 window 并以编程方式激活它。

我找到的解决方案是在wmctrl 源代码中。通过实施部分 NetWM 消息传递规范,我可以与 window 管理器(Compiz、KWin、Metacity)而不是工具包进行通信,要求它激活我的程序。

我需要的特定消息是 _NET_ACTIVE_WINDOW 以及我 window 的 XID。当此事件发送 (XSendEvent) 到根 window 时,任何实现 NetWM 消息传递的 window 管理器都会将 windows I ask 带到前台并为其提供输入焦点。问题已解决。