问题标签 [xembed]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
760 浏览

gtk - 将焦点放在 Gtk::Socket 内的嵌入式窗口

我已将 gvim 嵌入到 Gtk::Socket 中,该 Gtk::Socket 位于 Gtk::Box 中,如何将焦点放在嵌入的 gvim 窗口中,以便实现与在嵌入窗口中实际指向和单击相同的效果?

在 Gtk::Socket 小部件上使用->grab_focus()没有任何效果。

根据 XEMBED 规范(http://standards.freedesktop.org/xembed-spec/xembed-spec-latest.html#idm139742761059984),嵌入器(Gtk::Socket)似乎应该XEMBED_FOCUS_INXEMBED_WINDOW_ACTIVATE孩子,但在 Gtk::Socket 中似乎没有这个接口。

可以在这里找到基于Gtk::Plug 和 Gtk::Socket 示例的我正在尝试做的一个简单示例: https ://github.com/gauteh/plug-socket-grab-focus 。

如果这是一个错误,已在此处报告:https ://bugzilla.gnome.org/show_bug.cgi?id=729248

0 投票
1 回答
130 浏览

d - 检查重新设置的窗口关闭事件

我正在尝试为 X11 制作一个 xlib 托盘栏,它使用 XEMBED 嵌入托盘图标,如托盘规格中所述。但是,当我使用托盘图标关闭应用程序时,它只是将其从容器窗口中删除,但黑色容器窗口矩形和我的代码中的条目仍然存在。

XEMBED 文档中它说

嵌入器有责任跟踪所有转发的加速器并在客户端窗口终止时将其删除。

但是,当嵌入式窗口死机时,我的应用程序不会收到任何事件或指示。

我基本上只收到一个停靠请求事件,之后什么都没有。当一个停靠请求事件出现时,我为我的面板创建一个子窗口,其中包含托盘窗口并像这样重新设置它:

将它添加到面板没有任何问题,但我不知道如何检查何时再次删除它。

如何让我的应用程序接收这些托盘图标的关闭事件,或者如何检查重新设置的窗口是否仍然存在?

0 投票
1 回答
1124 浏览

x11 - C、Xlib 中的 freedesktop XEmbed 系统托盘客户端代码

我一直在尝试使用直接 C 和 Xlib 来实现一个系统托盘图标,以及 freedesktop 规范 [0]。我似乎无法让我的 Window 嵌入我的桌面管理器的系统托盘 [1],而其他应用程序似乎能够做到这一点。我不确定如何继续调试它,但我在下面提供了最少的示例代码。

我找不到任何使用直接 Xlib 和 C 的示例代码,我看到的所有建议都是关于 Gtk/Qt/Mono/whatever 等框架的,但我想了解应该做什么按照规范在这里发生,我做错了什么。

任何帮助将不胜感激。我认为这个问题与语言无关,更多的是因为我对协议的误解,所以任何语言的答案都是可以接受的,只要它们能帮助我解决这个 XEvent 问题。

[0] https://specifications.freedesktop.org/systemtray-spec/systemtray-spec-0.2.html

[1] 我正在使用 dwm 和系统托盘补丁http://dwm.suckless.org/patches/systray

0 投票
1 回答
227 浏览

c++ - 如何在 Gtk 套接字中嵌入 Gtk::Plug?

我有我的窗户。在这个窗口中,我想要两个按钮。一个是插头,另一个是正常的。

我执行以下操作

插件.cc

主文件

这可以编译,但我得到

gtk_socket_add_id: assertion '_gtk_widget_get_anchored (GTK_WIDGET (socket))' failed

如何将 Gtk::Plug 的实例嵌入到套接字中?

0 投票
0 回答
120 浏览

python - 当 Socket 从一个 Notebook 移动到另一个 Notebook 时,Gtk 会创建新的 XEMBED Socket

我正在使用 Python 3.7 和 PyGTK 3.0 开发一个 GUI 应用程序。我的 GUI 由多个 GTK.Notebooks 组成,它们都在同一个组中,并且它们的所有选项卡都设置为可拆卸的。这样,我可以从一个笔记本中拖出一页并将其放到另一个笔记本上。这适用于我正在使用的大多数小部件,但我正在努力让它与 GTK.Socket 一起使用。我想运行外部程序并将它们的 GUI 显示为其中一个笔记本中的页面。这很好用,但是当我将页面拖到不同的笔记本时,页面是空的。

我尝试连接到页面添加和页面删除信号并将一些调试信息打印到控制台。我注意到在 GTK.Socket 的每次移动(拖放到另一个笔记本)中,GTK.Socket 都会获得一个新 ID。在第一次移动之后,ID 已经与 Socket 创建和添加后的 ID 不同。这让我想到,每次移动页面时,都会创建一个新的 Socket,显然外部程序没有注意到这种变化,仍然会绘制到旧的 Socket 上,我无法再显示了。

这是我的问题的 MWE。它创建一个窗口,其中两个笔记本设置在 HPaned 容器中。每个 Notebook 都获得一个 TextView 作为它们的第一页(因此它不是空的),并且正确的 Notebook 也获得一个 Socket(在这种情况下,它中继​​到 gtkwave 会话)。我还通过一些调试输出添加了页面添加和页面删除的侦听器。

如果运行代码,您将看到以下消息:

第一个 ID 是 0x0,因为尚未将 Socket 添加到 Window,这是预期的行为。这也解释了错误(如果我不连接信号,错误就消失了)。就在调用 Gtk.main() 之前,Socket 是有效的,并且可以打印 ID。现在移动带有 GTKWave 会话的选项卡,您将看到每次移动的以下消息:

此 ID 与第一个有效 ID 不同,并且每次移动都不同。我希望这个 ID 保持不变,以便仍然可以显示外部 GUI。为什么要创建一个新的 Socket,我该如何解决这个问题?