1414#import " QSScreenshots.h"
1515#import " QSDonationController.h"
1616
17-
1817#import " QSIntValueTransformer.h"
1918
2019#import < PermissionsKit/PermissionsKit.h>
@@ -28,6 +27,7 @@ - (void)handleURL:(NSURL *)url;
2827
2928static QSController *defaultController = nil ;
3029
30+
3131@implementation QSController
3232
3333@synthesize crashReportPath;
@@ -834,23 +834,36 @@ -(void)checkForAccessibilityPermission {
834834}
835835
836836- (void )checkAccessibilityPermissions {
837+ [accessibilityPermissionWindow setLevel: NSNormalWindowLevel ];
838+
837839 // Prompt for accessibility permissions on macOS Mojave and later.
838840 BOOL hasAccessibility = [self hasAccessibilityPermission ];
839841 BOOL hasFullDisk = [MPPermissionsKit authorizationStatusForPermissionType: MPPermissionTypeFullDiskAccess] == MPAuthorizationStatusAuthorized;
840842 BOOL hasContacts = [MPPermissionsKit authorizationStatusForPermissionType: MPPermissionTypeContacts] == MPAuthorizationStatusAuthorized;
841843 BOOL hasCalendars = [MPPermissionsKit authorizationStatusForPermissionType: MPPermissionTypeCalendar] == MPAuthorizationStatusAuthorized;
842844 BOOL hasReminders = [MPPermissionsKit authorizationStatusForPermissionType: MPPermissionTypeReminders] == MPAuthorizationStatusAuthorized;
845+
846+ BOOL hasScreenshot;
847+ if (hasScreenshotPermissionOnStartup) {
848+ hasScreenshot = YES ;
849+ } else {
850+ // only call this if the user has actually clicked the screenshot button
851+ // this is a kind of hack, since the API for detecting if screenshot permission is enabled is buggy
852+ hasScreenshot = hasClickedScreenshotButton;
853+ }
854+
843855 [accessibilityButton setEnabled: !hasAccessibility];
844856 [fullDiskButton setEnabled: !hasFullDisk];
845857 [contactsButton setEnabled: !hasContacts];
846858 [calendarsButton setEnabled: !hasCalendars || !hasReminders];
859+ [screenshotButton setEnabled: !hasScreenshot];
847860
848861 [closeAccessibilityWindowButton setEnabled: (hasAccessibility && hasFullDisk)];
849862
850863 if (hasAccessibility && hasFullDisk && hasCalendars && hasContacts && hasReminders) {
851864 [accessibilityPermissionWindow close ];
852865 } else if (!accessibilityChecker) {
853- accessibilityChecker = [NSTimer scheduledTimerWithTimeInterval: 1 repeats: YES block: ^(NSTimer * _Nonnull timer) {
866+ accessibilityChecker = [NSTimer scheduledTimerWithTimeInterval: 0.5 repeats: YES block: ^(NSTimer * _Nonnull timer) {
854867 [self checkAccessibilityPermissions ];
855868 }];
856869 [[NSRunLoop currentRunLoop ] addTimer: accessibilityChecker forMode: NSModalPanelRunLoopMode ];
@@ -860,11 +873,16 @@ - (void)checkAccessibilityPermissions {
860873-(IBAction )showAccessibilityPrompt: (id )sender {
861874 [[NSNotificationCenter defaultCenter ] addObserver: self selector: @selector (closeAccessibilityPrompt: ) name: NSWindowWillCloseNotification object: accessibilityPermissionWindow];
862875 [closeAccessibilityWindowButton setEnabled: NO ];
863-
864876 [accessibilityPermissionWindow setIsVisible: YES ];
877+ hasClickedScreenshotButton = NO ;
878+ if (@available (macOS 10.15 , *)) {
879+ hasScreenshotPermissionOnStartup = CGPreflightScreenCaptureAccess ();
880+ } else {
881+ // below 10.15, no need to give permissions
882+ hasScreenshotPermissionOnStartup = YES ;
883+ }
865884 [self checkAccessibilityPermissions ];
866885 [NSApp runModalForWindow: accessibilityPermissionWindow];
867-
868886}
869887
870888- (IBAction )closeAccessibilityPrompt: (NSNotification *)notif {
@@ -892,7 +910,11 @@ -(IBAction)launchPrivacyPreferences:(id)sender {
892910 [MPPermissionsKit requestAuthorizationForPermissionType: MPPermissionTypeReminders withCompletion: ^(MPAuthorizationStatus status) {
893911 }];
894912 }];
895-
913+ } else if (sender == screenshotButton) {
914+ hasClickedScreenshotButton = YES ;
915+ if (@available (macOS 10.15 , *)) {
916+ CGRequestScreenCaptureAccess ();
917+ }
896918 } else {
897919 [accessibilityPermissionWindow close ];
898920 }
0 commit comments