aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax <dmoagx@users.noreply.github.com>2018-04-20 23:31:57 +0200
committerMax <dmoagx@users.noreply.github.com>2018-04-20 23:31:57 +0200
commit85f37eba060a5ff5571738d8248c1cbc39d5c33b (patch)
tree89ecee2d72de665827129fd965805f0a105d9557
parent06380f97dc8ed247ca426be8d76a08cea2de1316 (diff)
downloadsequelpro-85f37eba060a5ff5571738d8248c1cbc39d5c33b.tar.gz
sequelpro-85f37eba060a5ff5571738d8248c1cbc39d5c33b.tar.bz2
sequelpro-85f37eba060a5ff5571738d8248c1cbc39d5c33b.zip
Fix issue with app beachballing when connecting from external URL (#2903)
Let’s hope this won’t break on older OS versions now…
-rw-r--r--Interfaces/English.lproj/ConnectionView.xib4
-rw-r--r--Source/SPConnectionController.m19
-rw-r--r--Source/SPFunctions.h6
-rw-r--r--Source/SPFunctions.m6
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]) {