diff --git a/atom/browser/api/atom_api_system_preferences.cc b/atom/browser/api/atom_api_system_preferences.cc index 96efe80c3244..7bdc4feee4e2 100644 --- a/atom/browser/api/atom_api_system_preferences.cc +++ b/atom/browser/api/atom_api_system_preferences.cc @@ -52,6 +52,7 @@ void SystemPreferences::BuildPrototype( #if defined(OS_WIN) .SetMethod("getAccentColor", &SystemPreferences::GetAccentColor) .SetMethod("isAeroGlassEnabled", &SystemPreferences::IsAeroGlassEnabled) + .SetMethod("getColor", &SystemPreferences::GetColor) #elif defined(OS_MACOSX) .SetMethod("postNotification", &SystemPreferences::PostNotification) diff --git a/atom/browser/api/atom_api_system_preferences.h b/atom/browser/api/atom_api_system_preferences.h index 1c00bfe29c4f..ee55601b5364 100644 --- a/atom/browser/api/atom_api_system_preferences.h +++ b/atom/browser/api/atom_api_system_preferences.h @@ -44,6 +44,7 @@ class SystemPreferences : public mate::EventEmitter "DwmGetColorizationColor"); std::string GetAccentColor(); + std::string GetColor(const std::string& color, mate::Arguments* args); void InitializeWindow(); diff --git a/atom/browser/api/atom_api_system_preferences_win.cc b/atom/browser/api/atom_api_system_preferences_win.cc index c157d5281b78..6156104665f0 100644 --- a/atom/browser/api/atom_api_system_preferences_win.cc +++ b/atom/browser/api/atom_api_system_preferences_win.cc @@ -4,8 +4,10 @@ #include "atom/browser/api/atom_api_system_preferences.h" +#include "atom/common/color_util.h" #include "base/win/wrapped_window_proc.h" #include "ui/base/win/shell.h" +#include "ui/gfx/color_utils.h" #include "ui/gfx/win/hwnd_util.h" namespace atom { @@ -41,6 +43,77 @@ std::string SystemPreferences::GetAccentColor() { return hexColorDWORDToRGBA(color); } +std::string SystemPreferences::GetColor(const std::string& color, + mate::Arguments* args) { + int id; + if (color == "3d-dark-shadow") { + id = COLOR_3DDKSHADOW; + } else if (color == "3d-face") { + id = COLOR_3DFACE; + } else if (color == "3d-highlight") { + id = COLOR_3DHIGHLIGHT; + } else if (color == "3d-light") { + id = COLOR_3DLIGHT; + } else if (color == "3d-shadow") { + id = COLOR_3DSHADOW; + } else if (color == "active-border") { + id = COLOR_ACTIVEBORDER; + } else if (color == "active-caption") { + id = COLOR_ACTIVECAPTION; + } else if (color == "active-caption-gradient") { + id = COLOR_GRADIENTACTIVECAPTION; + } else if (color == "app-workspace") { + id = COLOR_APPWORKSPACE; + } else if (color == "button-text") { + id = COLOR_BTNTEXT; + } else if (color == "caption-text") { + id = COLOR_CAPTIONTEXT; + } else if (color == "desktop") { + id = COLOR_DESKTOP; + } else if (color == "disabled-text") { + id = COLOR_GRAYTEXT; + } else if (color == "highlight") { + id = COLOR_HIGHLIGHT; + } else if (color == "highlight-text") { + id = COLOR_HIGHLIGHTTEXT; + } else if (color == "hotlight") { + id = COLOR_HOTLIGHT; + } else if (color == "inactive-border") { + id = COLOR_INACTIVEBORDER; + } else if (color == "inactive-caption") { + id = COLOR_INACTIVECAPTION; + } else if (color == "inactive-caption-gradient") { + id = COLOR_GRADIENTINACTIVECAPTION; + } else if (color == "inactive-caption-text") { + id = COLOR_INACTIVECAPTIONTEXT; + } else if (color == "info-background") { + id = COLOR_INFOBK; + } else if (color == "info-text") { + id = COLOR_INFOTEXT; + } else if (color == "menu") { + id = COLOR_MENU; + } else if (color == "menu-highlight") { + id = COLOR_MENUHILIGHT; + } else if (color == "menubar") { + id = COLOR_MENUBAR; + } else if (color == "menu-text") { + id = COLOR_MENUTEXT; + } else if (color == "scrollbar") { + id = COLOR_SCROLLBAR; + } else if (color == "window") { + id = COLOR_WINDOW; + } else if (color == "window-frame") { + id = COLOR_WINDOWFRAME; + } else if (color == "window-text") { + id = COLOR_WINDOWTEXT; + } else { + args->ThrowError("Unknown color: " + color); + return ""; + } + + return ToRGBHex(color_utils::GetSysSkColor(id)); +} + void SystemPreferences::InitializeWindow() { invertered_color_scheme_ = IsInvertedColorScheme(); @@ -96,6 +169,7 @@ void SystemPreferences::OnSysColorChange() { invertered_color_scheme_ = new_invertered_color_scheme; Emit("inverted-color-scheme-changed", new_invertered_color_scheme); } + Emit("color-changed"); } } // namespace api diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 6e4a5131a9b0..124a0d3358f5 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -647,11 +647,7 @@ void WebContents::MediaStoppedPlaying(const MediaPlayerId& id) { } void WebContents::DidChangeThemeColor(SkColor theme_color) { - std::string hex_theme_color = base::StringPrintf("#%02X%02X%02X", - SkColorGetR(theme_color), - SkColorGetG(theme_color), - SkColorGetB(theme_color)); - Emit("did-change-theme-color", hex_theme_color); + Emit("did-change-theme-color", atom::ToRGBHex(theme_color)); } void WebContents::DocumentLoadedInFrame( diff --git a/atom/common/color_util.cc b/atom/common/color_util.cc index a6640d9e08b6..4df25d184e84 100644 --- a/atom/common/color_util.cc +++ b/atom/common/color_util.cc @@ -8,6 +8,7 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" +#include "base/strings/stringprintf.h" namespace atom { @@ -45,4 +46,11 @@ SkColor ParseHexColor(const std::string& color_string) { return SkColorSetARGB(bytes[0], bytes[1], bytes[2], bytes[3]); } +std::string ToRGBHex(SkColor color) { + return base::StringPrintf("#%02X%02X%02X", + SkColorGetR(color), + SkColorGetG(color), + SkColorGetB(color)); +} + } // namespace atom diff --git a/atom/common/color_util.h b/atom/common/color_util.h index 0f2bb9633a73..1186803c7648 100644 --- a/atom/common/color_util.h +++ b/atom/common/color_util.h @@ -14,6 +14,9 @@ namespace atom { // Parse hex color like "#FFF" or "#EFEFEF" SkColor ParseHexColor(const std::string& name); +// Convert color to RGB hex value like "#ABCDEF" +std::string ToRGBHex(SkColor color); + } // namespace atom #endif // ATOM_COMMON_COLOR_UTIL_H_ diff --git a/docs/api/system-preferences.md b/docs/api/system-preferences.md index 790e78c1499e..75b4f7ae2b64 100644 --- a/docs/api/system-preferences.md +++ b/docs/api/system-preferences.md @@ -19,6 +19,12 @@ Returns: * `newColor` String - The new RGBA color the user assigned to be there system accent color. +### Event: 'color-changed' _Windows_ + +Returns: + +* `event` Event + ### Event: 'inverted-color-scheme-changed' _Windows_ Returns: @@ -147,8 +153,8 @@ if (browserOptions.transparent) { ### `systemPreferences.getAccentColor()` _Windows_ -Returns the users current system wide color preference in the form of an RGBA -hexadecimal string. +Returns `String` - The users current system wide accent color preference in RGBA +hexadecimal form. ```js const color = systemPreferences.getAccentColor() // `"aabbccdd"` @@ -158,7 +164,56 @@ const blue = color.substr(4, 2) // "cc" const alpha = color.substr(6, 2) // "dd" ``` +### `systemPreferences.getColor(color)` _Windows_ + +* `color` String - One of the following values: + * `3d-dark-shadow` - Dark shadow for three-dimensional display elements. + * `3d-face` - Face color for three-dimensional display elements and for dialog + box backgrounds. + * `3d-highlight` - Highlight color for three-dimensional display elements. + * `3d-light` - Light color for three-dimensional display elements. + * `3d-shadow` - Shadow color for three-dimensional display elements. + * `active-border` - Active window border. + * `active-caption` - Active window title bar. Specifies the left side color in + the color gradient of an active window's title bar if the gradient effect is + enabled. + * `active-caption-gradient` - Right side color in the color gradient of an + active window's title bar. + * `app-workspace` - Background color of multiple document interface (MDI) + applications. + * `button-text` - Text on push buttons. + * `caption-text` - Text in caption, size box, and scroll bar arrow box. + * `desktop` - Desktop background color. + * `disabled-text` - Grayed (disabled) text. + * `highlight` - Item(s) selected in a control. + * `highlight-text` - Text of item(s) selected in a control. + * `hotlight` - Color for a hyperlink or hot-tracked item. + * `inactive-border` - Inactive window border. + * `inactive-caption` - Inactive window caption. Specifies the left side color + in the color gradient of an inactive window's title bar if the gradient + effect is enabled. + * `inactive-caption-gradient` - Right side color in the color gradient of an + inactive window's title bar. + * `inactive-caption-text` - Color of text in an inactive caption. + * `info-background` - Background color for tooltip controls. + * `info-text` - Text color for tooltip controls. + * `menu` - Menu background. + * `menu-highlight` - The color used to highlight menu items when the menu + appears as a flat menu. + * `menubar` - The background color for the menu bar when menus appear as flat + menus. + * `menu-text` - Text in menus. + * `scrollbar` - Scroll bar gray area. + * `window` - Window background. + * `window-frame` - Window frame. + * `window-text` - Text in windows. + +Returns `String` - The system color setting in RGB hexadecimal form (`#ABCDEF`). +See the [Windows docs][windows-colors] for more details. + ### `systemPreferences.isInvertedColorScheme()` _Windows_ Returns `Boolean` - `true` if an inverted color scheme, such as a high contrast theme, is active, `false` otherwise. + +[windows-colors]:https://msdn.microsoft.com/en-us/library/windows/desktop/ms724371(v=vs.85).aspx diff --git a/spec/api-system-preferences-spec.js b/spec/api-system-preferences-spec.js index 03bff26ad82e..e61ae726dfcc 100644 --- a/spec/api-system-preferences-spec.js +++ b/spec/api-system-preferences-spec.js @@ -15,6 +15,22 @@ describe('systemPreferences module', function () { }) }) + describe('systemPreferences.getColor(id)', function () { + if (process.platform !== 'win32') { + return + } + + it('throws an error when the id is invalid', function () { + assert.throws(function () { + systemPreferences.getColor('not-a-color') + }, /Unknown color: not-a-color/) + }) + + it('returns a hex RGB color string', function () { + assert.equal(/^#[0-9A-F]{6}$/i.test(systemPreferences.getColor('window')), true) + }) + }) + describe('systemPreferences.getUserDefault(key, type)', function () { if (process.platform !== 'darwin') { return