Solusi untuk masalah ini sangat mudah:
Anda harus menggunakan anggota struktur yang tepat dengan XDestroyWindow () fungsi.
Karena standar penerapan struktur peristiwa X11, mereka sangat mirip satu sama lain. Setiap struktur dimulai dengan anggota 'tipe', dan anggota pertama hampir selalu sama.
Sekarang asumsikan:
int = 4 bytes
Bool = 4 bytes
unsigned long = 8 bytes
Display* = 8 bytes
Window = 4 bytes
Jika Anda memanggil XDestroyWindow () dengan e.xdestroywindow.window , Anda akan berjarak 28 byte dari awal struktur peristiwa, sedangkan jika Anda menggunakan e.xclient.window , Anda akan berjarak 24 byte.
Karena Anda akan memanggil XDestroyWindow () dengan argumen Window yang salah, itu akan gagal. Sebaliknya jika Anda menyebutnya menggunakan e.xdestroywindow.event (yang berjarak 24 byte dari awal struktur peristiwa), alamatnya akan benar dan fungsinya akan bekerja dengan lancar.
Jika Anda melihat sendiri di Xlib.h file, Anda akan melihat bahwa kedua struktur memiliki jendela elemen diposisikan berbeda.
Menyatakan ini, ingatlah bahwa Xlib telah dikembangkan selama bertahun-tahun dan banyak pemrogram setiap hari bekerja dengannya, jadi jika ada kesalahan misterius, itu mungkin tidak ada di dalam Xlib. Sebagai petunjuk terakhir saya ingin memberi tahu Anda:jika Anda ingin lebih jauh dengan pemrograman Xlib, selalu ambil file header sebagai referensi utama, diikuti dengan manual sistem, lalu yang lainnya.
Satu-satunya kesalahan dengan kode Anda pada akhirnya adalah:
XDestroyWindow(display,e.xdestroywindow.window);
Yang harus diubah menjadi ini:
XDestroyWindow(display,e.xclient.window);
Alih-alih penggunaan beralih bagus, dan paling banyak diimplementasikan, tanpa masalah pada kode X11.
CATATAN :Saya telah menguji kode Anda sendiri, dengan mengubah baris itu saja, lalu melakukan berbagai pengujian, mencetak hasilnya. XDestroyWindow () pasti satu-satunya kesalahan.
Cukup panggil XDestroyWindow()
tepat sebelum XCloseDisplay()
.
Edit:
Maaf, saya tidak mengerti hal XSetWMProtocols. Sekarang saya sudah membacanya. Sepertinya Anda mengakses anggota gabungan acara yang salah.
XDestroyWindow(tampilan,e.xdestroywindow.window);
Mungkin seharusnya:
XDestroyWindow(display,e.xclient.window);