From 66bbd072a972c7de760aa4be2912aeaeab2dc767 Mon Sep 17 00:00:00 2001 From: Trevor Fitzgerald Date: Wed, 10 Jul 2013 20:53:36 -0400 Subject: [PATCH] first commit --- .gitignore | 17 ++ README.md | 2 + Shuttle.xcodeproj/project.pbxproj | 315 ++++++++++++++++++++++ Shuttle/AppDelegate.h | 22 ++ Shuttle/AppDelegate.m | 190 +++++++++++++ Shuttle/Shuttle-Info.plist | 38 +++ Shuttle/Shuttle-Prefix.pch | 7 + Shuttle/Shuttle.entitlements | 11 + Shuttle/en.lproj/Credits.rtf | 29 ++ Shuttle/en.lproj/InfoPlist.strings | 2 + Shuttle/en.lproj/MainMenu.xib | 416 +++++++++++++++++++++++++++++ Shuttle/main.m | 11 + Shuttle/shuttle.default.json | 42 +++ apple-scripts/iterm2.applescript | 24 ++ apple-scripts/terminal.applescript | 19 ++ shuttle.icns | Bin 0 -> 63118 bytes 16 files changed, 1145 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 Shuttle.xcodeproj/project.pbxproj create mode 100644 Shuttle/AppDelegate.h create mode 100644 Shuttle/AppDelegate.m create mode 100644 Shuttle/Shuttle-Info.plist create mode 100644 Shuttle/Shuttle-Prefix.pch create mode 100644 Shuttle/Shuttle.entitlements create mode 100644 Shuttle/en.lproj/Credits.rtf create mode 100644 Shuttle/en.lproj/InfoPlist.strings create mode 100644 Shuttle/en.lproj/MainMenu.xib create mode 100644 Shuttle/main.m create mode 100644 Shuttle/shuttle.default.json create mode 100644 apple-scripts/iterm2.applescript create mode 100644 apple-scripts/terminal.applescript create mode 100644 shuttle.icns diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cd6753f --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +.DS_Store + +# Xcode +build/* +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +*.xcworkspace +!default.xcworkspace +xcuserdata +profile +*.moved-aside diff --git a/README.md b/README.md new file mode 100644 index 0000000..d88ca43 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +Shuttle +======= diff --git a/Shuttle.xcodeproj/project.pbxproj b/Shuttle.xcodeproj/project.pbxproj new file mode 100644 index 0000000..82eb7fc --- /dev/null +++ b/Shuttle.xcodeproj/project.pbxproj @@ -0,0 +1,315 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 7E74A7C61789CE2F0079E0D2 /* shuttle.default.json in Resources */ = {isa = PBXBuildFile; fileRef = 7E74A7C51789CE2F0079E0D2 /* shuttle.default.json */; }; + C149EBFE15D5214600B1F558 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C149EBFD15D5214600B1F558 /* Cocoa.framework */; }; + C149EC0815D5214600B1F558 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = C149EC0615D5214600B1F558 /* InfoPlist.strings */; }; + C149EC0A15D5214600B1F558 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C149EC0915D5214600B1F558 /* main.m */; }; + C149EC0E15D5214600B1F558 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = C149EC0C15D5214600B1F558 /* Credits.rtf */; }; + C149EC1115D5214600B1F558 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C149EC1015D5214600B1F558 /* AppDelegate.m */; }; + C149EC1415D5214600B1F558 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = C149EC1215D5214600B1F558 /* MainMenu.xib */; }; + C159DC2815D5DE8000F5DE24 /* shuttle.icns in Resources */ = {isa = PBXBuildFile; fileRef = C159DC2715D5DE7F00F5DE24 /* shuttle.icns */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 7E72D21E178003ED00A6389C /* Shuttle.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = Shuttle.entitlements; sourceTree = ""; }; + 7E74A7C51789CE2F0079E0D2 /* shuttle.default.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = shuttle.default.json; sourceTree = ""; }; + C149EBF915D5214600B1F558 /* Shuttle.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Shuttle.app; sourceTree = BUILT_PRODUCTS_DIR; }; + C149EBFD15D5214600B1F558 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + C149EC0015D5214600B1F558 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; + C149EC0115D5214600B1F558 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + C149EC0215D5214600B1F558 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + C149EC0515D5214600B1F558 /* Shuttle-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Shuttle-Info.plist"; sourceTree = ""; }; + C149EC0715D5214600B1F558 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + C149EC0915D5214600B1F558 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + C149EC0B15D5214600B1F558 /* Shuttle-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Shuttle-Prefix.pch"; sourceTree = ""; }; + C149EC0D15D5214600B1F558 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; + C149EC0F15D5214600B1F558 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + C149EC1015D5214600B1F558 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + C149EC1315D5214600B1F558 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = ""; }; + C159DC2715D5DE7F00F5DE24 /* shuttle.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = shuttle.icns; path = ../shuttle.icns; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + C149EBF615D5214600B1F558 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C149EBFE15D5214600B1F558 /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + C149EBEE15D5214600B1F558 = { + isa = PBXGroup; + children = ( + C149EC0315D5214600B1F558 /* Shuttle */, + C149EBFC15D5214600B1F558 /* Frameworks */, + C149EBFA15D5214600B1F558 /* Products */, + ); + sourceTree = ""; + }; + C149EBFA15D5214600B1F558 /* Products */ = { + isa = PBXGroup; + children = ( + C149EBF915D5214600B1F558 /* Shuttle.app */, + ); + name = Products; + sourceTree = ""; + }; + C149EBFC15D5214600B1F558 /* Frameworks */ = { + isa = PBXGroup; + children = ( + C149EBFD15D5214600B1F558 /* Cocoa.framework */, + C149EBFF15D5214600B1F558 /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = ""; + }; + C149EBFF15D5214600B1F558 /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + C149EC0015D5214600B1F558 /* AppKit.framework */, + C149EC0115D5214600B1F558 /* CoreData.framework */, + C149EC0215D5214600B1F558 /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + C149EC0315D5214600B1F558 /* Shuttle */ = { + isa = PBXGroup; + children = ( + 7E74A7C51789CE2F0079E0D2 /* shuttle.default.json */, + 7E72D21E178003ED00A6389C /* Shuttle.entitlements */, + C159DC2715D5DE7F00F5DE24 /* shuttle.icns */, + C149EC0F15D5214600B1F558 /* AppDelegate.h */, + C149EC1015D5214600B1F558 /* AppDelegate.m */, + C149EC1215D5214600B1F558 /* MainMenu.xib */, + C149EC0415D5214600B1F558 /* Supporting Files */, + ); + path = Shuttle; + sourceTree = ""; + }; + C149EC0415D5214600B1F558 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + C149EC0515D5214600B1F558 /* Shuttle-Info.plist */, + C149EC0615D5214600B1F558 /* InfoPlist.strings */, + C149EC0915D5214600B1F558 /* main.m */, + C149EC0B15D5214600B1F558 /* Shuttle-Prefix.pch */, + C149EC0C15D5214600B1F558 /* Credits.rtf */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + C149EBF815D5214600B1F558 /* Shuttle */ = { + isa = PBXNativeTarget; + buildConfigurationList = C149EC1715D5214600B1F558 /* Build configuration list for PBXNativeTarget "Shuttle" */; + buildPhases = ( + C149EBF515D5214600B1F558 /* Sources */, + C149EBF615D5214600B1F558 /* Frameworks */, + C149EBF715D5214600B1F558 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Shuttle; + productName = Shuttle; + productReference = C149EBF915D5214600B1F558 /* Shuttle.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + C149EBF015D5214600B1F558 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0440; + ORGANIZATIONNAME = scturtle; + }; + buildConfigurationList = C149EBF315D5214600B1F558 /* Build configuration list for PBXProject "Shuttle" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = C149EBEE15D5214600B1F558; + productRefGroup = C149EBFA15D5214600B1F558 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + C149EBF815D5214600B1F558 /* Shuttle */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + C149EBF715D5214600B1F558 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C149EC0815D5214600B1F558 /* InfoPlist.strings in Resources */, + C149EC0E15D5214600B1F558 /* Credits.rtf in Resources */, + C149EC1415D5214600B1F558 /* MainMenu.xib in Resources */, + C159DC2815D5DE8000F5DE24 /* shuttle.icns in Resources */, + 7E74A7C61789CE2F0079E0D2 /* shuttle.default.json in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + C149EBF515D5214600B1F558 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C149EC0A15D5214600B1F558 /* main.m in Sources */, + C149EC1115D5214600B1F558 /* AppDelegate.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + C149EC0615D5214600B1F558 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + C149EC0715D5214600B1F558 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + C149EC0C15D5214600B1F558 /* Credits.rtf */ = { + isa = PBXVariantGroup; + children = ( + C149EC0D15D5214600B1F558 /* en */, + ); + name = Credits.rtf; + sourceTree = ""; + }; + C149EC1215D5214600B1F558 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + C149EC1315D5214600B1F558 /* en */, + ); + name = MainMenu.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + C149EC1515D5214600B1F558 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.8; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + C149EC1615D5214600B1F558 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.8; + SDKROOT = macosx; + }; + name = Release; + }; + C149EC1815D5214600B1F558 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_ENTITLEMENTS = Shuttle/Shuttle.entitlements; + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Shuttle/Shuttle-Prefix.pch"; + INFOPLIST_FILE = "Shuttle/Shuttle-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + C149EC1915D5214600B1F558 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_ENTITLEMENTS = Shuttle/Shuttle.entitlements; + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Shuttle/Shuttle-Prefix.pch"; + INFOPLIST_FILE = "Shuttle/Shuttle-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + C149EBF315D5214600B1F558 /* Build configuration list for PBXProject "Shuttle" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C149EC1515D5214600B1F558 /* Debug */, + C149EC1615D5214600B1F558 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C149EC1715D5214600B1F558 /* Build configuration list for PBXNativeTarget "Shuttle" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C149EC1815D5214600B1F558 /* Debug */, + C149EC1915D5214600B1F558 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = C149EBF015D5214600B1F558 /* Project object */; +} diff --git a/Shuttle/AppDelegate.h b/Shuttle/AppDelegate.h new file mode 100644 index 0000000..b7e39cb --- /dev/null +++ b/Shuttle/AppDelegate.h @@ -0,0 +1,22 @@ +// +// AppDelegate.h +// Shuttle +// + +#import + +@interface AppDelegate : NSObject { + IBOutlet NSMenu *menu; + IBOutlet NSArrayController *arrayController; + + NSStatusItem *statusItem; + NSString *shuttleConfigFile; + NSDate *configModified; + + NSString *terminalPref; + NSMutableArray* shuttleHosts; +} + +- (void)menuWillOpen:(NSMenu *)menu; + +@end \ No newline at end of file diff --git a/Shuttle/AppDelegate.m b/Shuttle/AppDelegate.m new file mode 100644 index 0000000..b6c54c5 --- /dev/null +++ b/Shuttle/AppDelegate.m @@ -0,0 +1,190 @@ +// +// AppDelegate.m +// Shuttle +// + +#import "AppDelegate.h" + +@implementation AppDelegate + +- (void) awakeFromNib { + // The path for the configuration file (by default: ~/.shuttle.json) + shuttleConfigFile = [NSHomeDirectory() stringByAppendingPathComponent:@".shuttle.json"]; + + // Load the menu content + // [self loadMenu]; + + // Create the status bar item + statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength]; + [statusItem setMenu:menu]; + [statusItem setHighlightMode:YES]; + [statusItem setTitle:@"SSH"]; + + // Needed to trigger the menuWillOpen event + [menu setDelegate:self]; +} + +- (void)menuWillOpen:(NSMenu *)menu { + // Check when the config was last modified + NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:shuttleConfigFile error:nil]; + NSDate *date = [attributes fileModificationDate]; + + // If it has been updated, refresh the menu + NSComparisonResult result; + result = [date compare:configModified]; + + if ( configModified == NULL || result == NSOrderedDescending ) { + configModified = date; + [self loadMenu]; + } +} + +- (void) loadMenu { + // Clear out the hosts so we can start over + NSUInteger n = [[menu itemArray] count]; + for (int i=0;i + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + shuttle + CFBundleIdentifier + shuttle.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSApplicationCategoryType + public.app-category.developer-tools + LSMinimumSystemVersion + ${MACOSX_DEPLOYMENT_TARGET} + LSUIElement + + NSHumanReadableCopyright + Copyright © 2013 Trevor Fitzgerald. All rights reserved. + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/Shuttle/Shuttle-Prefix.pch b/Shuttle/Shuttle-Prefix.pch new file mode 100644 index 0000000..9336e2f --- /dev/null +++ b/Shuttle/Shuttle-Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'Shuttle' target in the 'Shuttle' project +// + +#ifdef __OBJC__ + #import +#endif diff --git a/Shuttle/Shuttle.entitlements b/Shuttle/Shuttle.entitlements new file mode 100644 index 0000000..4a11143 --- /dev/null +++ b/Shuttle/Shuttle.entitlements @@ -0,0 +1,11 @@ + + + + + com.apple.security.temporary-exception.apple-events + + com.apple.terminal + com.googlecode.iterm2 + + + diff --git a/Shuttle/en.lproj/Credits.rtf b/Shuttle/en.lproj/Credits.rtf new file mode 100644 index 0000000..46576ef --- /dev/null +++ b/Shuttle/en.lproj/Credits.rtf @@ -0,0 +1,29 @@ +{\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;} +{\colortbl;\red255\green255\blue255;} +\paperw9840\paperh8400 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\b\fs24 \cf0 Engineering: +\b0 \ + Some people\ +\ + +\b Human Interface Design: +\b0 \ + Some other people\ +\ + +\b Testing: +\b0 \ + Hopefully not nobody\ +\ + +\b Documentation: +\b0 \ + Whoever\ +\ + +\b With special thanks to: +\b0 \ + Mom\ +} diff --git a/Shuttle/en.lproj/InfoPlist.strings b/Shuttle/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/Shuttle/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Shuttle/en.lproj/MainMenu.xib b/Shuttle/en.lproj/MainMenu.xib new file mode 100644 index 0000000..c9a6284 --- /dev/null +++ b/Shuttle/en.lproj/MainMenu.xib @@ -0,0 +1,416 @@ + + + + 1080 + 12E55 + 3084 + 1187.39 + 626.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 3084 + + + NSArrayController + NSCustomObject + NSMenu + NSMenuItem + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + NSApplication + + + FirstResponder + + + NSApplication + + + AMainMenu + + + + Shuttle + + 1048576 + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + submenuAction: + + Shuttle + + + + About Shuttle + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Quit Shuttle + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + _NSMainMenu + + + AppDelegate + + + NSFontManager + + + + + + + YES + YES + + + 2147483647 + + + + + + Configure + + 2147483647 + + + + + + + + + About + + 2147483647 + + + + + + + + + Quit + + 2147483647 + + + + + YES + + + YES + + YES + YES + YES + YES + YES + + + + + + + terminate: + + + + 449 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + delegate + + + + 495 + + + + menu + + + + 558 + + + + arrayController + + + + 621 + + + + showAbout: + + + + 640 + + + + quit: + + + + 642 + + + + configure: + + + + 643 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 29 + + + + + + + + 56 + + + + + + + + 57 + + + + + + + + + + 58 + + + + + 136 + + + + + 143 + + + + + 420 + + + + + 494 + + + + + 542 + + + + + + + + + + + 620 + + + + + 551 + + + + + 543 + + + + + 561 + + + + + 638 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 643 + + + + + AppDelegate + NSObject + + id + id + id + + + + configure: + id + + + quit: + id + + + showAbout: + id + + + + NSArrayController + NSMenu + + + + arrayController + NSArrayController + + + menu + NSMenu + + + + IBProjectSource + ./Classes/AppDelegate.h + + + + + 0 + IBCocoaFramework + YES + 3 + + {11, 11} + {10, 3} + + YES + + diff --git a/Shuttle/main.m b/Shuttle/main.m new file mode 100644 index 0000000..8b3f762 --- /dev/null +++ b/Shuttle/main.m @@ -0,0 +1,11 @@ +// +// main.m +// Shuttle +// + +#import + +int main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **)argv); +} diff --git a/Shuttle/shuttle.default.json b/Shuttle/shuttle.default.json new file mode 100644 index 0000000..e1d083b --- /dev/null +++ b/Shuttle/shuttle.default.json @@ -0,0 +1,42 @@ +{ + "_comment": "Valid terminals include: 'Terminal.app' or 'iTerm'", + "terminal": "Terminal.app", + "hosts": [ + { + "name": "My Dev Server", + "cmd": "ssh username@dev.example.com" + }, + { + "Personal": [ + { + "name": "My blog", + "cmd": "ssh username@blog.example.com" + } + ] + }, + { + "Work": [ + { + "name": "dev.example.net", + "cmd": "ssh username@dev.example.net -p 3000" + }, + { + "name": "staging.example.net", + "cmd": "ssh username@staging.example.net -p 3000" + }, + { + "name": "production.example.net", + "cmd": "ssh username@example.net -p 3000" + } + ] + }, + { + "Vagrant": [ + { + "name": "precise32", + "cmd": "ssh vagrant@127.0.0.1 -p 2222 -i ~/.vagrant.d/insecure_private_key" + } + ] + } + ] +} diff --git a/apple-scripts/iterm2.applescript b/apple-scripts/iterm2.applescript new file mode 100644 index 0000000..9902124 --- /dev/null +++ b/apple-scripts/iterm2.applescript @@ -0,0 +1,24 @@ +on ApplicationIsRunning(appName) + tell application "System Events" to set appNameIsRunning to exists (processes where name is appName) + return appNameIsRunning +end ApplicationIsRunning + +set isRunning to ApplicationIsRunning("iTerm") + +tell application "iTerm" + tell the current terminal + if (isRunning = false) then + tell the current session + write text "clear" + write text "%1$@" + activate + end tell + else + set newSession to (launch session "Default Session") + tell newSession + write text "clear" + write text "%1$@" + end tell + end if + end tell +end tell diff --git a/apple-scripts/terminal.applescript b/apple-scripts/terminal.applescript new file mode 100644 index 0000000..ba61caf --- /dev/null +++ b/apple-scripts/terminal.applescript @@ -0,0 +1,19 @@ +on ApplicationIsRunning(appName) + tell application "System Events" to set appNameIsRunning to exists (processes where name is appName) + return appNameIsRunning +end ApplicationIsRunning + +set isRunning to ApplicationIsRunning("Terminal") + +tell application "Terminal" + if isRunning then + activate + tell application "System Events" to tell process "Terminal.app" to keystroke "t" using command down + do script "clear" in front window + do script "%1$@" in front window + else + do script "clear" in window 1 + do script "%1$@" in window 1 + activate + end if +end tell diff --git a/shuttle.icns b/shuttle.icns new file mode 100644 index 0000000000000000000000000000000000000000..92f01d5e873d162b8849ad6bf068312c283d01ed GIT binary patch literal 63118 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