我正在尝试关闭上一次使用的窗口(按堆叠顺序在当前窗口下方的那个窗口)。不幸的是,由于某些原因,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
        }
    }
}

关于c++ - XQueryTree上的段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38275229/

10-09 15:01