mirror of
https://github.com/MacPass/MacPass.git
synced 2026-02-01 10:08:25 +00:00
Merge branch 'refs/heads/master' into feature/import_plugins
This commit is contained in:
2
.github/FUNDING.yml
vendored
Normal file
2
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
github: mstarke
|
||||||
|
custom: https://flattr.com/thing/1550529/mstarkeMacPass-on-GitHub
|
||||||
11
.travis.yml
11
.travis.yml
@@ -8,6 +8,16 @@ before_install:
|
|||||||
- gem install xcpretty --no-document --quiet
|
- gem install xcpretty --no-document --quiet
|
||||||
|
|
||||||
after_success:
|
after_success:
|
||||||
|
- xcodebuild -project MacPass.xcodeproj -exportLocalizations -localizationPath Localisations -exportLanguage de
|
||||||
|
- xcodebuild -project MacPass.xcodeproj -exportLocalizations -localizationPath Localisations -exportLanguage en
|
||||||
|
- xcodebuild -project MacPass.xcodeproj -exportLocalizations -localizationPath Localisations -exportLanguage es
|
||||||
|
- xcodebuild -project MacPass.xcodeproj -exportLocalizations -localizationPath Localisations -exportLanguage fr
|
||||||
|
- xcodebuild -project MacPass.xcodeproj -exportLocalizations -localizationPath Localisations -exportLanguage it
|
||||||
|
- xcodebuild -project MacPass.xcodeproj -exportLocalizations -localizationPath Localisations -exportLanguage nl
|
||||||
|
- xcodebuild -project MacPass.xcodeproj -exportLocalizations -localizationPath Localisations -exportLanguage ru
|
||||||
|
- xcodebuild -project MacPass.xcodeproj -exportLocalizations -localizationPath Localisations -exportLanguage sv-SE
|
||||||
|
- xcodebuild -project MacPass.xcodeproj -exportLocalizations -localizationPath Localisations -exportLanguage zh-Hans
|
||||||
|
- zip -9ry Localisations.zip Localisations
|
||||||
- cd ./build/Build/Products/Release
|
- cd ./build/Build/Products/Release
|
||||||
- zip -9ry MacPass-continuous.zip MacPass.app
|
- zip -9ry MacPass-continuous.zip MacPass.app
|
||||||
- shasum -a 256 MacPass-continuous.zip > MacPass-continuous.zip.sha256
|
- shasum -a 256 MacPass-continuous.zip > MacPass-continuous.zip.sha256
|
||||||
@@ -30,6 +40,7 @@ deploy:
|
|||||||
api_key:
|
api_key:
|
||||||
secure: AEb7fgi29S3aXFt5bXz+lq1KHISumny6bf4j06JBC5gUrSs+dW0/tmVFq68XRAqigeOQU31wwv20f7OHiy+GRYDXM2xBsX9ZBQ2IilnaXlDy/mPsNcJJJsZ2gyodi3KnU0rZtTb93me2YyU86H4Na/gtaZZUKjLwCFtGGziExD8=
|
secure: AEb7fgi29S3aXFt5bXz+lq1KHISumny6bf4j06JBC5gUrSs+dW0/tmVFq68XRAqigeOQU31wwv20f7OHiy+GRYDXM2xBsX9ZBQ2IilnaXlDy/mPsNcJJJsZ2gyodi3KnU0rZtTb93me2YyU86H4Na/gtaZZUKjLwCFtGGziExD8=
|
||||||
file:
|
file:
|
||||||
|
- Localisations.zip
|
||||||
- MacPass-continuous.zip
|
- MacPass-continuous.zip
|
||||||
- MacPass-continuous.zip.sha256
|
- MacPass-continuous.zip.sha256
|
||||||
overwrite: true
|
overwrite: true
|
||||||
|
|||||||
2
Cartfile
2
Cartfile
@@ -1,3 +1,3 @@
|
|||||||
github "sparkle-project/Sparkle" ~> 1.18.1
|
github "sparkle-project/Sparkle" ~> 1.22
|
||||||
github "MacPass/KeePassKit" ~> 2.4
|
github "MacPass/KeePassKit" ~> 2.4
|
||||||
github "mstarke/HNHUi" ~> 3.0
|
github "mstarke/HNHUi" ~> 3.0
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
github "MacPass/KeePassKit" "2.4.7"
|
github "MacPass/KeePassKit" "2.4.7"
|
||||||
github "mstarke/HNHUi" "3.0"
|
github "mstarke/HNHUi" "3.0"
|
||||||
github "robbiehanson/KissXML" "5.2.3"
|
github "robbiehanson/KissXML" "5.2.3"
|
||||||
github "sparkle-project/Sparkle" "1.20.0"
|
github "sparkle-project/Sparkle" "1.22.0"
|
||||||
|
|||||||
@@ -721,6 +721,7 @@
|
|||||||
4C8DEAA11C314D2C00D24C32 /* MPTestAutotypeDelay.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPTestAutotypeDelay.m; sourceTree = "<group>"; };
|
4C8DEAA11C314D2C00D24C32 /* MPTestAutotypeDelay.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPTestAutotypeDelay.m; sourceTree = "<group>"; };
|
||||||
4C8E889122C223620002C7C8 /* createdTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = createdTemplate.pdf; sourceTree = "<group>"; };
|
4C8E889122C223620002C7C8 /* createdTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = createdTemplate.pdf; sourceTree = "<group>"; };
|
||||||
4C8E889322C227270002C7C8 /* plugins.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = plugins.json; path = Resources/plugins.json; sourceTree = "<group>"; };
|
4C8E889322C227270002C7C8 /* plugins.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = plugins.json; path = Resources/plugins.json; sourceTree = "<group>"; };
|
||||||
|
4C8EAF20236720090025CC00 /* MacPass.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = MacPass.entitlements; sourceTree = "<group>"; };
|
||||||
4C8F0C6C1FCEE98900BE157F /* MPPluginConstants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPPluginConstants.h; sourceTree = "<group>"; };
|
4C8F0C6C1FCEE98900BE157F /* MPPluginConstants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPPluginConstants.h; sourceTree = "<group>"; };
|
||||||
4C8F0C6D1FCEE9B900BE157F /* MPPluginConstants.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPPluginConstants.m; sourceTree = "<group>"; };
|
4C8F0C6D1FCEE9B900BE157F /* MPPluginConstants.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPPluginConstants.m; sourceTree = "<group>"; };
|
||||||
4C8F0C6F1FCEF91400BE157F /* MPPickcharsParser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPPickcharsParser.h; sourceTree = "<group>"; };
|
4C8F0C6F1FCEF91400BE157F /* MPPickcharsParser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPPickcharsParser.h; sourceTree = "<group>"; };
|
||||||
@@ -733,6 +734,7 @@
|
|||||||
4C97CCEF1FA727DC00E58F8C /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
|
4C97CCEF1FA727DC00E58F8C /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||||
4C9BFFF91FD19B5400264B16 /* MPPrettyPasswordTransformer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPPrettyPasswordTransformer.h; sourceTree = "<group>"; };
|
4C9BFFF91FD19B5400264B16 /* MPPrettyPasswordTransformer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPPrettyPasswordTransformer.h; sourceTree = "<group>"; };
|
||||||
4C9BFFFA1FD19B5400264B16 /* MPPrettyPasswordTransformer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPPrettyPasswordTransformer.m; sourceTree = "<group>"; };
|
4C9BFFFA1FD19B5400264B16 /* MPPrettyPasswordTransformer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPPrettyPasswordTransformer.m; sourceTree = "<group>"; };
|
||||||
|
4C9FE47423703DA50096A5EA /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||||
4CA08D9E17A831B200A6544B /* MPAddEntryContextMenuDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAddEntryContextMenuDelegate.h; sourceTree = "<group>"; };
|
4CA08D9E17A831B200A6544B /* MPAddEntryContextMenuDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAddEntryContextMenuDelegate.h; sourceTree = "<group>"; };
|
||||||
4CA08D9F17A831B200A6544B /* MPAddEntryContextMenuDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAddEntryContextMenuDelegate.m; sourceTree = "<group>"; };
|
4CA08D9F17A831B200A6544B /* MPAddEntryContextMenuDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAddEntryContextMenuDelegate.m; sourceTree = "<group>"; };
|
||||||
4CA0B2EC15BCADAC00654E32 /* PreferencesWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PreferencesWindow.xib; sourceTree = "<group>"; };
|
4CA0B2EC15BCADAC00654E32 /* PreferencesWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PreferencesWindow.xib; sourceTree = "<group>"; };
|
||||||
@@ -955,9 +957,9 @@
|
|||||||
7837112B22553B1D009BD28D /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/AutotypeBuilderView.strings; sourceTree = "<group>"; };
|
7837112B22553B1D009BD28D /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/AutotypeBuilderView.strings; sourceTree = "<group>"; };
|
||||||
7837112D225540D1009BD28D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/PluginRepositoryBrowserView.xib; sourceTree = "<group>"; };
|
7837112D225540D1009BD28D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/PluginRepositoryBrowserView.xib; sourceTree = "<group>"; };
|
||||||
78371130225540D8009BD28D /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/PluginRepositoryBrowserView.strings; sourceTree = "<group>"; };
|
78371130225540D8009BD28D /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/PluginRepositoryBrowserView.strings; sourceTree = "<group>"; };
|
||||||
|
78C093DB236A18560008577C /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/AutotypeDoctorReportViewController.strings; sourceTree = "<group>"; };
|
||||||
78E1F8AF22E3A3DF00E738AE /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/IntegrationPreferences.strings; sourceTree = "<group>"; };
|
78E1F8AF22E3A3DF00E738AE /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/IntegrationPreferences.strings; sourceTree = "<group>"; };
|
||||||
78E1F8B122E3A5D600E738AE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/AutotypeDoctorReportViewController.xib; sourceTree = "<group>"; };
|
78E1F8B122E3A5D600E738AE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/AutotypeDoctorReportViewController.xib; sourceTree = "<group>"; };
|
||||||
78E1F8B422E3A5DB00E738AE /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/AutotypeDoctorReportViewController.strings; sourceTree = "<group>"; };
|
|
||||||
78E1F8B822E3B06700E738AE /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/PickcharsView.strings; sourceTree = "<group>"; };
|
78E1F8B822E3B06700E738AE /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/PickcharsView.strings; sourceTree = "<group>"; };
|
||||||
78E1F8BA22E3B0B700E738AE /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/PickfieldView.strings; sourceTree = "<group>"; };
|
78E1F8BA22E3B0B700E738AE /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/PickfieldView.strings; sourceTree = "<group>"; };
|
||||||
78E1F8BC22E3B12300E738AE /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/OpenPanelAccessoryView.strings; sourceTree = "<group>"; };
|
78E1F8BC22E3B12300E738AE /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/OpenPanelAccessoryView.strings; sourceTree = "<group>"; };
|
||||||
@@ -1512,6 +1514,7 @@
|
|||||||
4C77E36D15B84A240093A587 /* Supporting Files */ = {
|
4C77E36D15B84A240093A587 /* Supporting Files */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
4C8EAF20236720090025CC00 /* MacPass.entitlements */,
|
||||||
4C8E889322C227270002C7C8 /* plugins.json */,
|
4C8E889322C227270002C7C8 /* plugins.json */,
|
||||||
FA13910A1F9CD9EB0033D256 /* Localizable.stringsdict */,
|
FA13910A1F9CD9EB0033D256 /* Localizable.stringsdict */,
|
||||||
4C888C8E16EB6C91003D34A1 /* Localizable.strings */,
|
4C888C8E16EB6C91003D34A1 /* Localizable.strings */,
|
||||||
@@ -1992,13 +1995,15 @@
|
|||||||
files = (
|
files = (
|
||||||
);
|
);
|
||||||
inputPaths = (
|
inputPaths = (
|
||||||
|
"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}",
|
||||||
|
"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
|
||||||
);
|
);
|
||||||
name = Versioning;
|
name = Versioning;
|
||||||
outputPaths = (
|
outputPaths = (
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "git=`sh /etc/profile; which git`\n#branch_name=`$git symbolic-ref HEAD | sed -e 's,refs/heads/\\\\(.*\\\\),\\\\1,'`\nbranch_name=`$git rev-parse --abbrev-ref HEAD`\n#simple_branch_name=`$git rev-parse --abbrev-ref HEAD`\ngit_count=`$git rev-list $branch_name |wc -l | sed 's/^ *//;s/ *$//'`\n\nbuild_number=\"${git_count}0\"\nif [ $CONFIGURATION != \"Release\" ] || [ $branch_name != \"master\" ]; then\nbuild_number+=\"-$branch_name\"\nfi\nif [ \"$CI\" = \"true\" ]; then\nbuild_date=`date +\"%Y%m%d%H%m%S\"`\nbuild_number=\"$build_date-continuous\"\nfi\n\nplist=\"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}\"\ndsym_plist=\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist\"\n\n/usr/libexec/PlistBuddy -c \"Set :CFBundleVersion $build_number\" \"$plist\"\nif [ -f \"$DSYM_INFO_PLIST\" ] ; then\n/usr/libexec/PlistBuddy -c \"Set :CFBundleVersion $build_number\" \"$dsym_plist\"\nfi\n";
|
shellScript = "git=`sh /etc/profile; which git`\nbranch_name=`$git rev-parse --abbrev-ref HEAD`\ngit_count=`$git rev-list $branch_name |wc -l | sed 's/^ *//;s/ *$//'`\n\nbuild_number=\"${git_count}0\"\nif [ $CONFIGURATION != \"Release\" ] || [ $branch_name != \"master\" ]; then\nbuild_number+=\"-$branch_name\"\nfi\nif [ \"$CI\" = \"true\" ]; then\nbuild_date=`date +\"%Y%m%d%H%m%S\"`\nbuild_number=\"$build_date-continuous\"\nfi\n\nplist=\"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}\"\ndsym_plist=\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist\"\n\n/usr/libexec/PlistBuddy -c \"Set :CFBundleVersion $build_number\" \"$plist\"\nif [ -f \"$DSYM_INFO_PLIST\" ] ; then\n/usr/libexec/PlistBuddy -c \"Set :CFBundleVersion $build_number\" \"$dsym_plist\"\nfi\n";
|
||||||
showEnvVarsInLog = 0;
|
showEnvVarsInLog = 0;
|
||||||
};
|
};
|
||||||
/* End PBXShellScriptBuildPhase section */
|
/* End PBXShellScriptBuildPhase section */
|
||||||
@@ -2367,6 +2372,7 @@
|
|||||||
4C4161151F50333C003BC0AF /* es */,
|
4C4161151F50333C003BC0AF /* es */,
|
||||||
FAA9109A1F9A95A500F7CB90 /* pl */,
|
FAA9109A1F9A95A500F7CB90 /* pl */,
|
||||||
6A74B07C2076F4B60049BC29 /* sv-SE */,
|
6A74B07C2076F4B60049BC29 /* sv-SE */,
|
||||||
|
4C9FE47423703DA50096A5EA /* en */,
|
||||||
);
|
);
|
||||||
name = InfoPlist.strings;
|
name = InfoPlist.strings;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -2651,10 +2657,10 @@
|
|||||||
isa = PBXVariantGroup;
|
isa = PBXVariantGroup;
|
||||||
children = (
|
children = (
|
||||||
78E1F8B122E3A5D600E738AE /* Base */,
|
78E1F8B122E3A5D600E738AE /* Base */,
|
||||||
78E1F8B422E3A5DB00E738AE /* ru */,
|
|
||||||
4C1888CF230FBC080054A38F /* de */,
|
4C1888CF230FBC080054A38F /* de */,
|
||||||
71FF7A27230FEF6B002F488F /* it */,
|
71FF7A27230FEF6B002F488F /* it */,
|
||||||
ABE8662F2316617500201125 /* zh-Hans */,
|
ABE8662F2316617500201125 /* zh-Hans */,
|
||||||
|
78C093DB236A18560008577C /* ru */,
|
||||||
);
|
);
|
||||||
name = AutotypeDoctorReportViewController.xib;
|
name = AutotypeDoctorReportViewController.xib;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -2787,7 +2793,7 @@
|
|||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
CODE_SIGN_IDENTITY = "";
|
CODE_SIGN_IDENTITY = "";
|
||||||
COPY_PHASE_STRIP = NO;
|
COPY_PHASE_STRIP = NO;
|
||||||
CURRENT_PROJECT_VERSION = 0.7.9;
|
CURRENT_PROJECT_VERSION = 0.7.11;
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
ENABLE_TESTABILITY = YES;
|
ENABLE_TESTABILITY = YES;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||||
@@ -2842,7 +2848,7 @@
|
|||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
CODE_SIGN_IDENTITY = "";
|
CODE_SIGN_IDENTITY = "";
|
||||||
COPY_PHASE_STRIP = YES;
|
COPY_PHASE_STRIP = YES;
|
||||||
CURRENT_PROJECT_VERSION = 0.7.9;
|
CURRENT_PROJECT_VERSION = 0.7.11;
|
||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
<connections>
|
<connections>
|
||||||
<outlet property="accessibiltyStatusImageView" destination="Xzw-kJ-WoH" id="jEb-0z-dNB"/>
|
<outlet property="accessibiltyStatusImageView" destination="Xzw-kJ-WoH" id="jEb-0z-dNB"/>
|
||||||
<outlet property="accessibiltyStatusTextField" destination="Pqa-Ff-7cc" id="h5M-ZN-GhR"/>
|
<outlet property="accessibiltyStatusTextField" destination="Pqa-Ff-7cc" id="h5M-ZN-GhR"/>
|
||||||
|
<outlet property="requestScreenRecordingButton" destination="d5Z-hD-bpr" id="gS2-vu-2zM"/>
|
||||||
<outlet property="screenRecordingStatusImageView" destination="vvZ-Lj-v22" id="7h0-cF-Mxt"/>
|
<outlet property="screenRecordingStatusImageView" destination="vvZ-Lj-v22" id="7h0-cF-Mxt"/>
|
||||||
<outlet property="screenRecordingStatusTextField" destination="IP0-CP-tlA" id="AfL-XZ-KRk"/>
|
<outlet property="screenRecordingStatusTextField" destination="IP0-CP-tlA" id="AfL-XZ-KRk"/>
|
||||||
<outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
|
<outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
|
||||||
@@ -18,27 +19,15 @@
|
|||||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||||
<customView id="Hz6-mo-xeY">
|
<customView id="Hz6-mo-xeY">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="400" height="375"/>
|
<rect key="frame" x="0.0" y="0.0" width="400" height="469"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<stackView orientation="horizontal" alignment="top" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" translatesAutoresizingMaskIntoConstraints="NO" id="T2c-ZD-ioV">
|
|
||||||
<rect key="frame" x="20" y="20" width="360" height="0.0"/>
|
|
||||||
<beginningViews>
|
|
||||||
<stackView orientation="vertical" alignment="leading" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ErP-eL-yKu"/>
|
|
||||||
</beginningViews>
|
|
||||||
<visibilityPriorities>
|
|
||||||
<integer value="1000"/>
|
|
||||||
</visibilityPriorities>
|
|
||||||
<customSpacing>
|
|
||||||
<real value="3.4028234663852886e+38"/>
|
|
||||||
</customSpacing>
|
|
||||||
</stackView>
|
|
||||||
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Xzw-kJ-WoH">
|
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Xzw-kJ-WoH">
|
||||||
<rect key="frame" x="20" y="339" width="16" height="16"/>
|
<rect key="frame" x="20" y="433" width="16" height="16"/>
|
||||||
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSStatusAvailable" id="DWu-HI-z3k"/>
|
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSStatusAvailable" id="DWu-HI-z3k"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Pqa-Ff-7cc">
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Pqa-Ff-7cc">
|
||||||
<rect key="frame" x="42" y="338" width="80" height="17"/>
|
<rect key="frame" x="42" y="432" width="80" height="17"/>
|
||||||
<textFieldCell key="cell" lineBreakMode="clipping" title="Accessibility" id="aIL-8W-63g">
|
<textFieldCell key="cell" lineBreakMode="clipping" title="Accessibility" id="aIL-8W-63g">
|
||||||
<font key="font" metaFont="system"/>
|
<font key="font" metaFont="system"/>
|
||||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||||
@@ -46,7 +35,7 @@
|
|||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
</textField>
|
</textField>
|
||||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" verticalCompressionResistancePriority="751" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hY9-T0-hke">
|
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" verticalCompressionResistancePriority="751" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hY9-T0-hke">
|
||||||
<rect key="frame" x="42" y="274" width="340" height="56"/>
|
<rect key="frame" x="42" y="368" width="340" height="56"/>
|
||||||
<textFieldCell key="cell" controlSize="small" selectable="YES" id="6GI-KJ-Xue">
|
<textFieldCell key="cell" controlSize="small" selectable="YES" id="6GI-KJ-Xue">
|
||||||
<font key="font" metaFont="smallSystem"/>
|
<font key="font" metaFont="smallSystem"/>
|
||||||
<string key="title">MacPass will send key press events to the system when Autotype or Global Autotype is executed. Since macOS 10.14 Mojave this is only possible, if Accessibility permissions are granted to the application.</string>
|
<string key="title">MacPass will send key press events to the system when Autotype or Global Autotype is executed. Since macOS 10.14 Mojave this is only possible, if Accessibility permissions are granted to the application.</string>
|
||||||
@@ -55,7 +44,7 @@
|
|||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
</textField>
|
</textField>
|
||||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="x9d-0h-hyJ">
|
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="x9d-0h-hyJ">
|
||||||
<rect key="frame" x="38" y="226" width="236" height="32"/>
|
<rect key="frame" x="38" y="320" width="236" height="32"/>
|
||||||
<buttonCell key="cell" type="push" title="Open Accessibilty Preferences…" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="8m1-vs-pd5">
|
<buttonCell key="cell" type="push" title="Open Accessibilty Preferences…" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="8m1-vs-pd5">
|
||||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||||
<font key="font" metaFont="system"/>
|
<font key="font" metaFont="system"/>
|
||||||
@@ -65,11 +54,11 @@
|
|||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="vvZ-Lj-v22">
|
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="vvZ-Lj-v22">
|
||||||
<rect key="frame" x="20" y="188" width="16" height="16"/>
|
<rect key="frame" x="20" y="282" width="16" height="16"/>
|
||||||
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSStatusAvailable" id="kCX-CB-5vQ"/>
|
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSStatusAvailable" id="kCX-CB-5vQ"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" verticalCompressionResistancePriority="751" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="6vq-iM-inn">
|
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" verticalCompressionResistancePriority="751" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="6vq-iM-inn">
|
||||||
<rect key="frame" x="42" y="81" width="340" height="98"/>
|
<rect key="frame" x="42" y="175" width="340" height="98"/>
|
||||||
<textFieldCell key="cell" controlSize="small" selectable="YES" id="7of-1z-Nfk">
|
<textFieldCell key="cell" controlSize="small" selectable="YES" id="7of-1z-Nfk">
|
||||||
<font key="font" metaFont="smallSystem"/>
|
<font key="font" metaFont="smallSystem"/>
|
||||||
<string key="title">MacPass will read every window title when Global Autotype is executed to find a match. Since macOS 10.15 Catalina it is not possible to read any window title, if the user has not granted permissions to record the screen. If you are running macOS 10.15 or higher, MacPass will check if it can read every window title of currently visible windows. This test will not read the actual title. The titles aren't stored or processed in any way.</string>
|
<string key="title">MacPass will read every window title when Global Autotype is executed to find a match. Since macOS 10.15 Catalina it is not possible to read any window title, if the user has not granted permissions to record the screen. If you are running macOS 10.15 or higher, MacPass will check if it can read every window title of currently visible windows. This test will not read the actual title. The titles aren't stored or processed in any way.</string>
|
||||||
@@ -77,8 +66,38 @@
|
|||||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
</textField>
|
</textField>
|
||||||
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="IP0-CP-tlA">
|
||||||
|
<rect key="frame" x="42" y="281" width="112" height="17"/>
|
||||||
|
<textFieldCell key="cell" lineBreakMode="clipping" title="Screen Recording" id="9gr-mz-2I4">
|
||||||
|
<font key="font" metaFont="system"/>
|
||||||
|
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
</textFieldCell>
|
||||||
|
</textField>
|
||||||
|
<box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="BHb-cd-Q0r">
|
||||||
|
<rect key="frame" x="20" y="304" width="360" height="5"/>
|
||||||
|
</box>
|
||||||
|
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="d5Z-hD-bpr">
|
||||||
|
<rect key="frame" x="38" y="127" width="177" height="32"/>
|
||||||
|
<buttonCell key="cell" type="push" title="Request Permissions…" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="1Nx-Cg-TCn">
|
||||||
|
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||||
|
<font key="font" metaFont="system"/>
|
||||||
|
</buttonCell>
|
||||||
|
<connections>
|
||||||
|
<action selector="requestScreenRecordingPermissions:" target="-2" id="dvF-Aw-j5Q"/>
|
||||||
|
</connections>
|
||||||
|
</button>
|
||||||
|
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" preferredMaxLayoutWidth="336" translatesAutoresizingMaskIntoConstraints="NO" id="cu4-Jq-eaS">
|
||||||
|
<rect key="frame" x="42" y="84" width="340" height="42"/>
|
||||||
|
<textFieldCell key="cell" selectable="YES" id="Mhg-rd-1hK">
|
||||||
|
<font key="font" metaFont="smallSystem"/>
|
||||||
|
<string key="title">To request Screen Recording permissions, MacPass will try to capture a 1 by 1 Pixel sized screenshot of the top left part of your screen. The data is not stored nor processed in any way.</string>
|
||||||
|
<color key="textColor" name="secondaryLabelColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
</textFieldCell>
|
||||||
|
</textField>
|
||||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="dek-ho-dPm">
|
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="dek-ho-dPm">
|
||||||
<rect key="frame" x="38" y="33" width="271" height="32"/>
|
<rect key="frame" x="38" y="48" width="271" height="32"/>
|
||||||
<buttonCell key="cell" type="push" title="Open Screen Recording Preferences…" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="lgB-Ys-L9R">
|
<buttonCell key="cell" type="push" title="Open Screen Recording Preferences…" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="lgB-Ys-L9R">
|
||||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||||
<font key="font" metaFont="system"/>
|
<font key="font" metaFont="system"/>
|
||||||
@@ -87,49 +106,41 @@
|
|||||||
<action selector="openScreenRecordingPreferences:" target="-2" id="rvE-ff-sR2"/>
|
<action selector="openScreenRecordingPreferences:" target="-2" id="rvE-ff-sR2"/>
|
||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="IP0-CP-tlA">
|
|
||||||
<rect key="frame" x="42" y="187" width="112" height="17"/>
|
|
||||||
<textFieldCell key="cell" lineBreakMode="clipping" title="Screen Recording" id="9gr-mz-2I4">
|
|
||||||
<font key="font" metaFont="system"/>
|
|
||||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
|
||||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
|
||||||
</textFieldCell>
|
|
||||||
</textField>
|
|
||||||
<box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="BHb-cd-Q0r">
|
|
||||||
<rect key="frame" x="20" y="210" width="360" height="5"/>
|
|
||||||
</box>
|
|
||||||
</subviews>
|
</subviews>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstItem="IP0-CP-tlA" firstAttribute="top" secondItem="BHb-cd-Q0r" secondAttribute="bottom" constant="8" symbolic="YES" id="0sS-li-mx4"/>
|
<constraint firstItem="IP0-CP-tlA" firstAttribute="top" secondItem="BHb-cd-Q0r" secondAttribute="bottom" constant="8" symbolic="YES" id="0sS-li-mx4"/>
|
||||||
|
<constraint firstItem="d5Z-hD-bpr" firstAttribute="top" secondItem="6vq-iM-inn" secondAttribute="bottom" constant="20" symbolic="YES" id="1SD-9R-lf0"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="hY9-T0-hke" secondAttribute="trailing" constant="20" symbolic="YES" id="1lC-Hg-bzq"/>
|
<constraint firstAttribute="trailing" secondItem="hY9-T0-hke" secondAttribute="trailing" constant="20" symbolic="YES" id="1lC-Hg-bzq"/>
|
||||||
<constraint firstItem="vvZ-Lj-v22" firstAttribute="leading" secondItem="Xzw-kJ-WoH" secondAttribute="leading" id="2ZC-Uf-Pe3"/>
|
<constraint firstItem="vvZ-Lj-v22" firstAttribute="leading" secondItem="Xzw-kJ-WoH" secondAttribute="leading" id="2ZC-Uf-Pe3"/>
|
||||||
<constraint firstItem="vvZ-Lj-v22" firstAttribute="centerY" secondItem="IP0-CP-tlA" secondAttribute="centerY" id="2t3-9h-RIf"/>
|
<constraint firstItem="vvZ-Lj-v22" firstAttribute="centerY" secondItem="IP0-CP-tlA" secondAttribute="centerY" id="2t3-9h-RIf"/>
|
||||||
<constraint firstItem="Pqa-Ff-7cc" firstAttribute="leading" secondItem="Xzw-kJ-WoH" secondAttribute="trailing" constant="8" symbolic="YES" id="57a-U7-goz"/>
|
<constraint firstItem="Pqa-Ff-7cc" firstAttribute="leading" secondItem="Xzw-kJ-WoH" secondAttribute="trailing" constant="8" symbolic="YES" id="57a-U7-goz"/>
|
||||||
<constraint firstItem="6vq-iM-inn" firstAttribute="top" secondItem="IP0-CP-tlA" secondAttribute="bottom" constant="8" symbolic="YES" id="5ag-ah-YEW"/>
|
<constraint firstItem="6vq-iM-inn" firstAttribute="top" secondItem="IP0-CP-tlA" secondAttribute="bottom" constant="8" symbolic="YES" id="5ag-ah-YEW"/>
|
||||||
|
<constraint firstItem="dek-ho-dPm" firstAttribute="leading" secondItem="6vq-iM-inn" secondAttribute="leading" id="6Zj-Te-qHt"/>
|
||||||
|
<constraint firstItem="cu4-Jq-eaS" firstAttribute="leading" secondItem="6vq-iM-inn" secondAttribute="leading" id="A1C-96-raA"/>
|
||||||
<constraint firstItem="x9d-0h-hyJ" firstAttribute="top" secondItem="hY9-T0-hke" secondAttribute="bottom" constant="20" symbolic="YES" id="Avt-sj-8GL"/>
|
<constraint firstItem="x9d-0h-hyJ" firstAttribute="top" secondItem="hY9-T0-hke" secondAttribute="bottom" constant="20" symbolic="YES" id="Avt-sj-8GL"/>
|
||||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="Pqa-Ff-7cc" secondAttribute="trailing" constant="20" symbolic="YES" id="Bmg-tH-M7Q"/>
|
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="Pqa-Ff-7cc" secondAttribute="trailing" constant="20" symbolic="YES" id="Bmg-tH-M7Q"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="6vq-iM-inn" secondAttribute="trailing" constant="20" symbolic="YES" id="Cga-EU-fSf"/>
|
<constraint firstAttribute="trailing" secondItem="6vq-iM-inn" secondAttribute="trailing" constant="20" symbolic="YES" id="Cga-EU-fSf"/>
|
||||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="x9d-0h-hyJ" secondAttribute="trailing" constant="20" symbolic="YES" id="D8o-Gu-s2Y"/>
|
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="x9d-0h-hyJ" secondAttribute="trailing" constant="20" symbolic="YES" id="D8o-Gu-s2Y"/>
|
||||||
<constraint firstItem="T2c-ZD-ioV" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="G27-G3-ORS"/>
|
<constraint firstItem="dek-ho-dPm" firstAttribute="top" secondItem="cu4-Jq-eaS" secondAttribute="bottom" constant="8" symbolic="YES" id="EH9-BF-LGO"/>
|
||||||
<constraint firstItem="T2c-ZD-ioV" firstAttribute="top" relation="greaterThanOrEqual" secondItem="dek-ho-dPm" secondAttribute="bottom" constant="20" symbolic="YES" id="GL8-gK-2fL"/>
|
|
||||||
<constraint firstItem="x9d-0h-hyJ" firstAttribute="leading" secondItem="Pqa-Ff-7cc" secondAttribute="leading" id="J4Y-VM-MZt"/>
|
<constraint firstItem="x9d-0h-hyJ" firstAttribute="leading" secondItem="Pqa-Ff-7cc" secondAttribute="leading" id="J4Y-VM-MZt"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="T2c-ZD-ioV" secondAttribute="trailing" constant="20" symbolic="YES" id="M4d-KM-mLN"/>
|
<constraint firstAttribute="trailing" secondItem="cu4-Jq-eaS" secondAttribute="trailing" constant="20" symbolic="YES" id="Mvl-zI-d9a"/>
|
||||||
<constraint firstItem="dek-ho-dPm" firstAttribute="leading" secondItem="6vq-iM-inn" secondAttribute="leading" id="TaR-vo-kBx"/>
|
|
||||||
<constraint firstItem="BHb-cd-Q0r" firstAttribute="top" secondItem="x9d-0h-hyJ" secondAttribute="bottom" constant="20" symbolic="YES" id="TlD-dn-LEm"/>
|
<constraint firstItem="BHb-cd-Q0r" firstAttribute="top" secondItem="x9d-0h-hyJ" secondAttribute="bottom" constant="20" symbolic="YES" id="TlD-dn-LEm"/>
|
||||||
<constraint firstItem="BHb-cd-Q0r" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="YdV-6E-JaO"/>
|
<constraint firstItem="BHb-cd-Q0r" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="YdV-6E-JaO"/>
|
||||||
<constraint firstItem="IP0-CP-tlA" firstAttribute="leading" secondItem="Pqa-Ff-7cc" secondAttribute="leading" id="c76-Ak-WXw"/>
|
<constraint firstItem="IP0-CP-tlA" firstAttribute="leading" secondItem="Pqa-Ff-7cc" secondAttribute="leading" id="c76-Ak-WXw"/>
|
||||||
<constraint firstItem="Xzw-kJ-WoH" firstAttribute="centerY" secondItem="Pqa-Ff-7cc" secondAttribute="centerY" id="dF3-uj-K2q"/>
|
<constraint firstItem="Xzw-kJ-WoH" firstAttribute="centerY" secondItem="Pqa-Ff-7cc" secondAttribute="centerY" id="dF3-uj-K2q"/>
|
||||||
<constraint firstItem="Pqa-Ff-7cc" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" constant="20" symbolic="YES" id="eyJ-B0-kI3"/>
|
<constraint firstItem="Pqa-Ff-7cc" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" constant="20" symbolic="YES" id="eyJ-B0-kI3"/>
|
||||||
<constraint firstItem="dek-ho-dPm" firstAttribute="top" secondItem="6vq-iM-inn" secondAttribute="bottom" constant="20" symbolic="YES" id="i0R-gb-coZ"/>
|
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="d5Z-hD-bpr" secondAttribute="trailing" constant="20" symbolic="YES" id="hEn-cJ-Ymz"/>
|
||||||
|
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="dek-ho-dPm" secondAttribute="trailing" constant="20" symbolic="YES" id="jIb-UJ-efk"/>
|
||||||
<constraint firstItem="hY9-T0-hke" firstAttribute="leading" secondItem="Pqa-Ff-7cc" secondAttribute="leading" id="kLD-8A-d1Y"/>
|
<constraint firstItem="hY9-T0-hke" firstAttribute="leading" secondItem="Pqa-Ff-7cc" secondAttribute="leading" id="kLD-8A-d1Y"/>
|
||||||
|
<constraint firstItem="cu4-Jq-eaS" firstAttribute="top" secondItem="d5Z-hD-bpr" secondAttribute="bottom" constant="8" symbolic="YES" id="nRl-Zo-yCx"/>
|
||||||
<constraint firstItem="6vq-iM-inn" firstAttribute="leading" secondItem="IP0-CP-tlA" secondAttribute="leading" id="nby-S7-orD"/>
|
<constraint firstItem="6vq-iM-inn" firstAttribute="leading" secondItem="IP0-CP-tlA" secondAttribute="leading" id="nby-S7-orD"/>
|
||||||
|
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="IP0-CP-tlA" secondAttribute="trailing" constant="20" symbolic="YES" id="ntn-yh-HC3"/>
|
||||||
<constraint firstItem="Xzw-kJ-WoH" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="oAi-Zl-LCI"/>
|
<constraint firstItem="Xzw-kJ-WoH" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="oAi-Zl-LCI"/>
|
||||||
<constraint firstItem="hY9-T0-hke" firstAttribute="top" secondItem="Pqa-Ff-7cc" secondAttribute="bottom" constant="8" symbolic="YES" id="oK3-FK-r0S"/>
|
<constraint firstItem="hY9-T0-hke" firstAttribute="top" secondItem="Pqa-Ff-7cc" secondAttribute="bottom" constant="8" symbolic="YES" id="oK3-FK-r0S"/>
|
||||||
<constraint firstAttribute="bottom" secondItem="T2c-ZD-ioV" secondAttribute="bottom" constant="20" symbolic="YES" id="pm7-eL-q1F"/>
|
<constraint firstItem="d5Z-hD-bpr" firstAttribute="leading" secondItem="6vq-iM-inn" secondAttribute="leading" id="oZ8-mG-RYJ"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="BHb-cd-Q0r" secondAttribute="trailing" constant="20" symbolic="YES" id="ryW-3O-g6b"/>
|
<constraint firstAttribute="trailing" secondItem="BHb-cd-Q0r" secondAttribute="trailing" constant="20" symbolic="YES" id="ryW-3O-g6b"/>
|
||||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="dek-ho-dPm" secondAttribute="trailing" constant="20" symbolic="YES" id="xcq-hp-Ay9"/>
|
|
||||||
</constraints>
|
</constraints>
|
||||||
<point key="canvasLocation" x="-409" y="-124"/>
|
<point key="canvasLocation" x="-409" y="-112.5"/>
|
||||||
</customView>
|
</customView>
|
||||||
</objects>
|
</objects>
|
||||||
<resources>
|
<resources>
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14313.18" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
|
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="macosx"/>
|
<deployment identifier="macosx"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14313.18"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<objects>
|
<objects>
|
||||||
@@ -31,6 +31,9 @@
|
|||||||
<buttonCell key="cell" type="push" title="Select" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="6Wi-9i-Tcb">
|
<buttonCell key="cell" type="push" title="Select" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="6Wi-9i-Tcb">
|
||||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||||
<font key="font" metaFont="system"/>
|
<font key="font" metaFont="system"/>
|
||||||
|
<string key="keyEquivalent" base64-UTF8="YES">
|
||||||
|
DQ
|
||||||
|
</string>
|
||||||
</buttonCell>
|
</buttonCell>
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="pickField:" target="-2" id="fLO-qW-oC9"/>
|
<action selector="pickField:" target="-2" id="fLO-qW-oC9"/>
|
||||||
@@ -121,11 +124,11 @@
|
|||||||
</tableView>
|
</tableView>
|
||||||
</subviews>
|
</subviews>
|
||||||
</clipView>
|
</clipView>
|
||||||
<scroller key="horizontalScroller" verticalHuggingPriority="750" horizontal="YES" id="RHy-ph-0lP">
|
<scroller key="horizontalScroller" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="RHy-ph-0lP">
|
||||||
<rect key="frame" x="1" y="255" width="432" height="16"/>
|
<rect key="frame" x="1" y="255" width="432" height="16"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
</scroller>
|
</scroller>
|
||||||
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="b5D-WW-IPI">
|
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="b5D-WW-IPI">
|
||||||
<rect key="frame" x="224" y="17" width="15" height="102"/>
|
<rect key="frame" x="224" y="17" width="15" height="102"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
</scroller>
|
</scroller>
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
|
|
||||||
- (void)runChecksAndPresentResults;
|
- (void)runChecksAndPresentResults;
|
||||||
- (void)openScreenRecordingPreferences;
|
- (void)openScreenRecordingPreferences;
|
||||||
|
- (void)requestScreenRecordingPermission;
|
||||||
- (void)openAccessibiltyPreferences;
|
- (void)openAccessibiltyPreferences;
|
||||||
- (void)openAutomationPreferences;
|
- (void)openAutomationPreferences;
|
||||||
|
|
||||||
|
|||||||
@@ -63,22 +63,41 @@
|
|||||||
|
|
||||||
- (BOOL)hasScreenRecordingPermissions:(NSError *__autoreleasing*)error {
|
- (BOOL)hasScreenRecordingPermissions:(NSError *__autoreleasing*)error {
|
||||||
/* macos 10.14 and lower do not require screen recording permission to get window titles */
|
/* macos 10.14 and lower do not require screen recording permission to get window titles */
|
||||||
if (@available(macOS 10.15, *)) {
|
|
||||||
|
/*
|
||||||
|
Solution is heavily inspired by Craig Hockenberry's
|
||||||
|
https://stackoverflow.com/questions/56597221/detecting-screen-recording-settings-on-macos-catalina/58985069#58985069
|
||||||
|
*/
|
||||||
|
if(@available(macOS 10.15, *)) {
|
||||||
CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
|
CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
|
||||||
NSUInteger numberOfWindows = CFArrayGetCount(windowList);
|
NSUInteger numberOfWindows = CFArrayGetCount(windowList);
|
||||||
NSUInteger numberOfWindowsWithName = 0;
|
BOOL canRecordScreen = NO;
|
||||||
for(int idx = 0; idx < numberOfWindows; idx++) {
|
for(int idx = 0; idx < numberOfWindows; idx++) {
|
||||||
NSDictionary *windowInfo = (NSDictionary *)CFArrayGetValueAtIndex(windowList, idx);
|
NSDictionary *windowInfo = (NSDictionary *)CFArrayGetValueAtIndex(windowList, idx);
|
||||||
|
NSNumber *ownerPid = windowInfo[(id)kCGWindowOwnerPID];
|
||||||
|
/*
|
||||||
|
Skip over our own windows
|
||||||
|
*/
|
||||||
|
if(ownerPid.intValue == NSProcessInfo.processInfo.processIdentifier) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
Skip applications we aren't allowed to access anyway
|
||||||
|
*/
|
||||||
|
NSRunningApplication *ownerApp = [NSRunningApplication runningApplicationWithProcessIdentifier:ownerPid.intValue];
|
||||||
|
if(!ownerApp) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
NSString *windowName = windowInfo[(id)kCGWindowName];
|
NSString *windowName = windowInfo[(id)kCGWindowName];
|
||||||
if(windowName) {
|
if(windowName) {
|
||||||
numberOfWindowsWithName++;
|
if([ownerApp.executableURL.lastPathComponent isEqualToString:@"Dock"]) {
|
||||||
}
|
continue;
|
||||||
else {
|
}
|
||||||
break; //breaking early, numberOfWindowsWithName not increased
|
canRecordScreen = YES;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CFRelease(windowList);
|
CFRelease(windowList);
|
||||||
BOOL canRecordScreen = (numberOfWindows == numberOfWindowsWithName);
|
|
||||||
if(!canRecordScreen && error) {
|
if(!canRecordScreen && error) {
|
||||||
*error = [NSError errorInDomain:MPAutotypeErrorDomain withCode:MPErrorAutotypeIsMissingScreenRecordingPermissions description:NSLocalizedString(@"ERROR_NO_PERMISSION_TO_RECORD_SCREEN", "Error description for missing screen recording permissions")];
|
*error = [NSError errorInDomain:MPAutotypeErrorDomain withCode:MPErrorAutotypeIsMissingScreenRecordingPermissions description:NSLocalizedString(@"ERROR_NO_PERMISSION_TO_RECORD_SCREEN", "Error description for missing screen recording permissions")];
|
||||||
}
|
}
|
||||||
@@ -104,8 +123,23 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (void)openScreenRecordingPreferences {
|
- (void)openScreenRecordingPreferences {
|
||||||
//TODO fix this in macOS 10.15 to use the correct URL
|
[NSWorkspace.sharedWorkspace openURL:[NSURL URLWithString:@"x-apple.systempreferences:com.apple.preference.security?Privacy_ScreenCapture"]];
|
||||||
[NSWorkspace.sharedWorkspace openURL:[NSURL URLWithString:@"x-apple.systempreferences:com.apple.preference.security"]];
|
}
|
||||||
|
|
||||||
|
- (void)requestScreenRecordingPermission {
|
||||||
|
/* macos 10.14 and lower do not require screen recording permission to get window titles */
|
||||||
|
if(@available(macos 10.15, *)) {
|
||||||
|
/*
|
||||||
|
To minimize the intrusion just make a 1px image of the upper left corner
|
||||||
|
This way there is no real possibilty to access any private data
|
||||||
|
*/
|
||||||
|
CGImageRef screenshot = CGWindowListCreateImage(
|
||||||
|
CGRectMake(0, 0, 1, 1),
|
||||||
|
kCGWindowListOptionOnScreenOnly,
|
||||||
|
kCGNullWindowID,
|
||||||
|
kCGWindowImageDefault);
|
||||||
|
CFRelease(screenshot);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)openAutomationPreferences {
|
- (void)openAutomationPreferences {
|
||||||
|
|||||||
@@ -17,12 +17,13 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
|
|
||||||
@property (strong) IBOutlet NSImageView *screenRecordingStatusImageView;
|
@property (strong) IBOutlet NSImageView *screenRecordingStatusImageView;
|
||||||
@property (strong) IBOutlet NSTextField *screenRecordingStatusTextField;
|
@property (strong) IBOutlet NSTextField *screenRecordingStatusTextField;
|
||||||
|
@property (strong) IBOutlet NSButton *requestScreenRecordingButton;
|
||||||
|
|
||||||
- (IBAction)openAccessibiltyPreferences:(id)sender;
|
- (IBAction)openAccessibiltyPreferences:(id)sender;
|
||||||
- (IBAction)openScreenRecordingPreferences:(id)sender;
|
- (IBAction)openScreenRecordingPreferences:(id)sender;
|
||||||
|
- (IBAction)requestScreenRecordingPermissions:(id)sender;
|
||||||
- (IBAction)openAutomationPreferences:(id)sender;
|
- (IBAction)openAutomationPreferences:(id)sender;
|
||||||
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_END
|
NS_ASSUME_NONNULL_END
|
||||||
|
|||||||
@@ -29,6 +29,10 @@
|
|||||||
[MPAutotypeDoctor.defaultDoctor openScreenRecordingPreferences];
|
[MPAutotypeDoctor.defaultDoctor openScreenRecordingPreferences];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (IBAction)requestScreenRecordingPermissions:(id)sender {
|
||||||
|
[MPAutotypeDoctor.defaultDoctor requestScreenRecordingPermission];
|
||||||
|
}
|
||||||
|
|
||||||
- (void)openAutomationPreferences:(id)sender {
|
- (void)openAutomationPreferences:(id)sender {
|
||||||
[MPAutotypeDoctor.defaultDoctor openAutomationPreferences];
|
[MPAutotypeDoctor.defaultDoctor openAutomationPreferences];
|
||||||
}
|
}
|
||||||
@@ -38,7 +42,7 @@
|
|||||||
NSError *error;
|
NSError *error;
|
||||||
if([MPAutotypeDoctor.defaultDoctor hasAccessibiltyPermissions:&error]) {
|
if([MPAutotypeDoctor.defaultDoctor hasAccessibiltyPermissions:&error]) {
|
||||||
self.accessibiltyStatusImageView.image = [NSImage imageNamed:NSImageNameStatusAvailable];
|
self.accessibiltyStatusImageView.image = [NSImage imageNamed:NSImageNameStatusAvailable];
|
||||||
self.accessibiltyStatusTextField.stringValue = NSLocalizedString(@"AUTOTYPE_STATUS_ACCESSIBILTY_PERMISSIONS_OK", "Status lable when no issue were found in accessibilty");
|
self.accessibiltyStatusTextField.stringValue = NSLocalizedString(@"AUTOTYPE_STATUS_ACCESSIBILTY_PERMISSIONS_OK", "Status label when no issue were found in accessibilty");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
self.accessibiltyStatusImageView.image = [NSImage imageNamed:NSImageNameStatusUnavailable];
|
self.accessibiltyStatusImageView.image = [NSImage imageNamed:NSImageNameStatusUnavailable];
|
||||||
@@ -50,10 +54,12 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if([MPAutotypeDoctor.defaultDoctor hasScreenRecordingPermissions:&error]) {
|
if([MPAutotypeDoctor.defaultDoctor hasScreenRecordingPermissions:&error]) {
|
||||||
|
self.requestScreenRecordingButton.enabled = NO;
|
||||||
self.screenRecordingStatusImageView.image = [NSImage imageNamed:NSImageNameStatusAvailable];
|
self.screenRecordingStatusImageView.image = [NSImage imageNamed:NSImageNameStatusAvailable];
|
||||||
self.screenRecordingStatusTextField.stringValue = NSLocalizedString(@"AUTOTYPE_STATUS_SCREEN_RECORDING_PERMISSIONS_OK", "Status lable when no issue were found in screen recording permissions");
|
self.screenRecordingStatusTextField.stringValue = NSLocalizedString(@"AUTOTYPE_STATUS_SCREEN_RECORDING_PERMISSIONS_OK", "Status label when no issue were found in screen recording permissions");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
self.requestScreenRecordingButton.enabled = YES;
|
||||||
self.screenRecordingStatusImageView.image = [NSImage imageNamed:NSImageNameStatusUnavailable];
|
self.screenRecordingStatusImageView.image = [NSImage imageNamed:NSImageNameStatusUnavailable];
|
||||||
if(error && error.localizedDescription) {
|
if(error && error.localizedDescription) {
|
||||||
self.screenRecordingStatusTextField.stringValue = error.localizedDescription;
|
self.screenRecordingStatusTextField.stringValue = error.localizedDescription;
|
||||||
|
|||||||
@@ -24,6 +24,12 @@
|
|||||||
|
|
||||||
@interface MPContextButton : NSSegmentedControl
|
@interface MPContextButton : NSSegmentedControl
|
||||||
|
|
||||||
|
typedef NS_ENUM(NSUInteger, MPContextButtonSegment) {
|
||||||
|
MPContextButtonSegmentButton,
|
||||||
|
MPContextButtonSegmentContextButton,
|
||||||
|
MPContextButtonSegmentCount // do not use
|
||||||
|
};
|
||||||
|
|
||||||
@property (nonatomic, strong) NSMenu *contextMenu;
|
@property (nonatomic, strong) NSMenu *contextMenu;
|
||||||
|
|
||||||
- (void)setImage:(NSImage *)image;
|
- (void)setImage:(NSImage *)image;
|
||||||
|
|||||||
@@ -53,14 +53,14 @@
|
|||||||
|
|
||||||
self.focusRingType = NSFocusRingTypeNone;
|
self.focusRingType = NSFocusRingTypeNone;
|
||||||
self.segmentStyle = NSSegmentStyleTexturedSquare;
|
self.segmentStyle = NSSegmentStyleTexturedSquare;
|
||||||
self.segmentCount = 2;
|
self.segmentCount = MPContextButtonSegmentCount;
|
||||||
cell.trackingMode = NSSegmentSwitchTrackingMomentary;
|
cell.trackingMode = NSSegmentSwitchTrackingMomentary;
|
||||||
[cell setWidth:31 forSegment:0];
|
[cell setWidth:31 forSegment:MPContextButtonSegmentButton];
|
||||||
[cell setWidth:17 forSegment:1];
|
[cell setWidth:17 forSegment:MPContextButtonSegmentContextButton];
|
||||||
cell.trackingMode = NSSegmentSwitchTrackingMomentary;
|
cell.trackingMode = NSSegmentSwitchTrackingMomentary;
|
||||||
|
|
||||||
NSImage *contextTriangle = [NSBundle.mainBundle imageForResource:@"contextTriangleTemplate"];
|
NSImage *contextTriangle = [NSBundle.mainBundle imageForResource:@"contextTriangleTemplate"];
|
||||||
[self setImage:contextTriangle forSegment:1];
|
[self setImage:contextTriangle forSegment:MPContextButtonSegmentContextButton];
|
||||||
|
|
||||||
cell.contextMenuAction = @selector(showContextMenu:);
|
cell.contextMenuAction = @selector(showContextMenu:);
|
||||||
cell.contextMenuTarget = self;
|
cell.contextMenuTarget = self;
|
||||||
@@ -76,42 +76,42 @@
|
|||||||
Block the segment setter to prevent accidental settings
|
Block the segment setter to prevent accidental settings
|
||||||
*/
|
*/
|
||||||
- (void)setImage:(NSImage *)image forSegment:(NSInteger)segment {
|
- (void)setImage:(NSImage *)image forSegment:(NSInteger)segment {
|
||||||
if(segment < 2) {
|
if(segment < MPContextButtonSegmentCount) {
|
||||||
[super setImage:image forSegment:segment];
|
[super setImage:image forSegment:segment];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setSegmentCount:(NSInteger)count {
|
- (void)setSegmentCount:(NSInteger)count {
|
||||||
if(count == 2) {
|
if(count == MPContextButtonSegmentCount) {
|
||||||
super.segmentCount = count;
|
super.segmentCount = count;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setImage:(NSImage *)image {
|
- (void)setImage:(NSImage *)image {
|
||||||
[self setImage:image forSegment:0];
|
[self setImage:image forSegment:MPContextButtonSegmentButton];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)showContextMenu:(id)sender {
|
- (void)showContextMenu:(id)sender {
|
||||||
NSPoint point = self.frame.origin;
|
NSPoint point = self.frame.origin;
|
||||||
point.x = [self.cell widthForSegment:0];
|
point.x = [self.cell widthForSegment:MPContextButtonSegmentButton];
|
||||||
point.y = NSHeight(self.frame) + 3;
|
point.y = NSHeight(self.frame) + 3;
|
||||||
[_contextMenu popUpMenuPositioningItem:nil atLocation:point inView:self];
|
[_contextMenu popUpMenuPositioningItem:nil atLocation:point inView:self];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setControlSize:(NSControlSize)controlSize {
|
- (void)setControlSize:(NSControlSize)controlSize {
|
||||||
NSImageRep *rep = [[self imageForSegment:0] bestRepresentationForRect:NSMakeRect(0, 0, 100, 100) context:nil hints:nil];
|
NSImageRep *rep = [[self imageForSegment:MPContextButtonSegmentButton] bestRepresentationForRect:NSMakeRect(0, 0, 100, 100) context:nil hints:nil];
|
||||||
CGFloat scale = rep.size.width / rep.size.height;
|
CGFloat scale = rep.size.width / rep.size.height;
|
||||||
switch (controlSize) {
|
switch (controlSize) {
|
||||||
case NSRegularControlSize:
|
case NSRegularControlSize:
|
||||||
[self imageForSegment:0].size = NSMakeSize(16 * scale, 16);
|
[self imageForSegment:MPContextButtonSegmentButton].size = NSMakeSize(16 * scale, 16);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NSSmallControlSize:
|
case NSSmallControlSize:
|
||||||
[self imageForSegment:0].size = NSMakeSize(14 * scale, 14);
|
[self imageForSegment:MPContextButtonSegmentButton].size = NSMakeSize(14 * scale, 14);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NSMiniControlSize:
|
case NSMiniControlSize:
|
||||||
[self imageForSegment:0].size = NSMakeSize(8 * scale, 8);
|
[self imageForSegment:MPContextButtonSegmentButton].size = NSMakeSize(8 * scale, 8);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -123,4 +123,9 @@
|
|||||||
return super.controlSize;
|
return super.controlSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)_updateContextButtonState {
|
||||||
|
BOOL hasContextMenu = (self.contextMenu != nil);
|
||||||
|
[self setEnabled:hasContextMenu forSegment:MPContextButtonSegmentContextButton];
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -557,6 +557,7 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
|
|||||||
NSMenu *customFieldMenu = [[NSMenu alloc] initWithTitle:NSLocalizedString(@"ADD_CUSTOM_FIELD_CONTEXT_MENU", @"Menu displayed for adding special custom keys")];
|
NSMenu *customFieldMenu = [[NSMenu alloc] initWithTitle:NSLocalizedString(@"ADD_CUSTOM_FIELD_CONTEXT_MENU", @"Menu displayed for adding special custom keys")];
|
||||||
customFieldMenu.delegate = _addCustomFieldContextMenuDelegate;
|
customFieldMenu.delegate = _addCustomFieldContextMenuDelegate;
|
||||||
self.addCustomFieldButton.contextMenu = customFieldMenu;
|
self.addCustomFieldButton.contextMenu = customFieldMenu;
|
||||||
|
[self.addCustomFieldButton setEnabled:NO forSegment:MPContextButtonSegmentContextButton];
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
|||||||
@@ -60,10 +60,14 @@
|
|||||||
self.window.alphaValue = 0;
|
self.window.alphaValue = 0;
|
||||||
self.window.opaque = NO;
|
self.window.opaque = NO;
|
||||||
self.window.hasShadow = YES;
|
self.window.hasShadow = YES;
|
||||||
|
self.window.backgroundColor = NSColor.clearColor;
|
||||||
|
|
||||||
self.textField.cell.backgroundStyle = NSBackgroundStyleLowered;
|
self.textField.cell.backgroundStyle = NSBackgroundStyleLowered;
|
||||||
self.imageView.cell.backgroundStyle = NSBackgroundStyleDark;
|
self.imageView.cell.backgroundStyle = NSBackgroundStyleEmphasized;
|
||||||
((NSImageCell *)self.imageView.cell).imageAlignment = NSImageAlignCenter;
|
((NSImageCell *)self.imageView.cell).imageAlignment = NSImageAlignCenter;
|
||||||
|
if (@available(macOS 10.14, *)) {
|
||||||
|
self.imageView.contentTintColor = NSColor.textColor;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)displayOverlayImage:(NSImage *)imageOrNil label:(NSString *)labelOrNil atView:(NSView *)view {
|
- (void)displayOverlayImage:(NSImage *)imageOrNil label:(NSString *)labelOrNil atView:(NSView *)view {
|
||||||
|
|||||||
@@ -47,10 +47,11 @@
|
|||||||
if([self.delegate respondsToSelector:@selector(pathControl:willDisplayOpenPanel:)]) {
|
if([self.delegate respondsToSelector:@selector(pathControl:willDisplayOpenPanel:)]) {
|
||||||
[self.delegate pathControl:self willDisplayOpenPanel:panel];
|
[self.delegate pathControl:self willDisplayOpenPanel:panel];
|
||||||
}
|
}
|
||||||
NSModalResponse result = [panel runModal];
|
[panel beginWithCompletionHandler:^(NSModalResponse result) {
|
||||||
if(result == NSModalResponseOK) {
|
if(result == NSModalResponseOK) {
|
||||||
self.URL = panel.URLs.firstObject;
|
self.URL = panel.URLs.firstObject;
|
||||||
}
|
}
|
||||||
|
}];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)pathControl:(NSPathControl *)pathControl willPopUpMenu:(NSMenu *)menu {
|
- (void)pathControl:(NSPathControl *)pathControl willPopUpMenu:(NSMenu *)menu {
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ NSString *const kMPDepricatedSettingsKeyAutotypeHideAccessibiltyWarning = @"Au
|
|||||||
@implementation MPSettingsHelper
|
@implementation MPSettingsHelper
|
||||||
|
|
||||||
+ (void)setupDefaults {
|
+ (void)setupDefaults {
|
||||||
[[NSUserDefaults standardUserDefaults] registerDefaults:[self _standardDefaults]];
|
[NSUserDefaults.standardUserDefaults registerDefaults:[self _standardDefaults]];
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (void)migrateDefaults {
|
+ (void)migrateDefaults {
|
||||||
@@ -193,7 +193,7 @@ NSString *const kMPDepricatedSettingsKeyAutotypeHideAccessibiltyWarning = @"Au
|
|||||||
+ (void)_removeDeprecatedValues {
|
+ (void)_removeDeprecatedValues {
|
||||||
/* Clear old style values */
|
/* Clear old style values */
|
||||||
for(NSString *key in [self _deprecatedSettingsKeys]) {
|
for(NSString *key in [self _deprecatedSettingsKeys]) {
|
||||||
[[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
|
[NSUserDefaults.standardUserDefaults removeObjectForKey:key];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -206,7 +206,7 @@ NSString *const kMPDepricatedSettingsKeyAutotypeHideAccessibiltyWarning = @"Au
|
|||||||
this was changed in 0.6. to parent.title
|
this was changed in 0.6. to parent.title
|
||||||
|
|
||||||
*/
|
*/
|
||||||
NSData *descriptorData = [[NSUserDefaults standardUserDefaults] dataForKey:kMPSettingsKeyEntryTableSortDescriptors];
|
NSData *descriptorData = [NSUserDefaults.standardUserDefaults dataForKey:kMPSettingsKeyEntryTableSortDescriptors];
|
||||||
if(!descriptorData) {
|
if(!descriptorData) {
|
||||||
return; // No user defaults
|
return; // No user defaults
|
||||||
}
|
}
|
||||||
@@ -217,27 +217,35 @@ NSString *const kMPDepricatedSettingsKeyAutotypeHideAccessibiltyWarning = @"Au
|
|||||||
if(descriptor.selector == @selector(compare:)
|
if(descriptor.selector == @selector(compare:)
|
||||||
|| [descriptor.key isEqualToString:@"timeInfo.modificationDate"]
|
|| [descriptor.key isEqualToString:@"timeInfo.modificationDate"]
|
||||||
|| [descriptor.key isEqualToString:@"parent.name"] ) {
|
|| [descriptor.key isEqualToString:@"parent.name"] ) {
|
||||||
[[NSUserDefaults standardUserDefaults] removeObjectForKey:kMPSettingsKeyEntryTableSortDescriptors];
|
[NSUserDefaults.standardUserDefaults removeObjectForKey:kMPSettingsKeyEntryTableSortDescriptors];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (void)_migrateURLDoubleClickPreferences {
|
+ (void)_migrateURLDoubleClickPreferences {
|
||||||
/* Default was NO so if the key was not set, we also get NO, which is what we want */
|
/*
|
||||||
BOOL openURL = [[NSUserDefaults standardUserDefaults] boolForKey:kMPDeprecatedSettingsKeyDoubleClickURLToLaunch];
|
Default was NO so if the key was not set the correct action now should be MPDoubleClickURLActionCopy
|
||||||
if(NO == openURL) {
|
But MPDoubleClickURLActionCopy is the default we cannot simply add this value.
|
||||||
[[NSUserDefaults standardUserDefaults] setInteger:MPDoubleClickURLActionOpen forKey:kMPSettingsKeyDoubleClickURLAction];
|
Hence we chose to only migrate a changed default and let the "old" default silenty be updated
|
||||||
|
This is a worth trade-off since the other solution will always re-set the default
|
||||||
|
*/
|
||||||
|
if(nil == [NSUserDefaults.standardUserDefaults objectForKey:kMPDeprecatedSettingsKeyDoubleClickURLToLaunch]) {
|
||||||
|
return; // the value was not set, do nothing since we cannot determine what to do
|
||||||
|
}
|
||||||
|
/* only update the settings if the defaults return an explicit set value */
|
||||||
|
if([NSUserDefaults.standardUserDefaults boolForKey:kMPDeprecatedSettingsKeyDoubleClickURLToLaunch]) {
|
||||||
|
[NSUserDefaults.standardUserDefaults setInteger:MPDoubleClickURLActionOpen forKey:kMPSettingsKeyDoubleClickURLAction];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (void)_migrateEntrySearchFlags {
|
+ (void)_migrateEntrySearchFlags {
|
||||||
/* Entry filters are now stored as archivd search context not just flags */
|
/* Entry filters are now stored as archivd search context not just flags */
|
||||||
NSInteger flags = [[NSUserDefaults standardUserDefaults] integerForKey:kMPDeprecatedSettingsKeyEntrySearchFilterMode];
|
NSInteger flags = [NSUserDefaults.standardUserDefaults integerForKey:kMPDeprecatedSettingsKeyEntrySearchFilterMode];
|
||||||
if(flags != 0) {
|
if(flags != 0) {
|
||||||
MPEntrySearchContext *context = [[MPEntrySearchContext alloc] initWithString:nil flags:flags];
|
MPEntrySearchContext *context = [[MPEntrySearchContext alloc] initWithString:nil flags:flags];
|
||||||
NSData *contextData = [NSKeyedArchiver archivedDataWithRootObject:context];
|
NSData *contextData = [NSKeyedArchiver archivedDataWithRootObject:context];
|
||||||
[[NSUserDefaults standardUserDefaults] setObject:contextData forKey:kMPSettingsKeyEntrySearchFilterContext];
|
[NSUserDefaults.standardUserDefaults setObject:contextData forKey:kMPSettingsKeyEntrySearchFilterContext];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -246,7 +254,7 @@ NSString *const kMPDepricatedSettingsKeyAutotypeHideAccessibiltyWarning = @"Au
|
|||||||
Database file paths was stored as plain text in keyfile mapping.
|
Database file paths was stored as plain text in keyfile mapping.
|
||||||
We only need to store the key file url in plain text, thus hashing the path is sufficent
|
We only need to store the key file url in plain text, thus hashing the path is sufficent
|
||||||
*/
|
*/
|
||||||
NSDictionary<NSString *, NSString *> *currentMapping = [[NSUserDefaults standardUserDefaults] dictionaryForKey:kMPSettingsKeyRememeberdKeysForDatabases];
|
NSDictionary<NSString *, NSString *> *currentMapping = [NSUserDefaults.standardUserDefaults dictionaryForKey:kMPSettingsKeyRememeberdKeysForDatabases];
|
||||||
if(!currentMapping) {
|
if(!currentMapping) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -268,7 +276,7 @@ NSString *const kMPDepricatedSettingsKeyAutotypeHideAccessibiltyWarning = @"Au
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(didHash) {
|
if(didHash) {
|
||||||
[[NSUserDefaults standardUserDefaults] setObject:hashedDict forKey:kMPSettingsKeyRememeberdKeysForDatabases];
|
[NSUserDefaults.standardUserDefaults setObject:hashedDict forKey:kMPSettingsKeyRememeberdKeysForDatabases];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -238,12 +238,20 @@ NSString *const MPToolbarItemAutotype = @"TOOLBAR_AUTOTYPE";
|
|||||||
|
|
||||||
#pragma mark - NSSearchFieldDelegate
|
#pragma mark - NSSearchFieldDelegate
|
||||||
- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector {
|
- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector {
|
||||||
|
if(control != self.searchField) {
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
if(commandSelector == @selector(insertNewline:) || commandSelector == @selector(moveDown:)) {
|
if(commandSelector == @selector(insertNewline:) || commandSelector == @selector(moveDown:)) {
|
||||||
/* Dispatch the focus loss since doing it now will break recent search storage */
|
/* Dispatch the focus loss since doing it now will break recent search storage */
|
||||||
dispatch_async(dispatch_get_main_queue(), ^{
|
dispatch_async(dispatch_get_main_queue(), ^{
|
||||||
[[NSApp targetForAction:@selector(focusEntries:) to:nil from:self] focusEntries:self];
|
[[NSApp targetForAction:@selector(focusEntries:) to:nil from:self] focusEntries:self];
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
if(commandSelector == @selector(cancelOperation:) ) {
|
||||||
|
dispatch_async(dispatch_get_main_queue(), ^{
|
||||||
|
[[NSApp targetForAction:@selector(exitSearch:) to:nil from:self] exitSearch:nil];
|
||||||
|
});
|
||||||
|
}
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -335,7 +343,7 @@ NSString *const MPToolbarItemAutotype = @"TOOLBAR_AUTOTYPE";
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (void)_didExitSearch:(NSNotification *)notification {
|
- (void)_didExitSearch:(NSNotification *)notification {
|
||||||
[self.searchField setStringValue:@""];
|
self.searchField.stringValue = @"";
|
||||||
NSWindow *window = [self.searchField window];
|
NSWindow *window = [self.searchField window];
|
||||||
/* Resign first responder form search field only if it was the first responder */
|
/* Resign first responder form search field only if it was the first responder */
|
||||||
if(window.firstResponder == [self.searchField currentEditor]) {
|
if(window.firstResponder == [self.searchField currentEditor]) {
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#import "MPWelcomeViewController.h"
|
#import "MPWelcomeViewController.h"
|
||||||
|
#import "MPConstants.h"
|
||||||
|
|
||||||
@interface MPWelcomeViewController ()
|
@interface MPWelcomeViewController ()
|
||||||
|
|
||||||
@@ -26,17 +27,32 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
|
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
|
||||||
return NSDocumentController.sharedDocumentController.recentDocumentURLs.count;
|
return MAX(1, NSDocumentController.sharedDocumentController.recentDocumentURLs.count);
|
||||||
}
|
}
|
||||||
|
|
||||||
- (nullable NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(nullable NSTableColumn *)tableColumn row:(NSInteger)row {
|
- (nullable NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(nullable NSTableColumn *)tableColumn row:(NSInteger)row {
|
||||||
NSTableCellView *view = [tableView makeViewWithIdentifier:tableColumn.identifier owner:self];
|
NSTableCellView *view = [tableView makeViewWithIdentifier:tableColumn.identifier owner:self];
|
||||||
NSURL *url = NSDocumentController.sharedDocumentController.recentDocumentURLs[row];
|
NSArray<NSURL *> *recentURLS = NSDocumentController.sharedDocumentController.recentDocumentURLs;
|
||||||
view.textField.stringValue = url.lastPathComponent;
|
if(row > -1 && row < recentURLS.count) {
|
||||||
view.imageView.image = [NSWorkspace.sharedWorkspace iconForFile:url.path];
|
NSURL *url = recentURLS[row];
|
||||||
|
view.textField.enabled = YES;
|
||||||
|
view.imageView.enabled = YES;
|
||||||
|
view.textField.stringValue = url.lastPathComponent;
|
||||||
|
view.imageView.image = [NSWorkspace.sharedWorkspace iconForFile:url.path];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
view.textField.enabled = NO;
|
||||||
|
view.imageView.enabled = NO;
|
||||||
|
view.textField.stringValue = NSLocalizedString(@"WELCOME_WINDOW_NO_RECENT_DOCUMENTS", "Text displayed when no recent documents can be displayed in");
|
||||||
|
view.imageView.image = [NSWorkspace.sharedWorkspace iconForFileType:MPKdbxDocumentUTI];
|
||||||
|
}
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(NSInteger)row {
|
||||||
|
return (NSDocumentController.sharedDocumentController.recentDocumentURLs.count > 0);
|
||||||
|
}
|
||||||
|
|
||||||
- (IBAction)openRecentURL:(id)sender {
|
- (IBAction)openRecentURL:(id)sender {
|
||||||
NSInteger clicked = self.tableView.clickedRow;
|
NSInteger clicked = self.tableView.clickedRow;
|
||||||
NSArray <NSURL *> *recentURLS = NSDocumentController.sharedDocumentController.recentDocumentURLs;
|
NSArray <NSURL *> *recentURLS = NSDocumentController.sharedDocumentController.recentDocumentURLs;
|
||||||
|
|||||||
@@ -2,8 +2,6 @@
|
|||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
<key>NSAppleEventsUsageDescription</key>
|
|
||||||
<string>MacPass might use AppleEvents to perform Autotype functionality</string>
|
|
||||||
<key>CFBundleDevelopmentRegion</key>
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
<string>en</string>
|
<string>en</string>
|
||||||
<key>CFBundleDocumentTypes</key>
|
<key>CFBundleDocumentTypes</key>
|
||||||
@@ -71,6 +69,8 @@
|
|||||||
<string>https://github.com/MacPass/MacPass</string>
|
<string>https://github.com/MacPass/MacPass</string>
|
||||||
<key>MPPluginRepositoryURL</key>
|
<key>MPPluginRepositoryURL</key>
|
||||||
<string>https://macpassapp.org/data/plugins.json</string>
|
<string>https://macpassapp.org/data/plugins.json</string>
|
||||||
|
<key>NSAppleEventsUsageDescription</key>
|
||||||
|
<string>MacPass might use AppleEvents to perform Autotype functionality</string>
|
||||||
<key>NSHumanReadableCopyright</key>
|
<key>NSHumanReadableCopyright</key>
|
||||||
<string>Copyright © 2012-2019 HicknHack Software GmbH. All rights reserved.</string>
|
<string>Copyright © 2012-2019 HicknHack Software GmbH. All rights reserved.</string>
|
||||||
<key>NSMainNibFile</key>
|
<key>NSMainNibFile</key>
|
||||||
@@ -92,6 +92,8 @@
|
|||||||
</array>
|
</array>
|
||||||
<key>UTTypeDescription</key>
|
<key>UTTypeDescription</key>
|
||||||
<string>KDBX Database</string>
|
<string>KDBX Database</string>
|
||||||
|
<key>UTTypeIconFile</key>
|
||||||
|
<string>FileTypeIcon</string>
|
||||||
<key>UTTypeIdentifier</key>
|
<key>UTTypeIdentifier</key>
|
||||||
<string>com.hicknhack.macpass.kdbx</string>
|
<string>com.hicknhack.macpass.kdbx</string>
|
||||||
<key>UTTypeTagSpecification</key>
|
<key>UTTypeTagSpecification</key>
|
||||||
@@ -109,6 +111,8 @@
|
|||||||
</array>
|
</array>
|
||||||
<key>UTTypeDescription</key>
|
<key>UTTypeDescription</key>
|
||||||
<string>KDB Database</string>
|
<string>KDB Database</string>
|
||||||
|
<key>UTTypeIconFile</key>
|
||||||
|
<string>FileTypeIcon</string>
|
||||||
<key>UTTypeIdentifier</key>
|
<key>UTTypeIdentifier</key>
|
||||||
<string>com.hicknhack.macpass.kdb</string>
|
<string>com.hicknhack.macpass.kdb</string>
|
||||||
<key>UTTypeTagSpecification</key>
|
<key>UTTypeTagSpecification</key>
|
||||||
|
|||||||
10
MacPass/MacPass.entitlements
Normal file
10
MacPass/MacPass.entitlements
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>com.apple.security.automation.apple-events</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.security.cs.disable-library-validation</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
18
MacPass/en.lproj/InfoPlist.strings
Normal file
18
MacPass/en.lproj/InfoPlist.strings
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
/* Bundle name */
|
||||||
|
"CFBundleName" = "MacPass";
|
||||||
|
|
||||||
|
/* (No Comment) */
|
||||||
|
"KDB Database" = "KDB Database";
|
||||||
|
|
||||||
|
/* (No Comment) */
|
||||||
|
"KDBX Database" = "KDBX Database";
|
||||||
|
|
||||||
|
/* (No Comment) */
|
||||||
|
"MacPass Plugin" = "MacPass Plugin";
|
||||||
|
|
||||||
|
/* (No Comment) */
|
||||||
|
"NSHumanReadableCopyright" = "Copyright ©2012-2019 HicknHack Software GmbH. All rights reserved.";
|
||||||
|
|
||||||
|
/* (No Comment) */
|
||||||
|
"XML" = "XML";
|
||||||
|
|
||||||
@@ -1,8 +1,12 @@
|
|||||||
|
|
||||||
|
/* Class = "NSButtonCell"; title = "Request Permissions…"; ObjectID = "1Nx-Cg-TCn"; */
|
||||||
|
"1Nx-Cg-TCn.title" = "Запросить разрешения…";
|
||||||
|
|
||||||
/* Class = "NSTextFieldCell"; title = "MacPass will send key press events to the system when Autotype or Global Autotype is executed. Since macOS 10.14 Mojave this is only possible, if Accessibility permissions are granted to the application."; ObjectID = "6GI-KJ-Xue"; */
|
/* Class = "NSTextFieldCell"; title = "MacPass will send key press events to the system when Autotype or Global Autotype is executed. Since macOS 10.14 Mojave this is only possible, if Accessibility permissions are granted to the application."; ObjectID = "6GI-KJ-Xue"; */
|
||||||
"6GI-KJ-Xue.title" = "MacPass будет отправлять события нажатия клавиш в систему при выполнении Автоввода или Глобального Автоввода. Начиная с macOS 10.14 Mojave это возможно только в том случае, если приложению разрешено управление копьютером через универсальный доступ.";
|
"6GI-KJ-Xue.title" = "MacPass будет отправлять события нажатия клавиш в систему при выполнении Автоввода или Глобального Автоввода. Начиная с macOS 10.14 Mojave это возможно только в том случае, если приложению разрешено управление копьютером через универсальный доступ.";
|
||||||
|
|
||||||
/* Class = "NSTextFieldCell"; title = "MacPass will read every window title when Global Autotype is executed to find a match. Since macOS 10.15 Catalina it is not possible to read any window title, if the user has not granted permissions to record the screen. If you are running macOS 10.15 or higher, MacPass will try to capture the left top most pixel on your screen to initate a request to record the screen. This pixel will not be stored and processed in any way."; ObjectID = "7of-1z-Nfk"; */
|
/* Class = "NSTextFieldCell"; title = "MacPass will read every window title when Global Autotype is executed to find a match. Since macOS 10.15 Catalina it is not possible to read any window title, if the user has not granted permissions to record the screen. If you are running macOS 10.15 or higher, MacPass will check if it can read every window title of currently visible windows. This test will not read the actual title. The titles aren't stored or processed in any way."; ObjectID = "7of-1z-Nfk"; */
|
||||||
"7of-1z-Nfk.title" = "MacPass будет читать заголовки окон чтобы найти совпадения при выполнении Глобального Автоввода. Начиная с macOS 10.15 Catalina невозможно прочитать заголовок окна, если пользователь не предоставил разрешения на запись экрана. Если вы используете MacOS 10.15 или выше, MacPass попытается захватить левый верхний пиксель на вашем экране, чтобы инициировать запрос на запись экрана. Этот пиксель не будет сохранен и обработан каким-либо образом.";
|
"7of-1z-Nfk.title" = "MacPass будет читать заголовки окон чтобы найти совпадения при выполнении Глобального Автоввода. Начиная с macOS 10.15 Catalina невозможно прочитать заголовок окна, если пользователь не предоставил разрешения на запись экрана. Если вы используете MacOS 10.15 или выше, MacPass проверит, возможно ли получить заголовки видимых окон. Заголовки не сохраняются и не обрабатываются каким-либо образом.";
|
||||||
|
|
||||||
/* Class = "NSButtonCell"; title = "Open Accessibilty Preferences…"; ObjectID = "8m1-vs-pd5"; */
|
/* Class = "NSButtonCell"; title = "Open Accessibilty Preferences…"; ObjectID = "8m1-vs-pd5"; */
|
||||||
"8m1-vs-pd5.title" = "Открыть настройки универсального доступа…";
|
"8m1-vs-pd5.title" = "Открыть настройки универсального доступа…";
|
||||||
@@ -10,9 +14,11 @@
|
|||||||
/* Class = "NSTextFieldCell"; title = "Screen Recording"; ObjectID = "9gr-mz-2I4"; */
|
/* Class = "NSTextFieldCell"; title = "Screen Recording"; ObjectID = "9gr-mz-2I4"; */
|
||||||
"9gr-mz-2I4.title" = "Запись экрана";
|
"9gr-mz-2I4.title" = "Запись экрана";
|
||||||
|
|
||||||
|
/* Class = "NSTextFieldCell"; title = "To request Screen Recording permissions, MacPass will try to capture a 1 by 1 Pixel sized screenshot of the top left part of your screen. The data is not stored nor processed in any way."; ObjectID = "Mhg-rd-1hK"; */
|
||||||
|
"Mhg-rd-1hK.title" = "Чтобы запросить разрешения на запись экрана, MacPass попытается сделать снимок экрана размером 1 на 1 пиксель в верхней левой части экрана. Эти данные не хранятся и не обрабатываются каким-либо образом.";
|
||||||
|
|
||||||
/* Class = "NSTextFieldCell"; title = "Accessibility"; ObjectID = "aIL-8W-63g"; */
|
/* Class = "NSTextFieldCell"; title = "Accessibility"; ObjectID = "aIL-8W-63g"; */
|
||||||
"aIL-8W-63g.title" = "Универсальный доступ";
|
"aIL-8W-63g.title" = "Универсальный доступ";
|
||||||
|
|
||||||
/* Class = "NSButtonCell"; title = "Open Screen Sharing Preferences…"; ObjectID = "lgB-Ys-L9R"; */
|
/* Class = "NSButtonCell"; title = "Open Screen Recording Preferences…"; ObjectID = "lgB-Ys-L9R"; */
|
||||||
"lgB-Ys-L9R.title" = "Открыть настройки безопасности…";
|
"lgB-Ys-L9R.title" = "Открыть настройки безопасности…";
|
||||||
|
|
||||||
|
|||||||
@@ -316,13 +316,19 @@
|
|||||||
"DRAG_GROUP" = "Перетащить группу";
|
"DRAG_GROUP" = "Перетащить группу";
|
||||||
|
|
||||||
/* Action name for duplicating entries */
|
/* Action name for duplicating entries */
|
||||||
"DUPLICATE_ENTRIES_%ld" = "Дублирующиеся записи %ld";
|
"DUPLICATE_ENTRIES_ACTION_NAME" = "Дублировать Записи";
|
||||||
|
|
||||||
/* Menu item to directly diplicate an entry */
|
/* Menu item to directly diplicate an entry */
|
||||||
"DUPLICATE_ENTRY" = "Скопировать Запись";
|
"DUPLICATE_ENTRY" = "Дублировать Запись";
|
||||||
|
|
||||||
/* Menu item to duplicate an entry with options how to duplicate. Will present a dialog. */
|
/* Menu item to duplicate an entry with options how to duplicate. Will present a dialog. */
|
||||||
"DUPLICATE_ENTRY_WITH_OPTIONS" = "Скопировать Запись…";
|
"DUPLICATE_ENTRY_WITH_OPTIONS" = "Дублировать Запись…";
|
||||||
|
|
||||||
|
/* Menu item to directly diplicate a group */
|
||||||
|
"DUPLICATE_GROUP" = "Дублировать Группу";
|
||||||
|
|
||||||
|
/* Action name for duplicating groups */
|
||||||
|
"DUPLICATE_GROUPS_ACTION_NAME" = "Дублировать Группу";
|
||||||
|
|
||||||
/* Menu item in the database outline context menu to change the template group
|
/* Menu item in the database outline context menu to change the template group
|
||||||
Menu item on the add entry context menu to edit template groups */
|
Menu item on the add entry context menu to edit template groups */
|
||||||
@@ -696,6 +702,9 @@
|
|||||||
/* Action button in Notification to show the Autotype Doctor */
|
/* Action button in Notification to show the Autotype Doctor */
|
||||||
"SHOW_AUTOTYPE_DOCTOR" = "Показать помощник автоввода";
|
"SHOW_AUTOTYPE_DOCTOR" = "Показать помощник автоввода";
|
||||||
|
|
||||||
|
/* Menu item to show the entries group in the outline view */
|
||||||
|
"SHOW_GROUP_IN_OUTLINE" = "Показать группу";
|
||||||
|
|
||||||
/* Menu item to show the history of the selected entry
|
/* Menu item to show the history of the selected entry
|
||||||
Toolbar item to toggle history display */
|
Toolbar item to toggle history display */
|
||||||
"SHOW_HISTORY" = "Показать историю";
|
"SHOW_HISTORY" = "Показать историю";
|
||||||
|
|||||||
@@ -105,11 +105,13 @@ The following list might not be complete, please refer to [merged Pull Requests]
|
|||||||
### Contributors
|
### Contributors
|
||||||
|
|
||||||
[ad](mailto:github.mnms@mamber.net),
|
[ad](mailto:github.mnms@mamber.net),
|
||||||
|
[Alessandro Vinciguerra](mailto:30745465+Arc676@users.noreply.github.com),
|
||||||
[Alex Borisov](mailto:alex@alexborisov.org),
|
[Alex Borisov](mailto:alex@alexborisov.org),
|
||||||
[Alex Seeholzer](mailto:seeholzer@gmail.com),
|
[Alex Seeholzer](mailto:seeholzer@gmail.com),
|
||||||
[amd](mailto:amd@gurge.com),
|
[amd](mailto:amd@gurge.com),
|
||||||
[Andrew Schleifer](mailto:me@andrewschleifer.name),
|
[Andrew Schleifer](mailto:me@andrewschleifer.name),
|
||||||
[AntoineCa](mailto:antoine@carrincazeaux.fr),
|
[AntoineCa](mailto:antoine@carrincazeaux.fr),
|
||||||
|
[Anton Glezman](mailto:anton@glezman.ru),
|
||||||
[Benjamin Steinwender](mailto:b@stbe.at),
|
[Benjamin Steinwender](mailto:b@stbe.at),
|
||||||
[binarious](mailto:bieder.martin@googlemail.com),
|
[binarious](mailto:bieder.martin@googlemail.com),
|
||||||
[Can Rau](mailto:cansrau@gmail.com),
|
[Can Rau](mailto:cansrau@gmail.com),
|
||||||
@@ -118,9 +120,11 @@ The following list might not be complete, please refer to [merged Pull Requests]
|
|||||||
[Chhom Seng](mailto:chhom.seng@gmail.com),
|
[Chhom Seng](mailto:chhom.seng@gmail.com),
|
||||||
[Christoph Leimbrock](mailto:christoph.leimbrock@gmx.de),
|
[Christoph Leimbrock](mailto:christoph.leimbrock@gmx.de),
|
||||||
[Cory Hutchison](mailto:cjhutchi@users.noreply.github.com),
|
[Cory Hutchison](mailto:cjhutchi@users.noreply.github.com),
|
||||||
|
[César Arratia](mailto:buttcmd@gmail.com),
|
||||||
[Daniele Polencic](mailto:daniele.polencic@gmail.com),
|
[Daniele Polencic](mailto:daniele.polencic@gmail.com),
|
||||||
[darnel](mailto:vojta.j@gmail.com),
|
[darnel](mailto:vojta.j@gmail.com),
|
||||||
[Deiwin Sarjas](mailto:deiwin.sarjas@gmail.com),
|
[Deiwin Sarjas](mailto:deiwin.sarjas@gmail.com),
|
||||||
|
[Deniz Türkoglu](mailto:denizt@users.noreply.github.com),
|
||||||
[Dennis Bolio](mailto:git@bolio.nl),
|
[Dennis Bolio](mailto:git@bolio.nl),
|
||||||
[Dylan Smith](mailto:dylansmith@gmail.com),
|
[Dylan Smith](mailto:dylansmith@gmail.com),
|
||||||
[eiermaaaan](mailto:37532252+eiermaaaan@users.noreply.github.com),
|
[eiermaaaan](mailto:37532252+eiermaaaan@users.noreply.github.com),
|
||||||
@@ -129,7 +133,7 @@ The following list might not be complete, please refer to [merged Pull Requests]
|
|||||||
[floriangouy](mailto:florian.gouy@gmail.com),
|
[floriangouy](mailto:florian.gouy@gmail.com),
|
||||||
[Francesco Servida](mailto:info@francescoservida.ch),
|
[Francesco Servida](mailto:info@francescoservida.ch),
|
||||||
[Frank Enderle](mailto:frank.enderle@anamica.de),
|
[Frank Enderle](mailto:frank.enderle@anamica.de),
|
||||||
[Frank Kooij](https://github.com/FrankKooij),
|
[Frank Kooij](mailto:FrankKooij@users.noreply.github.com),
|
||||||
[Gaétan Ryckeboer](mailto:gryckeboer@jouve.com),
|
[Gaétan Ryckeboer](mailto:gryckeboer@jouve.com),
|
||||||
[Geigi](mailto:git@geigi.de),
|
[Geigi](mailto:git@geigi.de),
|
||||||
[Henri de Jong](mailto:henridejong@gmail.com),
|
[Henri de Jong](mailto:henridejong@gmail.com),
|
||||||
@@ -137,6 +141,7 @@ The following list might not be complete, please refer to [merged Pull Requests]
|
|||||||
[Jannick Hemelhof](mailto:mister.jannick@gmail.com),
|
[Jannick Hemelhof](mailto:mister.jannick@gmail.com),
|
||||||
[Jefftree](mailto:jeffrey.ying86@live.com),
|
[Jefftree](mailto:jeffrey.ying86@live.com),
|
||||||
[Jellyfrog](mailto:Jellyfrog@users.noreply.github.com),
|
[Jellyfrog](mailto:Jellyfrog@users.noreply.github.com),
|
||||||
|
[Jesse Reppin](mailto:mail@jessereppin.de),
|
||||||
[Joanna Olsen](mailto:jo4flash@gmail.com),
|
[Joanna Olsen](mailto:jo4flash@gmail.com),
|
||||||
[Josh Halstead](mailto:jhalstead85@gmail.com),
|
[Josh Halstead](mailto:jhalstead85@gmail.com),
|
||||||
[Kurt](mailto:kurt@soapbox-software.com),
|
[Kurt](mailto:kurt@soapbox-software.com),
|
||||||
@@ -166,6 +171,7 @@ The following list might not be complete, please refer to [merged Pull Requests]
|
|||||||
[thesoundofom](mailto:45923716+thesoundofom@users.noreply.github.com),
|
[thesoundofom](mailto:45923716+thesoundofom@users.noreply.github.com),
|
||||||
[Thom](mailto:thomscode@gmail.com),
|
[Thom](mailto:thomscode@gmail.com),
|
||||||
[Thorsten Jacoby](mailto:tjacoby@gmail.com),
|
[Thorsten Jacoby](mailto:tjacoby@gmail.com),
|
||||||
|
[Veit-Hendrik Schlenker](mailto:git@vhschlenker.de),
|
||||||
[Volcyy](mailto:Volcyy@users.noreply.github.com),
|
[Volcyy](mailto:Volcyy@users.noreply.github.com),
|
||||||
[Yonatan Mittlefehldt](mailto:yono@toojuice.com),
|
[Yonatan Mittlefehldt](mailto:yono@toojuice.com),
|
||||||
[Zero King](mailto:l2dy@icloud.com),
|
[Zero King](mailto:l2dy@icloud.com),
|
||||||
|
|||||||
72
scripts/prepare_release.sh
Executable file
72
scripts/prepare_release.sh
Executable file
@@ -0,0 +1,72 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
POSITIONAL=()
|
||||||
|
while [[ $# -gt 0 ]]
|
||||||
|
do
|
||||||
|
key="$1"
|
||||||
|
|
||||||
|
case $key in
|
||||||
|
-s|--sign)
|
||||||
|
IDENTITY="$2"
|
||||||
|
shift # past argument
|
||||||
|
shift # past value
|
||||||
|
;;
|
||||||
|
-u|--username)
|
||||||
|
USERNAME="$2"
|
||||||
|
shift # past argument
|
||||||
|
shift # past value
|
||||||
|
;;
|
||||||
|
-p|--password)
|
||||||
|
PASSWORD="$2"
|
||||||
|
shift # past argument
|
||||||
|
shift # past value
|
||||||
|
;;
|
||||||
|
-e|--entitlements)
|
||||||
|
ENTITLEMENTS="$2"
|
||||||
|
shift # past argument
|
||||||
|
shift # past value
|
||||||
|
;;
|
||||||
|
*) # unknown option
|
||||||
|
POSITIONAL+=("$1") # save it in an array for later
|
||||||
|
shift # past argument
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
set -- "${POSITIONAL[@]}" # restore positional parameters
|
||||||
|
|
||||||
|
if [[ -z "${IDENTITY}" ]]; then
|
||||||
|
echo "Missing identity"
|
||||||
|
exit -1
|
||||||
|
fi
|
||||||
|
if [[ -z "${ENTITLEMENTS}" ]]; then
|
||||||
|
echo "Missing entitlements"
|
||||||
|
exit -1
|
||||||
|
fi
|
||||||
|
if [[ -z "${USERNAME}" ]]; then
|
||||||
|
echo "Missing username"
|
||||||
|
exit -1
|
||||||
|
fi
|
||||||
|
if [[ -z "${PASSWORD}" ]]; then
|
||||||
|
echo "Missing password"
|
||||||
|
exit -1
|
||||||
|
fi
|
||||||
|
|
||||||
|
DERIVED_DATA_FOLDER="${TMPDIR}"
|
||||||
|
BUILD_FOLDER="${DERIVED_DATA_FOLDER}"/Build/Products/Release
|
||||||
|
APP_BUNDLE=MacPass.app
|
||||||
|
APP_BUNDLE_ZIP="${APP_BUNDLE}".zip
|
||||||
|
cd ..
|
||||||
|
echo "Building..."
|
||||||
|
xcodebuild build -configuration Release -project MacPass.xcodeproj -scheme MacPass CODE_SIGNING_REQUIRED=NO -derivedDataPath "${DERIVED_DATA_FOLDER}"
|
||||||
|
cd "${BUILD_FOLDER}"
|
||||||
|
echo ""
|
||||||
|
echo "Signing..."
|
||||||
|
codesign --sign "${IDENTITY}" --options runtime --deep --force --entitlements "${ENTITLEMENTS}" "${APP_BUNDLE}"
|
||||||
|
echo ""
|
||||||
|
echo "Archiving..."
|
||||||
|
ditto -c -k --keepParent "${APP_BUNDLE}" "${APP_BUNDLE_ZIP}"
|
||||||
|
echo "Requesting Notarization..."
|
||||||
|
xcrun altool --notarize-app --primary-bundle-id "com.hicknhacksoftware.MacPass.zip" --username "${USERNAME}" --password "${PASSWORD}" --file "${APP_BUNDLE_ZIP}"
|
||||||
|
#xcrun stapler staple "${APP_BUNDLE}"
|
||||||
|
#xmllint --xpath "/plist/dict/key[contains(text(),'success-message')]::following-sibling" status.xml
|
||||||
Reference in New Issue
Block a user