Xlib + Cairo通过调整大小来保存内容

时间:2018-11-17 12:32:45

标签: c++ x11 cairo

我有一个使用Xlib和Cairo绘制简单内容(线条,矩形,文本)的小型GUI,并且我希望能够调整它的大小(使其比以前更大)而又不会丢失像X11通常处理大小调整的内容。

Cairo提供函数cairo_xlib_surface_set_size() (https://www.cairographics.org/manual/cairo-XLib-Surfaces.html#cairo-xlib-surface-set-size) 但这似乎也删除了所有当前内容。

我已经尝试过类似how to save Drawing area's content after resizing window at cairo的方法,但是没有效果,我不想使用Gtk,因为它只是一个简单的应用程序。

第一种方法(调整大小,不保存):

XSelectInput(display, window, ExposureMask | StructureNotifyMask);

switch (event.type) {
    case ConfigureNotify:
        onConfigure(event);
        break;
}

onConfigure(XEvent e) {
    XLockDisplay(display);

    // if resize
    if (e.xconfigure.width != width && e.xconfigure.height != height){

        width = e.xconfigure.width;
        height = e.xconfigure.height;

        cairo_xlib_surface_set_size (sfc, width, height);
        clear(); //without clear the screen just takes on a random color
    }
    cairo_surface_flush(sfc);
    XUnlockDisplay(display);
}

我还尝试研究开罗源代码,以查找cairo_xlib_surface_set_size应该做什么,而我看不到任何可保存内容的东西。

第二种方法(保存,不调整大小):

XSelectInput(display, window, ExposureMask | KeyPressMask | ButtonPressMask | StructureNotifyMask | ResizeRedirectMask);

switch (event.type) {
    case ResizeRequest:
        onResize(event);
        break;
}

onConfigure(XEvent e) {
    XLockDisplay(display);

    cairo_surface_flush(sfc);
    cairo_xlib_surface_set_size(sfc, e.xresizerequest.width, e.xresizerequest.height);

    width = e.xresizerequest.width;
    height = e.xresizerequest.height;

    XFlush(display);

    XUnlockDisplay(display);
}

第二种方法确实调整了窗口的大小并保留了内容,同时还设置了表面的大小。但是由于某种原因,它仍然会保留旧的大小。 The purple lines should go all the way to bottom/right side, but stay in the old surface size. 我真的不明白为什么第二种方法会做到这一点。

0 个答案:

没有答案