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, >k_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, >k_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, >k_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?
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