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.
我想在已接受的答案中添加两点
检查 get_surface()
是否确实返回了一个有效的非零对象当然很重要。否则在 Widget 的 signal_realize()
发出后获取 ID,这是在将 widget 分配给表面之后完成的。这可以通过覆盖默认处理程序 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 window ID。
在 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.
我想在已接受的答案中添加两点
检查
来实现get_surface()
是否确实返回了一个有效的非零对象当然很重要。否则在 Widget 的signal_realize()
发出后获取 ID,这是在将 widget 分配给表面之后完成的。这可以通过覆盖默认处理程序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 window ID。