Řešení tohoto problému je jednoduché:
S XDestroyWindow musíte použít správný člen struktury () funkce.
Díky implementačnímu standardu struktur událostí X11 jsou si navzájem velmi podobné. Každá struktura začíná členem 'type' a první členy jsou prakticky vždy stejné.
Nyní předpokládejme:
int = 4 bytes
Bool = 4 bytes
unsigned long = 8 bytes
Display* = 8 bytes
Window = 4 bytes
Pokud zavoláte XDestroyWindow () pomocí e.xdestroywindow.window , budete 28 bajtů od začátku struktury události, zatímco pokud použijete e.xclient.window , byli byste vzdáleni 24 bajtů.
Protože zavoláte XDestroyWindow () s nesprávným argumentem Window selže. Místo toho, pokud jej zavoláte pomocí e.xdestroywindow.event (což je 24 bajtů od začátku struktury události), adresa by byla správná a funkce by fungovala bez problémů.
Pokud se sami podíváte na Xlib.h soubor, všimnete si, že tyto dvě struktury mají okno prvek umístěn jinak.
Když to řeknete, pamatujte, že Xlib byl vyvíjen léta a mnoho programátorů s ním každý den pracuje, takže pokud dojde k záhadné chybě, pravděpodobně to není v rámci Xlib. Jako poslední nápovědu vám chci říci:pokud se chcete s programováním Xlib dostat dále, vždy berte jako primární referenční soubory hlavičkové soubory, za nimiž následuje systémový manuál a potom vše ostatní.
Jediná chyba s vaším kódem na konci je:
XDestroyWindow(display,e.xdestroywindow.window);
Což se musí změnit na toto:
XDestroyWindow(display,e.xclient.window);
Místo toho použití přepnout je dobrý a je nejvíce implementovaný, bez problémů s kódem X11.
POZNÁMKA :Testoval jsem váš kód sám tak, že jsem změnil pouze tento řádek a pak jsem provedl různé testy a vytiskl výsledek. XDestroyWindow () řádek je určitě jediná chyba.
Stačí zavolat na XDestroyWindow()
těsně před XCloseDisplay()
.
Upravit:
Omlouvám se, nerozuměl jsem věci XSetWMProtocols. Teď jsem si to přečetl. Myslím, že přistupujete ke špatnému členovi unie událostí.
XDestroyWindow(display,e.xdestroywindow.window);
Pravděpodobně by mělo být:
XDestroyWindow(display,e.xclient.window);