diff options
-rw-r--r-- | Interfaces/English.lproj/ConnectionView.xib | 4 | ||||
-rw-r--r-- | Source/SPConnectionController.m | 19 | ||||
-rw-r--r-- | Source/SPFunctions.h | 6 | ||||
-rw-r--r-- | Source/SPFunctions.m | 6 |
4 files changed, 31 insertions, 4 deletions
diff --git a/Interfaces/English.lproj/ConnectionView.xib b/Interfaces/English.lproj/ConnectionView.xib index 76fa2169..9e773a26 100644 --- a/Interfaces/English.lproj/ConnectionView.xib +++ b/Interfaces/English.lproj/ConnectionView.xib @@ -64,7 +64,7 @@ </customObject> <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> <customObject id="-3" userLabel="Application" customClass="NSObject"/> - <customView wantsLayer="YES" id="5739" userLabel="ConnectionView" customClass="SPFlippedView"> + <customView id="5739" userLabel="ConnectionView" customClass="SPFlippedView"> <rect key="frame" x="0.0" y="0.0" width="882" height="513"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <subviews> @@ -261,7 +261,7 @@ <rect key="frame" x="0.0" y="0.0" width="681" height="480"/> <autoresizingMask key="autoresizingMask" widthSizable="YES"/> <subviews> - <customView id="4888" customClass="NSCustomView"> + <customView wantsLayer="YES" id="4888" customClass="NSCustomView"> <rect key="frame" x="116" y="5" width="446" height="472"/> <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/> <subviews> diff --git a/Source/SPConnectionController.m b/Source/SPConnectionController.m index bb22a927..24298318 100644 --- a/Source/SPConnectionController.m +++ b/Source/SPConnectionController.m @@ -58,6 +58,7 @@ #endif #import "SPSplitView.h" #import "SPColorSelectorView.h" +#import "SPFunctions.h" #import <SPMySQL/SPMySQL.h> @@ -1931,8 +1932,15 @@ static NSComparisonResult _compareFavoritesUsingKey(id favorite1, id favorite2, [editButtonsView setAlphaValue:0.0f]; [editButtonsView setHidden:NO]; [editButtonsView setFrameOrigin:NSMakePoint([editButtonsView frame].origin.x, [editButtonsView frame].origin.y - 30)]; - [[editButtonsView animator] setFrameOrigin:NSMakePoint([editButtonsView frame].origin.x, [editButtonsView frame].origin.y + 30)]; - [[editButtonsView animator] setAlphaValue:1.0f]; + // The animation is started async because there is a bug/oddity with layer-backed views and animating frameOrigin (at least in 10.13): + // If both calls to -setFrameOrigin: are in the same method, CA would only animate the difference between those calls (which is 0 here). + // This works fine when not using layers, but then there is another issue with the progress indicator (#2903) + SPMainLoopAsync(^{ + [NSAnimationContext beginGrouping]; + [[editButtonsView animator] setFrameOrigin:NSMakePoint([editButtonsView frame].origin.x, [editButtonsView frame].origin.y + 30)]; + [[editButtonsView animator] setAlphaValue:1.0f]; + [NSAnimationContext endGrouping]; + }); // Update the "Save" button state as appropriate [saveFavoriteButton setEnabled:([self selectedFavorite] != nil)]; @@ -2975,6 +2983,13 @@ static NSComparisonResult _compareFavoritesUsingKey(id favorite1, id favorite2, // Otherwise, center else { connectionDetailsFrame.origin.y = (scrollViewFrame.size.height - connectionDetailsFrame.size.height)/3; + // the division may lead to values that are not valid for the current screen size (e.g. non-integer values on a + // @1x non-retina screen). The OS works something out when not using layer-backed views, but in the latter + // case the result will look like garbage if we don't fix this. + // This code is taken from Apple's "BlurryView" example code. + connectionDetailsFrame = [[connectionDetailsScrollView superview] convertRectToBase:connectionDetailsFrame]; + connectionDetailsFrame.origin.y = round(connectionDetailsFrame.origin.y); + connectionDetailsFrame = [[connectionDetailsScrollView superview] convertRectFromBase:connectionDetailsFrame]; [connectionResizeContainer setFrame:connectionDetailsFrame]; scrollDocumentFrame.size.height = scrollViewFrame.size.height; [[connectionDetailsScrollView documentView] setFrame:scrollDocumentFrame]; diff --git a/Source/SPFunctions.h b/Source/SPFunctions.h index 6a7845c0..ecbd09d6 100644 --- a/Source/SPFunctions.h +++ b/Source/SPFunctions.h @@ -36,6 +36,12 @@ void SPMainQSync(void (^block)(void)); /** + * Asynchronously execute a block on the main run loop. + * This function is equivalent to calling -[[NSRunLoop mainRunLoop] performBlock:] on 10.12+ + */ +void SPMainLoopAsync(void (^block)(void)); + +/** * Copies count bytes into buf provided by caller * @param buf Base address to copy to * @param count Number of bytes to copy diff --git a/Source/SPFunctions.m b/Source/SPFunctions.m index 461304e0..ca3462c4 100644 --- a/Source/SPFunctions.m +++ b/Source/SPFunctions.m @@ -42,6 +42,12 @@ void SPMainQSync(void (^block)(void)) } } +void SPMainLoopAsync(void (^block)(void)) +{ + NSArray *modes = @[NSDefaultRunLoopMode]; + CFRunLoopPerformBlock(CFRunLoopGetMain(), modes, block); +} + int SPBetterRandomBytes(uint8_t *buf, size_t count) { if([SPOSInfo isOSVersionAtLeastMajor:10 minor:7 patch:0]) { |