From a9a3348226a2d82f876117b14e967b20b543fedd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 12 Jul 2024 14:08:13 +0000 Subject: [PATCH] Bug 1907405 - Add appearance: -moz-sidebar and hook macOS vibrancy. r=mac-reviewers,spohl Unused for now, but pretty straight-forward. Bug 1905257 has some code that actually uses it. This allows the front-end folks to experiment with this effect for the sidebar. Differential Revision: https://phabricator.services.mozilla.com/D216325 --- modules/libpref/init/StaticPrefList.yaml | 5 +++++ servo/components/style/values/specified/box.rs | 4 ++++ widget/cocoa/MacThemeGeometryType.h | 1 + widget/cocoa/VibrancyManager.h | 1 + widget/cocoa/VibrancyManager.mm | 7 +++++++ widget/cocoa/nsChildView.mm | 2 ++ widget/cocoa/nsNativeThemeCocoa.mm | 6 +++++- 7 files changed, 25 insertions(+), 1 deletion(-) diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml index 72caf9af2a59..626063273113 100644 --- a/modules/libpref/init/StaticPrefList.yaml +++ b/modules/libpref/init/StaticPrefList.yaml @@ -16668,6 +16668,11 @@ value: true mirror: always +- name: widget.macos.sidebar-blend-mode.behind-window + type: RelaxedAtomicBool + value: true + mirror: always + - name: widget.macos.titlebar-blend-mode.behind-window type: RelaxedAtomicBool value: false diff --git a/servo/components/style/values/specified/box.rs b/servo/components/style/values/specified/box.rs index d65909f28907..100936b73d12 100644 --- a/servo/components/style/values/specified/box.rs +++ b/servo/components/style/values/specified/box.rs @@ -1580,6 +1580,10 @@ pub enum Appearance { #[parse(condition = "ParserContext::chrome_rules_enabled")] Tooltip, + /// Sidebar appearance. + #[parse(condition = "ParserContext::chrome_rules_enabled")] + MozSidebar, + /// Mac help button. #[parse(condition = "ParserContext::chrome_rules_enabled")] MozMacHelpButton, diff --git a/widget/cocoa/MacThemeGeometryType.h b/widget/cocoa/MacThemeGeometryType.h index 91879503e1d1..d64580f029e6 100644 --- a/widget/cocoa/MacThemeGeometryType.h +++ b/widget/cocoa/MacThemeGeometryType.h @@ -7,6 +7,7 @@ enum MacThemeGeometryType { eThemeGeometryTypeTitlebar = 1, + eThemeGeometryTypeSidebar, eThemeGeometryTypeWindowButtons, }; diff --git a/widget/cocoa/VibrancyManager.h b/widget/cocoa/VibrancyManager.h index 43adace794d8..f5f79b5d439c 100644 --- a/widget/cocoa/VibrancyManager.h +++ b/widget/cocoa/VibrancyManager.h @@ -18,6 +18,7 @@ namespace mozilla { class ViewRegion; enum class VibrancyType { + Sidebar, // Add new values here, or update MaxEnumValue below if you add them after. Titlebar, }; diff --git a/widget/cocoa/VibrancyManager.mm b/widget/cocoa/VibrancyManager.mm index a2bef29a19e2..e8263ee480a0 100644 --- a/widget/cocoa/VibrancyManager.mm +++ b/widget/cocoa/VibrancyManager.mm @@ -27,6 +27,7 @@ static NSVisualEffectState VisualEffectStateForVibrancyType( VibrancyType aType) { switch (aType) { case VibrancyType::Titlebar: + case VibrancyType::Sidebar: break; } return NSVisualEffectStateFollowsWindowActiveState; @@ -35,6 +36,8 @@ static NSVisualEffectState VisualEffectStateForVibrancyType( static NSVisualEffectMaterial VisualEffectMaterialForVibrancyType( VibrancyType aType) { switch (aType) { + case VibrancyType::Sidebar: + return NSVisualEffectMaterialSidebar; case VibrancyType::Titlebar: return NSVisualEffectMaterialTitlebar; } @@ -43,6 +46,10 @@ static NSVisualEffectMaterial VisualEffectMaterialForVibrancyType( static NSVisualEffectBlendingMode VisualEffectBlendingModeForVibrancyType( VibrancyType aType) { switch (aType) { + case VibrancyType::Sidebar: + return StaticPrefs::widget_macos_sidebar_blend_mode_behind_window() + ? NSVisualEffectBlendingModeBehindWindow + : NSVisualEffectBlendingModeWithinWindow; case VibrancyType::Titlebar: return StaticPrefs::widget_macos_titlebar_blend_mode_behind_window() ? NSVisualEffectBlendingModeBehindWindow diff --git a/widget/cocoa/nsChildView.mm b/widget/cocoa/nsChildView.mm index dc8cc0a31c29..98a2ab09deba 100644 --- a/widget/cocoa/nsChildView.mm +++ b/widget/cocoa/nsChildView.mm @@ -1735,6 +1735,8 @@ void nsChildView::UpdateThemeGeometries( static Maybe ThemeGeometryTypeToVibrancyType( nsITheme::ThemeGeometryType aThemeGeometryType) { switch (aThemeGeometryType) { + case eThemeGeometryTypeSidebar: + return Some(VibrancyType::Sidebar); case eThemeGeometryTypeTitlebar: return Some(VibrancyType::Titlebar); default: diff --git a/widget/cocoa/nsNativeThemeCocoa.mm b/widget/cocoa/nsNativeThemeCocoa.mm index a36f123f93e2..cf432ee48528 100644 --- a/widget/cocoa/nsNativeThemeCocoa.mm +++ b/widget/cocoa/nsNativeThemeCocoa.mm @@ -2191,6 +2191,7 @@ Maybe nsNativeThemeCocoa::ComputeWidgetInfo( case StyleAppearance::Separator: return Some(WidgetInfo::Separator()); + case StyleAppearance::MozSidebar: case StyleAppearance::MozWindowTitlebar: { return Nothing(); } @@ -2525,7 +2526,6 @@ bool nsNativeThemeCocoa::CreateWebRenderCommandsForWidget( case StyleAppearance::SpinnerDownbutton: case StyleAppearance::Toolbarbutton: case StyleAppearance::Separator: - case StyleAppearance::MozWindowTitlebar: case StyleAppearance::Statusbar: case StyleAppearance::Menulist: case StyleAppearance::MenulistButton: @@ -2879,6 +2879,7 @@ nsNativeThemeCocoa::WidgetStateChanged(nsIFrame* aFrame, // Some widget types just never change state. switch (aAppearance) { case StyleAppearance::MozWindowTitlebar: + case StyleAppearance::MozSidebar: case StyleAppearance::Statusbar: case StyleAppearance::Tooltip: case StyleAppearance::Tabpanels: @@ -2950,6 +2951,7 @@ bool nsNativeThemeCocoa::ThemeSupportsWidget(nsPresContext* aPresContext, case StyleAppearance::Listbox: case StyleAppearance::MozWindowButtonBox: case StyleAppearance::MozWindowTitlebar: + case StyleAppearance::MozSidebar: case StyleAppearance::Menupopup: case StyleAppearance::Tooltip: @@ -3057,6 +3059,8 @@ bool nsNativeThemeCocoa::WidgetAppearanceDependsOnWindowFocus( nsITheme::ThemeGeometryType nsNativeThemeCocoa::ThemeGeometryTypeForWidget( nsIFrame* aFrame, StyleAppearance aAppearance) { switch (aAppearance) { + case StyleAppearance::MozSidebar: + return eThemeGeometryTypeSidebar; case StyleAppearance::MozWindowTitlebar: return eThemeGeometryTypeTitlebar; case StyleAppearance::MozWindowButtonBox: