mic*_*c_e 4 x11 window window-management
是否有捷径可寻?我从来没有在任何地方见过这个(除了 Adobe/... Firefox 插件),所以我对此表示怀疑......
如果没有,是否有一种可靠的、hacky 的方法(例如Xlib通过 挂钩到该进程的调用LD_PRELOAD)?
如果重要的话,假设外部进程是mplayer,我的编程语言是C。我有一种预感,Xlib直接使用是我最好的选择,但请随意建议其他选择。仅有mplayer- 的解决方案是不够的。
如果您知道要嵌入的窗口的窗口 ID,则只需将其重新设置为您的窗口(使用XReparentWindow),即使它是由另一个进程创建的。
\n对于 mplayer 有“-wid”命令行选项。如果您将窗口 ID 传递给它,mplayer 会自动将其窗口创建为 wid 的子窗口:
\n\n\n\xe2\x88\x92wid(另请参阅 \xe2\x88\x92gui-wid)(仅限 X11、OpenGL 和 DirectX)
\n这告诉 MPlayer 附加到现有窗口。对于在浏览器中嵌入 MPlayer 很有用(例如插件扩展)。此选项完全填充给定窗口,因此宽高比缩放、平移扫描等不再由 MPlayer 处理,而是必须由创建该窗口的应用程序管理。
\n
您可以通过传递“-slave”标志并将命令发送到 stdin(或 fifo)来控制 mplayer
\n使用node-x11嵌入 mplayer 的示例:
\nvar 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});\nRun Code Online (Sandbox Code Playgroud)\n