|
@@ -10,6 +10,7 @@
|
|
|
#include "content/browser/web_contents/web_contents_impl.h" // nogncheck
|
|
|
#include "content/public/browser/render_process_host.h"
|
|
|
#include "content/public/browser/render_view_host.h"
|
|
|
+#include "content/public/common/color_parser.h"
|
|
|
#include "shell/browser/api/electron_api_web_contents_view.h"
|
|
|
#include "shell/browser/browser.h"
|
|
|
#include "shell/browser/native_browser_view.h"
|
|
@@ -24,6 +25,14 @@
|
|
|
#include "shell/common/options_switches.h"
|
|
|
#include "ui/gl/gpu_switching_manager.h"
|
|
|
|
|
|
+#if defined(TOOLKIT_VIEWS)
|
|
|
+#include "shell/browser/native_window_views.h"
|
|
|
+#endif
|
|
|
+
|
|
|
+#if defined(OS_WIN)
|
|
|
+#include "shell/browser/ui/views/win_frame_view.h"
|
|
|
+#endif
|
|
|
+
|
|
|
namespace electron {
|
|
|
|
|
|
namespace api {
|
|
@@ -467,6 +476,65 @@ v8::Local<v8::Value> BrowserWindow::GetWebContents(v8::Isolate* isolate) {
|
|
|
return v8::Local<v8::Value>::New(isolate, web_contents_);
|
|
|
}
|
|
|
|
|
|
+#if defined(OS_WIN)
|
|
|
+void BrowserWindow::SetTitleBarOverlay(const gin_helper::Dictionary& options,
|
|
|
+ gin_helper::Arguments* args) {
|
|
|
+ // Ensure WCO is already enabled on this window
|
|
|
+ if (!window_->titlebar_overlay_enabled()) {
|
|
|
+ args->ThrowError("Titlebar overlay is not enabled");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ auto* window = static_cast<NativeWindowViews*>(window_.get());
|
|
|
+ bool updated = false;
|
|
|
+
|
|
|
+ // Check and update the button color
|
|
|
+ std::string btn_color;
|
|
|
+ if (options.Get(options::kOverlayButtonColor, &btn_color)) {
|
|
|
+ // Parse the string as a CSS color
|
|
|
+ SkColor color;
|
|
|
+ if (!content::ParseCssColorString(btn_color, &color)) {
|
|
|
+ args->ThrowError("Could not parse color as CSS color");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Update the view
|
|
|
+ window->set_overlay_button_color(color);
|
|
|
+ updated = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Check and update the symbol color
|
|
|
+ std::string symbol_color;
|
|
|
+ if (options.Get(options::kOverlaySymbolColor, &symbol_color)) {
|
|
|
+ // Parse the string as a CSS color
|
|
|
+ SkColor color;
|
|
|
+ if (!content::ParseCssColorString(symbol_color, &color)) {
|
|
|
+ args->ThrowError("Could not parse symbol color as CSS color");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Update the view
|
|
|
+ window->set_overlay_symbol_color(color);
|
|
|
+ updated = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Check and update the height
|
|
|
+ int height = 0;
|
|
|
+ if (options.Get(options::kOverlayHeight, &height)) {
|
|
|
+ window->set_titlebar_overlay_height(height);
|
|
|
+ updated = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ // If anything was updated, invalidate the layout and schedule a paint of the
|
|
|
+ // window's frame view
|
|
|
+ if (updated) {
|
|
|
+ auto* frame_view = static_cast<WinFrameView*>(
|
|
|
+ window->widget()->non_client_view()->frame_view());
|
|
|
+ frame_view->InvalidateCaptionButtons();
|
|
|
+ }
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
void BrowserWindow::ScheduleUnresponsiveEvent(int ms) {
|
|
|
if (!window_unresponsive_closure_.IsCancelled())
|
|
|
return;
|
|
@@ -525,6 +593,9 @@ void BrowserWindow::BuildPrototype(v8::Isolate* isolate,
|
|
|
.SetMethod("focusOnWebView", &BrowserWindow::FocusOnWebView)
|
|
|
.SetMethod("blurWebView", &BrowserWindow::BlurWebView)
|
|
|
.SetMethod("isWebViewFocused", &BrowserWindow::IsWebViewFocused)
|
|
|
+#if defined(OS_WIN)
|
|
|
+ .SetMethod("setTitleBarOverlay", &BrowserWindow::SetTitleBarOverlay)
|
|
|
+#endif
|
|
|
.SetProperty("webContents", &BrowserWindow::GetWebContents);
|
|
|
}
|
|
|
|