Использовать GC (графический контекст X11) в другом процессе

Можно ли передать GC из процесса1 в процесс2 и использовать его там (мне нужно обновить область отсечения)?

Я пытался передать GC через свойство окна. Но у меня есть SEGFAULT при вызове XSetRegion на этом сборщике мусора.


person Sergey Podobry    schedule 17.04.2012    source источник


Ответы (2)


Да, это возможно. Вот пример (извините, в 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);
    });
});
person Andrey Sidorov    schedule 18.04.2012
comment
Спасибо, что поделился! Я новичок в X11 и хотел знать, что такие операции допустимы. - person Sergey Podobry; 18.04.2012

Возможно, но...

Вот что говорится в руководстве Xlib:

Xlib реализует кэш с обратной записью для всех элементов GC, которые не являются идентификаторами ресурсов, чтобы позволить Xlib реализовать прозрачное объединение изменений в GC. Например, вызов XSetForeground сборщика мусора, за которым следует вызов XSetLineAttributes, приводит к запросу протокола единственного изменения GC на сервер. Не ожидается и не поощряется совместное использование GC между клиентскими приложениями, поэтому такое кэширование с обратной записью не должно создавать проблем. Приложения не могут совместно использовать GC без внешней синхронизации. Поэтому совместное использование GC между приложениями крайне не рекомендуется.

person Die in Sente    schedule 17.09.2020