2016-07-27 6 views
0

이전 버전의 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, &gtk_alloc); 
CefRect cef_rect (
    (int)gtk_alloc.x, 
    (int)gtk_alloc.y, 
    (int)gtk_alloc.width, 
    (int)gtk_alloc.height 
); 

CEF 라이브러리 코드에서 형식 정의가 cef_window_handle_tunsigned long 있음을 나타냅니다 만, CEF documentation은 그것이 GtkWidget*이라고 말합니다 ... 나는 똑같은 것으로 추측합니다. 그러나 이것은 초기 혼란을 가져 왔습니다. 처음에 나는 기본 X11 창에서 X11 윈도우 아이디 (XID)를 통과 할 필요가 있다고 생각하지만, 이것은 런타임 오류 발생 :

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

간단히 말해 unsigned longGtkWidget* 캐스팅 대신 기본 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, &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 

나는, 링크를 컴파일하고 응용 프로그램을 실행할 수 있어요. 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, &gtk_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, &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 
    ); 
} 

// 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 내부에 표시하려면 어떻게합니까?

+1

기본적으로 여기에 있습니다. Chromium 구현은 GSoC의 일부로 수행되었으며 작업을 수행 한 학생은 사라졌습니다. 코드를 유지 보수 할 아무도 없기 때문에 분기를 병합하지 않습니다. 코드를 업데이트하고 모든 것이 작동하는지 확인하십시오. wxForum에 게시하거나 wx-dev/wx-users에게 전자 메일을 보내어 더 많은 노출을 시도 할 수 있습니다. 또는 ML 아카이브를 검색하려고 시도합니다. 누군가 최근에 Chromium에 대한 일부 작업을 시도하고 ML에서 몇 가지 질문을 시도했습니다. – Igor

답변

1

CEF는 X11 창 핸들을 예상합니다. 이전 버전의 CEF에서는 GtkWidget 핸들이 필요했습니다. 위키 페이지의 문서가 오래된 것 같습니다. CEF로 전달하기 전에 X11 핸들이 유효한지 확인하십시오 (창 표시).

난 단지 GTK 창이 cefclient 샘플 애플리케이션에서 생성되는 방법에 대해 살펴 걸릴 제안 할 수 있습니다 :

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

은 또한 CreateBrowser()를 살펴를 - 그것은 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

도와 주셔서 대단히 감사합니다! 불행히도 나는 여전히 같은 빈 창을 얻고있다. 귀하의 게시물을 기반으로 수정 한 내용을 원래의 질문으로 업데이트했습니다. 내가 제대로했는지 빨리 볼 수 있다고 생각하니? – David

+0

@David 업데이트 된 답변 –

+0

지금까지 도와 주셔서 감사합니다. 최상위 GTK 윈도우로 m_widget을 생성하여 CEF 브라우저를 표시하도록 만들었지 만, 실제로 이것을 wxWebViewChromium 위젯을 보유하는 wxBoxSizer에 임베드하고 싶습니다. 내가 어떻게이 일을 할 수 있는지 아십니까? 지금까지 변경 한 내용을 반영하여 질문을 업데이트했습니다. – David