我正在使用 X11 并想要執行重新父級。我從C 語言的
但是當我洗掉標記為map the smaller windowand的行時unmap the smaller window to reparent it,我得到了正確的結果:

不應該都產生相同的正確結果。我在原始檔案中所做的只是映射,然后立即取消映射。
uj5u.com熱心網友回復:
我剛剛在我的 Linux 機器上重現了這種行為。
問題似乎是您的程式和“視窗管理器”之間的時間問題。
“視窗管理器”是負責在視窗上繪制標題欄和邊框的程式。“視窗管理器”的作業方式如下:
每當一個視窗映射到根視窗時,X11 都會通知“視窗管理器”。“視窗管理器”創建一個包含標題欄和邊框的“外部視窗”。然后它重新定義視窗,使視窗成為“外部視窗”的子視窗。
例子:

如果“視窗管理器”在映射后處理某個視窗,則成為“外層視窗”的子視窗;出于這個原因,任何不是“外部視窗”的子視窗的視窗如果被映射,顯然不會由“視窗管理器”處理。
...至少在“正常情況下”。
出于這個原因,“視窗管理器”不關心在根視窗上未映射的視窗(而只關心從“外部視窗”未映射的視窗)。
通常,“視窗管理器”的行為如下:
Your program Window manager
------------ --------------
XMapWindow(d, w2);
XFlush(d);
wm_w2 = XCreateWindow(...);
XUnmapWindow(..., w2);
XReparentWindow(..., w2, wm_w2, ...);
XMapWindow(..., w2);
XUnmapWindow(d, w2);
XFlush(d);
XReparentWindow(..., w2, root, ...);
XDestroyWindow(... wm_w2);
XReparentWindow(d, w2, w, 500, 500);
XMapWindow(d, w2);
... ...
但是,您的程式執行XMapWindow()并且XUnmapWindow()沒有足夠的時間讓“視窗管理器”做出反應。
出于這個原因,這兩個程式有可能(并且很可能)按以下順序作業:
Your program Window manager
------------ --------------
XMapWindow(d, w2);
XFlush(d); // Here the window manager
// is notified about window w2
XUnmapWindow(d, w2);
XFlush(d); // The window manager will ignore
// w2 being un-mapped because
// it is not the child of an
// "outer window", yet!
XReparentWindow(d, w2, w, 500, 500);
XMapWindow(d, w2);
... ...
// The window manager received the
// notification using XNextEvent()
wm_w2 = XCreateWindow(...);
XUnmapWindow(..., w2);
XReparentWindow(..., w2, wm_w2, ...);
XMapWindow(..., w2);
您必須在 和 之間等待一段時間XMapWindow(),XUnmapWindow()以允許“視窗管理器”以“視窗管理器”完成的方式重新設定視窗的父級。
否則,“視窗管理器”將在您執行此操作后進行重新管理!
順便說一句:在我的電腦上,這個問題可以用更簡單的方式重現:
創建一個視窗,對其進行映射并在此之后立即取消映射...
盡管最后呼叫的函式是 ,但仍將顯示該視窗XUnmapWindow()。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/439001.html
