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
}
}
}
我正在尝试关闭最后使用的 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
}
}
}