在Unity桌面管理器的最新版本的Ubunutu上,如何激活正在運行的應用程序並以編程方式將其帶到前臺?如何激活應用程序並將焦點集中在gtk/ubuntu上?
也就是說,假設您的圖形應用程序中有一個計時器設置爲3分鐘。有沒有辦法激活你的應用程序,把它帶到前臺,並在計時器到期時設置焦點?
我搜索了各地的API以幫助解決這個問題。
gtk_window_present()實際上並未使我的應用程序成爲活動應用程序。當我稱之爲活動應用程序保持不變。
接下來我應該嘗試什麼?
在Unity桌面管理器的最新版本的Ubunutu上,如何激活正在運行的應用程序並以編程方式將其帶到前臺?如何激活應用程序並將焦點集中在gtk/ubuntu上?
也就是說,假設您的圖形應用程序中有一個計時器設置爲3分鐘。有沒有辦法激活你的應用程序,把它帶到前臺,並在計時器到期時設置焦點?
我搜索了各地的API以幫助解決這個問題。
gtk_window_present()實際上並未使我的應用程序成爲活動應用程序。當我稱之爲活動應用程序保持不變。
接下來我應該嘗試什麼?
對於ptomato,在我的現實世界中,我的應用程序需要基於全局熱鍵彈出一個屏幕。當按下熱鍵時,我的應用程序會截取屏幕截圖,然後允許用戶裁剪他們的選擇並將其保存到網址。所以是的,我需要彈出我的背景窗口並以編程方式激活它。
我找到的解決方案是在wmctrl源代碼中。通過實施NetWM消息傳遞規範的一部分,我可以與窗口管理器(Compiz,KWin,Metacity)進行溝通,而不是工具包,要求它激活我的程序。
我需要的特定消息是_NET_ACTIVE_WINDOW以及我的窗口的XID。當這個事件被髮送(XSendEvent)到根窗口時,任何實現NetWM消息傳遞的窗口管理器都會把我要求的窗口帶到前臺並給它輸入焦點。問題解決了。
好問題,但我認爲你應該採取不同的方法。以編程方式將應用程序置於前臺是一種安全風險。例如,當您的窗口跳轉到前臺並抓住鍵盤焦點時,用戶可能正要將他們的密碼輸入到他們的在線銀行登錄頁面。
這實際上發生在我身上 - 幸運的是沒有使用在線銀行密碼 - 而且從那以後,我通常只是停止使用彈出到前面的應用程序,如果可以的話。
相反,我認爲您應該使用g_application_send_notification()
來通知用戶操作已完成。在大多數桌面中,點擊通知會將窗口置於前臺,所以您將獲得基本相同的效果,而不會讓用戶感到意外。