0

我有一个窗口管理器代码,它可以做窗口移动,窗口调整大小。但是,当我尝试使用 XMoveResizeWindow 同时执行这两项操作时,它不起作用,并且也没有错误日志出现。

我的代码如下

void WindowMgrLib::MoveResizeWindow(Window window, int x, int y, int width, int height)
{
    Display *display = XOpenDisplay(NULL);
    XSetErrorHandler(catch_error);
    XMoveResizeWindow(display, window, x, y, width, height);
    printf("x = %d, y= %d, width = %d, height=%d\n", x, y, width, height);
    XFlush(display);
    XCloseDisplay(display);
}

void WindowMgrLib::MoveWindow(Window window, int x, int y)
{
    Display *display = XOpenDisplay(NULL);
    XSetErrorHandler(catch_error);
    XMoveWindow(display, window, x, y);
    XFlush(display);
    XCloseDisplay(display);
}

void WindowMgrLib::ResizeWindow(Window window, int w, int h)
{
    Display *display = XOpenDisplay(NULL);
    XSetErrorHandler(catch_error);
    XResizeWindow(display, window, w, h);
    XFlush(display);
    XCloseDisplay(display);
}

在这里WindowMgrLib::MoveWindow工作WindowMgrLib::ResizeWindow正常。有人可以告诉我有什么问题WindowMgrLib::MoveResizeWindow吗?

4

1 回答 1

1

X关闭显示

XCloseDisplay 函数为 Display 结构中指定的显示关闭与 X 服务器的连接,并销毁所有窗口、资源 ID(窗口、字体、像素图、颜色图、光标和 GContext)或客户端在此创建的其他资源display,除非资源的关闭模式已更改(请参阅 XSetCloseDownMode)。因此,不应再次引用这些窗口、资源 ID 和其他资源,否则将产生错误。在退出之前,您应该显式调用 XCloseDisplay,以便在 XCloseDisplay 执行最终 XSync 操作时报告任何未决错误。

因此

  • 打开显示器一次
  • 做你的事(创建窗口、接收/处理事件等)
  • 完成时(最后一个窗口关闭):关闭显示(一次)
于 2021-08-04T13:24:49.110 回答