經過我的測試,在 X11 裡面,如果先使用 XDestroyWindow 銷燬視窗,將不能再次使用 XMapWindow 顯示視窗
簡單的測試程式碼如下
bool destroyWindow = false;
if (!destroyWindow)
{
XDestroyWindow(display, handle);
XFlush(display);
destroyWindow = true;
}
else
{
XMapWindow(display, handle);
XFlush(display);
}
上述程式碼的 display 是透過 XOpenDisplay 函式的返回值獲取的,上述程式碼的 handle 是透過 XCreateWindow 函式的返回值獲取的,是 X11 視窗的 XID 的值
執行以上程式碼,先進入 XDestroyWindow(display, handle)
然後再次執行執行 XMapWindow(display, handle)
將看到大概如下的錯誤輸出
X Error of failed request: BadWindow (invalid Window parameter)
Major opcode of failed request: 25 (X_SendEvent)
Resource id in failed request: 0x9800002
Serial number of failed request: 13
Current serial number in output stream: 13
透過以上程式碼可以證明視窗 XDestroyWindow 之後,不可以再次呼叫 XMapWindow 顯示視窗。如果只是想隱藏視窗,可以使用 XUnmapWindow 函式進行隱藏視窗
這也就是為什麼大部分教程都只在清理時才呼叫 XDestroyWindow 方法的原因
本文程式碼放在 github 和 gitee 上,可以使用如下命令列拉取程式碼。我整個程式碼倉庫比較龐大,使用以下命令列可以進行部分拉取,拉取速度比較快
先建立一個空資料夾,接著使用命令列 cd 命令進入此空資料夾,在命令列裡面輸入以下程式碼,即可獲取到本文的程式碼
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin a7a1054b3b1913cadd08b01547f808f9500dc5bb
以上使用的是國內的 gitee 的源,如果 gitee 不能訪問,請替換為 github 的源。請在命令列繼續輸入以下程式碼,將 gitee 源換成 github 源進行拉取程式碼。如果依然拉取不到程式碼,可以發郵件向我要程式碼
git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin a7a1054b3b1913cadd08b01547f808f9500dc5bb
獲取程式碼之後,進入 X11/GaroceabairCibiwhemfi 資料夾,即可獲取到原始碼
更多技術部落格,請參閱 部落格導航