2016-08-07 8 views
0

Я собираюсь из различных ссылок класса wxWidgets в документации (example), что wxWidgets, используемые для построения графического интерфейса, в основном наследуются от wxWindow. Я вижу из комментариев в the source of wxWidgets/window.cpp, что каждый wxWindow имеет указатель на некоторый GtkWidget, который хранится в элементе wxWidget m_widget. Из тех же комментариев исходного кода я также вижу, что m_wxwindow является членом класса wxWindow и может содержать указатель на объект wxPizza в случае wxWindow, который имеет клиентскую область для рисования и детей.Как подключить wxWidgets, виджеты GTK2 и окна X11?

Я работаю над приложением, для которого требуется такая функциональность. Я расширяю класс wxWidgets для создания своего собственного виджета, который должен содержать графическое окно X11, и я не уверен, как его подключить, и у меня возникли проблемы с поиском решения с использованием документации.

Когда я создаю свой собственный виджет (в методе Create), я могу видеть, что m_widget и m_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); 

Где Сайзер является 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 (XID) и встроить его в родительский виджет (wxBoxSizer).
  • Нужно ли использовать как m_widget, так и m_wxwindow? Как мне их настроить?
  • Нужно ли что-либо делать, кроме звонка sizer->Add(), чтобы связать это с моим wxBoxSizer?

Спасибо!

ОБНОВЛЕНИЕ: Извините, что забыл упомянуть, это для GTK2. Спасибо @andlabs за это.

ОБНОВЛЕНИЕ 2: @VZ. рекомендовал, чтобы я уточнил, что я пытаюсь сделать.

Я использую библиотеку, которая нуждается в доступе к окну X11, но сама не создает это окно. Когда я инициализирую библиотеку, мне нужно передать ей дескриптор окна X11 (XID). Затем библиотека будет рисовать в это окно. Я хочу создать это окно внутри приложения wxWidgets. Я пытаюсь расширить класс wxWidgets, чтобы я смог добавить эти окна X11 в виджеты на основе wxSizer в своем приложении.

Я знаю, что gtk_window_new() не то, что я ищу, потому что он создает новое окно верхнего уровня, в то время как я хочу окно, встроенное в мое приложение wxWidgets. Это то, что я пробовал на этом пути.

+1

GTK + 2 или GTK + 3? – andlabs

+0

@ Давид, почему тебя это волнует? Все эти m_widget и m_wxwindow являются исключительно wxWidgets внутренними. Вы попробовали образец чертежа wxWidgets? Или любые другие образцы в этом отношении? – Igor

+0

Спасибо за запрос @andlabs, это GTK + 2 – David

ответ

1

Было бы очень полезно знать, что именно вы пытаетесь сделать. Вы говорите о GtkWidgets s, но затем покажите gtk_window_new() вызов, который создает новый (верхний уровень) окно, что совсем другое и может быть представлено только wxTopLevelWindow на уровне wx.

Вам нужно обернуть существующий GtkWidget в приложении wxWidgets? Если это так, вы должны просто использовать wxNativeWindow. Даже если вы не используете последнюю версию с ней, вы все равно можете легко повторно использовать/дублировать свой код.

Вам нужно обернуть существующий XWindow? Тогда это сложнее, потому что вы не можете легко сделать это с помощью wxGTK. Вы можете использовать wxX11, но этот порт не в хорошем состоянии, поэтому, вероятно, это не лучшая идея, если только ваши потребности не очень ограничены. Лучше всего, наверное, сначала обернуть окно X в GtkWidget, а затем продолжить, как описано выше.


После обновления кажется, что вам просто нужен XID существующего окна. Это даже проще, чем встраивание виджета GTK +, поскольку вы можете получить GtkWidget, используя wxWindow::GetHandle(), затем используйте gtk_widget_get_window(), чтобы получить его GdkWindow и, наконец, используйте GDK_WINDOW_XID(), чтобы получить XID.

+0

Спасибо @VZ. Я обновил свой вопрос, чтобы уточнить, что я ищу. Я хочу обернуть окно X11 в виджет wxWidgets, но это не существующее окно X11 - я хочу создать тот, который я потом использую позже. – David

+0

Отметить как ответ, потому что я буду идти по пути, чтобы внедрить окно X11 в GtkWidget, а затем вставить GtkWidget в приложение wxWidgets. Спасибо @VZ.! – David