保存和恢复窗口状态 (X11)



我希望能够向我的窗口应用程序添加一些彩色图形,而我能做到这一点的唯一方法是手动加载位图并使用Xlib的放置像素例程。

我目前正在使用 Xlib。我尝试了 gtk 和很多人,它的标题有编译问题,我认为其他额外的库不会工作,因为我想制作一些需要尽可能少的库的东西。

经过学习和实验,我注意到当我使用窗口管理器 (xfce) 最小化和恢复窗口时,窗口出现但内部内容消失(仅显示背景颜色),除非我之前包含模板代码中显示的事件,即使我这样做,我也必须重新执行用于生成窗口中项目的所有命令。如果目标计算机较旧,并且位图是逐像素加载的(尤其是大尺寸位图),则这可能是灾难性的。

因此,与其在每次最小化窗口然后恢复时都执行所有这些重新加载,是否有某种基本的 X 系统函数可以捕获窗口内容,并允许我将数据保存到变量(可能是 char* 类型的指针)然后我可以调用具有相同指针的函数一次恢复窗口的所有内容,而不是放置每个元素(包括单个位图像素)一次一个?

下面是模板代码:

XEvent e;
Window w;
Display* dpy;
//events interested in
long EvCap=ExposureMask|ButtonPressMask|KeyPressMask|StructureNotifyMask;

void endx(){
// Unload stuff so memory is freed
}
void initx(){
// Load window and initial commands that don't need updating
}

void redrawWindowItems(){
// Stuff that needs to go on screen that disappears on minimize
}

int main(){
initx();
redrawWindowItems();
while(1){
if (XCheckWindowEvent(dpy,w,EvCap,&e)){
if (e.type==Expose && e.xexpose.count==0) {redrawWindowItems();} //redraw exposed windows
}
}
endx();
}

...是否有某种基本的X系统功能可以捕获窗口内容...

您可以使用XCreatePixmap()创建像素图。像素图应具有与窗口相同的深度。

使用XCopyArea()函数将窗口的内容复制到 pixmap;收到Expose事件时,使用XCopyArea()将内容复制回窗口。

所用GCfunction应为GXcopy(这是调用XCreateGC()时的默认值)。

但是,这不是最好的主意:

如果在"保存">

窗口内容时窗口的某些部分不可见,则"保存"的数据将不完整。

但是,您可以(几乎)直接对像素图而不是窗口执行所有图形功能(例如绘图)。

直接将图像"绘制"到像素图而不是窗口。

然后调用XCopyArea()第一次在窗口中显示图像。(每当收到Expose事件时,请再次呼叫XCopyArea()

相关内容

  • 没有找到相关文章

最新更新