是否可以将GC从进程1传递到进程2并在那里使用它(我需要更新剪辑区域)?
我尝试通过窗口属性传递 GC。但是我在 XSetRegion 调用该 GC 上遇到了 SEGFAULT。
是的,这是可能的。下面是一个示例(抱歉,在 JavaScript 中,使用 node-x11),您可以在一个进程中创建 gc 并将其作为命令行参数传递给另一个进程。对 gc(在本例中为前景色)所做的所有更改在另一个进程中都可见。请注意,当第一个进程退出时,GC 在服务器上被销毁,如果您尝试继续使用它,您将在第二个进程中看到"错误的 GContext"错误。
var x11 = require('x11');
var gc;
x11.createClient(function(display) {
var X = display.client;
var root = display.screen[0].root;
var wid = X.AllocID();
X.CreateWindow(wid, root, 0, 0, 400, 300);
var _gc = parseInt(process.argv[2]);
if (_gc != 0)
gc = _gc;
else {
gc = X.AllocID();
X.CreateGC(gc, root);
console.log('GC created: ' + gc);
setInterval(function() {
X.ChangeGC(gc, { foreground: parseInt(Math.random()*0xffffff) });
console.log('gc updated!');
}, 500);
}
X.MapWindow(wid);
setInterval(function() {
X.PolyText8(wid, gc, 50, 50, ['Hello, Node.JS!', ' Hello, world!']);
console.log(gc);
}, 100);
X.on('error', function(err) {
console.log(err);
});
});
这是可能的,但是...
以下是Xlib手册的内容:
"Xlib为GC中所有非资源的元素实现了回写缓存。ID 以允许 Xlib 实现对 GC 更改的透明合并。为例如,调用 GC 的 XSetForeground,然后调用 XSetLineAttributes导致仅向服务器发出单次更改 GC 协议请求。指导性案例既不是也不鼓励在客户端应用程序之间共享,因此此写回缓存应该没有问题。应用程序无法共享 GC,否则外部同步。因此,在应用程序之间共享 GC 是高度的气馁。