【问题标题】:Xdamage unable to get damage regionXdamage 无法获得伤害区域
【发布时间】:2021-09-15 17:23:01
【问题描述】:
Display *display = XOpenDisplay(NULL);
Window root = XDefaultRootWindow(display);

int damage_event, damage_error, count = 0;

XDamageQueryExtension(display, &damage_event, &damage_error);
//tried all 4  damage levels giving the same output
Damage dmg = XDamageCreate(display, root, XDamageReportNonEmpty); 
XDamageNotifyEvent *dmg_ev = NULL;
XEvent event;
while (1)
{

    XNextEvent(display, &event);

    if (event.type == damage_event + XDamageNotify)
    {
        printf("Got event\n");
        dmg_ev = (XDamageNotifyEvent *)&event;
        auto region = XFixesCreateRegion(display, NULL, 0);
        XDamageSubtract(display, dmg_ev->damage, None, region);
        auto area = XFixesFetchRegion(display, region, &count);
        if (area)
        {
            printf("count is %d \n", count);
            for (int i = 0; i < count; i++)
            {
                auto rect = area[i];
                printf("x:%d y:%d height:%d width:%d\n", rect.x, rect.y, rect.height, rect.width);
            }
            XFree(area);
        }
        else
        {
            printf("areaa is NULL \n");
        }
        XFixesDestroyRegion(display, region);
    }
}

https://www.x.org/releases/X11R7.6/doc/damageproto/damageproto.txt

我正在使用 Xdamage 来检测屏幕上的变化,或者像发生变化的特定区域一样。如果我在文本编辑器中的第 30 行和第 40 列进行了更改,我需要单独隔离该特定区域.上面的程序正在运行,但总是输出为

x:0 y:0 height:1080 width:1920)(这是我的屏幕分辨率)

有人能告诉我我是否遗漏了某些东西,或者是否有可能使用 Xdamage 获取发生更改的确切区域,或者是否有其他库可以使用(截取屏幕截图并将其与以前的图像是一种可能的解决方案,但它会消耗大量 CPU。需要占用更少 CPU 的东西)?

【问题讨论】:

  • 您使用的是什么桌面环境/窗口管理器?我猜想“带有 GL 的东西”很可能看起来像 X11 服务器作为翻页,即整个图像被替换。我猜你可能会通过观察单个窗口的变化而不是“一切”来获得更多的外观。
  • 我正在使用 Kubuntu 20,04 (Kwin)...
  • 是的,这肯定会使用“类似于 OpenGL 的东西”进行绘图。

标签: c++ c x11 xorg xcb


【解决方案1】:

来自damageproto.txt

6.损坏报告级别

DamageReportNonEmpty

每当损坏矩形从空变为非空时,以及当 DamageSubtract 请求的结果导致非空区域时,都会发送一个 DamageNotify 事件。

因此,您只收到一个报告根窗口大小的事件(第一次绘制或没有更多损坏区域)也就不足为奇了。

在对XDamageCreate 的函数调用中使用DamageReportRawRectanglesDamageReportDeltaRectangles 作为DamageReportLevelDamageReportDeltaRectangles 可能是更好的选择,因为它可以避免被DamageNotifyEvents 淹没。

进一步

3.1 1.1 版本协议的新增内容

...但是直接渲染扩展允许客户端在 X 服务器的控制之外执行渲染。

因此,可能不会报告所有区域(如果有的话)。使用的扩展或工具包提供了一个接口来获取损坏区域,否则某些库必须截取屏幕截图并获取前一个的差异并以每个像素为基础计算损坏区域。不是最高效的方式。

【讨论】:

  • 我已经尝试了所有不同的 DamageReportLevel(DamageReportRawRectangles、DamageReportDeltaRectangles 等),但它们产生了相似的输出......
  • 那么我们可以得出结论,窗口/复合管理器没有报告损坏吗?此外,您收到的矩形是否可能是整个窗口重绘的结果?如果复合管理器将绘画重定向到像素图中,那么可能就是这样。困扰我的是,XDamageSubtractregion 设置为damage 并清空damage,因为repair 参数设置为None
猜你喜欢
  • 2020-03-03
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 2014-10-31
  • 2014-12-28
  • 2012-01-10
  • 2017-01-29
相关资源
最近更新 更多