2014-10-13 1 views
1

Есть ли простой способ сделать это? Я никогда не видел этого нигде (кроме плагинов Adobe/... для Firefox), поэтому я сомневаюсь в этом ...Внедрение окна X11, входящего в самостоятельный процесс, запущенный мной, в мое собственное окно?

Если нет, существует надежный, хакерский способ (например, подключение к этому процессу Xlib звонки через LD_PRELOAD)?

Если это имеет значение, предположим, что внешний процесс - mplayer, мой язык программирования - C. У меня есть подозрение, что использование Xlib - это мой лучший выбор, но не стесняйтесь предлагать другие варианты. А mplayer - единственного решения не хватит.

ответ

2

Если вы know window id окна, которое хотите вставить, вы можете просто отследить его в своем окне (используя XReparentWindow), даже если он создан другим процессом.

Для mplayer есть опция командной строки «-wid». Если вы передаете свой идентификатор окна к нему, MPlayer создает это окно, как ребенок УЖР автоматически:

-wid (также см -gui-WID) (X11, OpenGL и DirectX только)

Это говорит MPlayer для прикрепления к существующему окну. Полезно вставлять MPlayer в браузер (например, расширение плэйдера). Эта опция полностью заполняет данное окно, поэтому масштабирование размеров, panscan и т. Д. Больше не обрабатывается MPlayer, но должно управляться приложением, создавшим окно.

Вы можете управлять MPlayer'ом путем пропускания '-slave' флаг и отправки commands на стандартный ввод (или FIFO)

Пример встраивания MPlayer использованием node-x11:

var x11 = require('x11'); 
var spawn = require('child_process').spawn; 
x11.createClient(function(err, display) { 
    var X = display.client; 
    var wid = X.AllocID(); 
    X.CreateWindow(wid, display.screen[0].root, 100, 100, 400, 300, 0, 0, 0, 0, {eventMask: x11.eventMask.SubstructureNotify|x11.eventMask.StructureNotify}); 
    X.MapWindow(wid); 
    var mplayer = spawn('mplayer', ['-wid', wid, './video.mp4']); 

    function pause() { 
     mplayer.stdin.write('pause\n'); 
     setTimeout(play, 1000); 
    } 

    function play() { 
     mplayer.stdin.write('play\n'); 
     setTimeout(pause, 1000); 
    } 

    pause(); 


    var mpid; 
    X.on('event', function(ev) { 
     console.log(ev); 
     if (ev.name == 'CreateNotify') 
      mpid = ev.wid; 
     if (ev.name == 'ConfigureNotify' && ev.wid == wid) { 
      X.ResizeWindow(mpid, ev.width, ev.height); 
     } 

    }); 
}); 
Смежные вопросы