是否可以在 GTK 中的另一个应用程序中运行一个应用程序?
Posted
技术标签:
【中文标题】是否可以在 GTK 中的另一个应用程序中运行一个应用程序?【英文标题】:is it possible run an app inside another app in GTK? 【发布时间】:2021-12-29 20:29:29 【问题描述】:我的问题是关于天气是否有可能在 GTK3 应用程序中嵌入窗口的内容(例如终端模拟器、浏览器、游戏或任何其他 X org 应用程序)。这意味着用户仍然可以与应用程序交互并查看其内容。我正在运行 Debian 11 64 位,我想使用 C 制作应用程序。
【问题讨论】:
执行system()
或popen()
命令之类的操作是否符合您的想法?从调用共享库中的导出函数开始的会话怎么样? More ideas here
@ryyker 这适用于终端应用程序,但我的目标是将图形应用程序嵌入到其他图形应用程序中。
popen()不限于终端应用。它是一个库函数,可以从程序中调用,无论是终端应用程序,还是带有窗口/表单/面板的程序。当被调用时,它打开一个到调用程序的管道,然后创建一个子进程,其中启动字符串命令参数。字符串命令可以是任何可执行文件的路径名,无论它是操作系统原生的,还是您编写的,例如。 "./my_program.exe"
。也可以通过抑制控制台弹出窗口的方式调用popen()
。
@ryyker 我知道,但是 popen() 会打开另一个窗口。我想要做的是在 gtk 小部件内呈现窗口的内容。例如,ubuntu 安装程序在安装时显示一个小终端而不是终端弹出窗口的方式相同。
有一些方法可以阻止控制台弹出。不过,看看这个question/answer。
【参考方案1】:
我见过的最接近的是使用GtkPlug
and a GtkSocket
:
与 GtkSocket 一起,GtkPlug 提供了嵌入小部件的能力 以透明的方式从一个流程到另一个流程 给用户。一个进程创建一个 GtkSocket 小部件并传递 ID 将该窗口小部件的窗口转移到另一个进程,然后创建一个 具有该窗口 ID 的 GtkPlug。然后包含在 GtkPlug 中的任何小部件 将出现在第一个应用程序的窗口中。
GtkSocket 和 GtkPlug 之间的通信遵循XEmbed Protocol。该协议也已在其他工具包中实现, 例如Qt,在嵌入 Qt 时允许相同级别的集成 GTK+ 中的小部件,反之亦然。
这方面的一个例子是xfce-settings-manager
,您可以研究here(在repo 中搜索“socket-id”)。
注意:GtkPlug
s 和 GtkSocket
s 是 X11 特定的。如果您正在寻找跨平台的东西,这可能不是它。
【讨论】:
以上是关于是否可以在 GTK 中的另一个应用程序中运行一个应用程序?的主要内容,如果未能解决你的问题,请参考以下文章
将 Ansible 变量从一个角色(在一个主机上运行)传递给在同一剧本中的另一台主机上运行的另一个角色