2016-08-07 53 views
0

entnehme ich aus dem verschiedenen wxWidgets Klassenverweis in der Dokumentation (example), dass die wxWidgets eine GUI im Grunde von wxWindow erben bauen verwendet. Ich sehe aus den Kommentaren in the source of wxWidgets/window.cpp, dass jede wxWindow einen Zeiger auf einige GtkWidget hat, die im m_widget Mitglied des wxWidget-Objekts gespeichert ist. Aus den gleichen Quellcode Kommentare sehe ich auch, dass m_wxwindow ein Mitglied der wxWindow Klasse ist, und kann einen Zeiger auf ein Objekt wxPizza im Falle eines wxWindow, die eine Client-Bereich zum Zeichnen und Kinder hat halten.Wie verbinde ich wxWidgets, GTK2-Widgets und X11-Fenster?

Ich arbeite an einer Anwendung, die diese Art von Funktionalität erfordert. Ich erweitere eine wxWidgets-Klasse, um mein eigenes Widget zu erstellen, das ein aufklappbares X11-Fenster enthalten muss, und ich bin mir nicht sicher, wie ich das alles verbinden soll und ich habe Probleme, eine Lösung anhand der Dokumentation zu finden.

Als ich meine benutzerdefinierte Widget erschaffe (im Create-Methode), kann ich sehen, dass m_widget und m_wxwindow beide NULL sind, so von diesem und was ich oben erwähnt habe, entnehme ich, das sind die GtkWidget Objekte, die ich zu schaffen sein sollte um meinen Kundenbereich zu bilden. Zuerst habe ich folgendes versucht:

m_widget = gtk_window_new(GTK_WINDOW_TOPLEVEL); 

Welche Art von Arbeiten, aber nicht ganz so wie ich es will. Ich bin in der Lage, die XID von GtkWidget zu bekommen und das X11-Fenster verhält sich wie erwartet. Aber das erzeugt ein neues Fenster außerhalb meines Haupt-wxWidgets App-Fensters. Was ich will, ist genau diese Funktionalität außer in meinem Haupt wxWidgets App-Fenster eingebettet. Meine benutzerdefinierte Klasse hat zu einem wxBoxSizer wie folgt hinzugefügt:

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

Wo Sizer ein wxBoxSizer und my_widget ist meine Gewohnheit Widget.

Ich habe dann versucht m_widget als ein paar verschiedene Arten von GtkWidget zu schaffen, sondern diese alle führten Fehler in der Laufzeit, wenn gtk_widget_realize zu verwenden versuchen und versuchen, die XID zu bekommen.

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

Dies sind die Fehlermeldungen ich immer bin, wenn ich versuchte, die oben:

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. 

Also ich dies ist eine mehrteilige Frage:

  • Was ist eine angemessene GtkWidget Typ, um dies zu erreichen? Ich muss in der Lage sein, eine ausklappbare X11-Fenster-ID (XID) zu erhalten und sie in das übergeordnete Widget (wxBoxSizer) einzubetten.
  • Muss ich sowohl m_widget als auch m_wxwindow verwenden? Wie richte ich diese ein?
  • Muss ich irgendetwas anderes tun als sizer->Add() anrufen, um dies mit meinem wxBoxSizer zu verbinden?

Vielen Dank!

UPDATE: Sorry, ich habe vergessen zu erwähnen, das ist für GTK2. Danke @andlabs für das Aufzeigen.

UPDATE 2: @ VZ. empfohlen, dass ich klarstelle, was ich versuche zu tun.

Ich verwende eine Bibliothek, die Zugriff auf ein X11-Fenster benötigt, aber dieses Fenster nicht selbst erstellt. Wenn ich die Bibliothek initialisiere, muss ich ihr ein X11-Fensterhandle übergeben (XID). Die Bibliothek wird dann in dieses Fenster zeichnen. Ich möchte dieses Fenster in meiner wxWidgets-Anwendung erstellen. Ich versuche, eine wxWidgets-Klasse zu erweitern, so dass ich in der Lage bin, diese X11-Fenster Widgets basierend auf wxSizer in meiner Anwendung hinzuzufügen.

Ich weiß, dass gtk_window_new() ist nicht das, was ich suche, weil es ein neues Top-Level-Fenster erstellt, während ich ein Fenster in meiner wxWidgets-Anwendung eingebettet werden möchte. Es ist nur etwas, was ich auf dem Weg versucht habe.

+1

GTK + 2 oder GTK + 3? – andlabs

+0

@ David, warum kümmert es dich? All dies m_widget und m_wxwindow sind ausschließlich wxWidgets intern. Hast du das Zeichenbeispiel von wxWidgets getestet? Oder irgendwelche anderen Proben für diese Angelegenheit? – Igor

+0

Danke für die Nachfrage @andlabs, es ist GTK + 2 – David

Antwort

1

Es wäre wirklich hilfreich zu wissen, was genau Sie zu tun versuchen. Sie sprechen über GtkWidgets s, aber dann zeigen Sie gtk_window_new() Aufruf, der ein neues (Top-Level) Fenster erstellt, das ist etwas ganz anderes und kann nur von wxTopLevelWindow auf wx-Ebene dargestellt werden.

Müssen Sie ein vorhandenes GtkWidget in eine wxWidgets-Anwendung einbinden? Wenn ja, sollten Sie einfach wxNativeWindow verwenden. Selbst wenn Sie nicht die neueste Version verwenden, können Sie den Code dennoch problemlos wiederverwenden/duplizieren.

Müssen Sie eine vorhandene XWindow einpacken? Dann ist es schwieriger, weil du es mit wxGTK nicht leicht machen kannst. Sie könnten wxX11 verwenden, aber dieser Port ist nicht in einem guten Zustand, also ist es wahrscheinlich nicht die beste Idee, es sei denn, Ihre Bedürfnisse sind sehr begrenzt. Das beste wäre wahrscheinlich, X-Fenster in einem GtkWidget zuerst zu wickeln und dann wie oben fortzufahren.


Nach dem Update scheint es, dass Sie nur eine XID eines vorhandenen Fensters benötigen. Dies ist noch einfacher als das Einbetten eines GTK + -Widgets, wie Sie die GtkWidget mit wxWindow::GetHandle() erhalten können, dann verwenden Sie gtk_widget_get_window(), um seine GdkWindow zu erhalten und schließlich GDK_WINDOW_XID() zu verwenden, um die XID zu erhalten.

+0

Danke @VZ. Ich habe meine Frage aktualisiert, um zu verdeutlichen, wonach ich suche. Ich möchte ein X11-Fenster in ein WxWidgets-Widget einbinden, aber es ist kein vorhandenes X11-Fenster - ich möchte ein X11-Fenster erstellen, das ich später verwenden werde. – David

+0

Kennzeichnung als die Antwort, weil ich den Pfad des Versuchens versuchen werde, ein X11-Fenster in einem GtkWidget einzubetten, und dann das GtkWidget in die wxWidgets-Anwendung einzubetten. Danke @VZ.! – David