0

是否可以将 GC 从 process1 传递到 process2 并在那里使用它(我需要更新剪辑区域)?

我试图通过窗口属性传递 GC。但是我在那个 GC 上的 XSetRegion 调用上有 SEGFAULT。

4

2 回答 2

1

是的,有可能。这是示例(抱歉,在 JavaScript 中,使用node-x11),您可以在其中创建 gc 在一个进程中并将其作为命令行参数传递给另一个进程。对 gc(本例中的前景色)的所有更改在另一个进程中都是可见的。请注意,当第一个进程退出时,GC 在服务器上被销毁,如果您尝试继续使用它,您将在第二个进程中看到“Bad 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);
    });
});
于 2012-04-18T05:06:01.687 回答
1

有可能但是...

这是 Xlib 手册所说的:

“Xlib 为 GC 的所有不是资源 ID 的元素实现回写缓存,以允许 Xlib 实现对 GC 更改的透明合并。例如,调用 GC 的 XSetForeground 然后调用 XSetLineAttributes 会导致只向服务器请求单次更改的 GC 协议。既不期望也不鼓励客户端应用程序之间共享 GC,因此这种写回缓存应该没有问题。应用程序无法在没有外部同步的情况下共享 GC。因此,应用程序之间共享 GC 是高度灰心。”

于 2020-09-17T19:57:23.423 回答