GNU/Linux >> Linux の 問題 >  >> Linux

エラーなしで X11 プログラムを終了する方法

この問題の解決策は簡単です:

XDestroyWindow で正しい構造メンバーを使用する必要があります () 関数。

X11 イベント構造の実装標準により、それらは互いに非常に似ています。すべての構造は「type」メンバーで始まり、最初のメンバーは実質的に常に同じです。

ここで仮定します:

int = 4 bytes
Bool = 4 bytes
unsigned long = 8 bytes
Display* = 8 bytes
Window = 4 bytes

XDestroyWindow を呼び出した場合 () e.xdestroywindow.windowe.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);

Linux
  1. パスワードプロンプトなしでルートとして特定のプログラムを実行する方法は?

  2. Sudo特権なしでプログラムをローカルにインストールする方法は?

  3. 実行可能Cプログラムのエラー情報をStdoutにリダイレクトする方法は? (mac Os X)?

  1. Dockerコンテナを終了する方法

  2. 「exit」と入力せずに「画面」から出るにはどうすればよいですか?

  3. C++ を使用して Linux でウィンドウを作成するにはどうすればよいですか?

  1. sudoersエラーを解決する方法–「申し訳ありませんが、sudoを実行するにはttyが必要です」

  2. ウィンドウリストに移動せずにGNU Screenでウィンドウ9を通過する方法は?

  3. SSH 接続を終了するにはどうすればよいですか?