【问题标题】:gtkmm 4: How to get X window ID from inside widget?gtkmm 4:如何从小部件内部获取 X 窗口 ID?
【发布时间】:2021-10-01 15:03:08
【问题描述】:

在 gtkmm 4 中,如何从继承自 Gtk::Widget 的类内部获取 X11/X.h 中定义的 XID 类型的 X Window ID?

【问题讨论】:

    标签: c++ x11 gtkmm gtkmm4


    【解决方案1】:

    并非所有人都有。

    这些小部件将实现GtkNative 接口,该接口提供gtk_native_get_surface 函数,允许您获取GdkSurface。在 gtkmm 中,这将对应于转换为 Gtk::Native 并调用 get_surface

    要从中获取Window 句柄,您可以使用GDK_SURFACE_XID 宏。为此,我认为不存在 C++ 包装器。您必须调用 Gdk::Surface::gobj 来获取 GdkSurface * 并使用 C API。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-13
        • 1970-01-01
        相关资源
        最近更新 更多