chore: finalize dropping support for OS X Mavericks (version 10.9) (#17102)
This commit is contained in:
parent
df5305d6a7
commit
5e762d6a47
14 changed files with 175 additions and 318 deletions
|
@ -410,37 +410,31 @@ std::string SystemPreferences::GetAccentColor() {
|
||||||
|
|
||||||
std::string SystemPreferences::GetSystemColor(const std::string& color,
|
std::string SystemPreferences::GetSystemColor(const std::string& color,
|
||||||
mate::Arguments* args) {
|
mate::Arguments* args) {
|
||||||
if (@available(macOS 10.10, *)) {
|
NSColor* sysColor = nil;
|
||||||
NSColor* sysColor;
|
if (color == "blue") {
|
||||||
if (color == "blue") {
|
sysColor = [NSColor systemBlueColor];
|
||||||
sysColor = [NSColor systemBlueColor];
|
} else if (color == "brown") {
|
||||||
} else if (color == "brown") {
|
sysColor = [NSColor systemBrownColor];
|
||||||
sysColor = [NSColor systemBrownColor];
|
} else if (color == "gray") {
|
||||||
} else if (color == "gray") {
|
sysColor = [NSColor systemGrayColor];
|
||||||
sysColor = [NSColor systemGrayColor];
|
} else if (color == "green") {
|
||||||
} else if (color == "green") {
|
sysColor = [NSColor systemGreenColor];
|
||||||
sysColor = [NSColor systemGreenColor];
|
} else if (color == "orange") {
|
||||||
} else if (color == "orange") {
|
sysColor = [NSColor systemOrangeColor];
|
||||||
sysColor = [NSColor systemOrangeColor];
|
} else if (color == "pink") {
|
||||||
} else if (color == "pink") {
|
sysColor = [NSColor systemPinkColor];
|
||||||
sysColor = [NSColor systemPinkColor];
|
} else if (color == "purple") {
|
||||||
} else if (color == "purple") {
|
sysColor = [NSColor systemPurpleColor];
|
||||||
sysColor = [NSColor systemPurpleColor];
|
} else if (color == "red") {
|
||||||
} else if (color == "red") {
|
sysColor = [NSColor systemRedColor];
|
||||||
sysColor = [NSColor systemRedColor];
|
} else if (color == "yellow") {
|
||||||
} else if (color == "yellow") {
|
sysColor = [NSColor systemYellowColor];
|
||||||
sysColor = [NSColor systemYellowColor];
|
|
||||||
} else {
|
|
||||||
args->ThrowError("Unknown system color: " + color);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
return ToRGBHex(sysColor);
|
|
||||||
} else {
|
} else {
|
||||||
args->ThrowError(
|
args->ThrowError("Unknown system color: " + color);
|
||||||
"This api is not available on MacOS version 10.9 or lower.");
|
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return ToRGBHex(sysColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SystemPreferences::CanPromptTouchID() {
|
bool SystemPreferences::CanPromptTouchID() {
|
||||||
|
@ -542,23 +536,18 @@ std::string SystemPreferences::GetColor(const std::string& color,
|
||||||
} else if (color == "keyboard-focus-indicator") {
|
} else if (color == "keyboard-focus-indicator") {
|
||||||
sysColor = [NSColor keyboardFocusIndicatorColor];
|
sysColor = [NSColor keyboardFocusIndicatorColor];
|
||||||
} else if (color == "label") {
|
} else if (color == "label") {
|
||||||
if (@available(macOS 10.10, *))
|
sysColor = [NSColor labelColor];
|
||||||
sysColor = [NSColor labelColor];
|
|
||||||
} else if (color == "link") {
|
} else if (color == "link") {
|
||||||
if (@available(macOS 10.10, *))
|
sysColor = [NSColor linkColor];
|
||||||
sysColor = [NSColor linkColor];
|
|
||||||
} else if (color == "placeholder-text") {
|
} else if (color == "placeholder-text") {
|
||||||
if (@available(macOS 10.10, *))
|
sysColor = [NSColor placeholderTextColor];
|
||||||
sysColor = [NSColor placeholderTextColor];
|
|
||||||
} else if (color == "quaternary-label") {
|
} else if (color == "quaternary-label") {
|
||||||
if (@available(macOS 10.10, *))
|
sysColor = [NSColor quaternaryLabelColor];
|
||||||
sysColor = [NSColor quaternaryLabelColor];
|
|
||||||
} else if (color == "scrubber-textured-background") {
|
} else if (color == "scrubber-textured-background") {
|
||||||
if (@available(macOS 10.12.2, *))
|
if (@available(macOS 10.12.2, *))
|
||||||
sysColor = [NSColor scrubberTexturedBackgroundColor];
|
sysColor = [NSColor scrubberTexturedBackgroundColor];
|
||||||
} else if (color == "secondary-label") {
|
} else if (color == "secondary-label") {
|
||||||
if (@available(macOS 10.10, *))
|
sysColor = [NSColor secondaryLabelColor];
|
||||||
sysColor = [NSColor secondaryLabelColor];
|
|
||||||
} else if (color == "selected-content-background") {
|
} else if (color == "selected-content-background") {
|
||||||
if (@available(macOS 10.14, *))
|
if (@available(macOS 10.14, *))
|
||||||
sysColor = [NSColor selectedContentBackgroundColor];
|
sysColor = [NSColor selectedContentBackgroundColor];
|
||||||
|
@ -578,8 +567,7 @@ std::string SystemPreferences::GetColor(const std::string& color,
|
||||||
} else if (color == "shadow") {
|
} else if (color == "shadow") {
|
||||||
sysColor = [NSColor shadowColor];
|
sysColor = [NSColor shadowColor];
|
||||||
} else if (color == "tertiary-label") {
|
} else if (color == "tertiary-label") {
|
||||||
if (@available(macOS 10.10, *))
|
sysColor = [NSColor tertiaryLabelColor];
|
||||||
sysColor = [NSColor tertiaryLabelColor];
|
|
||||||
} else if (color == "text-background") {
|
} else if (color == "text-background") {
|
||||||
sysColor = [NSColor textBackgroundColor];
|
sysColor = [NSColor textBackgroundColor];
|
||||||
} else if (color == "text") {
|
} else if (color == "text") {
|
||||||
|
|
|
@ -148,13 +148,9 @@ void Browser::SetUserActivity(const std::string& type,
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Browser::GetCurrentActivityType() {
|
std::string Browser::GetCurrentActivityType() {
|
||||||
if (@available(macOS 10.10, *)) {
|
NSUserActivity* userActivity =
|
||||||
NSUserActivity* userActivity =
|
[[AtomApplication sharedApplication] getCurrentActivity];
|
||||||
[[AtomApplication sharedApplication] getCurrentActivity];
|
return base::SysNSStringToUTF8(userActivity.activityType);
|
||||||
return base::SysNSStringToUTF8(userActivity.activityType);
|
|
||||||
} else {
|
|
||||||
return std::string();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Browser::InvalidateCurrentActivity() {
|
void Browser::InvalidateCurrentActivity() {
|
||||||
|
|
|
@ -104,8 +104,7 @@ typedef NS_ENUM(NSInteger, AVAuthorizationStatusMac) {
|
||||||
NSUserActivityDelegate> {
|
NSUserActivityDelegate> {
|
||||||
@private
|
@private
|
||||||
BOOL handlingSendEvent_;
|
BOOL handlingSendEvent_;
|
||||||
base::scoped_nsobject<NSUserActivity> currentActivity_
|
base::scoped_nsobject<NSUserActivity> currentActivity_;
|
||||||
API_AVAILABLE(macosx(10.10));
|
|
||||||
NSCondition* handoffLock_;
|
NSCondition* handoffLock_;
|
||||||
BOOL updateReceived_;
|
BOOL updateReceived_;
|
||||||
base::Callback<bool()> shouldShutdown_;
|
base::Callback<bool()> shouldShutdown_;
|
||||||
|
@ -121,7 +120,7 @@ typedef NS_ENUM(NSInteger, AVAuthorizationStatusMac) {
|
||||||
// CrAppControlProtocol:
|
// CrAppControlProtocol:
|
||||||
- (void)setHandlingSendEvent:(BOOL)handlingSendEvent;
|
- (void)setHandlingSendEvent:(BOOL)handlingSendEvent;
|
||||||
|
|
||||||
- (NSUserActivity*)getCurrentActivity API_AVAILABLE(macosx(10.10));
|
- (NSUserActivity*)getCurrentActivity;
|
||||||
- (void)setCurrentActivity:(NSString*)type
|
- (void)setCurrentActivity:(NSString*)type
|
||||||
withUserInfo:(NSDictionary*)userInfo
|
withUserInfo:(NSDictionary*)userInfo
|
||||||
withWebpageURL:(NSURL*)webpageURL;
|
withWebpageURL:(NSURL*)webpageURL;
|
||||||
|
|
|
@ -69,15 +69,13 @@ inline void dispatch_sync_main(dispatch_block_t block) {
|
||||||
- (void)setCurrentActivity:(NSString*)type
|
- (void)setCurrentActivity:(NSString*)type
|
||||||
withUserInfo:(NSDictionary*)userInfo
|
withUserInfo:(NSDictionary*)userInfo
|
||||||
withWebpageURL:(NSURL*)webpageURL {
|
withWebpageURL:(NSURL*)webpageURL {
|
||||||
if (@available(macOS 10.10, *)) {
|
currentActivity_ = base::scoped_nsobject<NSUserActivity>(
|
||||||
currentActivity_ = base::scoped_nsobject<NSUserActivity>(
|
[[NSUserActivity alloc] initWithActivityType:type]);
|
||||||
[[NSUserActivity alloc] initWithActivityType:type]);
|
[currentActivity_ setUserInfo:userInfo];
|
||||||
[currentActivity_ setUserInfo:userInfo];
|
[currentActivity_ setWebpageURL:webpageURL];
|
||||||
[currentActivity_ setWebpageURL:webpageURL];
|
[currentActivity_ setDelegate:self];
|
||||||
[currentActivity_ setDelegate:self];
|
[currentActivity_ becomeCurrent];
|
||||||
[currentActivity_ becomeCurrent];
|
[currentActivity_ setNeedsSave:YES];
|
||||||
[currentActivity_ setNeedsSave:YES];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSUserActivity*)getCurrentActivity {
|
- (NSUserActivity*)getCurrentActivity {
|
||||||
|
@ -103,8 +101,7 @@ inline void dispatch_sync_main(dispatch_block_t block) {
|
||||||
[handoffLock_ unlock];
|
[handoffLock_ unlock];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)userActivityWillSave:(NSUserActivity*)userActivity
|
- (void)userActivityWillSave:(NSUserActivity*)userActivity {
|
||||||
API_AVAILABLE(macosx(10.10)) {
|
|
||||||
__block BOOL shouldWait = NO;
|
__block BOOL shouldWait = NO;
|
||||||
dispatch_sync_main(^{
|
dispatch_sync_main(^{
|
||||||
std::string activity_type(
|
std::string activity_type(
|
||||||
|
@ -132,8 +129,7 @@ inline void dispatch_sync_main(dispatch_block_t block) {
|
||||||
[userActivity setNeedsSave:YES];
|
[userActivity setNeedsSave:YES];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)userActivityWasContinued:(NSUserActivity*)userActivity
|
- (void)userActivityWasContinued:(NSUserActivity*)userActivity {
|
||||||
API_AVAILABLE(macosx(10.10)) {
|
|
||||||
dispatch_async(dispatch_get_main_queue(), ^{
|
dispatch_async(dispatch_get_main_queue(), ^{
|
||||||
std::string activity_type(
|
std::string activity_type(
|
||||||
base::SysNSStringToUTF8(userActivity.activityType));
|
base::SysNSStringToUTF8(userActivity.activityType));
|
||||||
|
|
|
@ -103,7 +103,7 @@ static base::mac::ScopedObjCClassSwizzler* g_swizzle_imk_input_session;
|
||||||
#else
|
#else
|
||||||
(void (^)(NSArray* restorableObjects))
|
(void (^)(NSArray* restorableObjects))
|
||||||
#endif
|
#endif
|
||||||
restorationHandler API_AVAILABLE(macosx(10.10)) {
|
restorationHandler {
|
||||||
std::string activity_type(base::SysNSStringToUTF8(userActivity.activityType));
|
std::string activity_type(base::SysNSStringToUTF8(userActivity.activityType));
|
||||||
std::unique_ptr<base::DictionaryValue> user_info =
|
std::unique_ptr<base::DictionaryValue> user_info =
|
||||||
atom::NSDictionaryToDictionaryValue(userActivity.userInfo);
|
atom::NSDictionaryToDictionaryValue(userActivity.userInfo);
|
||||||
|
|
|
@ -168,8 +168,6 @@ class NativeWindowMac : public NativeWindow {
|
||||||
void AddContentViewLayers();
|
void AddContentViewLayers();
|
||||||
|
|
||||||
void InternalSetParentWindow(NativeWindow* parent, bool attach);
|
void InternalSetParentWindow(NativeWindow* parent, bool attach);
|
||||||
void ShowWindowButton(NSWindowButton button);
|
|
||||||
|
|
||||||
void SetForwardMouseMessages(bool forward);
|
void SetForwardMouseMessages(bool forward);
|
||||||
|
|
||||||
AtomNSWindow* window_; // Weak ref, managed by widget_.
|
AtomNSWindow* window_; // Weak ref, managed by widget_.
|
||||||
|
|
|
@ -315,11 +315,9 @@ NativeWindowMac::NativeWindowMac(const mate::Dictionary& options,
|
||||||
}
|
}
|
||||||
|
|
||||||
NSUInteger styleMask = NSWindowStyleMaskTitled;
|
NSUInteger styleMask = NSWindowStyleMaskTitled;
|
||||||
if (@available(macOS 10.10, *)) {
|
if (title_bar_style_ == CUSTOM_BUTTONS_ON_HOVER &&
|
||||||
if (title_bar_style_ == CUSTOM_BUTTONS_ON_HOVER &&
|
(!useStandardWindow || transparent() || !has_frame())) {
|
||||||
(!useStandardWindow || transparent() || !has_frame())) {
|
styleMask = NSWindowStyleMaskFullSizeContentView;
|
||||||
styleMask = NSWindowStyleMaskFullSizeContentView;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (minimizable) {
|
if (minimizable) {
|
||||||
styleMask |= NSMiniaturizableWindowMask;
|
styleMask |= NSMiniaturizableWindowMask;
|
||||||
|
@ -378,11 +376,9 @@ NativeWindowMac::NativeWindowMac(const mate::Dictionary& options,
|
||||||
[window_ setDisableKeyOrMainWindow:YES];
|
[window_ setDisableKeyOrMainWindow:YES];
|
||||||
|
|
||||||
if (transparent() || !has_frame()) {
|
if (transparent() || !has_frame()) {
|
||||||
if (@available(macOS 10.10, *)) {
|
// Don't show title bar.
|
||||||
// Don't show title bar.
|
[window_ setTitlebarAppearsTransparent:YES];
|
||||||
[window_ setTitlebarAppearsTransparent:YES];
|
[window_ setTitleVisibility:NSWindowTitleHidden];
|
||||||
[window_ setTitleVisibility:NSWindowTitleHidden];
|
|
||||||
}
|
|
||||||
// Remove non-transparent corners, see http://git.io/vfonD.
|
// Remove non-transparent corners, see http://git.io/vfonD.
|
||||||
[window_ setOpaque:NO];
|
[window_ setOpaque:NO];
|
||||||
}
|
}
|
||||||
|
@ -401,22 +397,15 @@ NativeWindowMac::NativeWindowMac(const mate::Dictionary& options,
|
||||||
|
|
||||||
// Hide the title bar background
|
// Hide the title bar background
|
||||||
if (title_bar_style_ != NORMAL) {
|
if (title_bar_style_ != NORMAL) {
|
||||||
if (@available(macOS 10.10, *)) {
|
[window_ setTitlebarAppearsTransparent:YES];
|
||||||
[window_ setTitlebarAppearsTransparent:YES];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hide the title bar.
|
// Hide the title bar.
|
||||||
if (title_bar_style_ == HIDDEN_INSET) {
|
if (title_bar_style_ == HIDDEN_INSET) {
|
||||||
if (@available(macOS 10.10, *)) {
|
base::scoped_nsobject<NSToolbar> toolbar(
|
||||||
base::scoped_nsobject<NSToolbar> toolbar(
|
[[NSToolbar alloc] initWithIdentifier:@"titlebarStylingToolbar"]);
|
||||||
[[NSToolbar alloc] initWithIdentifier:@"titlebarStylingToolbar"]);
|
[toolbar setShowsBaselineSeparator:NO];
|
||||||
[toolbar setShowsBaselineSeparator:NO];
|
[window_ setToolbar:toolbar];
|
||||||
[window_ setToolbar:toolbar];
|
|
||||||
} else {
|
|
||||||
[window_ enableWindowButtonsOffset];
|
|
||||||
[window_ setWindowButtonsOffset:NSMakePoint(12, 10)];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Resize to content bounds.
|
// Resize to content bounds.
|
||||||
|
@ -874,17 +863,11 @@ void NativeWindowMac::Invalidate() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void NativeWindowMac::SetTitle(const std::string& title) {
|
void NativeWindowMac::SetTitle(const std::string& title) {
|
||||||
// For macOS <= 10.9, the setTitleVisibility API is not available, we have
|
|
||||||
// to avoid calling setTitle for frameless window.
|
|
||||||
if (!base::mac::IsAtLeastOS10_10() && (transparent() || !has_frame()))
|
|
||||||
return;
|
|
||||||
|
|
||||||
[window_ setTitle:base::SysUTF8ToNSString(title)];
|
[window_ setTitle:base::SysUTF8ToNSString(title)];
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string NativeWindowMac::GetTitle() {
|
std::string NativeWindowMac::GetTitle() {
|
||||||
return base::SysNSStringToUTF8([window_ title]);
|
return base::SysNSStringToUTF8([window_ title]);
|
||||||
;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void NativeWindowMac::FlashFrame(bool flash) {
|
void NativeWindowMac::FlashFrame(bool flash) {
|
||||||
|
@ -1246,84 +1229,81 @@ bool NativeWindowMac::SetWindowButtonVisibility(bool visible) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void NativeWindowMac::SetVibrancy(const std::string& type) {
|
void NativeWindowMac::SetVibrancy(const std::string& type) {
|
||||||
if (@available(macOS 10.10, *)) {
|
NSView* vibrant_view = [window_ vibrantView];
|
||||||
NSView* vibrant_view = [window_ vibrantView];
|
|
||||||
|
|
||||||
if (type.empty()) {
|
|
||||||
if (background_color_before_vibrancy_) {
|
|
||||||
[window_ setBackgroundColor:background_color_before_vibrancy_];
|
|
||||||
[window_ setTitlebarAppearsTransparent:transparency_before_vibrancy_];
|
|
||||||
}
|
|
||||||
if (vibrant_view == nil)
|
|
||||||
return;
|
|
||||||
|
|
||||||
[vibrant_view removeFromSuperview];
|
|
||||||
[window_ setVibrantView:nil];
|
|
||||||
|
|
||||||
|
if (type.empty()) {
|
||||||
|
if (background_color_before_vibrancy_) {
|
||||||
|
[window_ setBackgroundColor:background_color_before_vibrancy_];
|
||||||
|
[window_ setTitlebarAppearsTransparent:transparency_before_vibrancy_];
|
||||||
|
}
|
||||||
|
if (vibrant_view == nil)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
background_color_before_vibrancy_.reset([[window_ backgroundColor] retain]);
|
[vibrant_view removeFromSuperview];
|
||||||
transparency_before_vibrancy_ = [window_ titlebarAppearsTransparent];
|
[window_ setVibrantView:nil];
|
||||||
|
|
||||||
if (title_bar_style_ != NORMAL) {
|
return;
|
||||||
[window_ setTitlebarAppearsTransparent:YES];
|
|
||||||
[window_ setBackgroundColor:[NSColor clearColor]];
|
|
||||||
}
|
|
||||||
|
|
||||||
NSVisualEffectView* effect_view = (NSVisualEffectView*)vibrant_view;
|
|
||||||
if (effect_view == nil) {
|
|
||||||
effect_view = [[[NSVisualEffectView alloc]
|
|
||||||
initWithFrame:[[window_ contentView] bounds]] autorelease];
|
|
||||||
[window_ setVibrantView:(NSView*)effect_view];
|
|
||||||
|
|
||||||
[effect_view
|
|
||||||
setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
|
|
||||||
[effect_view setBlendingMode:NSVisualEffectBlendingModeBehindWindow];
|
|
||||||
[effect_view setState:NSVisualEffectStateActive];
|
|
||||||
[[window_ contentView] addSubview:effect_view
|
|
||||||
positioned:NSWindowBelow
|
|
||||||
relativeTo:nil];
|
|
||||||
}
|
|
||||||
|
|
||||||
NSVisualEffectMaterial vibrancyType = NSVisualEffectMaterialLight;
|
|
||||||
|
|
||||||
if (type == "appearance-based") {
|
|
||||||
vibrancyType = NSVisualEffectMaterialAppearanceBased;
|
|
||||||
} else if (type == "light") {
|
|
||||||
vibrancyType = NSVisualEffectMaterialLight;
|
|
||||||
} else if (type == "dark") {
|
|
||||||
vibrancyType = NSVisualEffectMaterialDark;
|
|
||||||
} else if (type == "titlebar") {
|
|
||||||
vibrancyType = NSVisualEffectMaterialTitlebar;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (@available(macOS 10.11, *)) {
|
|
||||||
// TODO(kevinsawicki): Use NSVisualEffectMaterial* constants directly once
|
|
||||||
// they are available in the minimum SDK version
|
|
||||||
if (type == "selection") {
|
|
||||||
// NSVisualEffectMaterialSelection
|
|
||||||
vibrancyType = static_cast<NSVisualEffectMaterial>(4);
|
|
||||||
} else if (type == "menu") {
|
|
||||||
// NSVisualEffectMaterialMenu
|
|
||||||
vibrancyType = static_cast<NSVisualEffectMaterial>(5);
|
|
||||||
} else if (type == "popover") {
|
|
||||||
// NSVisualEffectMaterialPopover
|
|
||||||
vibrancyType = static_cast<NSVisualEffectMaterial>(6);
|
|
||||||
} else if (type == "sidebar") {
|
|
||||||
// NSVisualEffectMaterialSidebar
|
|
||||||
vibrancyType = static_cast<NSVisualEffectMaterial>(7);
|
|
||||||
} else if (type == "medium-light") {
|
|
||||||
// NSVisualEffectMaterialMediumLight
|
|
||||||
vibrancyType = static_cast<NSVisualEffectMaterial>(8);
|
|
||||||
} else if (type == "ultra-dark") {
|
|
||||||
// NSVisualEffectMaterialUltraDark
|
|
||||||
vibrancyType = static_cast<NSVisualEffectMaterial>(9);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[effect_view setMaterial:vibrancyType];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
background_color_before_vibrancy_.reset([[window_ backgroundColor] retain]);
|
||||||
|
transparency_before_vibrancy_ = [window_ titlebarAppearsTransparent];
|
||||||
|
|
||||||
|
if (title_bar_style_ != NORMAL) {
|
||||||
|
[window_ setTitlebarAppearsTransparent:YES];
|
||||||
|
[window_ setBackgroundColor:[NSColor clearColor]];
|
||||||
|
}
|
||||||
|
|
||||||
|
NSVisualEffectView* effect_view = (NSVisualEffectView*)vibrant_view;
|
||||||
|
if (effect_view == nil) {
|
||||||
|
effect_view = [[[NSVisualEffectView alloc]
|
||||||
|
initWithFrame:[[window_ contentView] bounds]] autorelease];
|
||||||
|
[window_ setVibrantView:(NSView*)effect_view];
|
||||||
|
|
||||||
|
[effect_view setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
|
||||||
|
[effect_view setBlendingMode:NSVisualEffectBlendingModeBehindWindow];
|
||||||
|
[effect_view setState:NSVisualEffectStateActive];
|
||||||
|
[[window_ contentView] addSubview:effect_view
|
||||||
|
positioned:NSWindowBelow
|
||||||
|
relativeTo:nil];
|
||||||
|
}
|
||||||
|
|
||||||
|
NSVisualEffectMaterial vibrancyType = NSVisualEffectMaterialLight;
|
||||||
|
|
||||||
|
if (type == "appearance-based") {
|
||||||
|
vibrancyType = NSVisualEffectMaterialAppearanceBased;
|
||||||
|
} else if (type == "light") {
|
||||||
|
vibrancyType = NSVisualEffectMaterialLight;
|
||||||
|
} else if (type == "dark") {
|
||||||
|
vibrancyType = NSVisualEffectMaterialDark;
|
||||||
|
} else if (type == "titlebar") {
|
||||||
|
vibrancyType = NSVisualEffectMaterialTitlebar;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (@available(macOS 10.11, *)) {
|
||||||
|
// TODO(kevinsawicki): Use NSVisualEffectMaterial* constants directly once
|
||||||
|
// they are available in the minimum SDK version
|
||||||
|
if (type == "selection") {
|
||||||
|
// NSVisualEffectMaterialSelection
|
||||||
|
vibrancyType = static_cast<NSVisualEffectMaterial>(4);
|
||||||
|
} else if (type == "menu") {
|
||||||
|
// NSVisualEffectMaterialMenu
|
||||||
|
vibrancyType = static_cast<NSVisualEffectMaterial>(5);
|
||||||
|
} else if (type == "popover") {
|
||||||
|
// NSVisualEffectMaterialPopover
|
||||||
|
vibrancyType = static_cast<NSVisualEffectMaterial>(6);
|
||||||
|
} else if (type == "sidebar") {
|
||||||
|
// NSVisualEffectMaterialSidebar
|
||||||
|
vibrancyType = static_cast<NSVisualEffectMaterial>(7);
|
||||||
|
} else if (type == "medium-light") {
|
||||||
|
// NSVisualEffectMaterialMediumLight
|
||||||
|
vibrancyType = static_cast<NSVisualEffectMaterial>(8);
|
||||||
|
} else if (type == "ultra-dark") {
|
||||||
|
// NSVisualEffectMaterialUltraDark
|
||||||
|
vibrancyType = static_cast<NSVisualEffectMaterial>(9);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[effect_view setMaterial:vibrancyType];
|
||||||
}
|
}
|
||||||
|
|
||||||
void NativeWindowMac::SetTouchBar(
|
void NativeWindowMac::SetTouchBar(
|
||||||
|
@ -1468,11 +1448,6 @@ void NativeWindowMac::InternalSetParentWindow(NativeWindow* parent,
|
||||||
ordered:NSWindowAbove];
|
ordered:NSWindowAbove];
|
||||||
}
|
}
|
||||||
|
|
||||||
void NativeWindowMac::ShowWindowButton(NSWindowButton button) {
|
|
||||||
auto view = [window_ standardWindowButton:button];
|
|
||||||
[view.superview addSubview:view positioned:NSWindowAbove relativeTo:nil];
|
|
||||||
}
|
|
||||||
|
|
||||||
void NativeWindowMac::SetForwardMouseMessages(bool forward) {
|
void NativeWindowMac::SetForwardMouseMessages(bool forward) {
|
||||||
[window_ setAcceptsMouseMovedEvents:forward];
|
[window_ setAcceptsMouseMovedEvents:forward];
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,8 +29,7 @@ class CocoaNotification : public Notification {
|
||||||
void NotificationDisplayed();
|
void NotificationDisplayed();
|
||||||
void NotificationReplied(const std::string& reply);
|
void NotificationReplied(const std::string& reply);
|
||||||
void NotificationActivated();
|
void NotificationActivated();
|
||||||
void NotificationActivated(NSUserNotificationAction* action)
|
void NotificationActivated(NSUserNotificationAction* action);
|
||||||
API_AVAILABLE(macosx(10.10));
|
|
||||||
void NotificationDismissed();
|
void NotificationDismissed();
|
||||||
|
|
||||||
NSUserNotification* notification() const { return notification_; }
|
NSUserNotification* notification() const { return notification_; }
|
||||||
|
|
|
@ -72,24 +72,18 @@ void CocoaNotification::Show(const NotificationOptions& options) {
|
||||||
// All of the rest are appended to the list of additional actions
|
// All of the rest are appended to the list of additional actions
|
||||||
NSString* actionIdentifier =
|
NSString* actionIdentifier =
|
||||||
[NSString stringWithFormat:@"%@Action%d", identifier, i];
|
[NSString stringWithFormat:@"%@Action%d", identifier, i];
|
||||||
if (@available(macOS 10.10, *)) {
|
NSUserNotificationAction* notificationAction = [NSUserNotificationAction
|
||||||
NSUserNotificationAction* notificationAction =
|
actionWithIdentifier:actionIdentifier
|
||||||
[NSUserNotificationAction
|
title:base::SysUTF16ToNSString(action.text)];
|
||||||
actionWithIdentifier:actionIdentifier
|
[additionalActions addObject:notificationAction];
|
||||||
title:base::SysUTF16ToNSString(action.text)];
|
additional_action_indices_.insert(
|
||||||
[additionalActions addObject:notificationAction];
|
std::make_pair(base::SysNSStringToUTF8(actionIdentifier), i));
|
||||||
additional_action_indices_.insert(
|
|
||||||
std::make_pair(base::SysNSStringToUTF8(actionIdentifier), i));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
if ([additionalActions count] > 0 &&
|
if ([additionalActions count] > 0) {
|
||||||
[notification_ respondsToSelector:@selector(setAdditionalActions:)]) {
|
[notification_ setAdditionalActions:additionalActions];
|
||||||
if (@available(macOS 10.10, *)) {
|
|
||||||
[notification_ setAdditionalActions:additionalActions];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options.has_reply) {
|
if (options.has_reply) {
|
||||||
|
|
|
@ -47,12 +47,9 @@
|
||||||
NSUserNotificationActivationTypeReplied) {
|
NSUserNotificationActivationTypeReplied) {
|
||||||
notification->NotificationReplied([notif.response.string UTF8String]);
|
notification->NotificationReplied([notif.response.string UTF8String]);
|
||||||
} else {
|
} else {
|
||||||
if (@available(macOS 10.10, *)) {
|
if (notif.activationType ==
|
||||||
if (notif.activationType ==
|
NSUserNotificationActivationTypeAdditionalActionClicked) {
|
||||||
NSUserNotificationActivationTypeAdditionalActionClicked) {
|
notification->NotificationActivated([notif additionalActivationAction]);
|
||||||
notification->NotificationActivated(
|
|
||||||
[notif additionalActivationAction]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,20 +30,17 @@ class ScopedDisableResize {
|
||||||
@interface AtomNSWindow : NativeWidgetMacNSWindow {
|
@interface AtomNSWindow : NativeWidgetMacNSWindow {
|
||||||
@private
|
@private
|
||||||
atom::NativeWindowMac* shell_;
|
atom::NativeWindowMac* shell_;
|
||||||
CGFloat windowButtonsInterButtonSpacing_;
|
|
||||||
}
|
}
|
||||||
@property BOOL acceptsFirstMouse;
|
@property BOOL acceptsFirstMouse;
|
||||||
@property BOOL enableLargerThanScreen;
|
@property BOOL enableLargerThanScreen;
|
||||||
@property BOOL disableAutoHideCursor;
|
@property BOOL disableAutoHideCursor;
|
||||||
@property BOOL disableKeyOrMainWindow;
|
@property BOOL disableKeyOrMainWindow;
|
||||||
@property NSPoint windowButtonsOffset;
|
|
||||||
@property(nonatomic, retain) NSView* vibrantView;
|
@property(nonatomic, retain) NSView* vibrantView;
|
||||||
- (id)initWithShell:(atom::NativeWindowMac*)shell
|
- (id)initWithShell:(atom::NativeWindowMac*)shell
|
||||||
styleMask:(NSUInteger)styleMask;
|
styleMask:(NSUInteger)styleMask;
|
||||||
- (atom::NativeWindowMac*)shell;
|
- (atom::NativeWindowMac*)shell;
|
||||||
- (id)accessibilityFocusedUIElement;
|
- (id)accessibilityFocusedUIElement;
|
||||||
- (NSRect)originalContentRectForFrameRect:(NSRect)frameRect;
|
- (NSRect)originalContentRectForFrameRect:(NSRect)frameRect;
|
||||||
- (void)enableWindowButtonsOffset;
|
|
||||||
- (void)toggleFullScreenMode:(id)sender;
|
- (void)toggleFullScreenMode:(id)sender;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,6 @@ bool ScopedDisableResize::disable_resize_ = false;
|
||||||
@synthesize enableLargerThanScreen;
|
@synthesize enableLargerThanScreen;
|
||||||
@synthesize disableAutoHideCursor;
|
@synthesize disableAutoHideCursor;
|
||||||
@synthesize disableKeyOrMainWindow;
|
@synthesize disableKeyOrMainWindow;
|
||||||
@synthesize windowButtonsOffset;
|
|
||||||
@synthesize vibrantView;
|
@synthesize vibrantView;
|
||||||
|
|
||||||
- (id)initWithShell:(atom::NativeWindowMac*)shell
|
- (id)initWithShell:(atom::NativeWindowMac*)shell
|
||||||
|
@ -130,78 +129,6 @@ bool ScopedDisableResize::disable_resize_ = false;
|
||||||
return !self.disableKeyOrMainWindow;
|
return !self.disableKeyOrMainWindow;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)enableWindowButtonsOffset {
|
|
||||||
auto closeButton = [self standardWindowButton:NSWindowCloseButton];
|
|
||||||
auto miniaturizeButton =
|
|
||||||
[self standardWindowButton:NSWindowMiniaturizeButton];
|
|
||||||
auto zoomButton = [self standardWindowButton:NSWindowZoomButton];
|
|
||||||
|
|
||||||
[closeButton setPostsFrameChangedNotifications:YES];
|
|
||||||
[miniaturizeButton setPostsFrameChangedNotifications:YES];
|
|
||||||
[zoomButton setPostsFrameChangedNotifications:YES];
|
|
||||||
|
|
||||||
windowButtonsInterButtonSpacing_ =
|
|
||||||
NSMinX([miniaturizeButton frame]) - NSMaxX([closeButton frame]);
|
|
||||||
|
|
||||||
auto center = [NSNotificationCenter defaultCenter];
|
|
||||||
|
|
||||||
[center addObserver:self
|
|
||||||
selector:@selector(adjustCloseButton:)
|
|
||||||
name:NSViewFrameDidChangeNotification
|
|
||||||
object:closeButton];
|
|
||||||
|
|
||||||
[center addObserver:self
|
|
||||||
selector:@selector(adjustMiniaturizeButton:)
|
|
||||||
name:NSViewFrameDidChangeNotification
|
|
||||||
object:miniaturizeButton];
|
|
||||||
|
|
||||||
[center addObserver:self
|
|
||||||
selector:@selector(adjustZoomButton:)
|
|
||||||
name:NSViewFrameDidChangeNotification
|
|
||||||
object:zoomButton];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)adjustCloseButton:(NSNotification*)notification {
|
|
||||||
[self adjustButton:[notification object] ofKind:NSWindowCloseButton];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)adjustMiniaturizeButton:(NSNotification*)notification {
|
|
||||||
[self adjustButton:[notification object] ofKind:NSWindowMiniaturizeButton];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)adjustZoomButton:(NSNotification*)notification {
|
|
||||||
[self adjustButton:[notification object] ofKind:NSWindowZoomButton];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)adjustButton:(NSButton*)button ofKind:(NSWindowButton)kind {
|
|
||||||
NSRect buttonFrame = [button frame];
|
|
||||||
NSRect frameViewBounds = [[self frameView] bounds];
|
|
||||||
NSPoint offset = self.windowButtonsOffset;
|
|
||||||
|
|
||||||
buttonFrame.origin = NSMakePoint(
|
|
||||||
offset.x, (NSHeight(frameViewBounds) - NSHeight(buttonFrame) - offset.y));
|
|
||||||
|
|
||||||
switch (kind) {
|
|
||||||
case NSWindowZoomButton:
|
|
||||||
buttonFrame.origin.x += NSWidth(
|
|
||||||
[[self standardWindowButton:NSWindowMiniaturizeButton] frame]);
|
|
||||||
buttonFrame.origin.x += windowButtonsInterButtonSpacing_;
|
|
||||||
FALLTHROUGH;
|
|
||||||
case NSWindowMiniaturizeButton:
|
|
||||||
buttonFrame.origin.x +=
|
|
||||||
NSWidth([[self standardWindowButton:NSWindowCloseButton] frame]);
|
|
||||||
buttonFrame.origin.x += windowButtonsInterButtonSpacing_;
|
|
||||||
FALLTHROUGH;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL didPost = [button postsBoundsChangedNotifications];
|
|
||||||
[button setPostsFrameChangedNotifications:NO];
|
|
||||||
[button setFrame:buttonFrame];
|
|
||||||
[button setPostsFrameChangedNotifications:didPost];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (NSView*)frameView {
|
- (NSView*)frameView {
|
||||||
return [[self contentView] superview];
|
return [[self contentView] superview];
|
||||||
}
|
}
|
||||||
|
|
|
@ -179,62 +179,56 @@
|
||||||
shell_->SetResizable(true);
|
shell_->SetResizable(true);
|
||||||
// Hide the native toolbar before entering fullscreen, so there is no visual
|
// Hide the native toolbar before entering fullscreen, so there is no visual
|
||||||
// artifacts.
|
// artifacts.
|
||||||
if (@available(macOS 10.10, *)) {
|
if (shell_->title_bar_style() == atom::NativeWindowMac::HIDDEN_INSET) {
|
||||||
if (shell_->title_bar_style() == atom::NativeWindowMac::HIDDEN_INSET) {
|
NSWindow* window = shell_->GetNativeWindow().GetNativeNSWindow();
|
||||||
NSWindow* window = shell_->GetNativeWindow().GetNativeNSWindow();
|
[window setToolbar:nil];
|
||||||
[window setToolbar:nil];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)windowDidEnterFullScreen:(NSNotification*)notification {
|
- (void)windowDidEnterFullScreen:(NSNotification*)notification {
|
||||||
shell_->NotifyWindowEnterFullScreen();
|
shell_->NotifyWindowEnterFullScreen();
|
||||||
|
|
||||||
if (@available(macOS 10.10, *)) {
|
// For frameless window we don't show set title for normal mode since the
|
||||||
// For frameless window we don't show set title for normal mode since the
|
// titlebar is expected to be empty, but after entering fullscreen mode we
|
||||||
// titlebar is expected to be empty, but after entering fullscreen mode we
|
// have to set one, because title bar is visible here.
|
||||||
// have to set one, because title bar is visible here.
|
NSWindow* window = shell_->GetNativeWindow().GetNativeNSWindow();
|
||||||
NSWindow* window = shell_->GetNativeWindow().GetNativeNSWindow();
|
if ((shell_->transparent() || !shell_->has_frame()) &&
|
||||||
if ((shell_->transparent() || !shell_->has_frame()) &&
|
// FIXME(zcbenz): Showing titlebar for hiddenInset window is weird under
|
||||||
// FIXME(zcbenz): Showing titlebar for hiddenInset window is weird under
|
// fullscreen mode.
|
||||||
// fullscreen mode.
|
// Show title if fullscreen_window_title flag is set
|
||||||
// Show title if fullscreen_window_title flag is set
|
(shell_->title_bar_style() != atom::NativeWindowMac::HIDDEN_INSET ||
|
||||||
(shell_->title_bar_style() != atom::NativeWindowMac::HIDDEN_INSET ||
|
shell_->fullscreen_window_title())) {
|
||||||
shell_->fullscreen_window_title())) {
|
[window setTitleVisibility:NSWindowTitleVisible];
|
||||||
[window setTitleVisibility:NSWindowTitleVisible];
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Restore the native toolbar immediately after entering fullscreen, if we
|
// Restore the native toolbar immediately after entering fullscreen, if we
|
||||||
// do this before leaving fullscreen, traffic light buttons will be jumping.
|
// do this before leaving fullscreen, traffic light buttons will be jumping.
|
||||||
if (shell_->title_bar_style() == atom::NativeWindowMac::HIDDEN_INSET) {
|
if (shell_->title_bar_style() == atom::NativeWindowMac::HIDDEN_INSET) {
|
||||||
base::scoped_nsobject<NSToolbar> toolbar(
|
base::scoped_nsobject<NSToolbar> toolbar(
|
||||||
[[NSToolbar alloc] initWithIdentifier:@"titlebarStylingToolbar"]);
|
[[NSToolbar alloc] initWithIdentifier:@"titlebarStylingToolbar"]);
|
||||||
[toolbar setShowsBaselineSeparator:NO];
|
[toolbar setShowsBaselineSeparator:NO];
|
||||||
[window setToolbar:toolbar];
|
[window setToolbar:toolbar];
|
||||||
|
|
||||||
// Set window style to hide the toolbar, otherwise the toolbar will show
|
// Set window style to hide the toolbar, otherwise the toolbar will show
|
||||||
// in fullscreen mode.
|
// in fullscreen mode.
|
||||||
[window setTitlebarAppearsTransparent:NO];
|
[window setTitlebarAppearsTransparent:NO];
|
||||||
shell_->SetStyleMask(true, NSWindowStyleMaskFullSizeContentView);
|
shell_->SetStyleMask(true, NSWindowStyleMaskFullSizeContentView);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)windowWillExitFullScreen:(NSNotification*)notification {
|
- (void)windowWillExitFullScreen:(NSNotification*)notification {
|
||||||
if (@available(macOS 10.10, *)) {
|
// Restore the titlebar visibility.
|
||||||
// Restore the titlebar visibility.
|
NSWindow* window = shell_->GetNativeWindow().GetNativeNSWindow();
|
||||||
NSWindow* window = shell_->GetNativeWindow().GetNativeNSWindow();
|
if ((shell_->transparent() || !shell_->has_frame()) &&
|
||||||
if ((shell_->transparent() || !shell_->has_frame()) &&
|
(shell_->title_bar_style() != atom::NativeWindowMac::HIDDEN_INSET ||
|
||||||
(shell_->title_bar_style() != atom::NativeWindowMac::HIDDEN_INSET ||
|
shell_->fullscreen_window_title())) {
|
||||||
shell_->fullscreen_window_title())) {
|
[window setTitleVisibility:NSWindowTitleHidden];
|
||||||
[window setTitleVisibility:NSWindowTitleHidden];
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Turn off the style for toolbar.
|
// Turn off the style for toolbar.
|
||||||
if (shell_->title_bar_style() == atom::NativeWindowMac::HIDDEN_INSET) {
|
if (shell_->title_bar_style() == atom::NativeWindowMac::HIDDEN_INSET) {
|
||||||
shell_->SetStyleMask(false, NSWindowStyleMaskFullSizeContentView);
|
shell_->SetStyleMask(false, NSWindowStyleMaskFullSizeContentView);
|
||||||
[window setTitlebarAppearsTransparent:YES];
|
[window setTitlebarAppearsTransparent:YES];
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,11 +26,8 @@ namespace {
|
||||||
// thread safe, including LSGetApplicationForURL (> 10.2) and
|
// thread safe, including LSGetApplicationForURL (> 10.2) and
|
||||||
// NSWorkspace#openURLs.
|
// NSWorkspace#openURLs.
|
||||||
std::string OpenURL(NSURL* ns_url, bool activate) {
|
std::string OpenURL(NSURL* ns_url, bool activate) {
|
||||||
CFURLRef ref = nil;
|
CFURLRef ref = LSCopyDefaultApplicationURLForURL(
|
||||||
if (@available(macOS 10.10, *)) {
|
base::mac::NSToCFCast(ns_url), kLSRolesAll, nullptr);
|
||||||
ref = LSCopyDefaultApplicationURLForURL(base::mac::NSToCFCast(ns_url),
|
|
||||||
kLSRolesAll, nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
// If no application could be found, NULL is returned and outError
|
// If no application could be found, NULL is returned and outError
|
||||||
// (if not NULL) is populated with kLSApplicationNotFoundErr.
|
// (if not NULL) is populated with kLSApplicationNotFoundErr.
|
||||||
|
|
Loading…
Reference in a new issue