├── .github ├── FUNDING.yml └── workflows │ └── macos.yml ├── .gitignore ├── FastDMG.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── xcuserdata │ └── sveinbjorn.xcuserdatad │ └── xcschemes │ ├── FastDMG.xcscheme │ └── xcschememanagement.plist ├── FastDMG ├── Base.lproj │ ├── MainMenu.xib │ └── MainWindow.xib ├── Credits.rtf ├── FastDMGAppDelegate.h ├── FastDMGAppDelegate.m ├── FastDMGWindowController.h ├── FastDMGWindowController.m ├── Info.plist ├── diskimage.icns ├── fastdmg.icns └── main.m ├── Icon ├── createicns ├── fastdmg.iconset │ ├── icon_128x128.png │ ├── icon_128x128@2x.png │ ├── icon_16x16.png │ ├── icon_16x16@2x.png │ ├── icon_256x256.png │ ├── icon_256x256@2x.png │ ├── icon_32x32.png │ ├── icon_32x32@2x.png │ ├── icon_512x512.png │ └── icon_512x512@2x.png ├── fastdmg.png ├── fastdmg.svg ├── make_icon.sh └── old │ ├── fastdmg.ai │ ├── fastdmg.icns │ ├── fastdmg.iconset │ ├── icon_128x128.png │ ├── icon_128x128@2x.png │ ├── icon_16x16.png │ ├── icon_16x16@2x.png │ ├── icon_256x256.png │ ├── icon_256x256@2x.png │ ├── icon_32x32.png │ ├── icon_32x32@2x.png │ ├── icon_512x512.png │ └── icon_512x512@2x.png │ └── fastdmg_icon.png ├── LICENSE.txt ├── Makefile └── README.md /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | custom: ["https://paypal.me/sveinbjornt", sveinbjorn.org/donations] 2 | -------------------------------------------------------------------------------- /.github/workflows/macos.yml: -------------------------------------------------------------------------------- 1 | name: build 2 | 3 | on: 4 | push: 5 | branches: [ '*' ] 6 | pull_request: 7 | branches: [ '*' ] 8 | 9 | jobs: 10 | build: 11 | name: Build on macOS 12 | runs-on: macos-latest 13 | 14 | steps: 15 | - name: Checkout 16 | uses: actions/checkout@v4 17 | - run: make build_unsigned 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | build/ 2 | products/ 3 | DerivedData 4 | ## Various settings 5 | *.pbxuser 6 | !default.pbxuser 7 | *.mode1v3 8 | !default.mode1v3 9 | *.mode2v3 10 | !default.mode2v3 11 | *.perspectivev3 12 | !default.perspectivev3 13 | xcuserdata 14 | ## Other 15 | *.xccheckout 16 | *.moved-aside 17 | *.xcuserstate 18 | *.xcworkspace 19 | dsa_priv.pem 20 | .xcbkptlist 21 | -------------------------------------------------------------------------------- /FastDMG.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 54; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | F416C1F42DDCC9FE00B710B6 /* fastdmg.icns in Resources */ = {isa = PBXBuildFile; fileRef = F416C1F32DDCC9FE00B710B6 /* fastdmg.icns */; }; 11 | F42C834120AF048700E95DD4 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = F42C833F20AF048700E95DD4 /* MainWindow.xib */; }; 12 | F42C834420AF05A800E95DD4 /* FastDMGWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = F42C834320AF05A800E95DD4 /* FastDMGWindowController.m */; }; 13 | F45AC0FD20ACDB4E0086DF1D /* FastDMGAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = F45AC0FC20ACDB4E0086DF1D /* FastDMGAppDelegate.m */; }; 14 | F45AC10220ACDB4F0086DF1D /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = F45AC10020ACDB4F0086DF1D /* MainMenu.xib */; }; 15 | F45AC10520ACDB4F0086DF1D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = F45AC10420ACDB4F0086DF1D /* main.m */; }; 16 | F49A991820ADD90F0064B9A4 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = F49A991720ADD90F0064B9A4 /* Credits.rtf */; }; 17 | F4E2D4CE29268E2C00BDA386 /* diskimage.icns in Resources */ = {isa = PBXBuildFile; fileRef = F4E2D4CD29268E2C00BDA386 /* diskimage.icns */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXFileReference section */ 21 | F416C1F32DDCC9FE00B710B6 /* fastdmg.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = fastdmg.icns; sourceTree = ""; }; 22 | F416C1F52DDCCC4D00B710B6 /* fastdmg.ai */ = {isa = PBXFileReference; lastKnownFileType = text; path = fastdmg.ai; sourceTree = ""; }; 23 | F416C1F62DDCCC4D00B710B6 /* fastdmg.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = fastdmg.icns; sourceTree = ""; }; 24 | F416C1F72DDCCC4D00B710B6 /* fastdmg.iconset */ = {isa = PBXFileReference; lastKnownFileType = folder.iconset; path = fastdmg.iconset; sourceTree = ""; }; 25 | F416C1F82DDCCC4D00B710B6 /* fastdmg_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = fastdmg_icon.png; sourceTree = ""; }; 26 | F416C1FA2DDCCC4D00B710B6 /* createicns */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; path = createicns; sourceTree = ""; }; 27 | F416C1FC2DDCCC4D00B710B6 /* fastdmg.iconset */ = {isa = PBXFileReference; lastKnownFileType = folder.iconset; path = fastdmg.iconset; sourceTree = ""; }; 28 | F416C1FD2DDCCC4D00B710B6 /* fastdmg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = fastdmg.png; sourceTree = ""; }; 29 | F416C1FE2DDCCC4D00B710B6 /* make_icon.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = make_icon.sh; sourceTree = ""; }; 30 | F42C834020AF048700E95DD4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainWindow.xib; sourceTree = ""; }; 31 | F42C834220AF05A800E95DD4 /* FastDMGWindowController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FastDMGWindowController.h; sourceTree = ""; }; 32 | F42C834320AF05A800E95DD4 /* FastDMGWindowController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FastDMGWindowController.m; sourceTree = ""; }; 33 | F4485613264AB4EE0098872C /* macos.yml */ = {isa = PBXFileReference; lastKnownFileType = text.yaml; name = macos.yml; path = .github/workflows/macos.yml; sourceTree = ""; }; 34 | F45AC0F820ACDB4E0086DF1D /* FastDMG.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FastDMG.app; sourceTree = BUILT_PRODUCTS_DIR; }; 35 | F45AC0FB20ACDB4E0086DF1D /* FastDMGAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FastDMGAppDelegate.h; sourceTree = ""; }; 36 | F45AC0FC20ACDB4E0086DF1D /* FastDMGAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FastDMGAppDelegate.m; sourceTree = ""; }; 37 | F45AC10120ACDB4F0086DF1D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; 38 | F45AC10320ACDB4F0086DF1D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 39 | F45AC10420ACDB4F0086DF1D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 40 | F49A991720ADD90F0064B9A4 /* Credits.rtf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.rtf; path = Credits.rtf; sourceTree = ""; }; 41 | F49A991B20ADEAC30064B9A4 /* LICENSE.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE.txt; sourceTree = ""; }; 42 | F49A991C20ADEAC30064B9A4 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 43 | F4E2D4CD29268E2C00BDA386 /* diskimage.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = diskimage.icns; sourceTree = ""; }; 44 | F4FC1A062239E5D700CC1F6A /* Makefile */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = ""; }; 45 | /* End PBXFileReference section */ 46 | 47 | /* Begin PBXFrameworksBuildPhase section */ 48 | F45AC0F520ACDB4E0086DF1D /* Frameworks */ = { 49 | isa = PBXFrameworksBuildPhase; 50 | buildActionMask = 2147483647; 51 | files = ( 52 | ); 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | /* End PBXFrameworksBuildPhase section */ 56 | 57 | /* Begin PBXGroup section */ 58 | F416C1F92DDCCC4D00B710B6 /* old */ = { 59 | isa = PBXGroup; 60 | children = ( 61 | F416C1F52DDCCC4D00B710B6 /* fastdmg.ai */, 62 | F416C1F62DDCCC4D00B710B6 /* fastdmg.icns */, 63 | F416C1F72DDCCC4D00B710B6 /* fastdmg.iconset */, 64 | F416C1F82DDCCC4D00B710B6 /* fastdmg_icon.png */, 65 | ); 66 | path = old; 67 | sourceTree = ""; 68 | }; 69 | F416C1FF2DDCCC4D00B710B6 /* Icon */ = { 70 | isa = PBXGroup; 71 | children = ( 72 | F416C1FE2DDCCC4D00B710B6 /* make_icon.sh */, 73 | F416C1FA2DDCCC4D00B710B6 /* createicns */, 74 | F416C1FC2DDCCC4D00B710B6 /* fastdmg.iconset */, 75 | F416C1FD2DDCCC4D00B710B6 /* fastdmg.png */, 76 | F416C1F92DDCCC4D00B710B6 /* old */, 77 | ); 78 | path = Icon; 79 | sourceTree = ""; 80 | }; 81 | F45AC0EF20ACDB4D0086DF1D = { 82 | isa = PBXGroup; 83 | children = ( 84 | F4485613264AB4EE0098872C /* macos.yml */, 85 | F4FC1A062239E5D700CC1F6A /* Makefile */, 86 | F49A991B20ADEAC30064B9A4 /* LICENSE.txt */, 87 | F49A991C20ADEAC30064B9A4 /* README.md */, 88 | F45AC0FA20ACDB4E0086DF1D /* FastDMG */, 89 | F416C1FF2DDCCC4D00B710B6 /* Icon */, 90 | F45AC0F920ACDB4E0086DF1D /* Products */, 91 | ); 92 | sourceTree = ""; 93 | }; 94 | F45AC0F920ACDB4E0086DF1D /* Products */ = { 95 | isa = PBXGroup; 96 | children = ( 97 | F45AC0F820ACDB4E0086DF1D /* FastDMG.app */, 98 | ); 99 | name = Products; 100 | sourceTree = ""; 101 | }; 102 | F45AC0FA20ACDB4E0086DF1D /* FastDMG */ = { 103 | isa = PBXGroup; 104 | children = ( 105 | F45AC10420ACDB4F0086DF1D /* main.m */, 106 | F45AC0FB20ACDB4E0086DF1D /* FastDMGAppDelegate.h */, 107 | F45AC0FC20ACDB4E0086DF1D /* FastDMGAppDelegate.m */, 108 | F42C834220AF05A800E95DD4 /* FastDMGWindowController.h */, 109 | F42C834320AF05A800E95DD4 /* FastDMGWindowController.m */, 110 | F45AC10020ACDB4F0086DF1D /* MainMenu.xib */, 111 | F42C833F20AF048700E95DD4 /* MainWindow.xib */, 112 | F49A991720ADD90F0064B9A4 /* Credits.rtf */, 113 | F45AC10320ACDB4F0086DF1D /* Info.plist */, 114 | F4E2D4CD29268E2C00BDA386 /* diskimage.icns */, 115 | F416C1F32DDCC9FE00B710B6 /* fastdmg.icns */, 116 | ); 117 | path = FastDMG; 118 | sourceTree = ""; 119 | }; 120 | /* End PBXGroup section */ 121 | 122 | /* Begin PBXNativeTarget section */ 123 | F45AC0F720ACDB4E0086DF1D /* FastDMG */ = { 124 | isa = PBXNativeTarget; 125 | buildConfigurationList = F45AC10920ACDB4F0086DF1D /* Build configuration list for PBXNativeTarget "FastDMG" */; 126 | buildPhases = ( 127 | F45AC0F420ACDB4E0086DF1D /* Sources */, 128 | F45AC0F520ACDB4E0086DF1D /* Frameworks */, 129 | F45AC0F620ACDB4E0086DF1D /* Resources */, 130 | F49A990F20ADCA6E0064B9A4 /* Set CFBundleVersion */, 131 | ); 132 | buildRules = ( 133 | ); 134 | dependencies = ( 135 | ); 136 | name = FastDMG; 137 | productName = FastDMG; 138 | productReference = F45AC0F820ACDB4E0086DF1D /* FastDMG.app */; 139 | productType = "com.apple.product-type.application"; 140 | }; 141 | /* End PBXNativeTarget section */ 142 | 143 | /* Begin PBXProject section */ 144 | F45AC0F020ACDB4D0086DF1D /* Project object */ = { 145 | isa = PBXProject; 146 | attributes = { 147 | BuildIndependentTargetsInParallel = YES; 148 | LastUpgradeCheck = 1630; 149 | ORGANIZATIONNAME = "Sveinbjorn Thordarson"; 150 | TargetAttributes = { 151 | F45AC0F720ACDB4E0086DF1D = { 152 | CreatedOnToolsVersion = 9.3.1; 153 | }; 154 | }; 155 | }; 156 | buildConfigurationList = F45AC0F320ACDB4D0086DF1D /* Build configuration list for PBXProject "FastDMG" */; 157 | compatibilityVersion = "Xcode 9.3"; 158 | developmentRegion = en; 159 | hasScannedForEncodings = 0; 160 | knownRegions = ( 161 | en, 162 | Base, 163 | ); 164 | mainGroup = F45AC0EF20ACDB4D0086DF1D; 165 | productRefGroup = F45AC0F920ACDB4E0086DF1D /* Products */; 166 | projectDirPath = ""; 167 | projectRoot = ""; 168 | targets = ( 169 | F45AC0F720ACDB4E0086DF1D /* FastDMG */, 170 | ); 171 | }; 172 | /* End PBXProject section */ 173 | 174 | /* Begin PBXResourcesBuildPhase section */ 175 | F45AC0F620ACDB4E0086DF1D /* Resources */ = { 176 | isa = PBXResourcesBuildPhase; 177 | buildActionMask = 2147483647; 178 | files = ( 179 | F42C834120AF048700E95DD4 /* MainWindow.xib in Resources */, 180 | F4E2D4CE29268E2C00BDA386 /* diskimage.icns in Resources */, 181 | F49A991820ADD90F0064B9A4 /* Credits.rtf in Resources */, 182 | F45AC10220ACDB4F0086DF1D /* MainMenu.xib in Resources */, 183 | F416C1F42DDCC9FE00B710B6 /* fastdmg.icns in Resources */, 184 | ); 185 | runOnlyForDeploymentPostprocessing = 0; 186 | }; 187 | /* End PBXResourcesBuildPhase section */ 188 | 189 | /* Begin PBXShellScriptBuildPhase section */ 190 | F49A990F20ADCA6E0064B9A4 /* Set CFBundleVersion */ = { 191 | isa = PBXShellScriptBuildPhase; 192 | alwaysOutOfDate = 1; 193 | buildActionMask = 2147483647; 194 | files = ( 195 | ); 196 | inputPaths = ( 197 | ); 198 | name = "Set CFBundleVersion"; 199 | outputPaths = ( 200 | ); 201 | runOnlyForDeploymentPostprocessing = 0; 202 | shellPath = /bin/sh; 203 | shellScript = "#!/bin/sh\nBUILD_NUMBER=`git rev-list HEAD | wc -l`\n/usr/libexec/PlistBuddy -c \"Set :CFBundleVersion $BUILD_NUMBER\" \"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}\"\nif [ \"$?\" -ne 0 ] ; then\n echo \"warning:Error incrementing CFBundleVersion\"\nfi\n"; 204 | }; 205 | /* End PBXShellScriptBuildPhase section */ 206 | 207 | /* Begin PBXSourcesBuildPhase section */ 208 | F45AC0F420ACDB4E0086DF1D /* Sources */ = { 209 | isa = PBXSourcesBuildPhase; 210 | buildActionMask = 2147483647; 211 | files = ( 212 | F45AC10520ACDB4F0086DF1D /* main.m in Sources */, 213 | F45AC0FD20ACDB4E0086DF1D /* FastDMGAppDelegate.m in Sources */, 214 | F42C834420AF05A800E95DD4 /* FastDMGWindowController.m in Sources */, 215 | ); 216 | runOnlyForDeploymentPostprocessing = 0; 217 | }; 218 | /* End PBXSourcesBuildPhase section */ 219 | 220 | /* Begin PBXVariantGroup section */ 221 | F42C833F20AF048700E95DD4 /* MainWindow.xib */ = { 222 | isa = PBXVariantGroup; 223 | children = ( 224 | F42C834020AF048700E95DD4 /* Base */, 225 | ); 226 | name = MainWindow.xib; 227 | sourceTree = ""; 228 | }; 229 | F45AC10020ACDB4F0086DF1D /* MainMenu.xib */ = { 230 | isa = PBXVariantGroup; 231 | children = ( 232 | F45AC10120ACDB4F0086DF1D /* Base */, 233 | ); 234 | name = MainMenu.xib; 235 | sourceTree = ""; 236 | }; 237 | /* End PBXVariantGroup section */ 238 | 239 | /* Begin XCBuildConfiguration section */ 240 | F45AC10720ACDB4F0086DF1D /* Debug */ = { 241 | isa = XCBuildConfiguration; 242 | buildSettings = { 243 | ALWAYS_SEARCH_USER_PATHS = NO; 244 | CLANG_ANALYZER_NONNULL = YES; 245 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 246 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 247 | CLANG_CXX_LIBRARY = "libc++"; 248 | CLANG_ENABLE_MODULES = YES; 249 | CLANG_ENABLE_OBJC_ARC = YES; 250 | CLANG_ENABLE_OBJC_WEAK = YES; 251 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 252 | CLANG_WARN_BOOL_CONVERSION = YES; 253 | CLANG_WARN_COMMA = YES; 254 | CLANG_WARN_CONSTANT_CONVERSION = YES; 255 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 256 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 257 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 258 | CLANG_WARN_EMPTY_BODY = YES; 259 | CLANG_WARN_ENUM_CONVERSION = YES; 260 | CLANG_WARN_INFINITE_RECURSION = YES; 261 | CLANG_WARN_INT_CONVERSION = YES; 262 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 263 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 264 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 265 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 266 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 267 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 268 | CLANG_WARN_STRICT_PROTOTYPES = YES; 269 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 270 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 271 | CLANG_WARN_UNREACHABLE_CODE = YES; 272 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 273 | CODE_SIGN_IDENTITY = "Apple Development"; 274 | COPY_PHASE_STRIP = NO; 275 | DEAD_CODE_STRIPPING = YES; 276 | DEBUG_INFORMATION_FORMAT = dwarf; 277 | DEPLOYMENT_POSTPROCESSING = YES; 278 | DEVELOPMENT_TEAM = 5WX26Y89JP; 279 | ENABLE_STRICT_OBJC_MSGSEND = YES; 280 | ENABLE_TESTABILITY = NO; 281 | GCC_C_LANGUAGE_STANDARD = "compiler-default"; 282 | GCC_DYNAMIC_NO_PIC = NO; 283 | GCC_NO_COMMON_BLOCKS = YES; 284 | GCC_OPTIMIZATION_LEVEL = 0; 285 | GCC_PREPROCESSOR_DEFINITIONS = ( 286 | "DEBUG=1", 287 | "$(inherited)", 288 | ); 289 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 290 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 291 | GCC_WARN_UNDECLARED_SELECTOR = YES; 292 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 293 | GCC_WARN_UNUSED_FUNCTION = YES; 294 | GCC_WARN_UNUSED_VARIABLE = YES; 295 | GENERATE_PKGINFO_FILE = NO; 296 | INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; 297 | MACOSX_DEPLOYMENT_TARGET = 10.10; 298 | MTL_ENABLE_DEBUG_INFO = YES; 299 | ONLY_ACTIVE_ARCH = YES; 300 | SDKROOT = macosx; 301 | STRIPFLAGS = "-x"; 302 | WARNING_CFLAGS = "-Wpartial-availability"; 303 | }; 304 | name = Debug; 305 | }; 306 | F45AC10820ACDB4F0086DF1D /* Release */ = { 307 | isa = XCBuildConfiguration; 308 | buildSettings = { 309 | ALWAYS_SEARCH_USER_PATHS = NO; 310 | CLANG_ANALYZER_NONNULL = YES; 311 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 312 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 313 | CLANG_CXX_LIBRARY = "libc++"; 314 | CLANG_ENABLE_MODULES = YES; 315 | CLANG_ENABLE_OBJC_ARC = YES; 316 | CLANG_ENABLE_OBJC_WEAK = YES; 317 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 318 | CLANG_WARN_BOOL_CONVERSION = YES; 319 | CLANG_WARN_COMMA = YES; 320 | CLANG_WARN_CONSTANT_CONVERSION = YES; 321 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 322 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 323 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 324 | CLANG_WARN_EMPTY_BODY = YES; 325 | CLANG_WARN_ENUM_CONVERSION = YES; 326 | CLANG_WARN_INFINITE_RECURSION = YES; 327 | CLANG_WARN_INT_CONVERSION = YES; 328 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 329 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 330 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 331 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 332 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 333 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 334 | CLANG_WARN_STRICT_PROTOTYPES = YES; 335 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 336 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 337 | CLANG_WARN_UNREACHABLE_CODE = YES; 338 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 339 | CODE_SIGN_IDENTITY = "Apple Development"; 340 | COPY_PHASE_STRIP = YES; 341 | DEAD_CODE_STRIPPING = YES; 342 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 343 | DEPLOYMENT_POSTPROCESSING = YES; 344 | DEVELOPMENT_TEAM = 5WX26Y89JP; 345 | ENABLE_NS_ASSERTIONS = NO; 346 | ENABLE_STRICT_OBJC_MSGSEND = YES; 347 | ENABLE_TESTABILITY = NO; 348 | GCC_C_LANGUAGE_STANDARD = "compiler-default"; 349 | GCC_NO_COMMON_BLOCKS = YES; 350 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 351 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 352 | GCC_WARN_UNDECLARED_SELECTOR = YES; 353 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 354 | GCC_WARN_UNUSED_FUNCTION = YES; 355 | GCC_WARN_UNUSED_VARIABLE = YES; 356 | GENERATE_PKGINFO_FILE = NO; 357 | INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; 358 | MACOSX_DEPLOYMENT_TARGET = 10.10; 359 | MTL_ENABLE_DEBUG_INFO = NO; 360 | SDKROOT = macosx; 361 | STRIPFLAGS = "-x"; 362 | WARNING_CFLAGS = "-Wpartial-availability"; 363 | }; 364 | name = Release; 365 | }; 366 | F45AC10A20ACDB4F0086DF1D /* Debug */ = { 367 | isa = XCBuildConfiguration; 368 | buildSettings = { 369 | CODE_SIGN_ENTITLEMENTS = ""; 370 | CODE_SIGN_IDENTITY = "Apple Development"; 371 | "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Developer ID Application"; 372 | CODE_SIGN_STYLE = Manual; 373 | DEPLOYMENT_POSTPROCESSING = NO; 374 | ENABLE_HARDENED_RUNTIME = YES; 375 | INFOPLIST_FILE = FastDMG/Info.plist; 376 | LD_RUNPATH_SEARCH_PATHS = ""; 377 | MACOSX_DEPLOYMENT_TARGET = 10.13; 378 | PRODUCT_BUNDLE_IDENTIFIER = org.sveinbjorn.FastDMG; 379 | PRODUCT_NAME = "$(TARGET_NAME)"; 380 | PROVISIONING_PROFILE_SPECIFIER = ""; 381 | }; 382 | name = Debug; 383 | }; 384 | F45AC10B20ACDB4F0086DF1D /* Release */ = { 385 | isa = XCBuildConfiguration; 386 | buildSettings = { 387 | CODE_SIGN_ENTITLEMENTS = ""; 388 | CODE_SIGN_IDENTITY = "Apple Development"; 389 | "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Developer ID Application"; 390 | CODE_SIGN_STYLE = Manual; 391 | ENABLE_HARDENED_RUNTIME = YES; 392 | INFOPLIST_FILE = FastDMG/Info.plist; 393 | LD_RUNPATH_SEARCH_PATHS = ""; 394 | MACOSX_DEPLOYMENT_TARGET = 10.13; 395 | PRODUCT_BUNDLE_IDENTIFIER = org.sveinbjorn.FastDMG; 396 | PRODUCT_NAME = "$(TARGET_NAME)"; 397 | PROVISIONING_PROFILE_SPECIFIER = ""; 398 | }; 399 | name = Release; 400 | }; 401 | /* End XCBuildConfiguration section */ 402 | 403 | /* Begin XCConfigurationList section */ 404 | F45AC0F320ACDB4D0086DF1D /* Build configuration list for PBXProject "FastDMG" */ = { 405 | isa = XCConfigurationList; 406 | buildConfigurations = ( 407 | F45AC10720ACDB4F0086DF1D /* Debug */, 408 | F45AC10820ACDB4F0086DF1D /* Release */, 409 | ); 410 | defaultConfigurationIsVisible = 0; 411 | defaultConfigurationName = Release; 412 | }; 413 | F45AC10920ACDB4F0086DF1D /* Build configuration list for PBXNativeTarget "FastDMG" */ = { 414 | isa = XCConfigurationList; 415 | buildConfigurations = ( 416 | F45AC10A20ACDB4F0086DF1D /* Debug */, 417 | F45AC10B20ACDB4F0086DF1D /* Release */, 418 | ); 419 | defaultConfigurationIsVisible = 0; 420 | defaultConfigurationName = Release; 421 | }; 422 | /* End XCConfigurationList section */ 423 | }; 424 | rootObject = F45AC0F020ACDB4D0086DF1D /* Project object */; 425 | } 426 | -------------------------------------------------------------------------------- /FastDMG.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /FastDMG.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /FastDMG.xcodeproj/xcuserdata/sveinbjorn.xcuserdatad/xcschemes/FastDMG.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 41 | 42 | 52 | 54 | 60 | 61 | 62 | 63 | 69 | 71 | 77 | 78 | 79 | 80 | 82 | 83 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /FastDMG.xcodeproj/xcuserdata/sveinbjorn.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | FastDMG.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | F45AC0F720ACDB4E0086DF1D 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /FastDMG/Base.lproj/MainMenu.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /FastDMG/Base.lproj/MainWindow.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 50 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 93 | 104 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | -------------------------------------------------------------------------------- /FastDMG/Credits.rtf: -------------------------------------------------------------------------------- 1 | {\rtf1\ansi\ansicpg1252\cocoartf1561\cocoasubrtf400 2 | {\fonttbl\f0\fswiss\fcharset0 Helvetica;} 3 | {\colortbl;\red255\green255\blue255;} 4 | {\*\expandedcolortbl;;} 5 | \paperw11900\paperh16840\margl1440\margr1440\vieww10800\viewh8400\viewkind0 6 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0 7 | 8 | \f0\fs24 \cf0 Created by {\field{\*\fldinst{HYPERLINK "mailto:sveinbjorn@sveinbjorn.org"}}{\fldrslt Sveinbjorn Thordarson}}\ 9 | \ 10 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0 11 | {\field{\*\fldinst{HYPERLINK "https://sveinbjorn.org/fastdmg"}}{\fldrslt \cf0 https://sveinbjorn.org/fastdmg}}\ 12 | \pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\qc\partightenfactor0 13 | \cf0 \ 14 | FastDMG is free, open-source software distributed under a BSD license. If you like it, feel free to {\field{\*\fldinst{HYPERLINK "https://sveinbjorn.org/donations"}}{\fldrslt make a donation}}.} -------------------------------------------------------------------------------- /FastDMG/FastDMGAppDelegate.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2012-2025, Sveinbjorn Thordarson 3 | All rights reserved. 4 | 5 | Redistribution and use in source and binary forms, with or without modification, 6 | are permitted provided that the following conditions are met: 7 | 8 | 1. Redistributions of source code must retain the above copyright notice, this 9 | list of conditions and the following disclaimer. 10 | 11 | 2. Redistributions in binary form must reproduce the above copyright notice, this 12 | list of conditions and the following disclaimer in the documentation and/or other 13 | materials provided with the distribution. 14 | 15 | 3. Neither the name of the copyright holder nor the names of its contributors may 16 | be used to endorse or promote products derived from this software without specific 17 | prior written permission. 18 | 19 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 20 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 21 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 22 | IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 23 | INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 24 | NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 25 | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 26 | WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 | POSSIBILITY OF SUCH DAMAGE. 29 | */ 30 | 31 | #import 32 | 33 | @interface FastDMGAppDelegate : NSObject 34 | 35 | @end 36 | -------------------------------------------------------------------------------- /FastDMG/FastDMGAppDelegate.m: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2012-2025, Sveinbjorn Thordarson 3 | All rights reserved. 4 | 5 | Redistribution and use in source and binary forms, with or without modification, 6 | are permitted provided that the following conditions are met: 7 | 8 | 1. Redistributions of source code must retain the above copyright notice, this 9 | list of conditions and the following disclaimer. 10 | 11 | 2. Redistributions in binary form must reproduce the above copyright notice, this 12 | list of conditions and the following disclaimer in the documentation and/or other 13 | materials provided with the distribution. 14 | 15 | 3. Neither the name of the copyright holder nor the names of its contributors may 16 | be used to endorse or promote products derived from this software without specific 17 | prior written permission. 18 | 19 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 20 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 21 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 22 | IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 23 | INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 24 | NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 25 | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 26 | WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 | POSSIBILITY OF SUCH DAMAGE. 29 | */ 30 | 31 | #import "FastDMGAppDelegate.h" 32 | #import "FastDMGWindowController.h" 33 | 34 | #define DEFAULTS [NSUserDefaults standardUserDefaults] 35 | 36 | #ifdef DEBUG 37 | #define DLog(...) NSLog(__VA_ARGS__) 38 | #else 39 | #define DLog(...) 40 | #endif 41 | 42 | @interface FastDMGAppDelegate () 43 | { 44 | BOOL hasReceivedOpenFileEvent; 45 | BOOL inForeground; 46 | BOOL numActiveTasks; 47 | 48 | FastDMGWindowController *windowController; 49 | } 50 | @end 51 | 52 | @implementation FastDMGAppDelegate 53 | 54 | + (void)initialize { 55 | static dispatch_once_t onceToken; 56 | dispatch_once(&onceToken, ^{ 57 | [DEFAULTS registerDefaults:[FastDMGAppDelegate defaults]]; 58 | }); 59 | } 60 | 61 | + (NSDictionary *)defaults { 62 | return @{ @"RunInBackground": @(YES), 63 | @"OpenDiskImage": @(YES), 64 | @"QuitAfterMounting": @(YES) }; 65 | } 66 | 67 | - (void)awakeFromNib { 68 | // Transition to foreground if RunInBackground setting is NO 69 | if (!inForeground && [DEFAULTS boolForKey:@"RunInBackground"] == NO) { 70 | inForeground = [self transformToForeground]; 71 | } 72 | // Start listening for task done notifications 73 | [[NSNotificationCenter defaultCenter] addObserver:self 74 | selector:@selector(taskDone:) 75 | name:@"FastDMGTaskDoneNotification" 76 | object:nil]; 77 | } 78 | 79 | #pragma mark - 80 | 81 | - (BOOL)transformToForeground { 82 | // Use nasty Carbon API to transition between application states 83 | ProcessSerialNumber psn = { 0, kCurrentProcess }; 84 | OSStatus ret = TransformProcessType(&psn, kProcessTransformToForegroundApplication); 85 | if (ret != noErr) { 86 | DLog(@"Failed to transform application to foreground state: %d", ret); 87 | return NO; 88 | } 89 | 90 | // Important: After transforming to a foreground app, we need to 91 | // register for dock notifications and set activation policy 92 | [[NSApplication sharedApplication] setActivationPolicy:NSApplicationActivationPolicyRegular]; 93 | 94 | // We also need to ensure the app appears in the dock 95 | [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular]; 96 | 97 | return YES; 98 | } 99 | 100 | - (IBAction)showWindow:(id)sender { 101 | // Load window lazily 102 | if (windowController == nil) { 103 | windowController = [[FastDMGWindowController alloc] initWithWindowNibName:@"MainWindow"]; 104 | } 105 | [windowController showWindow:self]; 106 | } 107 | 108 | #pragma mark - NSApplicationDelegate 109 | 110 | - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 111 | // We only become a foreground application if the 112 | // application wasn't launched by opening a file. 113 | // In that case, we show FastDMG Settings window. 114 | [self performSelector:@selector(showPrefs) withObject:nil afterDelay:0.5]; 115 | } 116 | 117 | - (BOOL)application:(NSApplication *)app openFile:(NSString *)path { 118 | hasReceivedOpenFileEvent = YES; 119 | 120 | [self mountDiskImage:path]; 121 | 122 | return YES; 123 | } 124 | 125 | - (void)showPrefs { 126 | // Show Preferences window 127 | if (hasReceivedOpenFileEvent == NO) { 128 | if (!inForeground) { 129 | inForeground = [self transformToForeground]; 130 | 131 | // This slight delay is important to let the UI update after the transformation 132 | [self performSelector:@selector(showAndActivateWindow) withObject:nil afterDelay:0.1]; 133 | } else { 134 | [self showAndActivateWindow]; 135 | } 136 | } 137 | } 138 | 139 | - (void)showAndActivateWindow { 140 | // First activate the app itself 141 | [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; 142 | 143 | // Then show window and make it key 144 | [self showWindow:self]; 145 | 146 | // Force window to front and make it key 147 | if (windowController && windowController.window) { 148 | [windowController.window makeKeyAndOrderFront:self]; 149 | 150 | // Special addition to ensure the window becomes active and key 151 | [NSApp arrangeInFront:self]; 152 | } 153 | } 154 | 155 | #pragma mark - Handle disk images 156 | 157 | - (IBAction)openFiles:(id)sender { 158 | // Create open panel 159 | NSOpenPanel *oPanel = [NSOpenPanel openPanel]; 160 | [oPanel setAllowsMultipleSelection:YES]; 161 | [oPanel setCanChooseFiles:YES]; 162 | [oPanel setCanChooseDirectories:NO]; 163 | 164 | // Run it modally 165 | if ([oPanel runModal] == NSModalResponseOK) { 166 | for (NSURL *url in [oPanel URLs]) { 167 | [self mountDiskImage:[url path]]; 168 | } 169 | } 170 | } 171 | 172 | - (void)mountDiskImage:(NSString *)diskImagePath { 173 | 174 | numActiveTasks += 1; 175 | 176 | // Set task off in high priority background thread 177 | dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ @autoreleasepool { 178 | DLog(@"Launching task: %@", diskImagePath); 179 | 180 | NSTask *task = [NSTask new]; 181 | task.launchPath = @"/usr/bin/hdiutil"; // present on all macOS systems 182 | 183 | // See man hdiutil for details 184 | task.arguments = @[@"attach", 185 | diskImagePath, 186 | @"-plist", 187 | @"-noautoopen", 188 | @"-noautofsck", 189 | @"-noverify", 190 | @"-ignorebadchecksums", 191 | @"-noidme"]; 192 | 193 | // STDIN 194 | task.standardInput = [NSPipe pipe]; 195 | NSFileHandle *inputHandle = [task.standardInput fileHandleForWriting]; 196 | // Auto-accept EULAs by feeding 'Y' into STDIN 197 | [inputHandle writeData:[@"Y\n" dataUsingEncoding:NSUTF8StringEncoding]]; 198 | 199 | // STDOUT 200 | // We're only interested in output if we need 201 | // to show image contents in the Finder 202 | if ([DEFAULTS boolForKey:@"OpenDiskImage"]) { 203 | task.standardOutput = [NSPipe pipe]; 204 | } else { 205 | task.standardOutput = [NSFileHandle fileHandleWithNullDevice]; 206 | } 207 | 208 | // STDERR 209 | task.standardError = [NSFileHandle fileHandleWithNullDevice]; 210 | 211 | // Launch 212 | [task launch]; 213 | [inputHandle closeFile]; // Close STDIN 214 | [task waitUntilExit]; 215 | 216 | DLog(@"Task termination status: %d", task.terminationStatus); 217 | 218 | // Open disk image in Finder 219 | if (task.terminationStatus == 0 && [DEFAULTS boolForKey:@"OpenDiskImage"]) { 220 | 221 | // Parse task output 222 | NSData *data = [[task.standardOutput fileHandleForReading] readDataToEndOfFile]; 223 | NSString *mountPoint = [self parseOutputForMountPath:data]; 224 | 225 | if (mountPoint) { 226 | // Make sure volume has been mounted at mount point 227 | int polling_ms = 50000; // 0.05 sec 228 | int max = 1000000/polling_ms; 229 | int cnt = 0; 230 | // Give it max 1 sec to mount 231 | while (cnt < max && [[NSFileManager defaultManager] fileExistsAtPath:mountPoint] == NO) { 232 | usleep(polling_ms); 233 | cnt++; 234 | DLog(@"Sleeping, no file at %@", mountPoint); 235 | } 236 | 237 | if (cnt == max-1) { 238 | DLog(@"Mount point '%@' doesn't exist", mountPoint); 239 | } else { 240 | // Show in Finder 241 | DLog(@"Revealing '%@' in Finder", mountPoint); 242 | [[NSWorkspace sharedWorkspace] openFile:mountPoint 243 | withApplication:@"Finder" 244 | andDeactivate:YES]; 245 | } 246 | } 247 | } 248 | 249 | // Notify on main thread that task is done 250 | dispatch_async(dispatch_get_main_queue(), ^{ 251 | 252 | if (task.terminationStatus != 0) { 253 | [self handleFailure:diskImagePath]; 254 | } 255 | 256 | [[NSNotificationCenter defaultCenter] postNotificationName:@"FastDMGTaskDoneNotification" object:diskImagePath]; 257 | 258 | DLog(@"Finished processing %@", diskImagePath); 259 | }); 260 | 261 | }}); 262 | } 263 | 264 | - (NSString *)parseOutputForMountPath:(NSData *)outputData { 265 | // Create string object 266 | NSString *outputStr = [[NSString alloc] initWithData:outputData encoding:NSUTF8StringEncoding]; 267 | if (outputStr) { 268 | DLog(@"Output:\n%@", outputStr); 269 | } else { 270 | DLog(@"Unable to read output data as UTF8 string"); 271 | return nil; 272 | } 273 | 274 | // Search for property list output 275 | NSString *xmlHeader = @" 3 | All rights reserved. 4 | 5 | Redistribution and use in source and binary forms, with or without modification, 6 | are permitted provided that the following conditions are met: 7 | 8 | 1. Redistributions of source code must retain the above copyright notice, this 9 | list of conditions and the following disclaimer. 10 | 11 | 2. Redistributions in binary form must reproduce the above copyright notice, this 12 | list of conditions and the following disclaimer in the documentation and/or other 13 | materials provided with the distribution. 14 | 15 | 3. Neither the name of the copyright holder nor the names of its contributors may 16 | be used to endorse or promote products derived from this software without specific 17 | prior written permission. 18 | 19 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 20 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 21 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 22 | IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 23 | INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 24 | NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 25 | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 26 | WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 | POSSIBILITY OF SUCH DAMAGE. 29 | */ 30 | 31 | #import 32 | 33 | @interface FastDMGWindowController : NSWindowController 34 | 35 | @end 36 | -------------------------------------------------------------------------------- /FastDMG/FastDMGWindowController.m: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2012-2025, Sveinbjorn Thordarson 3 | All rights reserved. 4 | 5 | Redistribution and use in source and binary forms, with or without modification, 6 | are permitted provided that the following conditions are met: 7 | 8 | 1. Redistributions of source code must retain the above copyright notice, this 9 | list of conditions and the following disclaimer. 10 | 11 | 2. Redistributions in binary form must reproduce the above copyright notice, this 12 | list of conditions and the following disclaimer in the documentation and/or other 13 | materials provided with the distribution. 14 | 15 | 3. Neither the name of the copyright holder nor the names of its contributors may 16 | be used to endorse or promote products derived from this software without specific 17 | prior written permission. 18 | 19 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 20 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 21 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 22 | IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 23 | INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 24 | NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 25 | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 26 | WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 | POSSIBILITY OF SUCH DAMAGE. 29 | */ 30 | 31 | #import "FastDMGWindowController.h" 32 | 33 | @interface FastDMGWindowController () 34 | { 35 | IBOutlet NSTextView *aboutTextView; 36 | IBOutlet NSTextField *versionTextField; 37 | } 38 | @end 39 | 40 | @implementation FastDMGWindowController 41 | 42 | - (void)windowDidLoad { 43 | [super windowDidLoad]; 44 | 45 | NSString *rtfFilePath = [[NSBundle mainBundle] pathForResource:@"Credits" ofType:@"rtf"]; 46 | [aboutTextView readRTFDFromFile:rtfFilePath]; 47 | [aboutTextView setTextColor:[NSColor labelColor]]; 48 | 49 | NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]; 50 | [versionTextField setStringValue:[NSString stringWithFormat:@"Version %@", version]]; 51 | } 52 | 53 | - (void)windowWillClose:(NSNotification *)notification { 54 | [[NSApplication sharedApplication] terminate:self]; 55 | } 56 | 57 | @end 58 | -------------------------------------------------------------------------------- /FastDMG/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | $(PRODUCT_NAME) 9 | CFBundleDocumentTypes 10 | 11 | 12 | CFBundleTypeExtensions 13 | 14 | ndif 15 | img 16 | 17 | CFBundleTypeIconFile 18 | diskimage.icns 19 | CFBundleTypeName 20 | NDIF Disk Image 21 | CFBundleTypeOSTypes 22 | 23 | dimg 24 | hdro 25 | rohd 26 | hdcm 27 | 28 | CFBundleTypeRole 29 | Viewer 30 | 31 | 32 | CFBundleTypeExtensions 33 | 34 | imgpart 35 | 36 | CFBundleTypeIconFile 37 | diskimage.icns 38 | CFBundleTypeName 39 | NDIF Disk Image Segment 40 | CFBundleTypeOSTypes 41 | 42 | dseg 43 | 44 | CFBundleTypeRole 45 | Viewer 46 | 47 | 48 | CFBundleTypeExtensions 49 | 50 | smi 51 | 52 | CFBundleTypeIconFile 53 | diskimage.icns 54 | CFBundleTypeName 55 | Self Mounting Image 56 | CFBundleTypeRole 57 | Viewer 58 | 59 | 60 | CFBundleTypeExtensions 61 | 62 | dmg 63 | udif 64 | 65 | CFBundleTypeIconFile 66 | diskimage.icns 67 | CFBundleTypeName 68 | Disk Image 69 | CFBundleTypeOSTypes 70 | 71 | devi 72 | 73 | CFBundleTypeRole 74 | Viewer 75 | 76 | 77 | CFBundleTypeExtensions 78 | 79 | toast 80 | dvdr 81 | cdr 82 | 83 | CFBundleTypeIconFile 84 | diskimage.icns 85 | CFBundleTypeName 86 | DVD/CD-R Master Image 87 | CFBundleTypeOSTypes 88 | 89 | GImg 90 | PImg 91 | 92 | CFBundleTypeRole 93 | Viewer 94 | 95 | 96 | CFBundleTypeExtensions 97 | 98 | dmgpart 99 | 100 | CFBundleTypeIconFile 101 | diskimage.icns 102 | CFBundleTypeName 103 | Disk Image Segment 104 | CFBundleTypeOSTypes 105 | 106 | devs 107 | 108 | CFBundleTypeRole 109 | Viewer 110 | 111 | 112 | CFBundleTypeExtensions 113 | 114 | dc42 115 | diskcopy42 116 | 117 | CFBundleTypeIconFile 118 | diskimage.icns 119 | CFBundleTypeName 120 | Disk Copy 4.2 Disk Image 121 | CFBundleTypeOSTypes 122 | 123 | dImg 124 | 125 | CFBundleTypeRole 126 | Viewer 127 | 128 | 129 | CFBundleTypeExtensions 130 | 131 | dart 132 | 133 | CFBundleTypeIconFile 134 | diskimage.icns 135 | CFBundleTypeName 136 | DART Disk Image 137 | CFBundleTypeOSTypes 138 | 139 | DMdf 140 | DMd0 141 | DMd1 142 | DMd2 143 | DMd3 144 | DMd4 145 | DMd5 146 | DMd6 147 | DMd7 148 | 149 | CFBundleTypeRole 150 | Viewer 151 | 152 | 153 | CFBundleTypeIconFile 154 | diskimage.icns 155 | CFBundleTypeName 156 | Raw Disk Image 157 | CFBundleTypeOSTypes 158 | 159 | devr 160 | hdrv 161 | DDim 162 | 163 | CFBundleTypeRole 164 | Viewer 165 | 166 | 167 | CFBundleTypeIconFile 168 | diskimage.icns 169 | CFBundleTypeName 170 | PC Drive Container 171 | CFBundleTypeOSTypes 172 | 173 | OPCD 174 | 175 | CFBundleTypeRole 176 | Viewer 177 | 178 | 179 | CFBundleTypeExtensions 180 | 181 | iso 182 | 183 | CFBundleTypeIconFile 184 | diskimage.icns 185 | CFBundleTypeName 186 | ISO Disk Image 187 | CFBundleTypeRole 188 | Viewer 189 | 190 | 191 | CFBundleTypeExtensions 192 | 193 | sparseimage 194 | 195 | CFBundleTypeIconFile 196 | diskimage.icns 197 | CFBundleTypeName 198 | Sparse Disk Image 199 | CFBundleTypeRole 200 | Viewer 201 | 202 | 203 | CFBundleTypeExtensions 204 | 205 | sparsebundle 206 | 207 | CFBundleTypeIconFile 208 | diskimage.icns 209 | CFBundleTypeName 210 | Sparse Disk Image Bundle 211 | CFBundleTypeRole 212 | Viewer 213 | 214 | 215 | CFBundleExecutable 216 | $(EXECUTABLE_NAME) 217 | CFBundleGetInfoString 218 | Copyright © 2012-2025 Sveinbjorn Thordarson. All rights reserved. 219 | CFBundleIconFile 220 | fastdmg 221 | CFBundleIdentifier 222 | $(PRODUCT_BUNDLE_IDENTIFIER) 223 | CFBundleInfoDictionaryVersion 224 | 6.0 225 | CFBundleName 226 | $(PRODUCT_NAME) 227 | CFBundlePackageType 228 | APPL 229 | CFBundleShortVersionString 230 | 1.0.3 231 | CFBundleSignature 232 | fdmg 233 | CFBundleVersion 234 | 3 235 | LSApplicationCategoryType 236 | public.app-category.utilities 237 | LSMinimumSystemVersion 238 | $(MACOSX_DEPLOYMENT_TARGET) 239 | LSUIElement 240 | 241 | NSHumanReadableCopyright 242 | Copyright © 2012-2025 Sveinbjorn Thordarson. All rights reserved. 243 | NSMainNibFile 244 | MainMenu 245 | NSPrincipalClass 246 | NSApplication 247 | NSSupportsSuddenTermination 248 | 249 | 250 | 251 | -------------------------------------------------------------------------------- /FastDMG/diskimage.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveinbjornt/FastDMG/76a9202fa0026a0260191c3020f430f5396a9926/FastDMG/diskimage.icns -------------------------------------------------------------------------------- /FastDMG/fastdmg.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveinbjornt/FastDMG/76a9202fa0026a0260191c3020f430f5396a9926/FastDMG/fastdmg.icns -------------------------------------------------------------------------------- /FastDMG/main.m: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2012-2025, Sveinbjorn Thordarson 3 | All rights reserved. 4 | 5 | Redistribution and use in source and binary forms, with or without modification, 6 | are permitted provided that the following conditions are met: 7 | 8 | 1. Redistributions of source code must retain the above copyright notice, this 9 | list of conditions and the following disclaimer. 10 | 11 | 2. Redistributions in binary form must reproduce the above copyright notice, this 12 | list of conditions and the following disclaimer in the documentation and/or other 13 | materials provided with the distribution. 14 | 15 | 3. Neither the name of the copyright holder nor the names of its contributors may 16 | be used to endorse or promote products derived from this software without specific 17 | prior written permission. 18 | 19 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 20 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 21 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 22 | IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 23 | INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 24 | NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 25 | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 26 | WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 | POSSIBILITY OF SUCH DAMAGE. 29 | */ 30 | 31 | #import 32 | 33 | int main(int argc, const char * argv[]) { 34 | return NSApplicationMain(argc, argv); 35 | } 36 | -------------------------------------------------------------------------------- /Icon/createicns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveinbjornt/FastDMG/76a9202fa0026a0260191c3020f430f5396a9926/Icon/createicns -------------------------------------------------------------------------------- /Icon/fastdmg.iconset/icon_128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveinbjornt/FastDMG/76a9202fa0026a0260191c3020f430f5396a9926/Icon/fastdmg.iconset/icon_128x128.png -------------------------------------------------------------------------------- /Icon/fastdmg.iconset/icon_128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveinbjornt/FastDMG/76a9202fa0026a0260191c3020f430f5396a9926/Icon/fastdmg.iconset/icon_128x128@2x.png -------------------------------------------------------------------------------- /Icon/fastdmg.iconset/icon_16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveinbjornt/FastDMG/76a9202fa0026a0260191c3020f430f5396a9926/Icon/fastdmg.iconset/icon_16x16.png -------------------------------------------------------------------------------- /Icon/fastdmg.iconset/icon_16x16@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveinbjornt/FastDMG/76a9202fa0026a0260191c3020f430f5396a9926/Icon/fastdmg.iconset/icon_16x16@2x.png -------------------------------------------------------------------------------- /Icon/fastdmg.iconset/icon_256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveinbjornt/FastDMG/76a9202fa0026a0260191c3020f430f5396a9926/Icon/fastdmg.iconset/icon_256x256.png -------------------------------------------------------------------------------- /Icon/fastdmg.iconset/icon_256x256@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveinbjornt/FastDMG/76a9202fa0026a0260191c3020f430f5396a9926/Icon/fastdmg.iconset/icon_256x256@2x.png -------------------------------------------------------------------------------- /Icon/fastdmg.iconset/icon_32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveinbjornt/FastDMG/76a9202fa0026a0260191c3020f430f5396a9926/Icon/fastdmg.iconset/icon_32x32.png -------------------------------------------------------------------------------- /Icon/fastdmg.iconset/icon_32x32@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveinbjornt/FastDMG/76a9202fa0026a0260191c3020f430f5396a9926/Icon/fastdmg.iconset/icon_32x32@2x.png -------------------------------------------------------------------------------- /Icon/fastdmg.iconset/icon_512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveinbjornt/FastDMG/76a9202fa0026a0260191c3020f430f5396a9926/Icon/fastdmg.iconset/icon_512x512.png -------------------------------------------------------------------------------- /Icon/fastdmg.iconset/icon_512x512@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveinbjornt/FastDMG/76a9202fa0026a0260191c3020f430f5396a9926/Icon/fastdmg.iconset/icon_512x512@2x.png -------------------------------------------------------------------------------- /Icon/fastdmg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveinbjornt/FastDMG/76a9202fa0026a0260191c3020f430f5396a9926/Icon/fastdmg.png -------------------------------------------------------------------------------- /Icon/fastdmg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 20 | 22 | 25 | 29 | 33 | 34 | 37 | 41 | 45 | 49 | 50 | 53 | 57 | 61 | 62 | 65 | 69 | 73 | 74 | 77 | 81 | 85 | 89 | 93 | 97 | 101 | 105 | 109 | 110 | 113 | 117 | 121 | 122 | 125 | 129 | 133 | 134 | 137 | 143 | 149 | 154 | 158 | 159 | 162 | 167 | 168 | 174 | 180 | 185 | 189 | 190 | 198 | 202 | 203 | 212 | 221 | 230 | 238 | 242 | 243 | 251 | 255 | 256 | 264 | 268 | 269 | 278 | 287 | 295 | 299 | 300 | 309 | 318 | 327 | 336 | 339 | 344 | 345 | 353 | 357 | 358 | 361 | 369 | 370 | 378 | 382 | 383 | 392 | 393 | 413 | 416 | 417 | 419 | 420 | 422 | image/svg+xml 423 | 425 | 426 | 427 | 428 | 429 | 433 | 439 | 443 | 448 | 452 | 460 | 465 | 471 | 477 | 481 | 487 | 493 | 500 | 508 | 512 | 517 | 521 | 527 | 528 | 539 | 540 | -------------------------------------------------------------------------------- /Icon/make_icon.sh: -------------------------------------------------------------------------------- 1 | rm -r fastdmg.iconset &> /dev/null 2 | mkdir fastdmg.iconset 3 | sips -z 16 16 fastdmg.png --out fastdmg.iconset/icon_16x16.png 4 | sips -z 32 32 fastdmg.png --out fastdmg.iconset/icon_16x16@2x.png 5 | sips -z 32 32 fastdmg.png --out fastdmg.iconset/icon_32x32.png 6 | sips -z 64 64 fastdmg.png --out fastdmg.iconset/icon_32x32@2x.png 7 | sips -z 128 128 fastdmg.png --out fastdmg.iconset/icon_128x128.png 8 | sips -z 256 256 fastdmg.png --out fastdmg.iconset/icon_128x128@2x.png 9 | sips -z 256 256 fastdmg.png --out fastdmg.iconset/icon_256x256.png 10 | sips -z 512 512 fastdmg.png --out fastdmg.iconset/icon_256x256@2x.png 11 | sips -z 512 512 fastdmg.png --out fastdmg.iconset/icon_512x512.png 12 | cp fastdmg.png fastdmg.iconset/icon_512x512@2x.png 13 | # Run through ImageOptim... 14 | # iconutil -c icns fastdmg.iconset 15 | # ./createicns fastdmg.iconset 16 | -------------------------------------------------------------------------------- /Icon/old/fastdmg.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveinbjornt/FastDMG/76a9202fa0026a0260191c3020f430f5396a9926/Icon/old/fastdmg.ai -------------------------------------------------------------------------------- /Icon/old/fastdmg.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveinbjornt/FastDMG/76a9202fa0026a0260191c3020f430f5396a9926/Icon/old/fastdmg.icns -------------------------------------------------------------------------------- /Icon/old/fastdmg.iconset/icon_128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveinbjornt/FastDMG/76a9202fa0026a0260191c3020f430f5396a9926/Icon/old/fastdmg.iconset/icon_128x128.png -------------------------------------------------------------------------------- /Icon/old/fastdmg.iconset/icon_128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveinbjornt/FastDMG/76a9202fa0026a0260191c3020f430f5396a9926/Icon/old/fastdmg.iconset/icon_128x128@2x.png -------------------------------------------------------------------------------- /Icon/old/fastdmg.iconset/icon_16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveinbjornt/FastDMG/76a9202fa0026a0260191c3020f430f5396a9926/Icon/old/fastdmg.iconset/icon_16x16.png -------------------------------------------------------------------------------- /Icon/old/fastdmg.iconset/icon_16x16@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveinbjornt/FastDMG/76a9202fa0026a0260191c3020f430f5396a9926/Icon/old/fastdmg.iconset/icon_16x16@2x.png -------------------------------------------------------------------------------- /Icon/old/fastdmg.iconset/icon_256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveinbjornt/FastDMG/76a9202fa0026a0260191c3020f430f5396a9926/Icon/old/fastdmg.iconset/icon_256x256.png -------------------------------------------------------------------------------- /Icon/old/fastdmg.iconset/icon_256x256@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveinbjornt/FastDMG/76a9202fa0026a0260191c3020f430f5396a9926/Icon/old/fastdmg.iconset/icon_256x256@2x.png -------------------------------------------------------------------------------- /Icon/old/fastdmg.iconset/icon_32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveinbjornt/FastDMG/76a9202fa0026a0260191c3020f430f5396a9926/Icon/old/fastdmg.iconset/icon_32x32.png -------------------------------------------------------------------------------- /Icon/old/fastdmg.iconset/icon_32x32@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveinbjornt/FastDMG/76a9202fa0026a0260191c3020f430f5396a9926/Icon/old/fastdmg.iconset/icon_32x32@2x.png -------------------------------------------------------------------------------- /Icon/old/fastdmg.iconset/icon_512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveinbjornt/FastDMG/76a9202fa0026a0260191c3020f430f5396a9926/Icon/old/fastdmg.iconset/icon_512x512.png -------------------------------------------------------------------------------- /Icon/old/fastdmg.iconset/icon_512x512@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveinbjornt/FastDMG/76a9202fa0026a0260191c3020f430f5396a9926/Icon/old/fastdmg.iconset/icon_512x512@2x.png -------------------------------------------------------------------------------- /Icon/old/fastdmg_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveinbjornt/FastDMG/76a9202fa0026a0260191c3020f430f5396a9926/Icon/old/fastdmg_icon.png -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2012-2025, Sveinbjorn Thordarson 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | * Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | * Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | * Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # Makefile for FastDMG 2 | 3 | release: clean build size 4 | 5 | build_unsigned: 6 | mkdir -p products 7 | xattr -w com.apple.xcode.CreatedByBuildSystem true products 8 | xcodebuild -parallelizeTargets \ 9 | -project "FastDMG.xcodeproj" \ 10 | -target "FastDMG" \ 11 | -configuration "Release" \ 12 | CONFIGURATION_BUILD_DIR="products" \ 13 | CODE_SIGN_IDENTITY="" \ 14 | CODE_SIGNING_REQUIRED=NO \ 15 | clean build 16 | 17 | build: 18 | mkdir -p products 19 | xattr -w com.apple.xcode.CreatedByBuildSystem true products 20 | xcodebuild -parallelizeTargets \ 21 | -project "FastDMG.xcodeproj" \ 22 | -target "FastDMG" \ 23 | -configuration "Release" \ 24 | CONFIGURATION_BUILD_DIR="products" \ 25 | clean build 26 | 27 | size: 28 | @echo "App size:" 29 | @du -hs products/FastDMG.app 30 | @echo "Binary size:" 31 | @du -hs products/FastDMG.app/Contents/MacOS/* 32 | 33 | clean: 34 | xattr -w com.apple.xcode.CreatedByBuildSystem true products 35 | xcodebuild -project "FastDMG.xcodeproj" clean 36 | rm -rf products/* 2> /dev/null 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![macOS](https://img.shields.io/badge/macOS-000000?style=flat&logo=apple&logoColor=white)]() 2 | [![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause) 3 | [![Language](https://img.shields.io/badge/language-objective--c-lightgrey)]() 4 | [![Release](https://shields.io/github/v/release/sveinbjornt/fastdmg?display_name=tag)]() 5 | [![Build](https://github.com/sveinbjornt/fastdmg/actions/workflows/macos.yml/badge.svg)]() 6 | 7 | 8 | 9 | # FastDMG 10 | 11 | > "Replaces the system default DMG mounting application; is better in every way." - Some guy on the Internet 12 | 13 | FastDMG is a macOS utility to quickly and efficiently mount `.dmg` and other disk images without any unneeded nonsense. It is a very fast and reliable replacement for Apple's hopelessly inefficient and annoying [DiskImageMounter](https://en.wikipedia.org/wiki/DiskImageMounter) app. 14 | 15 | ## Features 16 | 17 | * Doesn't waste your precious time verifying disk images 18 | * Auto-accepts annoying end user license agreements 19 | * Runs in the background (doesn't show up in the Dock) 20 | * Displays no windows or menus and stays out of your way 21 | * Multithreaded and can concurrently mount several images 22 | * Disk image document icons continue to look the same 23 | * Handles all disk image types supported by DiskImageMounter (dmg, iso, toast, etc.) 24 | * Very fast native app written in Objective-C/Cocoa 25 | 26 | 27 | 28 | FastDMG is a very minimal wrapper around the [ `hdiutil`](https://web.archive.org/web/20170506155736/https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/hdiutil.1.html) command line tool that ships with macOS. It therefore uses Apple's private DiskImages framework indirectly. It is free, open source software. I've used it for many years and it works really well. If you like it, feel free to [make a donation](https://sveinbjorn.org/donations). 29 | 30 | ## Download 31 | 32 | * **[⬇ Download FastDMG 1.0.3](https://sveinbjorn.org/files/software/FastDMG.zip)** (~1.3 MB, Universal ARM/Intel 64-bit, 10.13 or later, Developer ID signed and notarized by Apple) 33 | 34 | If you need to run it on macOS 10.9-10.12, [version 1.0.2](https://sveinbjorn.org/files/software/fastdmg/) continues to work just fine. 35 | 36 | ## Brew 37 | 38 | FastDMG can also be installed via [Homebrew](https://brew.sh/): 39 | 40 | ```bash 41 | brew install --cask FastDMG 42 | ``` 43 | 44 | Then: 45 | 46 | ```bash 47 | open /Applications/FastDMG.app 48 | ``` 49 | 50 | ## How to use 51 | 52 | * Move FastDMG.app to your Applications folder 53 | * Ctrl-click the FastDMG app and select Open to bypass Apple's Gatekeeper 54 | * Select a `.dmg` file and press Cmd-I to show the Finder's Get Info window 55 | * Select FastDMG under the menu item "Open with:" 56 | * Press "Change All..." 57 | 58 | FastDMG will then take care of mounting `.dmg` disk images when you open them in the Finder. 59 | You can do the same for `.iso`, `.toast` and any other disk image formats supported by FastDMG. 60 | 61 | ## Version History 62 | 63 | ### 1.0.3 - 20/05/2025 64 | 65 | * App is now notarized by Apple 66 | * New application icon by maxtron95 67 | 68 | ### 1.0.2 - 28/11/2020 69 | 70 | * App is now built as a Universal ARM/Intel 64-bit binary 71 | 72 | ### 1.0.1 - 08/04/2019 73 | 74 | * App is now Developer ID signed 75 | * Built with support for Mojave Dark Mode 76 | 77 | ### 1.0 - 23/10/2018 78 | 79 | * First release as native non-[Platypus](https://sveinbjorn.org/platypus) app 80 | 81 | ## BSD License 82 | 83 | Copyright (C) 2012-2025 Sveinbjorn Thordarson <sveinbjorn@sveinbjorn.org> 84 | 85 | Redistribution and use in source and binary forms, with or without modification, 86 | are permitted provided that the following conditions are met: 87 | 88 | 1. Redistributions of source code must retain the above copyright notice, this 89 | list of conditions and the following disclaimer. 90 | 91 | 2. Redistributions in binary form must reproduce the above copyright notice, this 92 | list of conditions and the following disclaimer in the documentation and/or other 93 | materials provided with the distribution. 94 | 95 | 3. Neither the name of the copyright holder nor the names of its contributors may 96 | be used to endorse or promote products derived from this software without specific 97 | prior written permission. 98 | 99 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 100 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 101 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 102 | IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 103 | INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 104 | NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 105 | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 106 | WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 107 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 108 | POSSIBILITY OF SUCH DAMAGE. 109 | 110 | --------------------------------------------------------------------------------