XQueryTree 上的分段错误

Segmentation fault on XQueryTree

我正在尝试关闭最后使用的 window(在堆叠顺序中位于当前 window 正下方的那个)。不幸的是 XQueryTree 出于某种原因出现段错误。

#pragma once

#include <X11/Xlib.h>
#include <X11/Xutil.h>

namespace WindowingOperations {

    inline void closeLastWindow() {
        Display* dpy = XOpenDisplay(0);
        Window root = DefaultRootWindow(dpy);

        Window* root_return;
        Window* parent_return;
        Window** children_return;
        unsigned int* nchildren_return;

        XQueryTree(dpy,
                   root,
                   root_return,
                   parent_return,
                   children_return,
                   nchildren_return);

        // Kill the window right after this one
        if (*nchildren_return > 1)
            XDestroyWindow(dpy, *children_return[*nchildren_return - 2]);
    }
}

编辑:

如果需要测试用例:

#include "window_operations.h"
int main() {
    WindowingOperations::closeLastWindow();
    return 0;
}

_return 参数需要去某个地方。你不能只传入未初始化的指针,需要分配存储空间 XQueryTree 来写入结果。

所以...

namespace WindowingOperations {

    inline void closeLastWindow() {
        Display* dpy = XOpenDisplay(0);
        Window root = DefaultRootWindow(dpy);

    // Allocate storage for the results of XQueryTree. 
        Window root_return;
        Window parent_return;
        Window* children_return;
        unsigned int nchildren_return;

    // then make the call providing the addresses of the out parameters
        if (XQueryTree(dpy,
                       root,
                       &root_return,
                       &parent_return,
                       &children_return,
                       &nchildren_return) != 0)
        { // added if to test for a failed call. results are unchanged if call failed, 
          // so don't use them

            // Kill the window right after this one
            if (*nchildren_return > 1)
                XDestroyWindow(dpy, *children_return[*nchildren_return - 2]);
        }
        else
        {
            // handle error
        }
    }
}