From 0fa98a98781d742fab523d9f9066fc1feafa0f75 Mon Sep 17 00:00:00 2001 From: "chunmao.guo" Date: Mon, 19 Jun 2023 18:23:28 +0800 Subject: [PATCH] FIX: [STUDIO-3255] edge webview2 color scheme Change-Id: I04d5b59dbfdc1e1007fc5f4239abdd0104dbb2a2 --- src/slic3r/GUI/Widgets/WebView.cpp | 35 +++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Widgets/WebView.cpp b/src/slic3r/GUI/Widgets/WebView.cpp index 78454c60c..f14c837c2 100644 --- a/src/slic3r/GUI/Widgets/WebView.cpp +++ b/src/slic3r/GUI/Widgets/WebView.cpp @@ -44,6 +44,9 @@ class WebViewEdge : public wxWebViewEdge public: bool SetUserAgent(const wxString &userAgent) { + bool dark = userAgent.Contains("dark"); + SetColorScheme(dark ? COREWEBVIEW2_PREFERRED_COLOR_SCHEME_DARK : COREWEBVIEW2_PREFERRED_COLOR_SCHEME_LIGHT); + ICoreWebView2 *webView2 = (ICoreWebView2 *) GetNativeBackend(); if (webView2) { ICoreWebView2Settings *settings; @@ -57,12 +60,34 @@ public: return true; } } + settings->Release(); return false; } pendingUserAgent = userAgent; return true; } + bool SetColorScheme(COREWEBVIEW2_PREFERRED_COLOR_SCHEME colorScheme) + { + ICoreWebView2 *webView2 = (ICoreWebView2 *) GetNativeBackend(); + if (webView2) { + ICoreWebView2_13 * webView2_13; + HRESULT hr = webView2->QueryInterface(&webView2_13); + if (hr == S_OK) { + ICoreWebView2Profile *profile; + hr = webView2_13->get_Profile(&profile); + if (hr == S_OK) { + profile->put_PreferredColorScheme(colorScheme); + profile->Release(); + return true; + } + } + return false; + } + pendingColorScheme = colorScheme; + return true; + } + void DoGetClientSize(int *x, int *y) const override { if (!pendingUserAgent.empty()) { @@ -71,10 +96,17 @@ public: thiz->pendingUserAgent.clear(); thiz->SetUserAgent(userAgent); } + if (pendingColorScheme) { + auto thiz = const_cast(this); + auto colorScheme = pendingColorScheme; + thiz->pendingColorScheme = COREWEBVIEW2_PREFERRED_COLOR_SCHEME_AUTO; + thiz->SetColorScheme(colorScheme); + } wxWebViewEdge::DoGetClientSize(x, y); }; private: wxString pendingUserAgent; + COREWEBVIEW2_PREFERRED_COLOR_SCHEME pendingColorScheme = COREWEBVIEW2_PREFERRED_COLOR_SCHEME_AUTO; }; #elif defined __WXOSX__ @@ -280,9 +312,10 @@ bool WebView::RunScript(wxWebView *webView, wxString const &javascript) void WebView::RecreateAll() { + auto dark = Slic3r::GUI::wxGetApp().dark_mode(); for (auto webView : g_webviews) { webView->SetUserAgent(wxString::Format("BBL-Slicer/v%s (%s) Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko)", SLIC3R_VERSION, - Slic3r::GUI::wxGetApp().dark_mode() ? "dark" : "light")); + dark ? "dark" : "light")); webView->Reload(); } }