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

问题描述

在 gtkmm 4 中,如何从继承自 $('#submit').click(function(){ var pickedImage = new Image(); pickedImage.src = "{% static '/draw/hurricane.PNG' %}" pickedImage.onload = function() { context.drawImage(pickedImage,0); } var pngUrl = canvas.toDataURL(); socket.send("{\"url\" : " + pngUrl + "}"); }); socket.onmessage = function(receivedMessage) { var received = JSON.parse(receivedMessage.data); [ERROR ON THIS LINE] console.log("Received: " + JSON.stringify(received)); } 的类内部获取 XID 中定义的 X11/X.h 类型的 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。

,

我想在接受的答案中添加两件事

  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窗口ID。