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

时间:2012-04-17 12:04:56

标签: linux x11 graphicscontext

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

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

2 个答案:

答案 0 :(得分: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);
    });
});

答案 1 :(得分:1)

可能 但是...

这是Xlib手册所说的:

“ Xlib为非资源的GC的所有元素实现写回缓存 允许Xlib实施对GC更改的透明合并的ID。对于 例如,先调用GC的XSetForeground,再调用XSetLineAttributes 只会导致对服务器的单次更改GC协议请求。 GC都不是 期望也不鼓励在客户端应用程序之间共享,因此此写回 缓存应该没有问题。如果没有以下条件,应用程序将无法共享GC 外部同步。因此,在应用程序之间共享GC非常重要 灰心丧气。”