Если вы создадите Composite со стилем SWT.EMBEDDED, то в SWT / GTK + Composite.embeddedHandle будет идентификатор X-окна, который вы можете использовать для родительского элемента дочернего элемента XEMBED.
Composite embed = new Composite(shell, SWT.EMBEDDED);
System.out.println ("X window ID: " + embed.embeddedHandle);
int hwndChild = OS.GetWindow ( c.handle, OS.GW_CHILD);
Это поддерживает встраивание с использованием протокола XEMBED.
Это похоже на код JNI, используемый для получения идентификатора окна из его дескриптора
GtkWidget *widget = (GtkWidget *) handle;
GdkWindow *window = widget->window;
xwinid = GDK_WINDOW_XWINDOW(window);
Пример кода здесь .
Пример класса с использованием ОС:
org.eclipse.swt.widgets.Tree , org.eclipse.swt.widgets.CoolItem ,
ОС, которую я могу найти, действительно org.eclipse.swt.internal.win32.OS , а не gtk, и это не идеальное решение, потому что вы получите доступ к внутренний пакет, но это может дать вам представление, где искать.
В вашем случае org.eclipse.swt.internal.gtk.OS
- это правильный класс, и вы должны посмотреть в источниках Tree или CoolItem, как они используют функцию GetWindow.
В GTK должна быть вызвана какая-то другая функция, например, может быть gtk_container_get_children(int container);
В ответе сказано на сообщение, которое я имел в виду
Если вам нужно окно X, то нет способа сделать это из общедоступного API SWT (даже через внутренние компоненты), и, более того, даже если бы был способ, который я не думаю, вы могли бы гарантировать его для всех элементов управления. Я не уверен, что это работает, но самое близкое, что вы могли бы получить:
- сделать
Control.fixedHandle
общедоступным
- Используйте
OS.GTK_WIDGET_WINDOW (control.fixedHandle)
, чтобы получить GdkWindow
- Используйте
OS.gdk_x11_drawable_get_xid (gdkWindow)
, чтобы перевести это в окно X
Полагаю, другим способом было бы взять Control.handle
, а затем позвонить на него GTK_WIDGET_WINDOW()
, или, если это null
, продолжать звонить его родителям, пока не найдете один с GdkWindow
, а затем переведите это в окно X.
Сложность в том, что SWT общается с GTK +, который общается с GDK, который затем общается с X. Итак, между вами и окном X есть три слоя.