在問題結束時,我在X11中有一個相當簡單的「Hello World」。但是,它退出時,我得到以下運行時錯誤信息:如何退出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.
更新
試圖改變許多事情,如循環運行XPending()。 決定運行其他人的hello world,我得到了與他們的代碼相同的問題。必須是我的設置有問題。
更新 顯然很多人都有這個問題。谷歌ftk有這個問題,他們修復了他們的change log。他們調用FTK_QUIT(),我猜測它就像Exit()。所以我把我的回報放在循環裏面,解決了問題。不知道爲什麼,但確實如此。固定碼:
case ClientMessage:
if(e.xclient.data.l[0] == wmDeleteMessage)
{
XDestroyWindow(display,e.xclient.window);
XCloseDisplay(display);
return 0;
}
還是會給予正確答案的人誰可以解釋爲什麼,如果是可能的移動return語句(與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
語句的代碼不能正常工作運行。即使它退出循環而不調用另一個X函數。上面的if
語句放在您的switch
語句之前,可以解決問題,而不會從循環內的程序返回。
增加了逃避循環,因爲意識到它從不發生。還是一樣的錯誤信息。 –
爲什麼你想直接做X11編程?我強烈建議使用一個圖形工具包,比如GTK或Qt(但也有其他的:FLTK,Fox ...) –
@Starynkevitch瞭解它是如何工作的。不適用於工作或學校。 –