2016-07-27 38 views
0

Ich begann mit this branch of wxWidgets from GitHub user hokein, da es scheint, was ich mit älteren Versionen von CEF suche. Im Grunde versuche ich wxWebViewChromium (ein wxWebView mit CEF als Back-End) mit cef_3.2526.1354 zu implementieren, da dies die Version ist, die wir in unserer Anwendung verwenden möchten. Ich verwende CentOS 7 mit GNOME in einer VM mit Hyper-V.CEF3 mit wxWidgets (und GTK) unter Linux verwenden

Originalcode aus dem Repository oben verlinkten (Teil webview_chromium.cpp)

#ifdef __WXGTK__ 
m_widget = gtk_scrolled_window_new(NULL, NULL); 
g_object_ref(m_widget); 
GtkScrolledWindow *scrolled_window = GTK_SCROLLED_WINDOW(m_widget); 
// Hide the scroll bar. 
gtk_scrolled_window_set_policy(scrolled_window, GTK_POLICY_NEVER, GTK_POLICY_NEVER); 
GtkWidget* view_port = gtk_viewport_new(NULL, NULL); 
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window), 
             view_port); 
info.SetAsChild(view_port); 
m_parent->DoAddChild(this); 
PostCreation(size); 

gtk_widget_show(view_port); 
#endif 

Als ich versuchte, diese mit cef_3.2526.1354 zu kompilieren und zu verknüpfen, war ich Fehler im Zusammenhang mit der info.SetAsChild(viewport); Linie zu bekommen. Ich gab es eine GtkWidget* und es war cef_window_handle_t, CefRect erwartet.

Was ich versucht habe bisher

ich die CefRect erstellt diese wie auf der Grundlage der GtkWidget* view_port:

GtkAllocation gtk_alloc; 
gtk_widget_get_allocation(view_port, &gtk_alloc); 
CefRect cef_rect (
    (int)gtk_alloc.x, 
    (int)gtk_alloc.y, 
    (int)gtk_alloc.width, 
    (int)gtk_alloc.height 
); 

Der typedef aus dem Code CEF-Bibliothek zeigt an, dass cef_window_handle_t ein unsigned long, aber die CEF documentation sagt, es ist ein GtkWidget* ... Was ich denke, sind das gleiche, aber das führte zu einigen anfänglichen Verwirrung. Zuerst dachte ich, dass ich brauchte die X11-Fenster-ID (XID) von dem darunterliegenden X11-Fenster passieren, aber dies einen Laufzeitfehler erzeugt:

Gdk: gdkdrawable-x11.c:952 drawable is not a pixmap or window 

einfach die GtkWidget* als unsigned long anstatt das zugrunde liegende X11 Fenster Gießen ID hat diesen Fehler entfernt, daher denke ich, dass dies die Funktion erwartet hat.

Mein Code zur Zeit (Teil webview_chromium.cpp)

#ifdef __WXGTK__ 
m_widget = gtk_scrolled_window_new(NULL, NULL); 
g_object_ref(m_widget); 
GtkScrolledWindow *scrolled_window = GTK_SCROLLED_WINDOW(m_widget); 
// Hide the scroll bar. 
gtk_scrolled_window_set_policy(scrolled_window, GTK_POLICY_NEVER, GTK_POLICY_NEVER); 
GtkWidget* view_port = gtk_viewport_new(NULL, NULL); 
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window), 
             view_port); 

GtkAllocation gtk_alloc; 
gtk_widget_get_allocation(view_port, &gtk_alloc); 
CefRect cef_rect (
    (int)gtk_alloc.x, 
    (int)gtk_alloc.y, 
    (int)gtk_alloc.width, 
    (int)gtk_alloc.height 
); 

info.SetAsChild(
    (unsigned long) view_port, 
    cef_rect 
); 

m_parent->DoAddChild(this); 
PostCreation(size); 

// gtk_widget_show(view_port); 
gtk_widget_show_all(m_widget); 
gtk_widget_show_all(view_port); 
#endif 

Was

geschieht Ich bin in der Lage zu kompilieren, Link, und die Anwendung auszuführen. Ich kann das wxWidgets-Fenster sehen, und ich kann das Fenster wie jedes normale Fenster minimieren, vergrößern, verkleinern und schließen. Es gibt nichts im Fenster - es ist nur ein einfaches, graues, leeres Fenster. Ich erwarte (oder hoffe), den CEF Browser zu sehen. Im Terminal, dass ich die Anwendung starten verwendet, erhalte ich die folgende Meldung:

[0727/132200:ERROR:browser_main_loop.cc(203)] Running without SUID sandbox! See https://code.google.com/p/chromium/wiki/LinuxSUIDSandboxDevelopment for more information on developing with sandbox on.

Diese URL scheint nicht mehr von Nutzen zu sein. Wenn ich ./cefclient --no-sandbox von der Befehlszeile aus starte, bekomme ich die gleiche Fehlermeldung, aber der CEF-Client funktioniert wie erwartet. Wenn ich ./cefclient von der Befehlszeile aus starte (ohne Sandbox zu deaktivieren), bekomme ich diese gleiche Nachricht, außer es sagt FATAL und der CEF-Client funktioniert nicht (stürzt direkt ab).

Meine Fragen

Habe ich etwas falsch mit meiner Änderungen an der Datei webview_chromium.cpp getan? Gibt es irgendwo anders in dieser Datei, dass ich nach Dingen suchen sollte, die ich möglicherweise aktualisieren muss, um dieses mit cef_3.2526.1354 zu arbeiten? Wie kann ich dieses leere Fenster beheben, das ich sehe?

Danke!

UPDATE

Czarek Tomczak teilte mir mit, dass diese Version von CEF eine X11-Fenstergriff erwartet, so habe ich meinen Code wie folgt modifiziert.

Aber dies führt immer noch zu dem Laufzeitfehler unten, mit der gleichen leeren Fensterausgabe wie zuvor.

Gdk: gdkdrawable-x11.c:952 drawable is not a pixmap or window 

Jede Hilfe, die mich in die richtige Richtung zeigt, würde sehr geschätzt werden. Ich habe auch versucht, hier ein aktuelles GtkWindow zu erstellen, anstatt eines Scroll-Fensters mit einem Viewport darin. Dies beseitigt den obigen Laufzeitfehler, aber es öffnet ein zweites Fenster, das beide leer sind. Ich brauche all das in einem Fenster zu arbeiten.

UPDATE 2

Mit etwas Hilfe von Czarek Tomczak, die Links er geschrieben, und this FAQ Ich habe an einen Punkt, wo ich bin in der Lage, den CEF-Browser in eine GtkWidget einzubetten, aber ich bin nur in der Lage diese Arbeit zu machen, wenn ich das Widget als Top-Level-GTK-Fenster wie folgt zu erstellen:

m_widget = gtk_window_new(GTK_WINDOW_TOPLEVEL); 

Wo m_widget der Haupt-Widget des wxWebView ist ich versuche zu erstellen. Das Problem dabei ist, dass jetzt der CEF-Browser in seinem eigenen GTK-Fenster auftaucht, aber was ich wirklich brauche, ist, dass der CEF-Browser in das wxBoxSizer passt, dem ich mein wxWebViewChromium-Widget hinzufüge. Um dies an dieser Stelle zu erreichen, habe ich einen Teil des Codes von der Create-Methode in die OnSize-Methode aufgeteilt, so dass ich die XID des GtkWidget erhalten konnte, nachdem das GtkWidget realisiert wurde, und danach den CEF-Browser erstellte. Die OnSize-Methode ist mit wxEVT_SIZE verbunden. Mein Code ist jetzt wie folgt.

aktualisiert Teil Create Methode

// Actual creation of CEF browser moved to OnSize function so we 
// can guarantee the widgets have been realized 
this->Bind(wxEVT_SIZE, &wxWebViewChromium::OnSize, this); 

// Works but as a top-level GTK window only 
m_widget = gtk_window_new(GTK_WINDOW_TOPLEVEL); 

// None of these work 
//m_widget = gtk_drawing_area_new(); 
//m_widget = gtk_vbox_new(false, 0); 

g_object_ref(m_widget); 

aktualisiert Teil OnSize Methode

if (!cef_browser_created) 
{ 
    cef_browser_created = true; 

    CefBrowserSettings browsersettings; 
    CefWindowInfo info; 

    XSetErrorHandler(XErrorHandlerImpl); 
    XSetIOErrorHandler(XIOErrorHandlerImpl); 

    gtk_widget_realize(m_widget); 

    ::Window xwindow = GTK_WINDOW_XID(gtk_widget_get_window(m_widget)); 
    DCHECK(xwindow); 

    GtkAllocation gtk_alloc; 
    gtk_widget_get_allocation(m_widget, &gtk_alloc); 
    CefRect cef_rect (
     (int)gtk_alloc.x, 
     (int)gtk_alloc.y, 
     (int)gtk_alloc.width, 
     (int)gtk_alloc.height 
    ); 

    info.SetAsChild(xwindow, cef_rect); 
    m_parent->DoAddChild(this); 
    PostCreation(size); 

    CefBrowserHost::CreateBrowserSync(
     info, 
     static_cast<CefRefPtr<CefClient> >(m_clientHandler), 
     create_url.ToStdString(), 
     browsersettings, 
     NULL 
    ); 
} 

Wenn ich versuche, m_widget etwas anderes als ein Top-Level-GTK-Widget zu machen (wie gezeigt in den auskommentierten Teilen des Codes für die Create Methode oben), bekomme ich den folgenden Fehler oder zur Laufzeit.

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. 

Wie kann ich dieses Fenster in meinem wxBoxSizer statt als eigene GTK Top-Level-Fenster erscheinen zu lassen?

+1

im Grunde sind Sie hier auf eigene Faust. Die Chromiumimplementierung wurde als Teil des GSoC durchgeführt und der Schüler, der den Job ausgeführt hat, verschwindet. Die Verzweigung wird nicht einmal zusammengeführt, da es niemanden gibt, der den Code verwaltet, geschweige denn eine Aktualisierung vornimmt und überprüft, ob alles funktioniert. Sie können versuchen, auf wxForum zu posten oder eine E-Mail an wx-dev/wx-Benutzer zu senden, um mehr Informationen zu erhalten. Oder versuchen Sie, die ML-Archive zu durchsuchen - jemand hat kürzlich versucht, etwas an Chromium zu arbeiten und versucht, einige Fragen in ML zu stellen. – Igor

Antwort

1

CEF erwartet X11-Fenstergriff. GtkWidget-Handle wurde in früheren Versionen von CEF benötigt. Die Dokumentation auf dieser Wiki-Seite scheint veraltet zu sein. Stellen Sie sicher, dass das X11-Handle gültig ist (das Fenster anzeigen), bevor Sie es an CEF übergeben.

Ich kann nur einen Blick auf wie GTK Fenster in cefclient Beispielanwendung nehmen vorschlagen erstellt:

https://bitbucket.org/chromiumembedded/cef/src/98f59f47fd395c170f389eba36f2ef2e06a500a8/tests/cefclient/browser/root_window_gtk.cc?at=master&fileviewer=file-view-default#root_window_gtk.cc-233

auch einen Blick auf Create() nehmen - es nutzt GetXWindowForWidget():

https://bitbucket.org/chromiumembedded/cef/src/98f59f47fd395c170f389eba36f2ef2e06a500a8/tests/cefclient/browser/browser_window_std_gtk.cc?at=master&fileviewer=file-view-default#browser_window_std_gtk.cc-91

+0

Vielen Dank für Ihre Hilfe! Leider bekomme ich immer noch dasselbe leere Fenster. Ich habe meine ursprüngliche Frage aktualisiert, um die Änderungen zu beschreiben, die ich basierend auf Ihrem Beitrag vorgenommen habe. Denkst du, du könntest einen kurzen Blick darauf werfen, ob ich es richtig gemacht habe? – David

+0

@David Aktualisierte Antwort –

+0

Vielen Dank für Ihre Hilfe bisher. Ich konnte den CEF-Browser erscheinen lassen, indem ich m_widget als Top-Level-GTK-Fenster erstelle, aber ich möchte, dass dies in den wxBoxSizer eingebettet wird, der mein wxWebViewChromium-Widget enthält. Weißt du wie ich das machen kann? Ich habe meine Frage aktualisiert, um die Änderungen widerzuspiegeln, die ich bisher vorgenommen habe. – David