在最新版本的Ubunutu上使用Unity桌面管理器,如何激活正在运行的应用程序并以编程方式将其带到前台?
也就是说,假设您的图形应用程序中有一个计时器设置为3分钟。有没有办法激活你的应用程序,把它带到前台,并在计时器到期时将焦点设置到它?
我已经四处寻找API来帮助解决这个问题。
gtk_window_present()实际上并没有使我的应用程序成为活动应用程序。当我调用它时,活动应用程序保持不变。
我接下来应该尝试什么?
答案 0 :(得分:1)
好问题,但我认为你应采取不同的方法。以编程方式将应用程序带到前台存在安全风险。例如,当您的窗口跳到前台并抓住键盘焦点时,用户可能只是将其密码键入其在线银行登录页面。
这实际上发生在我身上 - 幸运的是没有使用网上银行密码 - 但从那以后我通常会停止使用弹出前面的应用程序,如果可以的话。
相反,我认为您应该使用g_application_send_notification()
来通知用户操作已完成。在大多数桌面中,单击通知会将窗口置于前台,因此您可以实现基本相同的效果,而不会让用户感到意外。
答案 1 :(得分:0)
对于ptomato,在我的真实案例中,我的应用程序需要根据全局热键弹出一个屏幕。当按下热键时,我的应用程序会截取屏幕截图,然后允许用户裁剪他们的选择并将其保存到网址。所以是的,我需要弹出我的后台窗口并以编程方式激活它。
我找到的解决方案是在wmctrl源代码中。通过实现部分NetWM消息传递规范,我可以使用窗口管理器(Compiz,KWin,Metacity)而不是工具包,要求它激活我的程序。
我需要的具体消息是_NET_ACTIVE_WINDOW以及我窗口的XID。当这个事件被发送(XSendEvent)到根窗口时,任何实现NetWM消息传递的窗口管理器都会把我要求的窗口带到前台并给它输入焦点。问题解决了。