小编Mar*_*ten的帖子

如何获取并同步所有X11窗口的完整列表?

我想监视X11下的所有打开的窗口.目前,我这样做如下:

  1. 最初通过从根窗口递归调用XQueryTree来遍历整个树
  2. 在整个桌面上侦听子结构更改: XSelectInput( display, root_window, SubstructureNotifyMask | PropertyChangeMask )
  3. 处理所有MapNotify,UnmapNotify和DestroyNotify事件,在此过程中更新我自己的窗口列表

我主要担心的是第1点.在递归期间,XQueryTree将被多次调用.有没有办法确保树在此期间不会改变?换句话说,要在一个时间点获得整棵树的"快照"?

另外,我注意到在某些X11系统下,并非所有事件都正确到达.例如,在桌面上打开新窗口时,该窗口的MapNotify可能永远不会到达我的监控应用程序.怎么会这样?是否有可能在到达之前扔掉?

更新:

我写了一个小程序,它将监视根窗口上的X事件(见下文).现在,当我运行这个程序并启动并退出xcalc时,我得到以下输出:

Reparented: 0x4a0005b to 0x1001e40
Mapped    : 0x1001e40
Destroyed : 0x1001e40
Run Code Online (Sandbox Code Playgroud)

而已.我从未收到过被破坏的真实窗口(0x4a0005b)的通知.甚至没有被映射!谁能告诉我为什么不呢?SubStructureNotifyMask是否仅导致发送直接子窗口的事件而不是整个子树?

顺便说一下,当Compiz运行时,这显然不会发生.然后没有重新完成:

Mapped    : 0x4a0005b
Mapped    : 0x4e00233
Destroyed : 0x4a0005b
Destroyed : 0x4e00233
Run Code Online (Sandbox Code Playgroud)

监控程序来源:

#include <X11/Xlib.h>
#include <cstdio>

int main()
{
    Display *display;
    Window rootwin;

    display = XOpenDisplay( NULL );
    rootwin = DefaultRootWindow( display );
    XSelectInput( display, rootwin, SubstructureNotifyMask );

    XEvent event;

    while ( 1 ) {
        XNextEvent( display, &event …
Run Code Online (Sandbox Code Playgroud)

c linux x11 xorg race-condition

13
推荐指数
1
解决办法
9674
查看次数

下载时创建自定义.dmg文件

我想分发一个跨平台的应用程序,可执行文件略有不同,具体取决于下载它的用户.这是通过在可执行文件中的某个位置放置占位符字符串来完成的,该位置字符串在下载时被特定于用户的内容替换

必须执行这些字符串替换的Web服务器是Linux机器.对于Windows,可执行文件不会在安装程序.exe中压缩,因此更换字符串很容易.

对于未压缩的Mac OS X .dmg文件,这也很容易.但是,使用gzip或bzip2压缩的.dmg文件并不容易.例如,在后一种情况下,压缩的.dmg不是一个大的bzip2压缩磁盘映像,而是由几个不同的bzip2压缩部分(具有不同的块大小)和一个plist后缀组成.此外,使用bzip2解压缩和重新压缩不同的部分不会产生原始数据,因此我猜测Apple使用bzip2的某些参数不同于命令行工具.

有没有办法从Linux上的未压缩的一个生成压缩的.dmg(没有hdiutil)?或者可能是另一个创建自定义应用程序而不预先生成它们的建议?它应该在没有用户输入的情况下工作.

linux macos software-distribution diskimage dmg

6
推荐指数
2
解决办法
2060
查看次数

标签 统计

linux ×2

c ×1

diskimage ×1

dmg ×1

macos ×1

race-condition ×1

software-distribution ×1

x11 ×1

xorg ×1