Skip to content

Commit ec9d8ad

Browse files
committed
[cef] handle all command line args in app
One can provide many arguments already when starting cef_main. But in principle there is special method in SimpleApp to append command line arguments when required. Allows to properly use CEF for both on-screen and off-screen outputs simulataneousely
1 parent 270c884 commit ec9d8ad

3 files changed

Lines changed: 37 additions & 38 deletions

File tree

gui/cefdisplay/inc/simple_app.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ class SimpleApp : public CefApp,
8181
#endif
8282

8383

84-
void StartWindow(THttpServer *serv, const std::string &url, const std::string &cont, CefRect &rect);
84+
void StartWindow(THttpServer *serv, const std::string &url, const std::string &cont, CefRect &rect, bool is_headless = false);
8585

8686
// CefRenderProcessHandler methods
8787
// void OnContextCreated(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame,

gui/cefdisplay/src/RCefWebDisplayHandle.cxx

Lines changed: 7 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ std::unique_ptr<ROOT::RWebDisplayHandle> RCefWebDisplayHandle::CefCreator::Displ
9797
CefRect rect((args.GetX() > 0) ? args.GetX() : 0, (args.GetY() > 0) ? args.GetY() : 0,
9898
(args.GetWidth() > 0) ? args.GetWidth() : 800, (args.GetHeight() > 0) ? args.GetHeight() : 600);
9999

100-
fCefApp->StartWindow(args.GetHttpServer(), args.GetFullUrl(), args.GetPageContent(), rect);
100+
fCefApp->StartWindow(args.GetHttpServer(), args.GetFullUrl(), args.GetPageContent(), rect, args.IsHeadless());
101101

102102
if (args.IsHeadless())
103103
handle->WaitForContent(wait_tmout, args.GetExtraArgs());
@@ -136,43 +136,18 @@ std::unique_ptr<ROOT::RWebDisplayHandle> RCefWebDisplayHandle::CefCreator::Displ
136136
bool supress_log = (settings.log_severity == LOGSEVERITY_DISABLE) ||
137137
(settings.log_severity == LOGSEVERITY_FATAL);
138138

139-
TApplication *root_app = gROOT->GetApplication();
140-
141-
std::vector<const char *> cef_argv = { root_app->Argv(0) };
142139

143140
#ifdef OS_WIN
144141

145-
CefMainArgs main_args(args.IsHeadless() ? (HINSTANCE) 0 : GetModuleHandle(nullptr));
142+
// CefMainArgs main_args(args.IsHeadless() ? (HINSTANCE) 0 : GetModuleHandle(nullptr));
143+
144+
CefMainArgs main_args(GetModuleHandle(nullptr));
146145

147146
#else
148147

149-
if (args.IsHeadless()) {
150-
cef_argv.emplace_back("--user-data-dir=.");
151-
cef_argv.emplace_back("--allow-file-access-from-files");
152-
cef_argv.emplace_back("--disable-web-security");
153-
#ifdef OS_LINUX
154-
cef_argv.emplace_back("--disable-gpu");
155-
cef_argv.emplace_back("--ignore-gpu-blocklist");
156-
cef_argv.emplace_back("--use-gl=swiftshader");
157-
cef_argv.emplace_back("--enable-unsafe-swiftshader");
158-
#endif
159-
#ifdef OS_MACOSX
160-
cef_argv.emplace_back("--use-angle=metal");
161-
cef_argv.emplace_back("--ignore-gpu-blocklist");
162-
cef_argv.emplace_back("--enable-webgl");
163-
cef_argv.emplace_back("--enable-gpu");
164-
cef_argv.emplace_back("--enable-gpu-rasterization");
165-
#endif
166-
cef_argv.emplace_back("--off-screen-rendering-enabled");
167-
if (use_views)
168-
cef_argv.emplace_back("--ozone-platform=headless");
169-
} else {
170-
#ifdef OS_MACOSX
171-
cef_argv.emplace_back("--use-angle=metal");
172-
cef_argv.emplace_back("--ignore-gpu-blocklist");
173-
cef_argv.emplace_back("--enable-webgl");
174-
#endif
175-
}
148+
TApplication *root_app = gROOT->GetApplication();
149+
150+
std::vector<const char *> cef_argv = { root_app->Argv(0) };
176151

177152
if (supress_log) {
178153
cef_argv.emplace_back("--disable-logging");

gui/cefdisplay/src/simple_app.cxx

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,8 @@ class SimpleBrowserViewDelegate : public CefBrowserViewDelegate {
117117
SimpleApp::SimpleApp(bool use_viewes, bool supress_log,
118118
THttpServer *serv, const std::string &url, const std::string &cont,
119119
int width, int height, bool headless)
120-
: CefApp(), CefBrowserProcessHandler(), fUseViewes(use_viewes), fSupressLog(supress_log), fFirstServer(serv), fFirstUrl(url), fFirstContent(cont), fFirstHeadless(headless)
120+
: CefApp(), CefBrowserProcessHandler(), fUseViewes(use_viewes), fSupressLog(supress_log),
121+
fFirstServer(serv), fFirstUrl(url), fFirstContent(cont), fFirstHeadless(headless)
121122
{
122123
fFirstRect.Set(0, 0, width, height);
123124

@@ -157,18 +158,41 @@ void SimpleApp::OnBeforeCommandLineProcessing(const CefString &process_type, Cef
157158
command_line->AppendSwitchWithValue("enable-logging", "none");
158159
}
159160

160-
#ifdef OS_MACOSX
161+
if (fNextHeadless) {
162+
command_line->AppendSwitchWithValue("user-data-dir", ".");
163+
command_line->AppendSwitch("allow-file-access-from-files");
164+
command_line->AppendSwitch("disable-web-security");
165+
command_line->AppendSwitch("off-screen-rendering-enabled");
166+
}
161167

168+
#ifdef OS_MACOSX
162169
if (fNextHeadless) {
170+
command_line->AppendSwitch("headless");
163171
command_line->AppendSwitchWithValue("use-angle", "swiftshader");
164172
command_line->AppendSwitch("enable-unsafe-swiftshader");
165173
command_line->AppendSwitch("disable-gpu");
174+
// command_line->AppendSwitch("enable-gpu-rasterization");
175+
// if (fUseViewes)
176+
// command_line->AppendSwitchWithValue("ozone-platform", "headless");
166177
} else {
167178
command_line->AppendSwitchWithValue("use-angle", "metal");
168179
command_line->AppendSwitch("ignore-gpu-blocklist");
169180
command_line->AppendSwitch("enable-webgl");
170181
}
171182
#endif
183+
184+
#ifdef OS_LINUX
185+
if (fNextHeadless) {
186+
command_line->AppendSwitch("headless");
187+
command_line->AppendSwitchWithValue("use-gl", "swiftshader");
188+
command_line->AppendSwitch("disable-gpu");
189+
command_line->AppendSwitch("ignore-gpu-blocklist");
190+
command_line->AppendSwitch("enable-unsafe-swiftshader");
191+
192+
if (fUseViewes)
193+
command_line->AppendSwitchWithValue("ozone-platform", "headless");
194+
}
195+
#endif
172196
}
173197

174198
void SimpleApp::OnBeforeChildProcessLaunch(CefRefPtr<CefCommandLine> command_line)
@@ -180,18 +204,18 @@ void SimpleApp::OnContextInitialized()
180204
CEF_REQUIRE_UI_THREAD();
181205

182206
if (!fFirstUrl.empty() || !fFirstContent.empty()) {
183-
StartWindow(fFirstServer, fFirstUrl, fFirstContent, fFirstRect);
207+
StartWindow(fFirstServer, fFirstUrl, fFirstContent, fFirstRect, fFirstHeadless);
184208
fFirstUrl.clear();
185209
fFirstContent.clear();
186210
}
187211
}
188212

189213

190-
void SimpleApp::StartWindow(THttpServer *serv, const std::string &addr, const std::string &cont, CefRect &rect)
214+
void SimpleApp::StartWindow(THttpServer *serv, const std::string &addr, const std::string &cont, CefRect &rect, bool is_headless)
191215
{
192216
CEF_REQUIRE_UI_THREAD();
193217

194-
bool is_batch = addr.empty() && !cont.empty();
218+
bool is_batch = (addr.empty() && !cont.empty()) || is_headless;
195219

196220
if (!fGuiHandler)
197221
fGuiHandler = new GuiHandler(fUseViewes);

0 commit comments

Comments
 (0)