【问题标题】:Saving and restoring Window State (X11)保存和恢复窗口状态 (X11)
【发布时间】:2022-01-26 03:33:18
【问题描述】:

我希望能够在我的窗口应用程序中添加一些彩色图形,而我能做到的唯一方法是手动加载位图并使用 Xlib 的 put pixel 例程。

我目前正在使用 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();
}

【问题讨论】:

    标签: bitmap save x11 restore xlib


    【解决方案1】:

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

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

    使用XCopyArea()函数将窗口内容复制到像素图中;当您收到Expose 事件时,使用XCopyArea() 将内容复制回窗口。

    使用的GC 中的function 应为GXcopy(这是调用XCreateGC() 时的默认值)。

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

    如果在“保存”窗口内容时部分窗口不可见,则“保存”的数据将不完整。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 1970-01-01
      • 2016-01-12
      • 2014-05-14
      • 2013-08-31
      • 1970-01-01
      相关资源
      最近更新 更多