在另一个进程中使用 GC(X11 图形上下文)



是否可以将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 是高度的气馁。

相关内容

  • 没有找到相关文章

最新更新