この問題の解決策は簡単です:
XDestroyWindow で正しい構造メンバーを使用する必要があります () 関数。
X11 イベント構造の実装標準により、それらは互いに非常に似ています。すべての構造は「type」メンバーで始まり、最初のメンバーは実質的に常に同じです。
ここで仮定します:
int = 4 bytes
Bool = 4 bytes
unsigned long = 8 bytes
Display* = 8 bytes
Window = 4 bytes
XDestroyWindow を呼び出した場合 () e.xdestroywindow.window で e.xclient.window を使用すると、イベント構造の先頭から 28 バイト離れることになります。 、24 バイト離れていることになります。
XDestroyWindow を呼び出すので () の Window 引数が間違っていると、失敗します。代わりに e.xdestroywindow.event を使用して呼び出した場合 (イベント構造の先頭から 24 バイト離れています)、アドレスは正しく、関数は正常に動作します。
Xlib.h を自分で見てみると、 ファイルを見ると、2 つの構造に window があることに気付くでしょう。 要素の位置が異なります。
Xlib は何年にもわたって開発されており、多くのプログラマーが毎日 Xlib で作業していることを思い出してください。最後のヒントとしてお伝えしたいのは、Xlib プログラミングをさらに進めたい場合は、常にヘッダー ファイルを主なリファレンスとして使用し、その後にシステム マニュアルを参照してから、残りのすべてを参照することです。
最後にあなたのコードの唯一のエラーは次のとおりです:
XDestroyWindow(display,e.xdestroywindow.window);
これに変更する必要があります:
XDestroyWindow(display,e.xclient.window);
代わりに switch を使用 優れており、最も実装されており、X11 コードに問題はありません。
注意 :私はあなたのコードを自分でテストしました。その行だけを変更し、さまざまなテストを行って結果を出力しました。 XDestroyWindow () 行が唯一のエラーであることは間違いありません。
XDestroyWindow()
を呼び出すだけです XCloseDisplay()
の直前 .
編集:
申し訳ありませんが、XSetWMProtocols のことを理解していませんでした。今、私はそれを読んだ。イベント ユニオンの間違ったメンバーにアクセスしているようです。
<ブロック引用>XDestroyWindow(display,e.xdestroywindow.window);
おそらく次のようになります:
XDestroyWindow(display,e.xclient.window);