将属于我启动的独立进程的 X11 窗口嵌入到我自己的窗口中?

mic*_*c_e 4 x11 window window-management

是否有捷径可寻?我从来没有在任何地方见过这个(除了 Adob​​e/... Firefox 插件),所以我对此表示怀疑......

如果没有,是否有一种可靠的、hacky 的方法(例如Xlib通过 挂钩到该进程的调用LD_PRELOAD)?

如果重要的话,假设外部进程是mplayer,我的编程语言是C。我有一种预感,Xlib直接使用是我最好的选择,但请随意建议其他选择。仅有mplayer- 的解决方案是不够的。

And*_*rov 5

如果您知道要嵌入的窗口的窗口 ID,则只需将其重新设置为您的窗口(使用XReparentWindow),即使它是由另一个进程创建的。

\n

对于 mplayer 有“-wid”命令行选项。如果您将窗口 ID 传递给它,mplayer 会自动将其窗口创建为 wid 的子窗口:

\n
\n

\xe2\x88\x92wid(另请参阅 \xe2\x88\x92gui-wid)(仅限 X11、OpenGL 和 DirectX)

\n

这告诉 MPlayer 附加到现有窗口。对于在浏览器中嵌入 MPlayer 很有用(例如插件扩展)。此选项完全填充给定窗口,因此宽高比缩放、平移扫描等不再由 MPlayer 处理,而是必须由创建该窗口的应用程序管理。

\n
\n

您可以通过传递“-slave”标志并将命令发送到 stdin(或 fifo)来控制 mplayer

\n

使用node-x11嵌入 mplayer 的示例:

\n
var x11 = require(\'x11\');\nvar spawn = require(\'child_process\').spawn;\nx11.createClient(function(err, display) {\n    var X = display.client;\n    var wid = X.AllocID();\n    X.CreateWindow(wid, display.screen[0].root, 100, 100, 400, 300, 0, 0, 0, 0, {eventMask: x11.eventMask.SubstructureNotify|x11.eventMask.StructureNotify});\n    X.MapWindow(wid);\n    var mplayer = spawn(\'mplayer\', [\'-wid\', wid, \'./video.mp4\']);\n\n    function pause() {\n      mplayer.stdin.write(\'pause\\n\');\n      setTimeout(play, 1000);\n    }\n\n    function play() {\n      mplayer.stdin.write(\'play\\n\');\n      setTimeout(pause, 1000);\n    }\n\n    pause();\n\n   \n    var mpid;\n    X.on(\'event\', function(ev) {\n        console.log(ev);\n        if (ev.name == \'CreateNotify\')\n            mpid = ev.wid;\n        if (ev.name == \'ConfigureNotify\' && ev.wid == wid) {\n            X.ResizeWindow(mpid, ev.width, ev.height);\n        }\n\n    });\n});\n
Run Code Online (Sandbox Code Playgroud)\n