summaryrefslogtreecommitdiffstats
path: root/widget/cocoa/VibrancyManager.mm
diff options
context:
space:
mode:
Diffstat (limited to 'widget/cocoa/VibrancyManager.mm')
-rw-r--r--widget/cocoa/VibrancyManager.mm74
1 files changed, 21 insertions, 53 deletions
diff --git a/widget/cocoa/VibrancyManager.mm b/widget/cocoa/VibrancyManager.mm
index 6062acb931..a2bef29a19 100644
--- a/widget/cocoa/VibrancyManager.mm
+++ b/widget/cocoa/VibrancyManager.mm
@@ -5,6 +5,9 @@
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "VibrancyManager.h"
+#include "ViewRegion.h"
+#include "nsRegion.h"
+#include "ViewRegion.h"
#import <objc/message.h>
@@ -20,18 +23,10 @@ using namespace mozilla;
vibrancyType:(VibrancyType)aVibrancyType;
@end
-@interface MOZVibrantLeafView : MOZVibrantView
-@end
-
static NSVisualEffectState VisualEffectStateForVibrancyType(
VibrancyType aType) {
switch (aType) {
- case VibrancyType::TOOLTIP:
- case VibrancyType::MENU:
- // Tooltip and menu windows are never "key", so we need to tell the
- // vibrancy effect to look active regardless of window state.
- return NSVisualEffectStateActive;
- case VibrancyType::TITLEBAR:
+ case VibrancyType::Titlebar:
break;
}
return NSVisualEffectStateFollowsWindowActiveState;
@@ -40,11 +35,7 @@ static NSVisualEffectState VisualEffectStateForVibrancyType(
static NSVisualEffectMaterial VisualEffectMaterialForVibrancyType(
VibrancyType aType) {
switch (aType) {
- case VibrancyType::TOOLTIP:
- return (NSVisualEffectMaterial)NSVisualEffectMaterialToolTip;
- case VibrancyType::MENU:
- return NSVisualEffectMaterialMenu;
- case VibrancyType::TITLEBAR:
+ case VibrancyType::Titlebar:
return NSVisualEffectMaterialTitlebar;
}
}
@@ -52,10 +43,7 @@ static NSVisualEffectMaterial VisualEffectMaterialForVibrancyType(
static NSVisualEffectBlendingMode VisualEffectBlendingModeForVibrancyType(
VibrancyType aType) {
switch (aType) {
- case VibrancyType::TOOLTIP:
- case VibrancyType::MENU:
- return NSVisualEffectBlendingModeBehindWindow;
- case VibrancyType::TITLEBAR:
+ case VibrancyType::Titlebar:
return StaticPrefs::widget_macos_titlebar_blend_mode_behind_window()
? NSVisualEffectBlendingModeBehindWindow
: NSVisualEffectBlendingModeWithinWindow;
@@ -63,7 +51,6 @@ static NSVisualEffectBlendingMode VisualEffectBlendingModeForVibrancyType(
}
@implementation MOZVibrantView
-
- (instancetype)initWithFrame:(NSRect)aRect vibrancyType:(VibrancyType)aType {
self = [super initWithFrame:aRect];
mType = aType;
@@ -76,50 +63,31 @@ static NSVisualEffectBlendingMode VisualEffectBlendingModeForVibrancyType(
return self;
}
-// Don't override allowsVibrancy here, because this view may have subviews, and
-// returning YES from allowsVibrancy forces on foreground vibrancy for all
-// descendant views, which can have unintended effects.
-
-@end
-
-@implementation MOZVibrantLeafView
-
- (NSView*)hitTest:(NSPoint)aPoint {
// This view must be transparent to mouse events.
return nil;
}
+@end
-// MOZVibrantLeafView does not have subviews, so we can return YES here without
-// having unintended effects on other contents of the window.
-- (BOOL)allowsVibrancy {
- return NO;
-}
+VibrancyManager::VibrancyManager(const nsChildView& aCoordinateConverter,
+ NSView* aContainerView)
+ : mCoordinateConverter(aCoordinateConverter),
+ mContainerView(aContainerView) {}
-@end
+VibrancyManager::~VibrancyManager() = default;
bool VibrancyManager::UpdateVibrantRegion(
VibrancyType aType, const LayoutDeviceIntRegion& aRegion) {
+ auto& slot = mVibrantRegions[aType];
if (aRegion.IsEmpty()) {
- return mVibrantRegions.Remove(uint32_t(aType));
+ bool hadRegion = !!slot;
+ slot = nullptr;
+ return hadRegion;
}
- auto& vr = *mVibrantRegions.GetOrInsertNew(uint32_t(aType));
- return vr.UpdateRegion(aRegion, mCoordinateConverter, mContainerView, ^() {
- return CreateEffectView(aType);
- });
-}
-
-LayoutDeviceIntRegion VibrancyManager::GetUnionOfVibrantRegions() const {
- LayoutDeviceIntRegion result;
- for (const auto& region : mVibrantRegions.Values()) {
- result.OrWith(region->Region());
+ if (!slot) {
+ slot = MakeUnique<ViewRegion>();
}
- return result;
-}
-
-/* static */ NSView* VibrancyManager::CreateEffectView(VibrancyType aType,
- BOOL aIsContainer) {
- return aIsContainer ? [[MOZVibrantView alloc] initWithFrame:NSZeroRect
- vibrancyType:aType]
- : [[MOZVibrantLeafView alloc] initWithFrame:NSZeroRect
- vibrancyType:aType];
+ return slot->UpdateRegion(aRegion, mCoordinateConverter, mContainerView, ^() {
+ return [[MOZVibrantView alloc] initWithFrame:NSZeroRect vibrancyType:aType];
+ });
}