2015-08-27 19 views
2

我有兩個頂級窗口,win1和win2。X11:如何讓窗戶依次移動?

當win1移動時,我想讓win2跟隨win1,這樣win2相對於win1的位置(我將稱之爲relpos)保持不變。 IOW,粘窗戶!

我的想法是在Win1的ConfigureNotify中移動win2。要做到這一點,我需要知道relpos

時WIN2移動,我可以得到(和存儲)RELPOS在WIN2的ConfigureNotify。

的問題是,WIN2得到ConfigureNotify既當用戶移動和編程時移動。有沒有辦法區分這兩種情況?

如果沒有,整個方法是失敗的,所以接下來的問題是:是否有另一種方式?

謝謝。

注意:我不能只設置一個「move_programmatically」標誌,移動窗口,然後檢查ConfigureNotify上的標誌,因爲X是異步的(它最大的一個瑕疵 - 許多人認爲這是一個功能),並且不能保證何時以及我得到多少個ConfigureNotify事件。嘗試這樣做,並快速移動win1,看看win2如何落後。

+0

您正在以編程方式移動它,以便您知道何時發生這種情況... –

+0

@ n.m。是的,我可以做到這一點,如果X將像任何理智的API(WINAPI /可可)同步。我添加了一個澄清說明。 – cap

+0

如果你想知道爲什麼在移動子窗口(例如彈性佈局)時不會出現這個問題,這是因爲在那裏移動窗口的人之間沒有任何歧義,因爲子窗口不能被WM移動/調整大小,只能通過應用程序。 – cap

回答

0

我想你必須爲此寫一個窗口管理器。您遇到麻煩的原因是您無法獲得「單擊win1標題」和「發佈鼠標按鈕而不是win1」事件 - 窗口管理器在您的應用程序可以看到它們之前將它們吞下。通過這些事件,解決方案很簡單:當用戶點擊win1的標題欄時獲取相對偏移量,並在移動win1時使用此偏移量。

其他應用程序(如LibreOffice的)通過允許這樣的窗口拖動到主窗口(主窗口的增長和子窗口變爲側的調色板)解決此問題。

+0

沒錯,但是編寫一個WM並不是一個應用程序的解決方案。 MDI也沒有(大多數用戶討厭MDI)。 – cap