【发布时间】: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 的东西”进行绘图。