GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Anda keluar dari program X11 tanpa Kesalahan

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);

Linux
  1. Bagaimana Anda menyembunyikan penunjuk tetikus di Linux/X11?

  2. Bagaimana cara keluar jika perintah gagal?

  3. Bagaimana cara keluar dari 'layar' tanpa mengetik 'keluar'?

  1. Bagaimana Anda membuat jendela di Linux dengan C++?

  2. Bagaimana cara keluar dari koneksi SSH?

  3. Bagaimana saya bisa mengeluarkan perintah ke file, tanpa mendapatkan file kosong karena kesalahan?

  1. Kesalahan dalam file Sudoers? Inilah cara Anda memperbaikinya.

  2. Vim menyoroti teks dalam warna Merah? Inilah cara Anda dapat menghentikannya!

  3. Bagaimana Anda Menginstal PHP5 tanpa menginstal Apache di ubuntu?