如何在X Windows / Linux中确定Windows的可见区域?

时间:2020-03-05 18:55:57  来源:igfitidea点击:

我有几个嵌套的X Windows,比方说一个可滚动窗口中的一个可滚动窗口(请参见下面的示例)。在这种情况下,主窗口包含(至少)它们控制的主要滚动条和(主要)绘图区域。该绘图区域依次包含(至少)一个可滚动窗口和一个(较小)主窗口,其中包含一个滚动条和一个较小的绘图区域。

在内部绘图区域的实时滚动过程中,重绘过程陷入混乱,因为我使用XCopyArea来加快过程并移动有效的内容,并仅对新出现的内容调用实际的重绘例程。当内部图形批处理是单独的时,这很好用,但是当嵌套在另一个内部图形中时,当内部滚动区是部分可见的(即,主图形区域已滚动)时,就会出现问题,从而从主图形中裁剪出新出现的内容的重绘区域,并且从未真正重绘过,但被认为是这样。在下一个滚动中,XCopyArea获取此假定重绘的区域时,实际上是空的。最终,该空白区域显示在部分可见的内部滚动批上,并且为空。在第一个常规重绘消息上,它们已修复。

如果我可以从(我的)内部绘图区域中实际看到的内容获取剪切蒙版,则可以调整XCopyArea()调用和redraw调用,并克服该问题,而无需计划" B"来重新绘制每个滚动条运动的所有内容。

示例:为Mozilla Firefox开发一个插件,并需要确定描述"我的"窗口可见区域的区域,即从Mozilla系统作为插件视口传递的区域。

解决方案

回答

如果我们确实获得了X Window,而不是某个特定工具箱中的小部件(例如GTK +?),则可以使用XGetWindowAttributes函数调用。

这将填充提供的XWindowAttributes结构,其中包括窗口x和y位置的整数,其宽度和高度以及其他有用的事实。

但实际上,我认为我们可能正在使用从Netscape(又名NSAPI)继承的Mozilla插件API,在这种情况下,我们至少会一次调用一次NPP_SetWindow()函数(如果有必要,则需要再次调用,因为某些更改),包含我们要查找的信息的结构。尝试查看http://www.mozilla.org/projects/plugins/,以获取有关应使用的API的更多信息。