8

なぜこれが起こるのかわかりませんが、C++ で Xlib を使用して作成したウィンドウは、X ボタンを使用して閉じようとすると、端末にエラーを出力します。エラーなしでプログラムで閉じることができます。それを行うのはXボタンだけです。

エラーは次のとおりです。

XIO:  fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
after 483 requests (483 known processed) with 0 events remaining.

リクエストの数は毎回異なりますが、残りのイベントは常に 0 です。なぜこれが起こるのですか?原因は私のコードではないようです。これは何があってもこれを行い、クローズイベントをキューに送信しないためです。Atom WM_WINDOW_DELETE をインターセプトしようとしましたが、ウィンドウを閉じたときに予想されるコードを実行しません。

編集: イベント ループ コードを追加しました。

while(XPending(display)) {
    XNextEvent(display, &event);

    pthread_mutex_unlock(&mutex);

    if(event.type == Expose) {
        XWindowAttributes getWindowAttributes;

        pthread_mutex_lock(&mutex);

        XGetWindowAttributes(display, window, &getWindowAttributes);

        if(state.currentState == STATE_NORMAL) {
            state.normX = getWindowAttributes.x;
            state.normY = getWindowAttributes.y;
            state.normWidth = getWindowAttributes.width;
            state.normHeight = getWindowAttributes.height;
        }

        pthread_mutex_unlock(&mutex);

        glViewport(0, 0, getWindowAttributes.width, getWindowAttributes.height);
    } else if(event.type == KeyPress) {
        return false;
    } else if(event.type == ClientMessage) {
        std::cout<<"X Button pressed"<<std::endl; //Never run when X-ing window
        if(event.xclient.message_type == XInternAtom(display, "WM_DELETE_WINDOW", True)) {
            return false;
        }
    } else if(event.type == ButtonPress) {
        if(state.currentState != STATE_FULLSCREEN) {
            fullscreen();
        } else {
            normalize();
        }
    } else if(!handleEvent(event)){
        return false;
    }

    pthread_mutex_lock(&mutex);
}
4

1 に答える 1