如何连接wxWidgets,GTK2小部件和X11窗口?

时间:2016-08-07 16:20:36

标签: c++ linux gtk wxwidgets x11

我从文档(example)中的各种wxWidgets类引用中收集到,用于构建GUI的wxWidgets基本上都是从wxWindow继承的。我在the source of wxWidgets/window.cpp的注释中看到每个wxWindow都有一个指向某个GtkWidget的指针,该指针存储在wxWidget对象的m_widget成员中。从相同的源代码注释中我也看到m_wxwindowwxWindow类的成员,并且在wxPizza的情况下可能包含指向wxWindow对象的指针有绘图和儿童的客户区。

我正在开发一个需要这种功能的应用程序。我正在扩展一个wxWidgets类来创建我自己的小部件,它需要包含一个可绘制的X11窗口,而我真的不知道如何将它连接起来而且我很难找到使用该文档的解决方案。

当我创建自定义窗口小部件时(在Create方法中),我可以看到m_widgetm_wxwindow都是NULL,所以从这里和我如上所述,我收集这些是我应该创建的GtkWidget对象,以形成我的客户区。首先,我尝试了这个:

m_widget = gtk_window_new(GTK_WINDOW_TOPLEVEL);

哪种作品但不太像我想要的那样。我能够从XID获取GtkWidget,并且X11窗口的行为符合预期。但是这会在我的主要wxWidgets应用程序窗口之外创建一个新窗口。我想要的是这个确切的功能,除了嵌入在我的主要wxWidgets应用程序窗口内。我的自定义类已添加到wxBoxSizer,如下所示:

sizer->Add(my_widget, 1, wxEXPAND | wxALL, 0);

sizer是wxBoxSizer,而my_widget是我的自定义小部件。

然后我尝试将m_widget创建为几种不同类型的GtkWidget,但这些都在尝试使用gtk_widget_realize并尝试获取XID时导致运行时错误}。

// These don't work
m_widget = gtk_drawing_area_new();
m_widget = gtk_vbox_new(false, 0);

这些是我在尝试上述操作时收到的错误消息:

Gtk: IA__gtk_widget_realize: assertion 'GTK_WIDGET_ANCHORED (widget) || GTK_IS_INVISIBLE (widget)' failed
Gdk: gdkdrawable-x11.c:952 drawable is not a pixmap or window
Check failed: xwindow.

所以我这是一个多部分的问题:

  • 完成此任务的适当GtkWidget类型是什么?我需要能够获得可绘制的X11窗口ID(XID)并将其嵌入到父窗口小部件(wxBoxSizer)中。
  • 我是否需要同时使用m_widgetm_wxwindow?我该如何设置它们?
  • 我是否需要执行除sizer->Add()之外的其他操作,以便将其与我的wxBoxSizer连接起来?

谢谢!

更新:抱歉,我忘了提及,这是针对GTK2的。谢谢@andlabs指出这一点。

更新2: @VZ。建议我澄清我想要做的事情。

我正在使用需要访问X11窗口的库,但不会自己创建该窗口。当我初始化库时,我需要传递一个X11窗口句柄(XID)。然后该库将绘制到该窗口中。我想创建此窗口以在我的wxWidgets应用程序中。我正在尝试扩展一个wxWidgets类,以便我能够在我的应用程序中基于wxSizer将这些X11窗口添加到窗口小部件。

我知道gtk_window_new()不是我想要的,因为它创建了一个新的顶级窗口,而我想在我的wxWidgets应用程序中嵌入一个窗口。这只是我一路上尝试的事情。

1 个答案:

答案 0 :(得分:1)

知道你究竟想做什么真的很有帮助。您说的是def user_for_select User.pluck(:name, :id).unshift(['All', 'all']) end s,然后显示GtkWidgets调用,这会创建一个新的(顶级)窗口,这是一个非常不同的窗口,只能在wx级别由gtk_window_new()表示。

您是否需要在wxWidgets应用程序中包装现有的wxTopLevelWindow?如果是这样,您应该使用wxNativeWindow。即使您没有使用最新版本,您仍然可以轻松地重复使用/复制其代码。

您需要包装现有的GtkWidget吗?然后它更难,因为你不能用wxGTK轻松做到这一点。你可以使用wxX11,但这个端口不是很好,所以它可能不是最好的主意,除非你的需求非常有限。最好的方法可能是首先在XWindow中包装X窗口,然后按上述步骤进行操作。

更新后,您似乎只需要现有窗口的XID。这比嵌入GTK +小部件更简单,因为您可以使用GtkWidget获取GtkWidget,然后使用wxWindow::GetHandle()获取其gtk_widget_get_window(),最后使用GdkWindow来得到XID。