gtkmm 4:如何从小部件内部获取 X window ID?

gtkmm 4: How to get X window ID from inside widget?

在 gtkmm 4 中,如何从继承自 Gtk::Widget?

并不是所有人都有。

那些执行的小部件将实现 GtkNative interface, which provides the gtk_native_get_surface function, allowing you to obtain a GdkSurface. In gtkmm, this will correspond to casting to to Gtk::Native and calling get_surface

要从中获得 Window 句柄,您可以使用 GDK_SURFACE_XID macro. For that, I don’t think a C++ wrapper exists; you will have to call Gdk::Surface::gobj 获得 GdkSurface * 并使用 C API.

我想在已接受的答案中添加两点

  1. 检查 get_surface() 是否确实返回了一个有效的非零对象当然很重要。否则在 Widget 的 signal_realize() 发出后获取 ID,这是在将 widget 分配给表面之后完成的。这可以通过覆盖默认处理程序 on_realize()

    来实现
  2. 除了强制转换和调用 ((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 window ID。