是否可以在 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”)。

注意:GtkPlugs 和 GtkSockets 是 X11 特定的。如果您正在寻找跨平台的东西,这可能不是它。

【讨论】:

以上是关于是否可以在 GTK 中的另一个应用程序中运行一个应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

GTK+ 中的 CSS 过渡/动画。是不是可以?

在 GTK 中使用多线程?

错误:不应忽略 void 值 - C/GTK+

将 Ansible 变量从一个角色(在一个主机上运行)传递给在同一剧本中的另一台主机上运行的另一个角色

是否可以从同一解决方案中的另一个项目引用 VS2005 网站项目?

是否可以将 GTK+ 与 C++ 一起使用?