fix: Drop support for OS X Mavericks (version 10.9)
This commit is contained in:
parent
bcbcb4c643
commit
794fe741e9
15 changed files with 155 additions and 289 deletions
|
@ -142,13 +142,9 @@ void Browser::SetUserActivity(const std::string& type,
|
|||
}
|
||||
|
||||
std::string Browser::GetCurrentActivityType() {
|
||||
if (@available(macOS 10.10, *)) {
|
||||
NSUserActivity* userActivity =
|
||||
[[AtomApplication sharedApplication] getCurrentActivity];
|
||||
return base::SysNSStringToUTF8(userActivity.activityType);
|
||||
} else {
|
||||
return std::string();
|
||||
}
|
||||
}
|
||||
|
||||
void Browser::InvalidateCurrentActivity() {
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
NSUserActivityDelegate> {
|
||||
@private
|
||||
BOOL handlingSendEvent_;
|
||||
base::scoped_nsobject<NSUserActivity> currentActivity_ API_AVAILABLE(macosx(10.10));
|
||||
base::scoped_nsobject<NSUserActivity> currentActivity_;
|
||||
NSCondition* handoffLock_;
|
||||
BOOL updateReceived_;
|
||||
base::Callback<bool()> shouldShutdown_;
|
||||
|
@ -27,7 +27,7 @@
|
|||
// CrAppControlProtocol:
|
||||
- (void)setHandlingSendEvent:(BOOL)handlingSendEvent;
|
||||
|
||||
- (NSUserActivity*)getCurrentActivity API_AVAILABLE(macosx(10.10));
|
||||
- (NSUserActivity*)getCurrentActivity;
|
||||
- (void)setCurrentActivity:(NSString*)type
|
||||
withUserInfo:(NSDictionary*)userInfo
|
||||
withWebpageURL:(NSURL*)webpageURL;
|
||||
|
|
|
@ -58,7 +58,6 @@ inline void dispatch_sync_main(dispatch_block_t block) {
|
|||
- (void)setCurrentActivity:(NSString*)type
|
||||
withUserInfo:(NSDictionary*)userInfo
|
||||
withWebpageURL:(NSURL*)webpageURL {
|
||||
if (@available(macOS 10.10, *)) {
|
||||
currentActivity_ = base::scoped_nsobject<NSUserActivity>(
|
||||
[[NSUserActivity alloc] initWithActivityType:type]);
|
||||
[currentActivity_ setUserInfo:userInfo];
|
||||
|
@ -67,7 +66,6 @@ inline void dispatch_sync_main(dispatch_block_t block) {
|
|||
[currentActivity_ becomeCurrent];
|
||||
[currentActivity_ setNeedsSave:YES];
|
||||
}
|
||||
}
|
||||
|
||||
- (NSUserActivity*)getCurrentActivity {
|
||||
return currentActivity_.get();
|
||||
|
@ -92,8 +90,7 @@ inline void dispatch_sync_main(dispatch_block_t block) {
|
|||
[handoffLock_ unlock];
|
||||
}
|
||||
|
||||
- (void)userActivityWillSave:(NSUserActivity*)userActivity
|
||||
API_AVAILABLE(macosx(10.10)) {
|
||||
- (void)userActivityWillSave:(NSUserActivity*)userActivity {
|
||||
__block BOOL shouldWait = NO;
|
||||
dispatch_sync_main(^{
|
||||
std::string activity_type(
|
||||
|
@ -121,8 +118,7 @@ inline void dispatch_sync_main(dispatch_block_t block) {
|
|||
[userActivity setNeedsSave:YES];
|
||||
}
|
||||
|
||||
- (void)userActivityWasContinued:(NSUserActivity*)userActivity
|
||||
API_AVAILABLE(macosx(10.10)) {
|
||||
- (void)userActivityWasContinued:(NSUserActivity*)userActivity {
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
std::string activity_type(
|
||||
base::SysNSStringToUTF8(userActivity.activityType));
|
||||
|
|
|
@ -98,8 +98,7 @@ static base::mac::ScopedObjCClassSwizzler* g_swizzle_imk_input_session;
|
|||
- (BOOL)application:(NSApplication*)sender
|
||||
continueUserActivity:(NSUserActivity*)userActivity
|
||||
restorationHandler:
|
||||
(void (^)(NSArray* restorableObjects))restorationHandler
|
||||
API_AVAILABLE(macosx(10.10)) {
|
||||
(void (^)(NSArray* restorableObjects))restorationHandler {
|
||||
std::string activity_type(base::SysNSStringToUTF8(userActivity.activityType));
|
||||
std::unique_ptr<base::DictionaryValue> user_info =
|
||||
atom::NSDictionaryToDictionaryValue(userActivity.userInfo);
|
||||
|
|
|
@ -153,8 +153,6 @@ class NativeWindowMac : public NativeWindow {
|
|||
|
||||
private:
|
||||
void InternalSetParentWindow(NativeWindow* parent, bool attach);
|
||||
void ShowWindowButton(NSWindowButton button);
|
||||
|
||||
void SetForwardMouseMessages(bool forward);
|
||||
|
||||
AtomNSWindow* window_; // Weak ref, managed by widget_.
|
||||
|
|
|
@ -295,12 +295,10 @@ NativeWindowMac::NativeWindowMac(const mate::Dictionary& options,
|
|||
}
|
||||
|
||||
NSUInteger styleMask = NSTitledWindowMask;
|
||||
if (@available(macOS 10.10, *)) {
|
||||
if (title_bar_style_ == CUSTOM_BUTTONS_ON_HOVER &&
|
||||
(!useStandardWindow || transparent() || !has_frame())) {
|
||||
styleMask = NSFullSizeContentViewWindowMask;
|
||||
}
|
||||
}
|
||||
if (minimizable) {
|
||||
styleMask |= NSMiniaturizableWindowMask;
|
||||
}
|
||||
|
@ -354,11 +352,10 @@ NativeWindowMac::NativeWindowMac(const mate::Dictionary& options,
|
|||
[window_ setDisableKeyOrMainWindow:YES];
|
||||
|
||||
if (transparent() || !has_frame()) {
|
||||
if (@available(macOS 10.10, *)) {
|
||||
// Don't show title bar.
|
||||
[window_ setTitlebarAppearsTransparent:YES];
|
||||
[window_ setTitleVisibility:NSWindowTitleHidden];
|
||||
}
|
||||
|
||||
// Remove non-transparent corners, see http://git.io/vfonD.
|
||||
[window_ setOpaque:NO];
|
||||
}
|
||||
|
@ -377,22 +374,15 @@ NativeWindowMac::NativeWindowMac(const mate::Dictionary& options,
|
|||
|
||||
// Hide the title bar background
|
||||
if (title_bar_style_ != NORMAL) {
|
||||
if (@available(macOS 10.10, *)) {
|
||||
[window_ setTitlebarAppearsTransparent:YES];
|
||||
}
|
||||
}
|
||||
|
||||
// Hide the title bar.
|
||||
if (title_bar_style_ == HIDDEN_INSET) {
|
||||
if (@available(macOS 10.10, *)) {
|
||||
base::scoped_nsobject<NSToolbar> toolbar(
|
||||
[[NSToolbar alloc] initWithIdentifier:@"titlebarStylingToolbar"]);
|
||||
[toolbar setShowsBaselineSeparator:NO];
|
||||
[window_ setToolbar:toolbar];
|
||||
} else {
|
||||
[window_ enableWindowButtonsOffset];
|
||||
[window_ setWindowButtonsOffset:NSMakePoint(12, 10)];
|
||||
}
|
||||
}
|
||||
|
||||
// Resize to content bounds.
|
||||
|
@ -445,9 +435,8 @@ NativeWindowMac::NativeWindowMac(const mate::Dictionary& options,
|
|||
SetContentView(new views::View());
|
||||
|
||||
// Make sure the bottom corner is rounded for non-modal windows:
|
||||
// http://crbug.com/396264. But do not enable it on OS X 10.9 for transparent
|
||||
// window, otherwise a semi-transparent frame would show.
|
||||
if (!(transparent() && base::mac::IsOS10_9()) && !is_modal()) {
|
||||
// http://crbug.com/396264.
|
||||
if (!is_modal()) {
|
||||
base::scoped_nsobject<CALayer> background_layer([[CALayer alloc] init]);
|
||||
[background_layer
|
||||
setAutoresizingMask:kCALayerWidthSizable | kCALayerHeightSizable];
|
||||
|
@ -479,11 +468,6 @@ NativeWindowMac::NativeWindowMac(const mate::Dictionary& options,
|
|||
[[window_ contentView] addSubview:buttons_view_];
|
||||
} else {
|
||||
if (title_bar_style_ != NORMAL) {
|
||||
if (base::mac::IsOS10_9()) {
|
||||
ShowWindowButton(NSWindowZoomButton);
|
||||
ShowWindowButton(NSWindowMiniaturizeButton);
|
||||
ShowWindowButton(NSWindowCloseButton);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -858,17 +842,11 @@ void NativeWindowMac::Invalidate() {
|
|||
}
|
||||
|
||||
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)];
|
||||
}
|
||||
|
||||
std::string NativeWindowMac::GetTitle() {
|
||||
return base::SysNSStringToUTF8([window_ title]);
|
||||
;
|
||||
}
|
||||
|
||||
void NativeWindowMac::FlashFrame(bool flash) {
|
||||
|
@ -1178,7 +1156,6 @@ bool NativeWindowMac::AddTabbedWindow(NativeWindow* window) {
|
|||
}
|
||||
|
||||
void NativeWindowMac::SetVibrancy(const std::string& type) {
|
||||
if (@available(macOS 10.10, *)) {
|
||||
NSView* vibrant_view = [window_ vibrantView];
|
||||
|
||||
if (type.empty()) {
|
||||
|
@ -1211,8 +1188,7 @@ void NativeWindowMac::SetVibrancy(const std::string& type) {
|
|||
initWithFrame:[[window_ contentView] bounds]] autorelease];
|
||||
[window_ setVibrantView:(NSView*)effect_view];
|
||||
|
||||
[effect_view
|
||||
setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
|
||||
[effect_view setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
|
||||
[effect_view setBlendingMode:NSVisualEffectBlendingModeBehindWindow];
|
||||
[effect_view setState:NSVisualEffectStateActive];
|
||||
[[window_ contentView] addSubview:effect_view
|
||||
|
@ -1258,7 +1234,6 @@ void NativeWindowMac::SetVibrancy(const std::string& type) {
|
|||
|
||||
[effect_view setMaterial:vibrancyType];
|
||||
}
|
||||
}
|
||||
|
||||
void NativeWindowMac::SetTouchBar(
|
||||
const std::vector<mate::PersistentDictionary>& items) {
|
||||
|
@ -1341,11 +1316,6 @@ void NativeWindowMac::InternalSetParentWindow(NativeWindow* parent,
|
|||
[parent->GetNativeWindow() addChildWindow:window_ 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) {
|
||||
[window_ setAcceptsMouseMovedEvents:forward];
|
||||
}
|
||||
|
|
|
@ -29,19 +29,16 @@ class ScopedDisableResize {
|
|||
@interface AtomNSWindow : NativeWidgetMacNSWindow {
|
||||
@private
|
||||
atom::NativeWindowMac* shell_;
|
||||
CGFloat windowButtonsInterButtonSpacing_;
|
||||
}
|
||||
@property BOOL acceptsFirstMouse;
|
||||
@property BOOL enableLargerThanScreen;
|
||||
@property BOOL disableAutoHideCursor;
|
||||
@property BOOL disableKeyOrMainWindow;
|
||||
@property NSPoint windowButtonsOffset;
|
||||
@property(nonatomic, retain) NSView* vibrantView;
|
||||
- (id)initWithShell:(atom::NativeWindowMac*)shell
|
||||
styleMask:(NSUInteger)styleMask;
|
||||
- (atom::NativeWindowMac*)shell;
|
||||
- (NSRect)originalContentRectForFrameRect:(NSRect)frameRect;
|
||||
- (void)enableWindowButtonsOffset;
|
||||
- (void)toggleFullScreenMode:(id)sender;
|
||||
@end
|
||||
|
||||
|
|
|
@ -21,7 +21,6 @@ bool ScopedDisableResize::disable_resize_ = false;
|
|||
@synthesize enableLargerThanScreen;
|
||||
@synthesize disableAutoHideCursor;
|
||||
@synthesize disableKeyOrMainWindow;
|
||||
@synthesize windowButtonsOffset;
|
||||
@synthesize vibrantView;
|
||||
|
||||
- (id)initWithShell:(atom::NativeWindowMac*)shell
|
||||
|
@ -117,78 +116,6 @@ bool ScopedDisableResize::disable_resize_ = false;
|
|||
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 {
|
||||
return [[self contentView] superview];
|
||||
}
|
||||
|
|
|
@ -168,18 +168,15 @@
|
|||
shell_->SetResizable(true);
|
||||
// Hide the native toolbar before entering fullscreen, so there is no visual
|
||||
// artifacts.
|
||||
if (@available(macOS 10.10, *)) {
|
||||
if (shell_->title_bar_style() == atom::NativeWindowMac::HIDDEN_INSET) {
|
||||
NSWindow* window = shell_->GetNativeWindow();
|
||||
[window setToolbar:nil];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)windowDidEnterFullScreen:(NSNotification*)notification {
|
||||
shell_->NotifyWindowEnterFullScreen();
|
||||
|
||||
if (@available(macOS 10.10, *)) {
|
||||
// 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
|
||||
// have to set one, because title bar is visible here.
|
||||
|
@ -206,10 +203,8 @@
|
|||
shell_->SetStyleMask(true, NSFullSizeContentViewWindowMask);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)windowWillExitFullScreen:(NSNotification*)notification {
|
||||
if (@available(macOS 10.10, *)) {
|
||||
// Restore the titlebar visibility.
|
||||
NSWindow* window = shell_->GetNativeWindow();
|
||||
if ((shell_->transparent() || !shell_->has_frame()) &&
|
||||
|
@ -223,7 +218,6 @@
|
|||
shell_->SetStyleMask(false, NSFullSizeContentViewWindowMask);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)windowDidExitFullScreen:(NSNotification*)notification {
|
||||
shell_->SetResizable(is_resizable_);
|
||||
|
|
|
@ -29,8 +29,7 @@ class CocoaNotification : public Notification {
|
|||
void NotificationDisplayed();
|
||||
void NotificationReplied(const std::string& reply);
|
||||
void NotificationActivated();
|
||||
void NotificationActivated(NSUserNotificationAction* action)
|
||||
API_AVAILABLE(macosx(10.10));
|
||||
void NotificationActivated(NSUserNotificationAction* action);
|
||||
|
||||
NSUserNotification* notification() const { return notification_; }
|
||||
|
||||
|
|
|
@ -72,9 +72,7 @@ void CocoaNotification::Show(const NotificationOptions& options) {
|
|||
// All of the rest are appended to the list of additional actions
|
||||
NSString* actionIdentifier =
|
||||
[NSString stringWithFormat:@"%@Action%d", identifier, i];
|
||||
if (@available(macOS 10.10, *)) {
|
||||
NSUserNotificationAction* notificationAction =
|
||||
[NSUserNotificationAction
|
||||
NSUserNotificationAction* notificationAction = [NSUserNotificationAction
|
||||
actionWithIdentifier:actionIdentifier
|
||||
title:base::SysUTF16ToNSString(action.text)];
|
||||
[additionalActions addObject:notificationAction];
|
||||
|
@ -82,15 +80,11 @@ void CocoaNotification::Show(const NotificationOptions& options) {
|
|||
std::make_pair(base::SysNSStringToUTF8(actionIdentifier), i));
|
||||
}
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if ([additionalActions count] > 0 &&
|
||||
[notification_ respondsToSelector:@selector(setAdditionalActions:)]) {
|
||||
if (@available(macOS 10.10, *)) {
|
||||
if ([additionalActions count] > 0) {
|
||||
[notification_ setAdditionalActions:additionalActions];
|
||||
}
|
||||
}
|
||||
|
||||
if (options.has_reply) {
|
||||
[notification_ setResponsePlaceholder:base::SysUTF16ToNSString(
|
||||
|
|
|
@ -48,12 +48,9 @@
|
|||
NSUserNotificationActivationTypeReplied) {
|
||||
notification->NotificationReplied([notif.response.string UTF8String]);
|
||||
} else {
|
||||
if (@available(macOS 10.10, *)) {
|
||||
if (notif.activationType ==
|
||||
NSUserNotificationActivationTypeAdditionalActionClicked) {
|
||||
notification->NotificationActivated(
|
||||
[notif additionalActivationAction]);
|
||||
}
|
||||
notification->NotificationActivated([notif additionalActivationAction]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,11 +21,10 @@ win.show()
|
|||
|
||||
### Alternatives on macOS
|
||||
|
||||
On macOS 10.9 Mavericks and newer, there's an alternative way to specify
|
||||
a chromeless window. Instead of setting `frame` to `false` which disables
|
||||
both the titlebar and window controls, you may want to have the title bar
|
||||
hidden and your content extend to the full window size, yet still preserve
|
||||
the window controls ("traffic lights") for standard window actions.
|
||||
There's an alternative way to specify a chromeless window.
|
||||
Instead of setting `frame` to `false` which disables both the titlebar and window controls,
|
||||
you may want to have the title bar hidden and your content extend to the full window size,
|
||||
yet still preserve the window controls ("traffic lights") for standard window actions.
|
||||
You can do so by specifying the `titleBarStyle` option:
|
||||
|
||||
#### `hidden`
|
||||
|
|
|
@ -7,7 +7,7 @@ rudimentary understanding of your operating system's command line client.
|
|||
|
||||
## Setting up macOS
|
||||
|
||||
> Electron supports Mac OS X 10.9 (and all versions named macOS) and up. Apple
|
||||
> Electron supports OS X Yosemite (version 10.10) and up. Apple
|
||||
does not allow running macOS in virtual machines unless the host computer is
|
||||
already an Apple computer, so if you find yourself in need of a Mac, consider
|
||||
using a cloud service that rents access to Macs (like [MacInCloud][macincloud]
|
||||
|
|
|
@ -61,7 +61,7 @@ Following platforms are supported by Electron:
|
|||
### macOS
|
||||
|
||||
Only 64bit binaries are provided for macOS, and the minimum macOS version
|
||||
supported is macOS 10.9.
|
||||
supported is OS X Yosemite (version 10.10).
|
||||
|
||||
### Windows
|
||||
|
||||
|
|
Loading…
Reference in a new issue