我有一个使用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. 我真的不明白为什么第二种方法会做到这一点。