बिना X11 कार्यक्रम से बाहर जाते हैं मैं एक काफी सरल "नमस्ते दुनिया" X11 में प्रश्न के अंत में है। लेकिन जब यह बाहर निकालता है मैं नीचे रन टाइम त्रुटि संदेश मिलता है:कैसे आप त्रुटि
$ ./xtest
XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
after 9 requests (7 known processed) with 0 events remaining.
तो मैं अपने आप को wmDeleteMessage
से निपटने की कोशिश की, और मैं बंद करने से खिड़की बंद करने के लिए कर रहा था, तो मैं जानता हूँ कि मैं सही ढंग से घटना हो रही है। मैंने ईवेंट हैंडलिंग में XDestroyWindow()
जोड़ा और मुझे नई त्रुटियां मिल गईं।
X Error of failed request: BadWindow (invalid Window parameter)
Major opcode of failed request: 4 (X_DestroyWindow)
Resource id in failed request: 0x130
Serial number of failed request: 12
Current serial number in output stream: 12
ऐसा लगता है कि मैं एक पहले से ही नष्ट कर दिया विंडो को नष्ट करने की कोशिश कर रहा हूँ, लेकिन अगर मैं XDestroyWindow()
बाहर ले यह मेरी स्क्रीन पर जिंदा रहता है।
नीचे एक को नष्ट खिड़की हैंडलर पर एक प्रयास के साथ मेरे कोड है। बिना किसी त्रुटि के मैं कैसे बाहर निकल सकता हूं?
#include<X11/Xlib.h>
#include <iostream>
int main()
{
Display *display;
if(!(display=XOpenDisplay(NULL)))
{
std::cerr << "ERROR: could not open display\n";
return 1;
}
int screen = DefaultScreen(display);
Window rootwind = RootWindow(display, screen);
Colormap cmap = DefaultColormap(display, screen);
Atom wmDeleteMessage = XInternAtom(display, "WM_DELETE_WINDOW", False);
int blackColor = BlackPixel(display, screen);
int whiteColor = WhitePixel(display, screen);
Window w = XCreateSimpleWindow(display, rootwind, 0, 0, 200, 100, 0, blackColor, blackColor);
XMapWindow(display, w);
XSetWMProtocols(display, w, &wmDeleteMessage, 1);
bool running = true;
while(running)
{
XEvent e;
XNextEvent(display, &e);
switch (e.type)
{
case ClientMessage:
if(e.xclient.data.l[0] == wmDeleteMessage)
{
std::cout << "Shutting down now!!!" << std::endl;
XDestroyWindow(display,e.xdestroywindow.window);
running=false;
break;
}
break;
}
}
XCloseDisplay(display);
return 0;
}
अद्यतन
बदला गया लाइन के लिए:
std::cout << "Shutting down now!!!" << std::endl;
XDestroyWindow(display,w);
कौन सा मुझे पसंद नहीं है, क्योंकि मैं खिड़की की तुलना में अधिक होने पर योजना है, लेकिन अब के लिए मैं पहली बार के लिए वापस हूँ त्रुटि संदेश मेरे पास था:
XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
after 9 requests (7 known processed) with 0 events remaining.
अद्यतन
एक्सपेंडिंग() के लूप को चलाने की तरह कई चीजों को बदलने की कोशिश की। किसी और के hello world चलाने का निर्णय लिया और मुझे उनके कोड के साथ एक ही समस्या मिलती है। मेरे सेटअप के साथ कुछ गलत होना चाहिए।
अद्यतन स्पष्ट रूप से बहुत से लोगों को यह समस्या है। Google ftk में यह समस्या थी और उन्होंने इसे change log में ठीक किया। वे FTK_QUIT() को कॉल करते हैं जिन्हें मैं अनुमान लगा रहा हूं जैसे बाहर निकलें()। तो मैंने लूप के अंदर वहां अपनी वापसी डाली और समस्या को हल किया। यकीन नहीं है कि क्यों किया लेकिन यह किया। निश्चित कोड:
case ClientMessage:
if(e.xclient.data.l[0] == wmDeleteMessage)
{
XDestroyWindow(display,e.xclient.window);
XCloseDisplay(display);
return 0;
}
अभी भी किसी को सही जवाब है जो क्यों और यदि संभव हो तो है ले जाने के वापसी कथन (XCloseDisplay
के साथ) लूप के बाहर की व्याख्या कर सकते देंगे।
घटना पाश ठीक से बाहर निकलने के लिए इस तरह दिखना चाहिए:
XEvent e;
do
{
XNextEvent(display, &e);
if(e.type == ClientMessage && e.xclient.data.l[0] == wmDeleteMessage)
{
XDestroyWindow(display,e.xclient.window);
break;
}
//...
}while (XPending(display) > 0)
XCloseDisplay(display);
return 0;
जब एक switch
बयान कोड काम नहीं करता है में चल रहा है। भले ही यह किसी अन्य एक्स फ़ंक्शन को कॉल किए बिना लूप से बाहर निकल जाए। आपके switch
कथन से पहले if
कथन ऊपर दिए गए कथन को लूप के अंदर प्रोग्राम से वापस किए बिना समस्या को हल करता है।
लूप से बच निकला क्योंकि एहसास हुआ कि यह कभी भी टूट नहीं जाता है। अभी भी एक ही त्रुटि संदेश। –
आप सीधे X11 प्रोग्रामिंग क्यों करना चाहते हैं? मैं दृढ़ता से ग्राफ़िकल टूलकिट का उपयोग करने की अनुशंसा करता हूं, जैसे जीटीके या क्यूटी (लेकिन अन्य भी हैं: FLTK, फॉक्स ...) –
@Starynkevitch यह समझने के लिए और अधिक काम करता है। काम या स्कूल के लिए नहीं। –