2012-06-01 70 views
1

我目前正試圖在遠程XServer(Exceed)上執行Qt X11應用程序。爲了使應用程序窗口總是在其他顯示器的頂部,我使用下面的語句:Qt X11應用程序配置爲Always on Top

MainWindow->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::Tool); 

如果我在Windows 7和Ubuntu執行我的應用程序運行在本地系統上,它執行爲「總在最前面」應用。但是,當我將顯示信息路由到遠程XServer(Exceed x64 v14)時,它開始執行時沒有「Always on Top」屬性。當它失去焦點時,它會落在其他顯示器的後面。

是否有任何進一步的配置,我應該在Qt代碼或Exceed產品?

謝謝。

回答

1

首先讓我們先弄清楚一些術語。您設置的「Always on Top」屬性不是X11的一項功能,而是所謂的窗口管理器「提示」的一部分標準,作爲客戶端間通信手冊和擴展窗口管理器的一部分進行了說明-Hints。

X11不處理窗口在屏幕上的位置,這就是Window管理器的功能。在典型的X11系統上,您獲得了符合ICCCM/EWMH標準的窗口管理器,該窗口管理器控制着所有的窗口,一切正常。這也適用於各種轉發,因爲對於X11服務器,客戶端連接的方式並不重要,客戶端之間的所有通信都通過X11服務器進行。

現在在你的情況下,你正在使用Exceed,它是在Microsoft Windows桌面上運行的X11服務器。 Windows自己完成所有的窗口管理,像「Always-On-Top」這樣的東西是Windows窗口管理代碼的策略部分。但是由於X11沒有定義策略,但是隻有方法將任何一種ICCCM/EWMH信息從都不會傳遞給Windows窗口管理。所有的Windows都是Exceed爲個人客戶創建的無與倫比的頂級窗口。

現在你可以在Exceed中啓動一個X11 WM,但是這個WM然後只能在X11內部運行,並且由於X11沒有定義象「Always-On-Top」這樣的策略,所以沒有辦法告訴Windows,一個窗口實際上應該停留在在上面。您也可以在「全屏」模式下啓動Exceed,在該窗口中打開一個窗口,其中所有X11客戶端都在自己的小桌面上運行。其中運行的WM將僅管理其中的X11客戶端,但不能將其信息傳遞給Windows。

你實際需要的是某種Bypass,它將連接到Exceed並行並且保持Windows窗口屬性(策略)與X11端的ICCCM/EWMH同步。這樣的程序是完全可行的,但我不知道有任何程序可以做到這一點。

+0

超級評論謝謝! – yatg

2

X11轉發不支持此功能

+2

背景:「Always On Top」不是應用程序的特徵(與Windows不同),而是窗口管理器在屏幕上排列窗口的功能。如果窗口管理器忽略了你的提示,那你就無能爲力。 –

+0

@AaronDigulla我在Ubuntu上嘗試了openbox窗口管理器,我的應用程序在Ubuntu中本地使用,但是當我將XServer配置爲使用openbox窗口管理器時,我的應用程序的Always On Top屬性將被忽略。同樣,本地MS Windows窗口管理器在本地工作,但使用MS Windows窗口的XServer不起作用。 – Anony

+0

如果您使用Exceed,您可以在一個桌面窗口中擁有所有X11窗口,也可以在其自己的桌面窗口中獲取一個X11窗口。在前一種情況下,「Always on top」顯然只能在單個桌面窗口內運行,因爲Windows不知道發生了什麼。在後一種情況下,它可以工作,但只有Exceed支持該功能(因爲在這種情況下,Exceed將替換遠程窗口管理器)。 –