Tôi có "Hello World" khá đơn giản trong X11 khi kết thúc câu hỏi. Nhưng khi nó thoát tôi nhận được thông báo lỗi thời gian chạy dưới đây:Làm cách nào để thoát khỏi chương trình X11 mà không có Lỗi
$ ./xtest
XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
after 9 requests (7 known processed) with 0 events remaining.
Vì vậy, tôi đã cố gắng xử lý wmDeleteMessage
bản thân mình, và tôi đã có thể ngăn chặn các cửa sổ từ bế mạc, do đó, tôi biết tôi đang nhận được sự kiện này một cách chính xác. Hơn tôi đã thêm XDestroyWindow()
vào xử lý sự kiện và tôi gặp lỗi mới.
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
Có vẻ như tôi đang cố phá hủy một Cửa sổ đã bị phá hủy, nhưng nếu tôi lấy ra XDestroyWindow()
nó vẫn còn trên màn hình của tôi.
Dưới đây là mã của tôi với nỗ lực xử lý cửa sổ hủy. Làm cách nào để thoát mà không có bất kỳ lỗi nào?
#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;
}
Cập nhật
dòng được đổi:
std::cout << "Shutting down now!!!" << std::endl;
XDestroyWindow(display,w);
Mà tôi không thích vì tôi dự định có nhiều hơn cửa sổ, nhưng bây giờ tôi trở lại đầu tiên thông báo lỗi tôi có:
XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
after 9 requests (7 known processed) with 0 events remaining.
Cập nhật
Cố gắng thay đổi nhiều thứ xung quanh giống như có vòng lặp tắt của XPending(). Quyết định chạy hello world của người khác và tôi gặp vấn đề tương tự với mã của họ. Phải là một cái gì đó sai với thiết lập của tôi.
Cập nhật Dường như nhiều người gặp vấn đề này. Google ftk gặp sự cố này và họ đã khắc phục sự cố trong số change log của họ. Họ gọi FTK_QUIT() mà tôi đoán giống như Exit(). Vì vậy, tôi đặt trở lại của tôi ngay trong vòng lặp và giải quyết được vấn đề. Không chắc chắn tại sao nhưng nó đã làm. đang cố định:
case ClientMessage:
if(e.xclient.data.l[0] == wmDeleteMessage)
{
XDestroyWindow(display,e.xclient.window);
XCloseDisplay(display);
return 0;
}
vẫn sẽ cung cấp cho câu trả lời đúng để ai đó có thể giải thích tại sao và nếu có thể di chuyển các câu lệnh return (cùng với XCloseDisplay
) bên ngoài vòng lặp.
Vòng lặp tổ chức sự kiện nên trông như thế này để thoát đúng cách:
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;
Khi chạy trong một tuyên bố switch
mã không hoạt động. Ngay cả khi nó thoát khỏi vòng lặp mà không gọi một hàm X khác. Tuyên bố if
ở trên được đặt trước tuyên bố switch
của bạn khắc phục vấn đề mà không cần phải trả lại từ chương trình bên trong vòng lặp.
Thêm lối thoát vào vòng lặp vì nhận ra nó không bao giờ thoát ra ngoài. Vẫn còn thông báo lỗi tương tự. –
Tại sao bạn muốn thực hiện lập trình X11 trực tiếp? Tôi khuyên bạn nên sử dụng bộ công cụ đồ họa, như GTK hoặc Qt (nhưng cũng có những công cụ khác: FLTK, Fox ...) –
@Starynkevitch Tìm hiểu thêm về cách hoạt động của nó. Không phải cho công việc hay trường học. –