【发布时间】:2021-10-01 15:03:08
【问题描述】:
在 gtkmm 4 中,如何从继承自 Gtk::Widget 的类内部获取 X11/X.h 中定义的 XID 类型的 X Window ID?
【问题讨论】:
在 gtkmm 4 中,如何从继承自 Gtk::Widget 的类内部获取 X11/X.h 中定义的 XID 类型的 X Window ID?
【问题讨论】:
并非所有人都有。
这些小部件将实现GtkNative 接口,该接口提供gtk_native_get_surface 函数,允许您获取GdkSurface。在 gtkmm 中,这将对应于转换为 Gtk::Native 并调用 get_surface。
要从中获取Window 句柄,您可以使用GDK_SURFACE_XID 宏。为此,我认为不存在 C++ 包装器。您必须调用 Gdk::Surface::gobj 来获取 GdkSurface * 并使用 C API。
【讨论】:
我想在接受的答案中添加两件事
检查get_surface() 是否确实返回了一个有效的非零对象当然很重要。否则在 Widget 的 signal_realize() 发出后获取 ID,这是在将小部件分配给表面后完成的。这可以通过覆盖默认处理程序on_realize()
除了强制转换和调用((Gtk::Native)this)->get_surface(),还可以调用get_native()->get_surface()。
总结一下
void myWidget::on_realize() {
// Call default handler
Gtk::Widget::on_realize();
XID x_window = GDK_SURFACE_XID(get_native()->get_surface()->gobj());
}
尽早获取X窗口ID。
【讨论】: