이전 버전의 CEF에서 찾고있는 것처럼 보이기 때문에 this branch of wxWidgets from GitHub user hokein으로 시작했습니다. 기본적으로 wxWebViewChromium (CEF를 백엔드로 사용하는 wxWebView)을 cef_3.2526.1354를 사용하여 구현하려고합니다. 응용 프로그램에서 사용하려는 버전이기 때문입니다. Hyper-V를 사용하는 VM에서 CentOS 7을 GNOME으로 실행하고 있습니다. 위의 링크 된 저장소에서Linux에서 wxWidgets (및 GTK)와 함께 CEF3 사용
원본 코드 (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
내가 컴파일하고 나는 info.SetAsChild(viewport);
라인에 관련 오류를 얻고 있었다, cef_3.2526.1354로이 연결하려고 노력했다. 나는 그것을 GtkWidget*
에게 건네주고 있었고, 그것은 cef_window_handle_t, CefRect
일 것으로 예상하고 있었다. 내가 그렇게 해봤 무엇
훨씬
내가에 따라이 같은 CefRect을 만든 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
);
CEF 라이브러리 코드에서 형식 정의가 cef_window_handle_t
가 unsigned long
있음을 나타냅니다 만, CEF documentation은 그것이 GtkWidget*
이라고 말합니다 ... 나는 똑같은 것으로 추측합니다. 그러나 이것은 초기 혼란을 가져 왔습니다. 처음에 나는 기본 X11 창에서 X11 윈도우 아이디 (XID)를 통과 할 필요가 있다고 생각하지만, 이것은 런타임 오류 발생 :
Gdk: gdkdrawable-x11.c:952 drawable is not a pixmap or window
간단히 말해 unsigned long
로 GtkWidget*
캐스팅 대신 기본 X11 창을 사용하여 ID가이 오류를 제거 했으므로 함수가 예상 한 것입니다.
을 무슨 일
내 코드 현재 (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
나는, 링크를 컴파일하고 응용 프로그램을 실행할 수 있어요. wxWidgets 윈도우를 볼 수 있으며 일반 윈도우처럼 윈도우를 최소화, 최대화, 크기 조정 및 닫을 수 있습니다. 창에 아무것도 없습니다. 이것은 단순한 회색의 빈 창입니다. 나는 CEF 브라우저를보기를 기대하고있다.
[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.
이 URL은 더 이상 유용 할 것으로 보인다 : 나는 응용 프로그램을 실행하는 데 사용되는 터미널에서, 다음과 같은 메시지가 뜹니다. 명령 줄에서 ./cefclient --no-sandbox
을 시작하면 동일한 오류 메시지가 표시되지만 CEF 클라이언트는 예상대로 작동합니다. 샌드 박스를 사용하지 않고 명령 줄에서 ./cefclient
을 실행하면 ERROR
대신에 FATAL
이라는 메시지가 표시되고 CEF 클라이언트가 작동하지 않습니다 (완전히 중단됨).
내 질문에
은 내가 webview_chromium.cpp
파일로 내 수정을 잘못한 적이 있습니까? 이 파일에서 cef_3.2526.1354와 함께 작동하도록 업데이트해야 할 부분을 찾아야하는 다른 곳이 있습니까? 내가보고있는이 빈 창을 어떻게 해결할 수 있습니까?
감사합니다.
UPDATE
Czarek Tomczak은 CEF의이 버전은 X11 윈도우 핸들을 기대하고, 그래서 다음과 같이 내가 내 코드를 수정 한 것을 저를 알렸다.
#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);
gtk_widget_show_all(m_widget);
gtk_widget_show_all(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(
gdk_x11_drawable_get_xid(gtk_widget_get_window(view_port)),
cef_rect
);
m_parent->DoAddChild(this);
PostCreation(size);
#endif
그러나 이것은 이전과 같은 빈 창 출력과 함께 여전히 런타임 오류가 발생합니다.
Gdk: gdkdrawable-x11.c:952 drawable is not a pixmap or window
올바른 방향으로 나를 가리키는 도움을 주시면 감사하겠습니다. 또한 뷰포트가있는 스크롤 창 대신 실제 GtkWindow를 여기에 만들어 보았습니다. 위의 런타임 오류가 없애지 만 두 번째 창은 모두 비어 있습니다. 하나의 창에서이 모든 작업을 수행해야합니다.
Czarek Tomczak, 그는 게시 된 링크의 도움으로 업데이트 2
및 this FAQ 나는 내가이 GtkWidget에 CEF 브라우저를 포함 할 수 있어요 지점에 입수했습니다,하지만 난 단지 수 있어요 나는이 같은 최상위 GTK 창으로 위젯을 만들 경우이 작업을하기 : m_widget
내가 만드는 데 노력하고있어 wxWebView의 주요 위젯입니다
m_widget = gtk_window_new(GTK_WINDOW_TOPLEVEL);
. 이 문제는 이제 CEF 브라우저가 자체 GTK 창에 표시되지만 실제로 필요한 것은 CEF 브라우저가 wxBoxSizer
에 맞춰 wxWebViewChromium 위젯을 추가하는 것입니다. 이 작업을 수행하기 위해 GtkWidget을 구현 한 후에 GtkWidget의 XID를 얻을 수 있도록 Create 메서드의 코드를 OnSize 메서드로 분할하고이 문제가 발생한 후에 CEF 브라우저를 만듭니다. OnSize 메서드는 wxEVT_SIZE
에 연결됩니다. 내 코드는 다음과 같습니다. 나는 (최상위 GTK 위젯 이외의 m_widget
뭔가를 만들려고 할 때
Create
방법의 업데이트 된 부분은 는
OnSize
방법의 업데이트 된 부분은
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
);
}
// 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);
을 같이 위의
Create
메소드 코드의 주석 처리 된 부분에서) 다음 오류가 발생합니다. 또는 런타임에.
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.
이 창을 자체 GTK 최상위 창 대신 wxBoxSizer 내부에 표시하려면 어떻게합니까?
기본적으로 여기에 있습니다. Chromium 구현은 GSoC의 일부로 수행되었으며 작업을 수행 한 학생은 사라졌습니다. 코드를 유지 보수 할 아무도 없기 때문에 분기를 병합하지 않습니다. 코드를 업데이트하고 모든 것이 작동하는지 확인하십시오. wxForum에 게시하거나 wx-dev/wx-users에게 전자 메일을 보내어 더 많은 노출을 시도 할 수 있습니다. 또는 ML 아카이브를 검색하려고 시도합니다. 누군가 최근에 Chromium에 대한 일부 작업을 시도하고 ML에서 몇 가지 질문을 시도했습니다. – Igor