I've built CEF with "use_gtk3=true" to get rid of GTK+ 2 symbols, chromium/src/out/Release_GN_x64/args.gn is therefoe as follows:
- Code: Select all
clang_use_chrome_plugins=false
enable_basic_printing=true
enable_nacl=false
enable_print_preview=false
enable_widevine=true
ffmpeg_branding="Chrome"
is_component_build=false
is_debug=false
is_official_build=true
proprietary_codecs=true
symbol_level=1
target_cpu="x64"
use_allocator="none"
use_gconf=false
use_gtk3=true
use_sysroot=false
cefgtk3.c
- Code: Select all
/*
* gcc -g $(pkg-config --cflags --libs glib-2.0 gtk+-3.0) -Iinclude -I. -L. -Wl,--unresolved-symbols=ignore-all -lcef -o cefgtk3 libcef_dll_wrapper.a cefgtk3.c
* export LD_LIBRARY_PATH=.; ./cefgtk3
*/
#include <glib.h>
#include <string.h>
#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <gtk/gtkx.h>
#include "capi/cef_app_capi.h"
#include "capi/cef_browser_capi.h"
#include "capi/cef_client_capi.h"
void dummy_add_ref(cef_base_ref_counted_t* self) {}
int dummy_release(cef_base_ref_counted_t* self) {return 1;}
int dummy_has_one_ref(cef_base_ref_counted_t* self) {return 1;}
void set_dummy_ref_counting (cef_base_ref_counted_t* self, size_t size) {
self->size = size;
self->add_ref = dummy_add_ref;
self->release = dummy_release;
self->has_one_ref = dummy_has_one_ref;
}
static gboolean on_gtk_widget_delete_event (GtkWidget* _sender, GdkEventAny* event, gpointer self) {
gtk_main_quit ();
return FALSE;
}
static gboolean do_work (void* self) {
cef_do_message_loop_work ();
return TRUE;
}
int x11_error_handler(Display* display, XErrorEvent* event) {
printf("X11 error: type=%d, serial=%lu, code=%d\n",
event->type, event->serial, (int)event->error_code);
return 0;
}
int x11_io_error_handler(Display* display) {
return 0;
}
int main (char** argv, int argc) {
cef_main_args_t main_args = {};
main_args.argc = 0;
main_args.argv = NULL;
cef_app_t app = {};
set_dummy_ref_counting(&app.base, sizeof(cef_app_t));
cef_settings_t settings = {sizeof(cef_settings_t)};
settings.log_severity = LOGSEVERITY_VERBOSE;
char c_path[] = "./cefsimple";
cef_string_utf8_to_utf16(c_path, strlen(c_path), &settings.browser_subprocess_path);
cef_initialize(&main_args, &settings, &app, NULL);
gtk_init(0, NULL);
XSetErrorHandler(x11_error_handler);
XSetIOErrorHandler(x11_io_error_handler);
GtkWindow* window = (GtkWindow*) gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(window, "CEF C API");
g_signal_connect((GtkWidget*) window, "delete-event", (GCallback) on_gtk_widget_delete_event, NULL);
gtk_window_set_default_size(window, 800, 600);
gtk_widget_realize((GtkWidget*) window);
GtkWidget* vbox = gtk_vbox_new(0, 0);
gtk_container_add(GTK_CONTAINER(window), vbox);
gtk_widget_show_all((GtkWidget*) window);
GdkX11Window* gdk_window = (GdkX11Window*) gtk_widget_get_window((GtkWidget*) window);
Window xid = gdk_x11_window_get_xid(gdk_window);
printf ("xid: %d\n", (int) xid);
cef_window_info_t window_info = {};
window_info.parent_window = xid;
window_info.width = 800;
window_info.height = 600;
cef_client_t client = {};
set_dummy_ref_counting(&client.base, sizeof(cef_client_t));
char c_url[] = "https:/google.com";
cef_string_t url = {};
cef_string_utf8_to_utf16(c_url, strlen(c_url), &url);
cef_browser_settings_t browser_settings = {sizeof(cef_browser_settings_t)};
cef_browser_host_create_browser(&window_info, &client, &url, &browser_settings, NULL);
g_timeout_add_full(G_PRIORITY_DEFAULT, (guint) 30, do_work, NULL, NULL);
gtk_main ();
cef_shutdown ();
return 0;
}
Result:
- Code: Select all
[0914/230827.817794:VERBOSE1:zygote_main_linux.cc(537)] ZygoteMain: initializing 0 fork delegates
[0914/230827.818141:INFO:cpu_info.cc(50)] Available number of cores: 6
[0914/230827.863448:VERBOSE1:proxy_config_service_linux.cc(854)] All gsettings tests OK. Will get proxy config from gsettings.
[0914/230827.863931:VERBOSE1:proxy_config_service_linux.cc(1608)] Obtained proxy settings from GSETTINGS
[0914/230827.863989:VERBOSE1:pref_proxy_config_tracker_impl.cc(154)] 0x562bf1d13070: set chrome proxy config service to 0x562bf1d9d200
xid: 79691779
[0914/230827.941855:ERROR:nss_util.cc(747)] After loading Root Certs, loaded==false: NSS error code: -8018
[0914/230827.942328:VERBOSE1:multi_log_ct_verifier.cc(75)] Adding CT log: Google 'Aviator' log
...
[0914/230827.970803:VERBOSE1:webrtc_internals.cc(108)] Could not get the download directory.
X11 error: type=0, serial=200, code=8
X11 error: type=0, serial=202, code=3
X11 error: type=0, serial=203, code=3
X11 error: type=0, serial=204, code=3
X11 error: type=0, serial=205, code=3
X11 error: type=0, serial=206, code=3
X11 error: type=0, serial=207, code=3
X11 error: type=0, serial=208, code=3
X11 error: type=0, serial=219, code=3
X11 error: type=0, serial=221, code=3
X11 error: type=0, serial=222, code=3
X11 error: type=0, serial=223, code=3
X11 error: type=0, serial=224, code=3
X11 error: type=0, serial=228, code=3
X11 error: type=0, serial=229, code=3
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x00007f57f1a009f7 in FindChild () at ../../cef/libcef/browser/native/window_x11.cc:45
45 child_window = children[0];
[Current thread is 1 (Thread 0x7f57f804dac0 (LWP 18659))]
#0 0x00007f57f1a009f7 in FindChild () at ../../cef/libcef/browser/native/window_x11.cc:45
#1 Show () at ../../cef/libcef/browser/native/window_x11.cc:182
#2 0x00007f57f19fd275 in CreateHostWindow ()
at ../../cef/libcef/browser/native/browser_platform_delegate_native_linux.cc:93
#3 0x00007f57f1922c3f in CreateHostWindow () at ../../cef/libcef/browser/browser_host_impl.cc:3006
#4 CreateInternal () at ../../cef/libcef/browser/browser_host_impl.cc:367
#5 0x00007f57f19221a9 in Create () at ../../cef/libcef/browser/browser_host_impl.cc:318
#6 0x00007f57f1921e2a in CreateBrowserSync () at ../../cef/libcef/browser/browser_host_impl.cc:267
#7 0x00007f57f1921868 in CreateBrowserWithHelper () at ../../cef/libcef/browser/browser_host_impl.cc:134
#8 0x00007f57f1a25cfb in Run () at ../../base/callback.h:91
#9 RunTask () at ../../base/debug/task_annotator.cc:59
#10 0x00007f57f1a3fab2 in RunTask () at ../../base/message_loop/message_loop.cc:422
#11 0x00007f57f1a3fea2 in DeferOrRunPendingTask () at ../../base/message_loop/message_loop.cc:433
#12 0x00007f57f1a401a6 in DoWork () at ../../base/message_loop/message_loop.cc:540
#13 0x00007f57f1a415ad in base::MessagePumpGlib::Run(base::MessagePump::Delegate*) ()
at ../../base/message_loop/message_pump_glib.cc:313
#14 0x00007f57f1a5c5d0 in Run () at ../../base/run_loop.cc:111
#15 0x00007f57f1939efa in CefBrowserMessageLoop::DoMessageLoopIteration() ()
at ../../cef/libcef/browser/browser_message_loop.cc:116
#16 0x0000562bf03290e6 in do_work (self=0x0) at cefgtk3.c:33
#17 0x00007f57f5c8e123 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#18 0x00007f57f5c8d6aa in g_main_context_dispatch () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#19 0x00007f57f5c8da60 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#20 0x00007f57f5c8dd82 in g_main_loop_run () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#21 0x00007f57f7823d55 in gtk_main () from /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
#22 0x0000562bf03294ab in main (argv=0x1, argc=299476808) at cefgtk3.c:87