dotnet X11 視窗 Destroy 之後是否可以再次 Map 顯示

lindexi發表於2024-08-14

經過我的測試,在 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 方法的原因

本文程式碼放在 githubgitee 上,可以使用如下命令列拉取程式碼。我整個程式碼倉庫比較龐大,使用以下命令列可以進行部分拉取,拉取速度比較快

先建立一個空資料夾,接著使用命令列 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 資料夾,即可獲取到原始碼

更多技術部落格,請參閱 部落格導航

相關文章