├── .gitignore ├── Howdoishotweb.icns ├── README.markdown ├── Rakefile ├── ScreenRecorder.xcodeproj ├── project.pbxproj └── project.xcworkspace │ └── contents.xcworkspacedata └── ScreenRecorder ├── MCAppDelegate.h ├── MCAppDelegate.m ├── MCScreenRecorder.h ├── MCScreenRecorder.m ├── MCScreenRecordingMenuItem.h ├── MCScreenRecordingMenuItem.m ├── ScreenRecorder-Info.plist ├── ScreenRecorder-Prefix.pch ├── en.lproj ├── Credits.rtf ├── InfoPlist.strings └── MainMenu.xib └── main.m /.gitignore: -------------------------------------------------------------------------------- 1 | xcuserdata/ 2 | build/ 3 | 4 | -------------------------------------------------------------------------------- /Howdoishotweb.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marketcircle/ScreenRecorder/c1737af833aafde6d420dd24def8c6779d1410be/Howdoishotweb.icns -------------------------------------------------------------------------------- /README.markdown: -------------------------------------------------------------------------------- 1 | # Screen Recorder 2 | 3 | A simple app to act as a proxy to the screen recording APIs in 4 | AVFoundation. I would have done this in MacRuby, but AVFoundation does 5 | not work with garbage collection on OS X 10.7. 6 | 7 | There is not much to see here, but the goal will be a simple app, just 8 | some menus, so that screen recordings can be easily started, 9 | stopped, or paused. 10 | 11 | ## Usage 12 | 13 | Clone and build. There are no external dependencies, you only need a 14 | version of XCode that includes Clang with ARC functionality. 15 | 16 | When you run the app there will be no windows. You can start a new 17 | recording from the menu bar using `Recorder > Start` and then stop the 18 | recording using `Recorder > Stop`. If you need to pause the recording 19 | then you can also use `Recorder > Pause` and `Recorder > Resume`. 20 | 21 | The screen recording will be saved to `~/Movies` and the file name will 22 | be shown in the `Recorder` after a recording has started. Selecting the 23 | file from the menu will show the file in the Finder. 24 | 25 | ## License 26 | 27 | Screen Recorder is released under the MIT license: http://www.opensource.org/licenses/MIT 28 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | desc "Build the project" 2 | task :build do 3 | puts `xcodebuild` 4 | end 5 | 6 | desc "Install the project to /Applications" 7 | task :install => :build do 8 | FileUtils.rm_rf "/Applications/ScreenRecorder.app" 9 | FileUtils.mv "build/Release/ScreenRecorder.app", "/Applications/ScreenRecorder.app" 10 | end 11 | -------------------------------------------------------------------------------- /ScreenRecorder.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | AF1C44CE15257F24009AB77E /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF1C44CD15257F24009AB77E /* Cocoa.framework */; }; 11 | AF1C44D815257F24009AB77E /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = AF1C44D615257F24009AB77E /* InfoPlist.strings */; }; 12 | AF1C44DA15257F24009AB77E /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = AF1C44D915257F24009AB77E /* main.m */; }; 13 | AF1C44DE15257F24009AB77E /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = AF1C44DC15257F24009AB77E /* Credits.rtf */; }; 14 | AF1C44E115257F24009AB77E /* MCAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = AF1C44E015257F24009AB77E /* MCAppDelegate.m */; }; 15 | AF1C44E415257F24009AB77E /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = AF1C44E215257F24009AB77E /* MainMenu.xib */; }; 16 | AF1C44EB15258015009AB77E /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF1C44EA15258015009AB77E /* AVFoundation.framework */; }; 17 | AF1C44F715261746009AB77E /* Howdoishotweb.icns in Resources */ = {isa = PBXBuildFile; fileRef = AF1C44F615261746009AB77E /* Howdoishotweb.icns */; }; 18 | AF93FC9D1530AE17006A1253 /* MCScreenRecorder.m in Sources */ = {isa = PBXBuildFile; fileRef = AF93FC9C1530AE17006A1253 /* MCScreenRecorder.m */; }; 19 | AFCD48CF15326B0800799408 /* MCScreenRecordingMenuItem.m in Sources */ = {isa = PBXBuildFile; fileRef = AFCD48CE15326B0800799408 /* MCScreenRecordingMenuItem.m */; }; 20 | /* End PBXBuildFile section */ 21 | 22 | /* Begin PBXFileReference section */ 23 | AF1C44C915257F24009AB77E /* ScreenRecorder.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ScreenRecorder.app; sourceTree = BUILT_PRODUCTS_DIR; }; 24 | AF1C44CD15257F24009AB77E /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 25 | AF1C44D015257F24009AB77E /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; 26 | AF1C44D115257F24009AB77E /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; 27 | AF1C44D215257F24009AB77E /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 28 | AF1C44D515257F24009AB77E /* ScreenRecorder-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ScreenRecorder-Info.plist"; sourceTree = ""; }; 29 | AF1C44D715257F24009AB77E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 30 | AF1C44D915257F24009AB77E /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 31 | AF1C44DB15257F24009AB77E /* ScreenRecorder-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ScreenRecorder-Prefix.pch"; sourceTree = ""; }; 32 | AF1C44DD15257F24009AB77E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; 33 | AF1C44DF15257F24009AB77E /* MCAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MCAppDelegate.h; sourceTree = ""; }; 34 | AF1C44E015257F24009AB77E /* MCAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MCAppDelegate.m; sourceTree = ""; }; 35 | AF1C44E315257F24009AB77E /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = ""; }; 36 | AF1C44EA15258015009AB77E /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; 37 | AF1C44F615261746009AB77E /* Howdoishotweb.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = Howdoishotweb.icns; path = ../Howdoishotweb.icns; sourceTree = ""; }; 38 | AF93FC9B1530AE17006A1253 /* MCScreenRecorder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCScreenRecorder.h; sourceTree = ""; }; 39 | AF93FC9C1530AE17006A1253 /* MCScreenRecorder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MCScreenRecorder.m; sourceTree = ""; }; 40 | AFCD48CD15326B0800799408 /* MCScreenRecordingMenuItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCScreenRecordingMenuItem.h; sourceTree = ""; }; 41 | AFCD48CE15326B0800799408 /* MCScreenRecordingMenuItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MCScreenRecordingMenuItem.m; sourceTree = ""; }; 42 | /* End PBXFileReference section */ 43 | 44 | /* Begin PBXFrameworksBuildPhase section */ 45 | AF1C44C615257F24009AB77E /* Frameworks */ = { 46 | isa = PBXFrameworksBuildPhase; 47 | buildActionMask = 2147483647; 48 | files = ( 49 | AF1C44EB15258015009AB77E /* AVFoundation.framework in Frameworks */, 50 | AF1C44CE15257F24009AB77E /* Cocoa.framework in Frameworks */, 51 | ); 52 | runOnlyForDeploymentPostprocessing = 0; 53 | }; 54 | /* End PBXFrameworksBuildPhase section */ 55 | 56 | /* Begin PBXGroup section */ 57 | AF1C44BE15257F24009AB77E = { 58 | isa = PBXGroup; 59 | children = ( 60 | AF1C44D315257F24009AB77E /* ScreenRecorder */, 61 | AF1C44CC15257F24009AB77E /* Frameworks */, 62 | AF1C44CA15257F24009AB77E /* Products */, 63 | ); 64 | sourceTree = ""; 65 | }; 66 | AF1C44CA15257F24009AB77E /* Products */ = { 67 | isa = PBXGroup; 68 | children = ( 69 | AF1C44C915257F24009AB77E /* ScreenRecorder.app */, 70 | ); 71 | name = Products; 72 | sourceTree = ""; 73 | }; 74 | AF1C44CC15257F24009AB77E /* Frameworks */ = { 75 | isa = PBXGroup; 76 | children = ( 77 | AF1C44EA15258015009AB77E /* AVFoundation.framework */, 78 | AF1C44CD15257F24009AB77E /* Cocoa.framework */, 79 | AF1C44CF15257F24009AB77E /* Other Frameworks */, 80 | ); 81 | name = Frameworks; 82 | sourceTree = ""; 83 | }; 84 | AF1C44CF15257F24009AB77E /* Other Frameworks */ = { 85 | isa = PBXGroup; 86 | children = ( 87 | AF1C44D015257F24009AB77E /* AppKit.framework */, 88 | AF1C44D115257F24009AB77E /* CoreData.framework */, 89 | AF1C44D215257F24009AB77E /* Foundation.framework */, 90 | ); 91 | name = "Other Frameworks"; 92 | sourceTree = ""; 93 | }; 94 | AF1C44D315257F24009AB77E /* ScreenRecorder */ = { 95 | isa = PBXGroup; 96 | children = ( 97 | AFCD48CD15326B0800799408 /* MCScreenRecordingMenuItem.h */, 98 | AFCD48CE15326B0800799408 /* MCScreenRecordingMenuItem.m */, 99 | AF1C44DF15257F24009AB77E /* MCAppDelegate.h */, 100 | AF1C44E015257F24009AB77E /* MCAppDelegate.m */, 101 | AF93FC9B1530AE17006A1253 /* MCScreenRecorder.h */, 102 | AF93FC9C1530AE17006A1253 /* MCScreenRecorder.m */, 103 | AF1C44E215257F24009AB77E /* MainMenu.xib */, 104 | AF1C44D415257F24009AB77E /* Supporting Files */, 105 | ); 106 | path = ScreenRecorder; 107 | sourceTree = ""; 108 | }; 109 | AF1C44D415257F24009AB77E /* Supporting Files */ = { 110 | isa = PBXGroup; 111 | children = ( 112 | AF1C44F615261746009AB77E /* Howdoishotweb.icns */, 113 | AF1C44D515257F24009AB77E /* ScreenRecorder-Info.plist */, 114 | AF1C44D615257F24009AB77E /* InfoPlist.strings */, 115 | AF1C44D915257F24009AB77E /* main.m */, 116 | AF1C44DB15257F24009AB77E /* ScreenRecorder-Prefix.pch */, 117 | AF1C44DC15257F24009AB77E /* Credits.rtf */, 118 | ); 119 | name = "Supporting Files"; 120 | sourceTree = ""; 121 | }; 122 | /* End PBXGroup section */ 123 | 124 | /* Begin PBXNativeTarget section */ 125 | AF1C44C815257F24009AB77E /* ScreenRecorder */ = { 126 | isa = PBXNativeTarget; 127 | buildConfigurationList = AF1C44E715257F24009AB77E /* Build configuration list for PBXNativeTarget "ScreenRecorder" */; 128 | buildPhases = ( 129 | AF1C44C515257F24009AB77E /* Sources */, 130 | AF1C44C615257F24009AB77E /* Frameworks */, 131 | AF1C44C715257F24009AB77E /* Resources */, 132 | ); 133 | buildRules = ( 134 | ); 135 | dependencies = ( 136 | ); 137 | name = ScreenRecorder; 138 | productName = ScreenRecorder; 139 | productReference = AF1C44C915257F24009AB77E /* ScreenRecorder.app */; 140 | productType = "com.apple.product-type.application"; 141 | }; 142 | /* End PBXNativeTarget section */ 143 | 144 | /* Begin PBXProject section */ 145 | AF1C44C015257F24009AB77E /* Project object */ = { 146 | isa = PBXProject; 147 | attributes = { 148 | CLASSPREFIX = MC; 149 | LastUpgradeCheck = 0430; 150 | ORGANIZATIONNAME = "Marketcircle Incorporated"; 151 | }; 152 | buildConfigurationList = AF1C44C315257F24009AB77E /* Build configuration list for PBXProject "ScreenRecorder" */; 153 | compatibilityVersion = "Xcode 3.2"; 154 | developmentRegion = English; 155 | hasScannedForEncodings = 0; 156 | knownRegions = ( 157 | en, 158 | ); 159 | mainGroup = AF1C44BE15257F24009AB77E; 160 | productRefGroup = AF1C44CA15257F24009AB77E /* Products */; 161 | projectDirPath = ""; 162 | projectRoot = ""; 163 | targets = ( 164 | AF1C44C815257F24009AB77E /* ScreenRecorder */, 165 | ); 166 | }; 167 | /* End PBXProject section */ 168 | 169 | /* Begin PBXResourcesBuildPhase section */ 170 | AF1C44C715257F24009AB77E /* Resources */ = { 171 | isa = PBXResourcesBuildPhase; 172 | buildActionMask = 2147483647; 173 | files = ( 174 | AF1C44D815257F24009AB77E /* InfoPlist.strings in Resources */, 175 | AF1C44DE15257F24009AB77E /* Credits.rtf in Resources */, 176 | AF1C44E415257F24009AB77E /* MainMenu.xib in Resources */, 177 | AF1C44F715261746009AB77E /* Howdoishotweb.icns in Resources */, 178 | ); 179 | runOnlyForDeploymentPostprocessing = 0; 180 | }; 181 | /* End PBXResourcesBuildPhase section */ 182 | 183 | /* Begin PBXSourcesBuildPhase section */ 184 | AF1C44C515257F24009AB77E /* Sources */ = { 185 | isa = PBXSourcesBuildPhase; 186 | buildActionMask = 2147483647; 187 | files = ( 188 | AF1C44DA15257F24009AB77E /* main.m in Sources */, 189 | AF1C44E115257F24009AB77E /* MCAppDelegate.m in Sources */, 190 | AF93FC9D1530AE17006A1253 /* MCScreenRecorder.m in Sources */, 191 | AFCD48CF15326B0800799408 /* MCScreenRecordingMenuItem.m in Sources */, 192 | ); 193 | runOnlyForDeploymentPostprocessing = 0; 194 | }; 195 | /* End PBXSourcesBuildPhase section */ 196 | 197 | /* Begin PBXVariantGroup section */ 198 | AF1C44D615257F24009AB77E /* InfoPlist.strings */ = { 199 | isa = PBXVariantGroup; 200 | children = ( 201 | AF1C44D715257F24009AB77E /* en */, 202 | ); 203 | name = InfoPlist.strings; 204 | sourceTree = ""; 205 | }; 206 | AF1C44DC15257F24009AB77E /* Credits.rtf */ = { 207 | isa = PBXVariantGroup; 208 | children = ( 209 | AF1C44DD15257F24009AB77E /* en */, 210 | ); 211 | name = Credits.rtf; 212 | sourceTree = ""; 213 | }; 214 | AF1C44E215257F24009AB77E /* MainMenu.xib */ = { 215 | isa = PBXVariantGroup; 216 | children = ( 217 | AF1C44E315257F24009AB77E /* en */, 218 | ); 219 | name = MainMenu.xib; 220 | sourceTree = ""; 221 | }; 222 | /* End PBXVariantGroup section */ 223 | 224 | /* Begin XCBuildConfiguration section */ 225 | AF1C44E515257F24009AB77E /* Debug */ = { 226 | isa = XCBuildConfiguration; 227 | buildSettings = { 228 | ALWAYS_SEARCH_USER_PATHS = NO; 229 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 230 | CLANG_ENABLE_OBJC_ARC = YES; 231 | COPY_PHASE_STRIP = NO; 232 | GCC_C_LANGUAGE_STANDARD = gnu99; 233 | GCC_DYNAMIC_NO_PIC = NO; 234 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 235 | GCC_OPTIMIZATION_LEVEL = 0; 236 | GCC_PREPROCESSOR_DEFINITIONS = ( 237 | "DEBUG=1", 238 | "$(inherited)", 239 | ); 240 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 241 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 242 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 243 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 244 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 245 | GCC_WARN_UNUSED_VARIABLE = YES; 246 | MACOSX_DEPLOYMENT_TARGET = 10.7; 247 | ONLY_ACTIVE_ARCH = YES; 248 | RUN_CLANG_STATIC_ANALYZER = YES; 249 | SDKROOT = macosx; 250 | }; 251 | name = Debug; 252 | }; 253 | AF1C44E615257F24009AB77E /* Release */ = { 254 | isa = XCBuildConfiguration; 255 | buildSettings = { 256 | ALWAYS_SEARCH_USER_PATHS = NO; 257 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 258 | CLANG_ENABLE_OBJC_ARC = YES; 259 | COPY_PHASE_STRIP = YES; 260 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 261 | GCC_C_LANGUAGE_STANDARD = gnu99; 262 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 263 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 264 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 265 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 266 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 267 | GCC_WARN_UNUSED_VARIABLE = YES; 268 | MACOSX_DEPLOYMENT_TARGET = 10.7; 269 | RUN_CLANG_STATIC_ANALYZER = YES; 270 | SDKROOT = macosx; 271 | }; 272 | name = Release; 273 | }; 274 | AF1C44E815257F24009AB77E /* Debug */ = { 275 | isa = XCBuildConfiguration; 276 | buildSettings = { 277 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 278 | GCC_PREFIX_HEADER = "ScreenRecorder/ScreenRecorder-Prefix.pch"; 279 | INFOPLIST_FILE = "ScreenRecorder/ScreenRecorder-Info.plist"; 280 | PRODUCT_NAME = "$(TARGET_NAME)"; 281 | WRAPPER_EXTENSION = app; 282 | }; 283 | name = Debug; 284 | }; 285 | AF1C44E915257F24009AB77E /* Release */ = { 286 | isa = XCBuildConfiguration; 287 | buildSettings = { 288 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 289 | GCC_PREFIX_HEADER = "ScreenRecorder/ScreenRecorder-Prefix.pch"; 290 | INFOPLIST_FILE = "ScreenRecorder/ScreenRecorder-Info.plist"; 291 | PRODUCT_NAME = "$(TARGET_NAME)"; 292 | WRAPPER_EXTENSION = app; 293 | }; 294 | name = Release; 295 | }; 296 | /* End XCBuildConfiguration section */ 297 | 298 | /* Begin XCConfigurationList section */ 299 | AF1C44C315257F24009AB77E /* Build configuration list for PBXProject "ScreenRecorder" */ = { 300 | isa = XCConfigurationList; 301 | buildConfigurations = ( 302 | AF1C44E515257F24009AB77E /* Debug */, 303 | AF1C44E615257F24009AB77E /* Release */, 304 | ); 305 | defaultConfigurationIsVisible = 0; 306 | defaultConfigurationName = Release; 307 | }; 308 | AF1C44E715257F24009AB77E /* Build configuration list for PBXNativeTarget "ScreenRecorder" */ = { 309 | isa = XCConfigurationList; 310 | buildConfigurations = ( 311 | AF1C44E815257F24009AB77E /* Debug */, 312 | AF1C44E915257F24009AB77E /* Release */, 313 | ); 314 | defaultConfigurationIsVisible = 0; 315 | defaultConfigurationName = Release; 316 | }; 317 | /* End XCConfigurationList section */ 318 | }; 319 | rootObject = AF1C44C015257F24009AB77E /* Project object */; 320 | } 321 | -------------------------------------------------------------------------------- /ScreenRecorder.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ScreenRecorder/MCAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // MCAppDelegate.h 3 | // ScreenRecorder 4 | // 5 | // Created by Mark Rada on 12-03-30. 6 | // Copyright (c) 2012 Marketcircle Incorporated. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "MCScreenRecorder.h" 11 | #import "MCScreenRecordingMenuItem.h" 12 | 13 | @interface MCAppDelegate : NSObject 14 | 15 | @property (retain) MCScreenRecorder* recorder; 16 | @property (weak) IBOutlet NSMenu *recorderMenu; 17 | @property (weak) IBOutlet NSMenuItem *startStopButton; 18 | @property (weak) IBOutlet NSMenuItem *pauseUnpauseButton; 19 | @property (weak) IBOutlet NSMenuItem *menuSeparator; 20 | 21 | - (IBAction)startStopRecording:(id)sender; 22 | - (IBAction)pauseUnpauseRecording:(id)sender; 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /ScreenRecorder/MCAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // MCAppDelegate.m 3 | // ScreenRecorder 4 | // 5 | // Created by Mark Rada on 12-03-30. 6 | // Copyright (c) 2012 Marketcircle Incorporated. All rights reserved. 7 | // 8 | 9 | #import "MCAppDelegate.h" 10 | 11 | @implementation MCAppDelegate 12 | 13 | @synthesize recorder; 14 | @synthesize recorderMenu; 15 | @synthesize startStopButton; 16 | @synthesize pauseUnpauseButton; 17 | @synthesize menuSeparator; 18 | 19 | - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 20 | self.recorder = [[MCScreenRecorder alloc] init]; 21 | [recorderMenu setAutoenablesItems:NO]; 22 | } 23 | 24 | - (IBAction)startStopRecording:(id)sender { 25 | if (self.recorder.session.running) { 26 | [self.recorder stop]; 27 | 28 | // Update UI 29 | [startStopButton setTitle:@"Start"]; 30 | [pauseUnpauseButton setEnabled:NO]; 31 | 32 | } else { 33 | [self.recorder start]; 34 | 35 | // Update UI 36 | [startStopButton setTitle:@"Stop"]; 37 | [pauseUnpauseButton setEnabled:YES]; 38 | [menuSeparator setHidden:NO]; 39 | 40 | // Add a menu item for the new recording 41 | [recorderMenu addItem:[[MCScreenRecordingMenuItem alloc] 42 | initWithFile:self.recorder.file]]; 43 | } 44 | 45 | // We always want to reset the title 46 | [pauseUnpauseButton setTitle:@"Pause"]; 47 | } 48 | 49 | - (IBAction)pauseUnpauseRecording:(id)sender { 50 | if ([self.recorder toggle]) 51 | [pauseUnpauseButton setTitle:@"Pause"]; 52 | else 53 | [pauseUnpauseButton setTitle:@"Resume"]; 54 | } 55 | 56 | @end 57 | -------------------------------------------------------------------------------- /ScreenRecorder/MCScreenRecorder.h: -------------------------------------------------------------------------------- 1 | // 2 | // MCScreenRecorder.h 3 | // ScreenRecorder 4 | // 5 | // Created by Mark Rada on 12-04-07. 6 | // Copyright (c) 2012 Marketcircle Incorporated. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface MCScreenRecorder : NSObject 13 | 14 | @property (retain) AVCaptureSession* session; 15 | @property (retain) AVCaptureScreenInput* input; 16 | @property (retain) AVCaptureMovieFileOutput* output; 17 | 18 | // File that the recording will be saved to 19 | @property NSURL* file; 20 | 21 | - (BOOL) start; 22 | - (BOOL) toggle; // Pause/Resume functionality 23 | - (BOOL) stop; 24 | 25 | #pragma mark AVCaptureFileOutputDelegate 26 | - (void)captureOutput:(AVCaptureFileOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection; 27 | 28 | #pragma mark AVCaptureFileOutputRecordingDelegate 29 | - (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error; 30 | - (void)captureOutput:(AVCaptureFileOutput *)captureOutput didPauseRecordingToOutputFileAtURL:(NSURL *)fileURL fromConnections:(NSArray *)connections; 31 | - (void)captureOutput:(AVCaptureFileOutput *)captureOutput didResumeRecordingToOutputFileAtURL:(NSURL *)fileURL fromConnections:(NSArray *)connections; 32 | - (void)captureOutput:(AVCaptureFileOutput *)captureOutput didStartRecordingToOutputFileAtURL:(NSURL *)fileURL fromConnections:(NSArray *)connections; 33 | - (void)captureOutput:(AVCaptureFileOutput *)captureOutput willFinishRecordingToOutputFileAtURL:(NSURL *)fileURL fromConnections:(NSArray *)connections error:(NSError *)error; 34 | 35 | @end 36 | -------------------------------------------------------------------------------- /ScreenRecorder/MCScreenRecorder.m: -------------------------------------------------------------------------------- 1 | // 2 | // MCScreenRecorder.m 3 | // ScreenRecorder 4 | // 5 | // Created by Mark Rada on 12-04-07. 6 | // Copyright (c) 2012 Marketcircle Incorporated. All rights reserved. 7 | // 8 | 9 | #import "MCScreenRecorder.h" 10 | 11 | 12 | @implementation MCScreenRecorder 13 | 14 | @synthesize session; 15 | @synthesize input; 16 | @synthesize output; 17 | @synthesize file; 18 | 19 | - (id) init { 20 | self.session = [[AVCaptureSession alloc] init]; 21 | // self.session.sessionPreset = AVCaptureSessionPreset1280x720; 22 | 23 | self.input = [[AVCaptureScreenInput alloc] initWithDisplayID:CGMainDisplayID()]; 24 | self.input.capturesMouseClicks = YES; 25 | 26 | self.output = [[AVCaptureMovieFileOutput alloc] init]; 27 | [self.output setDelegate:self]; 28 | 29 | [self.session addInput:self.input]; 30 | [self.session addOutput:self.output]; 31 | 32 | return self; 33 | } 34 | 35 | - (BOOL) start { 36 | static NSDateFormatter* formatter; 37 | static NSURL* homeDir; 38 | static dispatch_once_t onceToken; 39 | dispatch_once(&onceToken, ^{ 40 | formatter = [[NSDateFormatter alloc] init]; 41 | [formatter setDateFormat:@"YYYYMMDDHHmmss"]; 42 | 43 | homeDir = [NSURL fileURLWithPath:[@"~/Movies/" stringByExpandingTildeInPath]]; 44 | }); 45 | 46 | NSString* date = [formatter stringFromDate:[NSDate date]]; 47 | self.file = [[homeDir URLByAppendingPathComponent:[@"TestRecording-" stringByAppendingString:date]] URLByAppendingPathExtension:@"mov"]; 48 | 49 | [self.session startRunning]; 50 | [self.output startRecordingToOutputFileURL:self.file 51 | recordingDelegate:self]; 52 | 53 | return YES; 54 | } 55 | 56 | - (BOOL) toggle { 57 | if (self.output.recordingPaused) { 58 | [self.output resumeRecording]; 59 | return YES; 60 | } 61 | 62 | [self.output pauseRecording]; 63 | return NO; 64 | } 65 | 66 | - (BOOL) stop { 67 | [self.session stopRunning]; 68 | [self.output stopRecording]; 69 | return YES; 70 | } 71 | 72 | 73 | #pragma mark AVCaptureFileOutputDelegate 74 | 75 | - (void)captureOutput:(AVCaptureFileOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { 76 | } 77 | 78 | 79 | #pragma mark AVCaptureFileOutputRecordingDelegate 80 | 81 | - (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error { 82 | } 83 | 84 | - (void)captureOutput:(AVCaptureFileOutput *)captureOutput didPauseRecordingToOutputFileAtURL:(NSURL *)fileURL fromConnections:(NSArray *)connections { 85 | } 86 | 87 | - (void)captureOutput:(AVCaptureFileOutput *)captureOutput didResumeRecordingToOutputFileAtURL:(NSURL *)fileURL fromConnections:(NSArray *)connections { 88 | } 89 | 90 | - (void)captureOutput:(AVCaptureFileOutput *)captureOutput didStartRecordingToOutputFileAtURL:(NSURL *)fileURL fromConnections:(NSArray *)connections { 91 | } 92 | 93 | - (void)captureOutput:(AVCaptureFileOutput *)captureOutput willFinishRecordingToOutputFileAtURL:(NSURL *)fileURL fromConnections:(NSArray *)connections error:(NSError *)error { 94 | } 95 | 96 | @end 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | -------------------------------------------------------------------------------- /ScreenRecorder/MCScreenRecordingMenuItem.h: -------------------------------------------------------------------------------- 1 | // 2 | // MCScreenRecordingMenuItem.h 3 | // ScreenRecorder 4 | // 5 | // Created by Mark Rada on 12-04-08. 6 | // Copyright (c) 2012 Marketcircle Incorporated. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface MCScreenRecordingMenuItem : NSMenuItem 12 | 13 | @property (retain) NSURL* file; 14 | 15 | - (id)initWithFile:(NSURL*)url; 16 | - (IBAction)showInFinder:(id)sender; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /ScreenRecorder/MCScreenRecordingMenuItem.m: -------------------------------------------------------------------------------- 1 | // 2 | // MCScreenRecordingMenuItem.m 3 | // ScreenRecorder 4 | // 5 | // Created by Mark Rada on 12-04-08. 6 | // Copyright (c) 2012 Marketcircle Incorporated. All rights reserved. 7 | // 8 | 9 | #import "MCScreenRecordingMenuItem.h" 10 | 11 | @implementation MCScreenRecordingMenuItem 12 | 13 | @synthesize file; 14 | 15 | - (id)initWithFile:(NSURL*)url { 16 | self.file = url; 17 | 18 | [self setTitle:[url lastPathComponent]]; 19 | // rdar://11207662 documentation claims to allow URLs, but only takes strings 20 | [self accessibilitySetOverrideValue:[url absoluteString] 21 | forAttribute:NSAccessibilityURLAttribute]; 22 | 23 | [self setTarget:self]; 24 | [self setAction:@selector(showInFinder:)]; 25 | 26 | return self; 27 | } 28 | 29 | - (IBAction)showInFinder:(id)sender { 30 | [[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs: 31 | [NSArray arrayWithObject:self.file]]; 32 | } 33 | 34 | @end 35 | -------------------------------------------------------------------------------- /ScreenRecorder/ScreenRecorder-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIconFile 10 | Howdoishotweb.icns 11 | CFBundleIdentifier 12 | com.marketcircle.${PRODUCT_NAME:rfc1034identifier} 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | LSApplicationCategoryType 26 | public.app-category.developer-tools 27 | LSMinimumSystemVersion 28 | ${MACOSX_DEPLOYMENT_TARGET} 29 | NSHumanReadableCopyright 30 | Copyright © 2012 Marketcircle Incorporated. All rights reserved. 31 | NSMainNibFile 32 | MainMenu 33 | NSPrincipalClass 34 | NSApplication 35 | 36 | 37 | -------------------------------------------------------------------------------- /ScreenRecorder/ScreenRecorder-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'ScreenRecorder' target in the 'ScreenRecorder' project 3 | // 4 | 5 | #ifdef __OBJC__ 6 | #import 7 | #endif 8 | -------------------------------------------------------------------------------- /ScreenRecorder/en.lproj/Credits.rtf: -------------------------------------------------------------------------------- 1 | {\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf320 2 | {\fonttbl\f0\fswiss\fcharset0 Helvetica;} 3 | {\colortbl;\red255\green255\blue255;} 4 | \vieww9600\viewh8400\viewkind0 5 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720 6 | 7 | \f0\b\fs24 \cf0 Engineering: 8 | \b0 \ 9 | Mark Rada\ 10 | \ 11 | 12 | \b Human Interface Design: 13 | \b0 \ 14 | Mark Rada\ 15 | \ 16 | 17 | \b Testing: 18 | \b0 \ 19 | Mark Rada\ 20 | \ 21 | 22 | \b Documentation: 23 | \b0 \ 24 | Mark Rada\ 25 | \ 26 | 27 | \b With special thanks to: 28 | \b0 \ 29 | Mom\ 30 | } -------------------------------------------------------------------------------- /ScreenRecorder/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /ScreenRecorder/en.lproj/MainMenu.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1070 5 | 11D50 6 | 2182 7 | 1138.32 8 | 568.00 9 | 10 | com.apple.InterfaceBuilder.CocoaPlugin 11 | 2182 12 | 13 | 14 | NSMenu 15 | NSMenuItem 16 | NSCustomObject 17 | 18 | 19 | com.apple.InterfaceBuilder.CocoaPlugin 20 | 21 | 22 | PluginDependencyRecalculationVersion 23 | 24 | 25 | 26 | 27 | NSApplication 28 | 29 | 30 | FirstResponder 31 | 32 | 33 | NSApplication 34 | 35 | 36 | AMainMenu 37 | 38 | 39 | 40 | ScreenRecorder 41 | 42 | 1048576 43 | 2147483647 44 | 45 | NSImage 46 | NSMenuCheckmark 47 | 48 | 49 | NSImage 50 | NSMenuMixedState 51 | 52 | submenuAction: 53 | 54 | ScreenRecorder 55 | 56 | 57 | 58 | About ScreenRecorder 59 | 60 | 2147483647 61 | 62 | 63 | 64 | 65 | 66 | YES 67 | YES 68 | 69 | 70 | 1048576 71 | 2147483647 72 | 73 | 74 | 75 | 76 | 77 | Services 78 | 79 | 1048576 80 | 2147483647 81 | 82 | 83 | submenuAction: 84 | 85 | Services 86 | 87 | _NSServicesMenu 88 | 89 | 90 | 91 | 92 | YES 93 | YES 94 | 95 | 96 | 1048576 97 | 2147483647 98 | 99 | 100 | 101 | 102 | 103 | Hide ScreenRecorder 104 | h 105 | 1048576 106 | 2147483647 107 | 108 | 109 | 110 | 111 | 112 | Hide Others 113 | h 114 | 1572864 115 | 2147483647 116 | 117 | 118 | 119 | 120 | 121 | Show All 122 | 123 | 1048576 124 | 2147483647 125 | 126 | 127 | 128 | 129 | 130 | YES 131 | YES 132 | 133 | 134 | 1048576 135 | 2147483647 136 | 137 | 138 | 139 | 140 | 141 | Quit ScreenRecorder 142 | q 143 | 1048576 144 | 2147483647 145 | 146 | 147 | 148 | 149 | _NSAppleMenu 150 | 151 | 152 | 153 | 154 | File 155 | 156 | 1048576 157 | 2147483647 158 | 159 | 160 | submenuAction: 161 | 162 | File 163 | 164 | 165 | 166 | New 167 | n 168 | 1048576 169 | 2147483647 170 | 171 | 172 | 173 | 174 | 175 | Open… 176 | o 177 | 1048576 178 | 2147483647 179 | 180 | 181 | 182 | 183 | 184 | YES 185 | YES 186 | 187 | 188 | 1048576 189 | 2147483647 190 | 191 | 192 | 193 | 194 | 195 | Save… 196 | s 197 | 1048576 198 | 2147483647 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | Recorder 208 | 209 | 2147483647 210 | 211 | 212 | submenuAction: 213 | 214 | Recorder 215 | 216 | 217 | 218 | Start 219 | r 220 | 1048576 221 | 2147483647 222 | 223 | 224 | 225 | 226 | 227 | YES 228 | Pause 229 | p 230 | 1048576 231 | 2147483647 232 | 233 | 234 | 235 | 236 | 237 | YES 238 | YES 239 | YES 240 | 241 | 242 | 2147483647 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | Help 252 | 253 | 2147483647 254 | 255 | 256 | submenuAction: 257 | 258 | Help 259 | 260 | 261 | 262 | ScreenRecorder Help 263 | ? 264 | 1048576 265 | 2147483647 266 | 267 | 268 | 269 | 270 | _NSHelpMenu 271 | 272 | 273 | 274 | _NSMainMenu 275 | 276 | 277 | MCAppDelegate 278 | 279 | 280 | NSFontManager 281 | 282 | 283 | 284 | 285 | 286 | 287 | terminate: 288 | 289 | 290 | 291 | 449 292 | 293 | 294 | 295 | delegate 296 | 297 | 298 | 299 | 495 300 | 301 | 302 | 303 | orderFrontStandardAboutPanel: 304 | 305 | 306 | 307 | 142 308 | 309 | 310 | 311 | saveDocument: 312 | 313 | 314 | 315 | 362 316 | 317 | 318 | 319 | newDocument: 320 | 321 | 322 | 323 | 373 324 | 325 | 326 | 327 | openDocument: 328 | 329 | 330 | 331 | 374 332 | 333 | 334 | 335 | showHelp: 336 | 337 | 338 | 339 | 493 340 | 341 | 342 | 343 | hideOtherApplications: 344 | 345 | 346 | 347 | 368 348 | 349 | 350 | 351 | unhideAllApplications: 352 | 353 | 354 | 355 | 370 356 | 357 | 358 | 359 | hide: 360 | 361 | 362 | 363 | 367 364 | 365 | 366 | 367 | menuSeparator 368 | 369 | 370 | 371 | 560 372 | 373 | 374 | 375 | recorderMenu 376 | 377 | 378 | 379 | 564 380 | 381 | 382 | 383 | startStopButton 384 | 385 | 386 | 387 | 565 388 | 389 | 390 | 391 | pauseUnpauseButton 392 | 393 | 394 | 395 | 566 396 | 397 | 398 | 399 | startStopRecording: 400 | 401 | 402 | 403 | 567 404 | 405 | 406 | 407 | pauseUnpauseRecording: 408 | 409 | 410 | 411 | 568 412 | 413 | 414 | 415 | 416 | 417 | 0 418 | 419 | 420 | 421 | 422 | 423 | -2 424 | 425 | 426 | File's Owner 427 | 428 | 429 | -1 430 | 431 | 432 | First Responder 433 | 434 | 435 | -3 436 | 437 | 438 | Application 439 | 440 | 441 | 29 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 56 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 83 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 81 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 75 480 | 481 | 482 | 483 | 484 | 72 485 | 486 | 487 | 488 | 489 | 82 490 | 491 | 492 | 493 | 494 | 420 495 | 496 | 497 | 498 | 499 | 490 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 491 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 492 516 | 517 | 518 | 519 | 520 | 494 521 | 522 | 523 | 524 | 525 | 79 526 | 527 | 528 | 529 | 530 | 57 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 145 547 | 548 | 549 | 550 | 551 | 149 552 | 553 | 554 | 555 | 556 | 131 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 130 565 | 566 | 567 | 568 | 569 | 236 570 | 571 | 572 | 573 | 574 | 144 575 | 576 | 577 | 578 | 579 | 136 580 | 581 | 582 | 583 | 584 | 150 585 | 586 | 587 | 588 | 589 | 134 590 | 591 | 592 | 593 | 594 | 58 595 | 596 | 597 | 598 | 599 | 548 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 549 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 550 618 | 619 | 620 | 621 | 622 | 551 623 | 624 | 625 | 626 | 627 | 559 628 | 629 | 630 | 631 | 632 | 633 | 634 | com.apple.InterfaceBuilder.CocoaPlugin 635 | com.apple.InterfaceBuilder.CocoaPlugin 636 | com.apple.InterfaceBuilder.CocoaPlugin 637 | com.apple.InterfaceBuilder.CocoaPlugin 638 | com.apple.InterfaceBuilder.CocoaPlugin 639 | com.apple.InterfaceBuilder.CocoaPlugin 640 | com.apple.InterfaceBuilder.CocoaPlugin 641 | com.apple.InterfaceBuilder.CocoaPlugin 642 | com.apple.InterfaceBuilder.CocoaPlugin 643 | com.apple.InterfaceBuilder.CocoaPlugin 644 | com.apple.InterfaceBuilder.CocoaPlugin 645 | com.apple.InterfaceBuilder.CocoaPlugin 646 | com.apple.InterfaceBuilder.CocoaPlugin 647 | com.apple.InterfaceBuilder.CocoaPlugin 648 | com.apple.InterfaceBuilder.CocoaPlugin 649 | com.apple.InterfaceBuilder.CocoaPlugin 650 | com.apple.InterfaceBuilder.CocoaPlugin 651 | com.apple.InterfaceBuilder.CocoaPlugin 652 | com.apple.InterfaceBuilder.CocoaPlugin 653 | com.apple.InterfaceBuilder.CocoaPlugin 654 | com.apple.InterfaceBuilder.CocoaPlugin 655 | com.apple.InterfaceBuilder.CocoaPlugin 656 | com.apple.InterfaceBuilder.CocoaPlugin 657 | com.apple.InterfaceBuilder.CocoaPlugin 658 | com.apple.InterfaceBuilder.CocoaPlugin 659 | com.apple.InterfaceBuilder.CocoaPlugin 660 | com.apple.InterfaceBuilder.CocoaPlugin 661 | com.apple.InterfaceBuilder.CocoaPlugin 662 | com.apple.InterfaceBuilder.CocoaPlugin 663 | com.apple.InterfaceBuilder.CocoaPlugin 664 | com.apple.InterfaceBuilder.CocoaPlugin 665 | com.apple.InterfaceBuilder.CocoaPlugin 666 | 667 | 668 | 669 | 670 | 671 | 568 672 | 673 | 674 | 675 | 676 | MCAppDelegate 677 | NSObject 678 | 679 | id 680 | id 681 | 682 | 683 | 684 | pauseUnpauseRecording: 685 | id 686 | 687 | 688 | startStopRecording: 689 | id 690 | 691 | 692 | 693 | NSMenuItem 694 | NSMenuItem 695 | NSMenu 696 | NSMenuItem 697 | 698 | 699 | 700 | menuSeparator 701 | NSMenuItem 702 | 703 | 704 | pauseUnpauseButton 705 | NSMenuItem 706 | 707 | 708 | recorderMenu 709 | NSMenu 710 | 711 | 712 | startStopButton 713 | NSMenuItem 714 | 715 | 716 | 717 | IBProjectSource 718 | ./Classes/MCAppDelegate.h 719 | 720 | 721 | 722 | 723 | 0 724 | IBCocoaFramework 725 | 726 | com.apple.InterfaceBuilder.CocoaPlugin.macosx 727 | 728 | 729 | YES 730 | 3 731 | 732 | {11, 11} 733 | {10, 3} 734 | 735 | YES 736 | 737 | 738 | -------------------------------------------------------------------------------- /ScreenRecorder/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // ScreenRecorder 4 | // 5 | // Created by Mark Rada on 12-03-30. 6 | // Copyright (c) 2012 Marketcircle Incorporated. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | int main(int argc, char *argv[]) 12 | { 13 | return NSApplicationMain(argc, (const char **)argv); 14 | } 15 | --------------------------------------------------------------------------------