Browse Source

initial commit

master
boB Rudis 5 years ago
commit
2d9ee8dc90
No known key found for this signature in database GPG Key ID: 1D7529BE14E2BBA9
  1. 361
      Base.lproj/MainMenu.xib
  2. 28
      Info.plist
  3. BIN
      RSwitch.icns
  4. 340
      RSwitch.xcodeproj/project.pbxproj
  5. 7
      RSwitch.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  6. 8
      RSwitch.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  7. BIN
      RSwitch.xcodeproj/project.xcworkspace/xcuserdata/hrbrmstr.xcuserdatad/UserInterfaceState.xcuserstate
  8. 14
      RSwitch.xcodeproj/xcuserdata/hrbrmstr.xcuserdatad/xcschemes/xcschememanagement.plist
  9. 7
      RSwitch_Prefix.pch
  10. 10
      SwitchCtrl.h
  11. 152
      SwitchCtrl.m
  12. 3
      en.lproj/InfoPlist.strings
  13. 14
      main.m

361
Base.lproj/MainMenu.xib

@ -0,0 +1,361 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14865.1" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment version="101500" identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14865.1"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication"/>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<window title="R Switch" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" frameAutosaveName="r.switch.main" animationBehavior="default" id="21" userLabel="Window">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="484" y="618" width="416" height="215"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1440"/>
<view key="contentView" autoresizesSubviews="NO" id="2">
<rect key="frame" x="0.0" y="0.0" width="416" height="215"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<box autoresizesSubviews="NO" fixedFrame="YES" title="Current R Version" translatesAutoresizingMaskIntoConstraints="NO" id="206">
<rect key="frame" x="17" y="16" width="382" height="179"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<view key="contentView" id="zOt-Yb-lpq">
<rect key="frame" x="3" y="3" width="376" height="161"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<scrollView appearanceType="aqua" fixedFrame="YES" autohidesScrollers="YES" horizontalLineScroll="19" horizontalPageScroll="10" verticalLineScroll="19" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="208">
<rect key="frame" x="16" y="32" width="346" height="119"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<clipView key="contentView" ambiguous="YES" copiesOnScroll="NO" id="Yhc-99-Y1I">
<rect key="frame" x="1" y="1" width="344" height="117"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView verticalHuggingPriority="750" ambiguous="YES" allowsExpansionToolTips="YES" columnAutoresizingStyle="none" columnReordering="NO" columnResizing="NO" multipleSelection="NO" emptySelection="NO" autosaveColumns="NO" id="209">
<rect key="frame" x="0.0" y="0.0" width="466" height="117"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn identifier="version" editable="NO" width="60" minWidth="40" maxWidth="1000" id="210">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left" title="Version">
<font key="font" metaFont="message" size="11"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" white="0.33333299" alpha="1" colorSpace="calibratedWhite"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="left" id="228">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
</tableColumn>
<tableColumn identifier="desc" width="400" minWidth="4" maxWidth="1000" id="221">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left" title="Description">
<font key="font" metaFont="message" size="11"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="left" id="227">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
</tableColumn>
</tableColumns>
<connections>
<outlet property="dataSource" destination="213" id="220"/>
<outlet property="delegate" destination="213" id="219"/>
</connections>
</tableView>
</subviews>
</clipView>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="229">
<rect key="frame" x="-100" y="-100" width="128" height="15"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="230">
<rect key="frame" x="-30" y="1" width="15" height="117"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="212">
<rect key="frame" x="16" y="11" width="220" height="13"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Change is effective immediately." id="225">
<font key="font" metaFont="system" size="10"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" fixedFrame="YES" imageHugsTitle="YES" translatesAutoresizingMaskIntoConstraints="NO" id="222">
<rect key="frame" x="282" y="8" width="81" height="16"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
<buttonCell key="cell" type="push" title="Rediscover" bezelStyle="rounded" alignment="center" controlSize="mini" borderStyle="border" inset="2" id="226">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="miniSystem"/>
</buttonCell>
<connections>
<action selector="rediscover:" target="213" id="223"/>
</connections>
</button>
</subviews>
</view>
</box>
</subviews>
</view>
<connections>
<outlet property="delegate" destination="213" id="217"/>
<outlet property="initialFirstResponder" destination="209" id="218"/>
</connections>
<point key="canvasLocation" x="139" y="148"/>
</window>
<menu title="MainMenu" systemMenu="main" id="29" userLabel="MainMenu">
<items>
<menuItem title="RSwitch" id="56">
<menu key="submenu" title="RSwitch" systemMenu="apple" id="57">
<items>
<menuItem title="About RSwitch" id="58">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontStandardAboutPanel:" target="-2" id="142"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="196">
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem>
<menuItem title="Preferences…" keyEquivalent="," id="129"/>
<menuItem isSeparatorItem="YES" id="143">
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem>
<menuItem title="Services" id="131">
<menu key="submenu" title="Services" systemMenu="services" id="130"/>
</menuItem>
<menuItem isSeparatorItem="YES" id="144">
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem>
<menuItem title="Hide RSwitch" keyEquivalent="h" id="134">
<connections>
<action selector="hide:" target="-2" id="152"/>
</connections>
</menuItem>
<menuItem title="Hide Others" keyEquivalent="h" id="145">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="hideOtherApplications:" target="-2" id="146"/>
</connections>
</menuItem>
<menuItem title="Show All" id="150">
<connections>
<action selector="unhideAllApplications:" target="-2" id="153"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="149">
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem>
<menuItem title="Quit RSwitch" keyEquivalent="q" id="136">
<connections>
<action selector="terminate:" target="-2" id="139"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="File" id="83">
<menu key="submenu" title="File" id="81">
<items>
<menuItem title="New" keyEquivalent="n" id="82"/>
<menuItem title="Open..." keyEquivalent="o" id="72"/>
<menuItem title="Open Recent" id="124">
<menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="125">
<items>
<menuItem title="Clear Menu" id="126">
<connections>
<action selector="clearRecentDocuments:" target="-1" id="127"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="79">
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem>
<menuItem title="Close" keyEquivalent="w" id="73">
<connections>
<action selector="performClose:" target="-1" id="193"/>
</connections>
</menuItem>
<menuItem title="Save" keyEquivalent="s" id="75"/>
<menuItem title="Save As…" keyEquivalent="S" id="80"/>
<menuItem title="Revert" id="112">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem isSeparatorItem="YES" id="74">
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem>
<menuItem title="Page Setup…" keyEquivalent="P" id="77">
<connections>
<action selector="runPageLayout:" target="-1" id="87"/>
</connections>
</menuItem>
<menuItem title="Print…" keyEquivalent="p" id="78">
<connections>
<action selector="print:" target="-1" id="86"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Edit" id="163">
<menu key="submenu" title="Edit" id="169">
<items>
<menuItem title="Undo" keyEquivalent="z" id="158">
<connections>
<action selector="undo:" target="-1" id="180"/>
</connections>
</menuItem>
<menuItem title="Redo" keyEquivalent="Z" id="173">
<connections>
<action selector="redo:" target="-1" id="178"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="156">
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem>
<menuItem title="Cut" keyEquivalent="x" id="160">
<connections>
<action selector="cut:" target="-1" id="175"/>
</connections>
</menuItem>
<menuItem title="Copy" keyEquivalent="c" id="157">
<connections>
<action selector="copy:" target="-1" id="181"/>
</connections>
</menuItem>
<menuItem title="Paste" keyEquivalent="v" id="171">
<connections>
<action selector="paste:" target="-1" id="176"/>
</connections>
</menuItem>
<menuItem title="Paste and Match Style" keyEquivalent="V" id="204">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteAsPlainText:" target="-1" id="205"/>
</connections>
</menuItem>
<menuItem title="Delete" id="164">
<connections>
<action selector="delete:" target="-1" id="195"/>
</connections>
</menuItem>
<menuItem title="Select All" keyEquivalent="a" id="172">
<connections>
<action selector="selectAll:" target="-1" id="179"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="174">
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem>
<menuItem title="Find" id="168">
<menu key="submenu" title="Find" id="159">
<items>
<menuItem title="Find…" tag="1" keyEquivalent="f" id="154">
<connections>
<action selector="performFindPanelAction:" target="-1" id="199"/>
</connections>
</menuItem>
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="167">
<connections>
<action selector="performFindPanelAction:" target="-1" id="200"/>
</connections>
</menuItem>
<menuItem title="Find Previous" tag="3" keyEquivalent="G" id="162">
<connections>
<action selector="performFindPanelAction:" target="-1" id="201"/>
</connections>
</menuItem>
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="161">
<connections>
<action selector="performFindPanelAction:" target="-1" id="202"/>
</connections>
</menuItem>
<menuItem title="Jump to Selection" keyEquivalent="j" id="155">
<connections>
<action selector="centerSelectionInVisibleArea:" target="-1" id="203"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Spelling" id="184">
<menu key="submenu" title="Spelling" id="185">
<items>
<menuItem title="Spelling…" keyEquivalent=":" id="187">
<connections>
<action selector="showGuessPanel:" target="-1" id="188"/>
</connections>
</menuItem>
<menuItem title="Check Spelling" keyEquivalent=";" id="189">
<connections>
<action selector="checkSpelling:" target="-1" id="190"/>
</connections>
</menuItem>
<menuItem title="Check Spelling as You Type" id="191">
<connections>
<action selector="toggleContinuousSpellChecking:" target="-1" id="192"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Window" id="19">
<menu key="submenu" title="Window" systemMenu="window" id="24">
<items>
<menuItem title="Minimize" keyEquivalent="m" id="23">
<connections>
<action selector="performMiniaturize:" target="-1" id="37"/>
</connections>
</menuItem>
<menuItem title="Zoom" id="197">
<connections>
<action selector="performZoom:" target="-1" id="198"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="92">
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem>
<menuItem title="Bring All to Front" id="5">
<connections>
<action selector="arrangeInFront:" target="-1" id="39"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Help" id="103">
<menu key="submenu" title="Help" id="106">
<items>
<menuItem title="RSwitch Help" keyEquivalent="?" id="111">
<connections>
<action selector="showHelp:" target="-1" id="122"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
<customObject id="213" userLabel="SwitchCtrl" customClass="SwitchCtrl">
<connections>
<outlet property="list" destination="209" id="214"/>
<outlet property="window" destination="21" id="215"/>
</connections>
</customObject>
</objects>
</document>

28
Info.plist

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIconFile</key>
<string>RSwitch</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>NSMainNibFile</key>
<string>MainMenu</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
</dict>
</plist>

BIN
RSwitch.icns

Binary file not shown.

340
RSwitch.xcodeproj/project.pbxproj

@ -0,0 +1,340 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 45;
objects = {
/* Begin PBXBuildFile section */
01E00C68231C30F700FCDEFE /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 01E00C66231C30F700FCDEFE /* MainMenu.xib */; };
681F0F480AB1AB400089A9D9 /* SwitchCtrl.m in Sources */ = {isa = PBXBuildFile; fileRef = 681F0F470AB1AB400089A9D9 /* SwitchCtrl.m */; };
681F11D10AB1BA7D0089A9D9 /* RSwitch.icns in Resources */ = {isa = PBXBuildFile; fileRef = 681F11D00AB1BA7D0089A9D9 /* RSwitch.icns */; };
8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; };
8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
01E00C65231C2B7800FCDEFE /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
01E00C67231C30F700FCDEFE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = "<absolute>"; };
29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
32CA4F630368D1EE00C91783 /* RSwitch_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RSwitch_Prefix.pch; sourceTree = "<group>"; };
681F0F460AB1AB400089A9D9 /* SwitchCtrl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SwitchCtrl.h; sourceTree = "<group>"; };
681F0F470AB1AB400089A9D9 /* SwitchCtrl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SwitchCtrl.m; sourceTree = "<group>"; };
681F11D00AB1BA7D0089A9D9 /* RSwitch.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = RSwitch.icns; sourceTree = "<group>"; };
8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
8D1107320486CEB800E47090 /* RSwitch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RSwitch.app; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
8D11072E0486CEB800E47090 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = {
isa = PBXGroup;
children = (
1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */,
);
name = "Linked Frameworks";
sourceTree = "<group>";
};
1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = {
isa = PBXGroup;
children = (
29B97324FDCFA39411CA2CEA /* AppKit.framework */,
13E42FB307B3F0F600E4EEF1 /* CoreData.framework */,
29B97325FDCFA39411CA2CEA /* Foundation.framework */,
);
name = "Other Frameworks";
sourceTree = "<group>";
};
19C28FACFE9D520D11CA2CBB /* Products */ = {
isa = PBXGroup;
children = (
8D1107320486CEB800E47090 /* RSwitch.app */,
);
name = Products;
sourceTree = "<group>";
};
29B97314FDCFA39411CA2CEA /* RSwitch */ = {
isa = PBXGroup;
children = (
29B97315FDCFA39411CA2CEA /* Other Sources */,
29B97317FDCFA39411CA2CEA /* Resources */,
29B97323FDCFA39411CA2CEA /* Frameworks */,
19C28FACFE9D520D11CA2CBB /* Products */,
);
name = RSwitch;
sourceTree = "<group>";
};
29B97315FDCFA39411CA2CEA /* Other Sources */ = {
isa = PBXGroup;
children = (
32CA4F630368D1EE00C91783 /* RSwitch_Prefix.pch */,
29B97316FDCFA39411CA2CEA /* main.m */,
681F0F460AB1AB400089A9D9 /* SwitchCtrl.h */,
681F0F470AB1AB400089A9D9 /* SwitchCtrl.m */,
);
name = "Other Sources";
sourceTree = "<group>";
};
29B97317FDCFA39411CA2CEA /* Resources */ = {
isa = PBXGroup;
children = (
01E00C66231C30F700FCDEFE /* MainMenu.xib */,
681F11D00AB1BA7D0089A9D9 /* RSwitch.icns */,
8D1107310486CEB800E47090 /* Info.plist */,
089C165CFE840E0CC02AAC07 /* InfoPlist.strings */,
);
name = Resources;
sourceTree = "<group>";
};
29B97323FDCFA39411CA2CEA /* Frameworks */ = {
isa = PBXGroup;
children = (
1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */,
1058C7A2FEA54F0111CA2CBB /* Other Frameworks */,
);
name = Frameworks;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
8D1107260486CEB800E47090 /* RSwitch */ = {
isa = PBXNativeTarget;
buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "RSwitch" */;
buildPhases = (
8D1107290486CEB800E47090 /* Resources */,
8D11072C0486CEB800E47090 /* Sources */,
8D11072E0486CEB800E47090 /* Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = RSwitch;
productInstallPath = "$(HOME)/Applications";
productName = RSwitch;
productReference = 8D1107320486CEB800E47090 /* RSwitch.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
29B97313FDCFA39411CA2CEA /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 1100;
};
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "RSwitch" */;
compatibilityVersion = "Xcode 2.4";
developmentRegion = en;
hasScannedForEncodings = 1;
knownRegions = (
ja,
Base,
en,
fr,
de,
);
mainGroup = 29B97314FDCFA39411CA2CEA /* RSwitch */;
projectDirPath = "";
projectRoot = "";
targets = (
8D1107260486CEB800E47090 /* RSwitch */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
8D1107290486CEB800E47090 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */,
681F11D10AB1BA7D0089A9D9 /* RSwitch.icns in Resources */,
01E00C68231C30F700FCDEFE /* MainMenu.xib in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
8D11072C0486CEB800E47090 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
8D11072D0486CEB800E47090 /* main.m in Sources */,
681F0F480AB1AB400089A9D9 /* SwitchCtrl.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
01E00C66231C30F700FCDEFE /* MainMenu.xib */ = {
isa = PBXVariantGroup;
children = (
01E00C67231C30F700FCDEFE /* Base */,
);
name = MainMenu.xib;
sourceTree = "<group>";
};
089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = {
isa = PBXVariantGroup;
children = (
01E00C65231C2B7800FCDEFE /* en */,
);
name = InfoPlist.strings;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
C01FCF4B08A954540054247B /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_OBJC_WEAK = YES;
CODE_SIGN_IDENTITY = "-";
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1.3;
GCC_DYNAMIC_NO_PIC = NO;
GCC_MODEL_TUNING = G5;
GCC_OPTIMIZATION_LEVEL = 0;
INFOPLIST_FILE = Info.plist;
INSTALL_PATH = "$(HOME)/Applications";
MACOSX_DEPLOYMENT_TARGET = 10.12;
PRODUCT_BUNDLE_IDENTIFIER = info.urbanek.RSwitch;
PRODUCT_NAME = RSwitch;
SDKROOT = macosx;
WRAPPER_EXTENSION = app;
ZERO_LINK = YES;
};
name = Debug;
};
C01FCF4C08A954540054247B /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_OBJC_WEAK = YES;
CODE_SIGN_IDENTITY = "-";
CURRENT_PROJECT_VERSION = 1.3;
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_MODEL_TUNING = G5;
GCC_VERSION = "";
INFOPLIST_FILE = Info.plist;
INSTALL_PATH = "$(HOME)/Applications";
MACOSX_DEPLOYMENT_TARGET = 10.12;
PRODUCT_BUNDLE_IDENTIFIER = info.urbanek.RSwitch;
PRODUCT_NAME = RSwitch;
SDKROOT = macosx;
WRAPPER_EXTENSION = app;
};
name = Release;
};
C01FCF4F08A954540054247B /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk";
};
name = Debug;
};
C01FCF5008A954540054247B /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "RSwitch" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C01FCF4B08A954540054247B /* Debug */,
C01FCF4C08A954540054247B /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
C01FCF4E08A954540054247B /* Build configuration list for PBXProject "RSwitch" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C01FCF4F08A954540054247B /* Debug */,
C01FCF5008A954540054247B /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
}

7
RSwitch.xcodeproj/project.xcworkspace/contents.xcworkspacedata

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>

8
RSwitch.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

BIN
RSwitch.xcodeproj/project.xcworkspace/xcuserdata/hrbrmstr.xcuserdatad/UserInterfaceState.xcuserstate

Binary file not shown.

14
RSwitch.xcodeproj/xcuserdata/hrbrmstr.xcuserdatad/xcschemes/xcschememanagement.plist

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SchemeUserState</key>
<dict>
<key>RSwitch.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
</dict>
</dict>
</dict>
</plist>

7
RSwitch_Prefix.pch

@ -0,0 +1,7 @@
//
// Prefix header for all source files of the 'RSwitch' target in the 'RSwitch' project
//
#ifdef __OBJC__
#import <Cocoa/Cocoa.h>
#endif

10
SwitchCtrl.h

@ -0,0 +1,10 @@
/* SwitchCtrl */
#import <Cocoa/Cocoa.h>
@interface SwitchCtrl : NSObject
{
IBOutlet NSTableView *list;
IBOutlet NSWindow *window;
}
@end

152
SwitchCtrl.m

@ -0,0 +1,152 @@
#import "SwitchCtrl.h"
NSArray *versions = nil;
NSArray *desc = nil;
BOOL finishedLoading = NO;
@interface SwitchCtrl (Private)
- (void) reloadVersions;
@end
@implementation SwitchCtrl
NSString *where = @"/Library/Frameworks/R.framework/Versions";
- (IBAction)rediscover:(id)sender
{
[self reloadVersions];
}
/* awake */
- (void) awakeFromNib {
[self reloadVersions];
finishedLoading = YES;
}
// fn is now a path to R_HOME. Uses bin/R (for older R) or Rversion.h header
static NSString *getVersionString(NSString *fn) {
char buf[512];
FILE *f = fopen([[fn stringByAppendingString:@"/bin/R"] UTF8String],"r");
if (!f) return @"<incomplete installation>";
buf[511]=0;
while (!feof(f) && fgets(buf,511,f)) {
char *c = strstr(buf,"version=\"");
if (c) {
char *d = c;
while (*d) d++;
d--; while (d > c+10 && (*d=='.' || *d=='\n' || *d=='\r' || *d==' ')) { *d=0; d--; };
fclose(f);
return [NSString stringWithUTF8String:c+9];
}
}
fclose(f);
// bin/R doesn't contain version="" - try headers - it's messy, though
f = fopen([[fn stringByAppendingString:@"/include/i386/Rversion.h"] UTF8String], "r");
if (!f) // possibly not multi-arch -- note that this won't work for multi-arch as it's jsut a stub
f = fopen([[fn stringByAppendingString:@"/include/Rversion.h"] UTF8String], "r");
if (f) {
NSString *ver = @"";
while (!feof(f) && fgets(buf, 511, f)) {
int maj = 1;
char *c = strstr(buf, "R_MAJOR");
if (!c) {
c = strstr(buf, "R_MINOR");
maj = 0;
}
if (c) {
char *anchor;
while (*c && *c != '\"') c++;
if (*c) c++;
anchor = c;
while (*c && *c != '\"') c++;
*c = 0;
ver = [ver stringByAppendingFormat:@"%s%s", maj ? "" : ".", anchor];
}
}
fclose(f);
if ([ver length] > 0)
return ver;
}
return @"<unknown>";
}
- (void) reloadVersions {
NSArray *cont = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:where error:nil];
if (cont) {
NSMutableArray *ma = [[NSMutableArray alloc] initWithCapacity:[cont count]];
if (desc) [desc release];
desc = [[NSMutableArray alloc] initWithCapacity:[cont count]];
NSEnumerator *enumerator = [cont objectEnumerator];
NSString *cur = [[NSFileManager defaultManager] destinationOfSymbolicLinkAtPath:[NSString stringWithFormat:@"%@/Current", where] error: nil];
NSString *ver;
while (ver = (NSString*) [enumerator nextObject]) {
NSString *rsh = [NSString stringWithFormat:@"%@/%@/Resources", where, ver];
if (![ver isEqualToString:@"Current"] && [[NSFileManager defaultManager] fileExistsAtPath:rsh]) {
[ma addObject:ver];
[(NSMutableArray*)desc addObject: getVersionString(rsh)];
}
}
if (versions) [versions release];
versions = ma;
[list reloadData];
if (cur) {
NSUInteger cp = [versions indexOfObject:cur];
if (cp != NSNotFound) [list selectRowIndexes:[NSIndexSet indexSetWithIndex:cp] byExtendingSelection:NO];
}
}
}
/* selection */
- (void) tableViewSelectionDidChange:(NSNotification *)aNotification
{
NSUInteger nr = [list numberOfRows];
NSInteger sel = -1;
if (nr>0) {
sel = [list selectedRow];
if (finishedLoading && sel>=0 && sel<nr) {
NSString *curl = [NSString stringWithFormat:@"%@/Current", where];
NSString *new = [versions objectAtIndex:sel];
[[NSFileManager defaultManager] removeItemAtURL:[NSURL URLWithString:curl] error: nil];
[[NSFileManager defaultManager] createSymbolicLinkAtURL:[NSURL URLWithString:curl] withDestinationURL:[NSURL URLWithString:new] error: nil];
NSLog(@"Requested change of link %@ to %@", curl, new);
}
}
NSLog(@"Did change, nr=%ld, sel=%ld, finished=%d", nr, sel, finishedLoading);
}
/* dataSource callbacks */
- (id)tableView:(NSTableView *)aTableView
objectValueForTableColumn:(NSTableColumn *)aTableColumn
row:(int)rowIndex
{
NSArray *ac = nil;
if ([[aTableColumn identifier] isEqual:@"desc"]) ac = desc;
if ([[aTableColumn identifier] isEqual:@"version"]) ac = versions;
if (!ac) return nil;
NSParameterAssert(rowIndex >= 0 && rowIndex < [ac count]);
return [ac objectAtIndex:rowIndex];
}
- (NSUInteger)numberOfRowsInTableView:(NSTableView *)aTableView
{
return desc?[desc count]:0;
}
/* window callbacks */
- (BOOL)windowShouldClose:(id)sender {
[NSApp terminate:0];
return YES;
}
@end

3
en.lproj/InfoPlist.strings

@ -0,0 +1,3 @@
/* Localized versions of Info.plist keys */
NSHumanReadableCopyright = "© Simon Urbanek, 2006,2011";

14
main.m

@ -0,0 +1,14 @@
//
// main.m
// RSwitch
//
// Created by Simon Urbanek on 9/8/06.
// Copyright Simon Urbanek 2006,2011. All rights reserved.
//
#import <Cocoa/Cocoa.h>
int main(int argc, char *argv[])
{
return NSApplicationMain(argc, (const char **) argv);
}
Loading…
Cancel
Save