Skip to content

Commit

Permalink
feat: add wco title bar style setters
Browse files Browse the repository at this point in the history
  • Loading branch information
clavin committed Mar 7, 2022
1 parent 7b7de3c commit 2a10588
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 0 deletions.
64 changes: 64 additions & 0 deletions shell/browser/api/electron_api_browser_window.cc
Expand Up @@ -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"
Expand All @@ -24,6 +25,10 @@
#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

namespace electron {

namespace api {
Expand Down Expand Up @@ -466,6 +471,62 @@ v8::Local<v8::Value> BrowserWindow::GetWebContents(v8::Isolate* isolate) {
return v8::Local<v8::Value>::New(isolate, web_contents_);
}

#if BUILDFLAG(IS_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");
}

auto window = static_cast<NativeWindowViews*>(window_.get());
bool updated = false;

// Check and update the button color
const 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");
}

// Update the view
window->set_overlay_button_color(color);
updated = true;
}

// Check and update the symbol color
const 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");
}

// Update the view
window->set_overlay_symbol_color(color);
updated = true;
}

// Check and update the height
const 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 = window->widget()->non_client_view()->frame_view();
frame_view->InvalidateLayout();
frame_view->SchedulePaint();
}
}
#endif

void BrowserWindow::ScheduleUnresponsiveEvent(int ms) {
if (!window_unresponsive_closure_.IsCancelled())
return;
Expand Down Expand Up @@ -524,6 +585,9 @@ void BrowserWindow::BuildPrototype(v8::Isolate* isolate,
.SetMethod("focusOnWebView", &BrowserWindow::FocusOnWebView)
.SetMethod("blurWebView", &BrowserWindow::BlurWebView)
.SetMethod("isWebViewFocused", &BrowserWindow::IsWebViewFocused)
#if BUILDFLAG(IS_WIN)
.SetMethod("setTitleBarOverlay", &BrowserWindow::SetTitleBarOverlay)
#endif
.SetProperty("webContents", &BrowserWindow::GetWebContents);
}

Expand Down
3 changes: 3 additions & 0 deletions shell/browser/api/electron_api_browser_window.h
Expand Up @@ -99,6 +99,9 @@ class BrowserWindow : public BaseWindow,
void BlurWebView();
bool IsWebViewFocused();
v8::Local<v8::Value> GetWebContents(v8::Isolate* isolate);
#if BUILDFLAG(IS_WIN)
void SetTitleBarOverlay(const gin_helper::Dictionary& options);
#endif

private:
#if BUILDFLAG(IS_MAC)
Expand Down
4 changes: 4 additions & 0 deletions shell/browser/native_window.h
Expand Up @@ -328,6 +328,10 @@ class NativeWindow : public base::SupportsUserData,
};
TitleBarStyle title_bar_style() const { return title_bar_style_; }
int titlebar_overlay_height() const { return titlebar_overlay_height_; }
void set_titlebar_overlay_height(int height) {
titlebar_overlay_height_ = height;
}
bool titlebar_overlay_enabled() const { return titlebar_overlay_; }

bool has_frame() const { return has_frame_; }
void set_has_frame(bool has_frame) { has_frame_ = has_frame; }
Expand Down
6 changes: 6 additions & 0 deletions shell/browser/native_window_views.h
Expand Up @@ -181,7 +181,13 @@ class NativeWindowViews : public NativeWindow,
titlebar_overlay_;
}
SkColor overlay_button_color() const { return overlay_button_color_; }
void set_overlay_button_color(SkColor color) {
overlay_button_color_ = color;
}
SkColor overlay_symbol_color() const { return overlay_symbol_color_; }
void set_overlay_symbol_color(SkColor color) {
overlay_symbol_color_ = color;
}
#endif

private:
Expand Down
2 changes: 2 additions & 0 deletions shell/browser/ui/views/win_caption_button.cc
Expand Up @@ -100,6 +100,8 @@ void WinCaptionButton::SetSize(gfx::Size size) {
base_width_ = width;
if (height > 0)
height_ = height;

InvalidateLayout();
}

int WinCaptionButton::GetBetweenButtonSpacing() const {
Expand Down

0 comments on commit 2a10588

Please sign in to comment.