XQueryTree上的分段错误

Segmentation fault on XQueryTree

本文关键字:错误 分段 XQueryTree      更新时间:2023-10-16

我正在尝试关闭上次使用的窗口(堆叠顺序中当前窗口正下方的窗口)。不幸的是,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
        }
    }
}