Browse Source

1.4.0

tags/v1.4.0 v1.4.0
boB Rudis 5 years ago
parent
commit
58acd9c3ca
No known key found for this signature in database GPG Key ID: 1D7529BE14E2BBA9
  1. 1
      .gitignore
  2. 42
      RSwitch.xcodeproj/project.pbxproj
  3. 27
      RSwitch/Base.lproj/Main.storyboard
  4. 7
      RSwitch/c/RSwitch-Bridging-Header.h
  5. BIN
      RSwitch/c/libprocInfo.a
  6. 19
      RSwitch/c/procHelper.h
  7. 18
      RSwitch/c/procHelper.m
  8. 205
      RSwitch/c/procInfo.h
  9. 0
      RSwitch/c/swift/AboutViewController.swift
  10. 0
      RSwitch/c/swift/Alerts.swift
  11. 0
      RSwitch/c/swift/AppDelegate.swift
  12. 0
      RSwitch/c/swift/Bundle.swift
  13. 0
      RSwitch/c/swift/DownloadRStudio.swift
  14. 0
      RSwitch/c/swift/DownloadTarball.swift
  15. 0
      RSwitch/c/swift/HandleSwitch.swift
  16. 25
      RSwitch/c/swift/HandleSwitchTo.swift
  17. 0
      RSwitch/c/swift/HandleUpdate.swift
  18. 64
      RSwitch/c/swift/Menu.swift
  19. 0
      RSwitch/c/swift/Notify.swift
  20. 0
      RSwitch/c/swift/String+Version.swift
  21. 38
      RSwitch/c/swift/Utils.swift
  22. 0
      RSwitch/c/swift/ViewController.swift
  23. 8
      build/RSwitch.build/Release/RSwitch.build/DerivedSources/Entitlements.plist
  24. 1
      build/RSwitch.build/Release/RSwitch.build/DerivedSources/Pods-RSwitch-checkManifestLockResult.txt
  25. 1
      build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/RSwitch-OutputFileMap.json
  26. 16
      build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/RSwitch-master.d
  27. 4
      build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/RSwitch-master.swiftdeps
  28. 4
      build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/RSwitch-master.swiftdeps~
  29. 4
      build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/RSwitch-master.swiftdeps~moduleonly
  30. 13
      build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/RSwitch.LinkFileList
  31. 13
      build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/RSwitch.SwiftFileList
  32. BIN
      build/RSwitch.build/Release/RSwitch.build/RSwitch-all-non-framework-target-headers.hmap
  33. BIN
      build/RSwitch.build/Release/RSwitch.build/RSwitch-all-target-headers.hmap
  34. BIN
      build/RSwitch.build/Release/RSwitch.build/RSwitch-generated-files.hmap
  35. BIN
      build/RSwitch.build/Release/RSwitch.build/RSwitch-own-target-headers.hmap
  36. BIN
      build/RSwitch.build/Release/RSwitch.build/RSwitch-project-headers.hmap
  37. 8
      build/RSwitch.build/Release/RSwitch.build/RSwitch.app.xcent
  38. BIN
      build/RSwitch.build/Release/RSwitch.build/RSwitch.hmap
  39. 10
      build/RSwitch.build/Release/RSwitch.build/Script-FEB62898714FA5EEEAA0AFDE.sh
  40. 1
      build/RSwitch.build/Release/RSwitch.build/all-product-headers.yaml
  41. BIN
      build/XCBuildData/908dad76795ea13c6fc2915c74d69cd9-desc.xcbuild
  42. 93
      build/XCBuildData/908dad76795ea13c6fc2915c74d69cd9-manifest.xcbuild
  43. BIN
      build/XCBuildData/BuildDescriptionCacheIndex-a4dabeac050d47b4e44bb951c02cf12a
  44. BIN
      build/XCBuildData/build.db
  45. 0
      guide/.Rhistory
  46. 18
      guide/_site.yml
  47. 362
      guide/_site/acknowledgements.html
  48. BIN
      guide/_site/app-switch.png
  49. 376
      guide/_site/develop.html
  50. 2
      guide/_site/footer.html
  51. 596
      guide/_site/index.html
  52. BIN
      guide/_site/latest.png
  53. BIN
      guide/_site/launch-new.png
  54. BIN
      guide/_site/main-menu.png
  55. BIN
      guide/_site/menu-info.png
  56. BIN
      guide/_site/r-change-notify.png
  57. BIN
      guide/_site/r-devel-exists.png
  58. BIN
      guide/_site/r-macos-downloads.png
  59. BIN
      guide/_site/rstudio-exists.png
  60. BIN
      guide/_site/rstudio-in-progress.png
  61. BIN
      guide/_site/rstudio-success.png
  62. 587
      guide/_site/site_libs/bootstrap-3.3.5/css/bootstrap-theme.css
  63. 1
      guide/_site/site_libs/bootstrap-3.3.5/css/bootstrap-theme.css.map
  64. 5
      guide/_site/site_libs/bootstrap-3.3.5/css/bootstrap-theme.min.css
  65. 6799
      guide/_site/site_libs/bootstrap-3.3.5/css/bootstrap.css
  66. 1
      guide/_site/site_libs/bootstrap-3.3.5/css/bootstrap.css.map
  67. 5
      guide/_site/site_libs/bootstrap-3.3.5/css/bootstrap.min.css
  68. 11
      guide/_site/site_libs/bootstrap-3.3.5/css/cerulean.min.css
  69. 30
      guide/_site/site_libs/bootstrap-3.3.5/css/cosmo.min.css
  70. 30
      guide/_site/site_libs/bootstrap-3.3.5/css/darkly.min.css
  71. 30
      guide/_site/site_libs/bootstrap-3.3.5/css/flatly.min.css
  72. BIN
      guide/_site/site_libs/bootstrap-3.3.5/css/fonts/Lato.ttf
  73. BIN
      guide/_site/site_libs/bootstrap-3.3.5/css/fonts/LatoBold.ttf
  74. BIN
      guide/_site/site_libs/bootstrap-3.3.5/css/fonts/LatoItalic.ttf
  75. BIN
      guide/_site/site_libs/bootstrap-3.3.5/css/fonts/NewsCycle.ttf
  76. BIN
      guide/_site/site_libs/bootstrap-3.3.5/css/fonts/NewsCycleBold.ttf
  77. BIN
      guide/_site/site_libs/bootstrap-3.3.5/css/fonts/OpenSans.ttf
  78. BIN
      guide/_site/site_libs/bootstrap-3.3.5/css/fonts/OpenSansBold.ttf
  79. BIN
      guide/_site/site_libs/bootstrap-3.3.5/css/fonts/OpenSansBoldItalic.ttf
  80. BIN
      guide/_site/site_libs/bootstrap-3.3.5/css/fonts/OpenSansItalic.ttf
  81. BIN
      guide/_site/site_libs/bootstrap-3.3.5/css/fonts/OpenSansLight.ttf
  82. BIN
      guide/_site/site_libs/bootstrap-3.3.5/css/fonts/OpenSansLightItalic.ttf
  83. BIN
      guide/_site/site_libs/bootstrap-3.3.5/css/fonts/Raleway.ttf
  84. BIN
      guide/_site/site_libs/bootstrap-3.3.5/css/fonts/RalewayBold.ttf
  85. BIN
      guide/_site/site_libs/bootstrap-3.3.5/css/fonts/Roboto.ttf
  86. BIN
      guide/_site/site_libs/bootstrap-3.3.5/css/fonts/RobotoBold.ttf
  87. BIN
      guide/_site/site_libs/bootstrap-3.3.5/css/fonts/RobotoLight.ttf
  88. BIN
      guide/_site/site_libs/bootstrap-3.3.5/css/fonts/RobotoMedium.ttf
  89. BIN
      guide/_site/site_libs/bootstrap-3.3.5/css/fonts/SourceSansPro.ttf
  90. BIN
      guide/_site/site_libs/bootstrap-3.3.5/css/fonts/SourceSansProBold.ttf
  91. BIN
      guide/_site/site_libs/bootstrap-3.3.5/css/fonts/SourceSansProItalic.ttf
  92. BIN
      guide/_site/site_libs/bootstrap-3.3.5/css/fonts/SourceSansProLight.ttf
  93. BIN
      guide/_site/site_libs/bootstrap-3.3.5/css/fonts/Ubuntu.ttf
  94. 24
      guide/_site/site_libs/bootstrap-3.3.5/css/journal.min.css
  95. 37
      guide/_site/site_libs/bootstrap-3.3.5/css/lumen.min.css
  96. 36
      guide/_site/site_libs/bootstrap-3.3.5/css/paper.min.css
  97. 24
      guide/_site/site_libs/bootstrap-3.3.5/css/readable.min.css
  98. 24
      guide/_site/site_libs/bootstrap-3.3.5/css/sandstone.min.css
  99. 24
      guide/_site/site_libs/bootstrap-3.3.5/css/simplex.min.css
  100. 36
      guide/_site/site_libs/bootstrap-3.3.5/css/spacelab.min.css

1
.gitignore

@ -24,3 +24,4 @@ Icon
Network Trash Folder Network Trash Folder
Temporary Items Temporary Items
.apdisk .apdisk
.Rproj.user

42
RSwitch.xcodeproj/project.pbxproj

@ -18,6 +18,9 @@
01073F1F2311E67D007162C9 /* HandleUpdate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01073F1E2311E67D007162C9 /* HandleUpdate.swift */; }; 01073F1F2311E67D007162C9 /* HandleUpdate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01073F1E2311E67D007162C9 /* HandleUpdate.swift */; };
01073F212311E6BD007162C9 /* HandleSwitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01073F202311E6BD007162C9 /* HandleSwitch.swift */; }; 01073F212311E6BD007162C9 /* HandleSwitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01073F202311E6BD007162C9 /* HandleSwitch.swift */; };
0178970D230ED25100F8F5BC /* AboutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0178970C230ED25100F8F5BC /* AboutViewController.swift */; }; 0178970D230ED25100F8F5BC /* AboutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0178970C230ED25100F8F5BC /* AboutViewController.swift */; };
018A8C3B2312C7BC0006E87D /* libprocInfo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 018A8C3A2312C7BC0006E87D /* libprocInfo.a */; };
018A8C3F2312CB480006E87D /* procHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 018A8C3E2312CB480006E87D /* procHelper.m */; };
018A8C412312F4940006E87D /* HandleSwitchTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 018A8C402312F4940006E87D /* HandleSwitchTo.swift */; };
01F3EF0C230E635300DF5DF9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F3EF0B230E635300DF5DF9 /* AppDelegate.swift */; }; 01F3EF0C230E635300DF5DF9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F3EF0B230E635300DF5DF9 /* AppDelegate.swift */; };
01F3EF0E230E635300DF5DF9 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F3EF0D230E635300DF5DF9 /* ViewController.swift */; }; 01F3EF0E230E635300DF5DF9 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F3EF0D230E635300DF5DF9 /* ViewController.swift */; };
01F3EF10230E635500DF5DF9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 01F3EF0F230E635500DF5DF9 /* Assets.xcassets */; }; 01F3EF10230E635500DF5DF9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 01F3EF0F230E635500DF5DF9 /* Assets.xcassets */; };
@ -37,6 +40,12 @@
01073F1E2311E67D007162C9 /* HandleUpdate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HandleUpdate.swift; sourceTree = "<group>"; }; 01073F1E2311E67D007162C9 /* HandleUpdate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HandleUpdate.swift; sourceTree = "<group>"; };
01073F202311E6BD007162C9 /* HandleSwitch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HandleSwitch.swift; sourceTree = "<group>"; }; 01073F202311E6BD007162C9 /* HandleSwitch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HandleSwitch.swift; sourceTree = "<group>"; };
0178970C230ED25100F8F5BC /* AboutViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutViewController.swift; sourceTree = "<group>"; }; 0178970C230ED25100F8F5BC /* AboutViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutViewController.swift; sourceTree = "<group>"; };
018A8C392312C7BC0006E87D /* procInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = procInfo.h; sourceTree = "<group>"; };
018A8C3A2312C7BC0006E87D /* libprocInfo.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libprocInfo.a; sourceTree = "<group>"; };
018A8C3C2312C8380006E87D /* RSwitch-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "RSwitch-Bridging-Header.h"; sourceTree = "<group>"; };
018A8C3D2312CB480006E87D /* procHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = procHelper.h; sourceTree = "<group>"; };
018A8C3E2312CB480006E87D /* procHelper.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = procHelper.m; sourceTree = "<group>"; };
018A8C402312F4940006E87D /* HandleSwitchTo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HandleSwitchTo.swift; sourceTree = "<group>"; };
01F3EF08230E635300DF5DF9 /* RSwitch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RSwitch.app; sourceTree = BUILT_PRODUCTS_DIR; }; 01F3EF08230E635300DF5DF9 /* RSwitch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RSwitch.app; sourceTree = BUILT_PRODUCTS_DIR; };
01F3EF0B230E635300DF5DF9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; 01F3EF0B230E635300DF5DF9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
01F3EF0D230E635300DF5DF9 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; }; 01F3EF0D230E635300DF5DF9 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
@ -54,6 +63,7 @@
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
52B8A14237DA712A6A2ABDE0 /* Pods_RSwitch.framework in Frameworks */, 52B8A14237DA712A6A2ABDE0 /* Pods_RSwitch.framework in Frameworks */,
018A8C3B2312C7BC0006E87D /* libprocInfo.a in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -69,6 +79,7 @@
01073F1E2311E67D007162C9 /* HandleUpdate.swift */, 01073F1E2311E67D007162C9 /* HandleUpdate.swift */,
01073F1C2311E64E007162C9 /* DownloadRStudio.swift */, 01073F1C2311E64E007162C9 /* DownloadRStudio.swift */,
01073F1A2311E613007162C9 /* DownloadTarball.swift */, 01073F1A2311E613007162C9 /* DownloadTarball.swift */,
018A8C402312F4940006E87D /* HandleSwitchTo.swift */,
01073F182311E3B8007162C9 /* Bundle.swift */, 01073F182311E3B8007162C9 /* Bundle.swift */,
01073F162311E397007162C9 /* Menu.swift */, 01073F162311E397007162C9 /* Menu.swift */,
01073F142311E370007162C9 /* Notify.swift */, 01073F142311E370007162C9 /* Notify.swift */,
@ -80,6 +91,19 @@
path = swift; path = swift;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
018A8C342312C6510006E87D /* c */ = {
isa = PBXGroup;
children = (
018A8C3C2312C8380006E87D /* RSwitch-Bridging-Header.h */,
018A8C3A2312C7BC0006E87D /* libprocInfo.a */,
018A8C392312C7BC0006E87D /* procInfo.h */,
018A8C3D2312CB480006E87D /* procHelper.h */,
018A8C3E2312CB480006E87D /* procHelper.m */,
01073F232311E859007162C9 /* swift */,
);
path = c;
sourceTree = "<group>";
};
01F3EEFF230E635300DF5DF9 = { 01F3EEFF230E635300DF5DF9 = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -101,7 +125,7 @@
01F3EF0A230E635300DF5DF9 /* RSwitch */ = { 01F3EF0A230E635300DF5DF9 /* RSwitch */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
01073F232311E859007162C9 /* swift */, 018A8C342312C6510006E87D /* c */,
01F3EF0F230E635500DF5DF9 /* Assets.xcassets */, 01F3EF0F230E635500DF5DF9 /* Assets.xcassets */,
01F3EF11230E635500DF5DF9 /* Main.storyboard */, 01F3EF11230E635500DF5DF9 /* Main.storyboard */,
01F3EF14230E635500DF5DF9 /* Info.plist */, 01F3EF14230E635500DF5DF9 /* Info.plist */,
@ -160,6 +184,7 @@
TargetAttributes = { TargetAttributes = {
01F3EF07230E635300DF5DF9 = { 01F3EF07230E635300DF5DF9 = {
CreatedOnToolsVersion = 11.0; CreatedOnToolsVersion = 11.0;
LastSwiftMigration = 1100;
}; };
}; };
}; };
@ -241,8 +266,10 @@
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
01073F212311E6BD007162C9 /* HandleSwitch.swift in Sources */, 01073F212311E6BD007162C9 /* HandleSwitch.swift in Sources */,
018A8C3F2312CB480006E87D /* procHelper.m in Sources */,
01073F1F2311E67D007162C9 /* HandleUpdate.swift in Sources */, 01073F1F2311E67D007162C9 /* HandleUpdate.swift in Sources */,
01073F1B2311E613007162C9 /* DownloadTarball.swift in Sources */, 01073F1B2311E613007162C9 /* DownloadTarball.swift in Sources */,
018A8C412312F4940006E87D /* HandleSwitchTo.swift in Sources */,
0178970D230ED25100F8F5BC /* AboutViewController.swift in Sources */, 0178970D230ED25100F8F5BC /* AboutViewController.swift in Sources */,
01073F192311E3B8007162C9 /* Bundle.swift in Sources */, 01073F192311E3B8007162C9 /* Bundle.swift in Sources */,
01073F152311E370007162C9 /* Notify.swift in Sources */, 01073F152311E370007162C9 /* Notify.swift in Sources */,
@ -391,6 +418,7 @@
baseConfigurationReference = 53FF56D90FA7100C1726A4F7 /* Pods-RSwitch.debug.xcconfig */; baseConfigurationReference = 53FF56D90FA7100C1726A4F7 /* Pods-RSwitch.debug.xcconfig */;
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Developer ID Application"; CODE_SIGN_IDENTITY = "Developer ID Application";
CODE_SIGN_STYLE = Manual; CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
@ -401,11 +429,17 @@
"$(inherited)", "$(inherited)",
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/RSwitch/c",
);
MACOSX_DEPLOYMENT_TARGET = 10.14; MACOSX_DEPLOYMENT_TARGET = 10.14;
MARKETING_VERSION = 1.4.0; MARKETING_VERSION = 1.4.0;
PRODUCT_BUNDLE_IDENTIFIER = is.rud.bob.RSwitch; PRODUCT_BUNDLE_IDENTIFIER = is.rud.bob.RSwitch;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "RSwitch/c/RSwitch-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
}; };
name = Debug; name = Debug;
@ -415,6 +449,7 @@
baseConfigurationReference = 574911021B3B7938E36AB013 /* Pods-RSwitch.release.xcconfig */; baseConfigurationReference = 574911021B3B7938E36AB013 /* Pods-RSwitch.release.xcconfig */;
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Developer ID Application"; CODE_SIGN_IDENTITY = "Developer ID Application";
CODE_SIGN_STYLE = Manual; CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
@ -425,11 +460,16 @@
"$(inherited)", "$(inherited)",
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/RSwitch/c",
);
MACOSX_DEPLOYMENT_TARGET = 10.14; MACOSX_DEPLOYMENT_TARGET = 10.14;
MARKETING_VERSION = 1.4.0; MARKETING_VERSION = 1.4.0;
PRODUCT_BUNDLE_IDENTIFIER = is.rud.bob.RSwitch; PRODUCT_BUNDLE_IDENTIFIER = is.rud.bob.RSwitch;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "RSwitch/c/RSwitch-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
}; };
name = Release; name = Release;

27
RSwitch/Base.lproj/Main.storyboard

@ -721,22 +721,22 @@
<objects> <objects>
<viewController storyboardIdentifier="about2" id="KlD-6a-3Gc" customClass="AboutViewController" sceneMemberID="viewController"> <viewController storyboardIdentifier="about2" id="KlD-6a-3Gc" customClass="AboutViewController" sceneMemberID="viewController">
<view key="view" id="SgY-wa-ilj"> <view key="view" id="SgY-wa-ilj">
<rect key="frame" x="0.0" y="0.0" width="480" height="240"/> <rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<subviews> <subviews>
<scrollView appearanceType="aqua" fixedFrame="YES" borderType="none" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" hasVerticalScroller="NO" translatesAutoresizingMaskIntoConstraints="NO" id="rEB-nx-gFw"> <scrollView appearanceType="aqua" fixedFrame="YES" borderType="none" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" hasVerticalScroller="NO" translatesAutoresizingMaskIntoConstraints="NO" id="rEB-nx-gFw">
<rect key="frame" x="7" y="9" width="463" height="223"/> <rect key="frame" x="9" y="11" width="463" height="247"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<clipView key="contentView" ambiguous="YES" drawsBackground="NO" copiesOnScroll="NO" id="iCP-uh-CRl"> <clipView key="contentView" ambiguous="YES" drawsBackground="NO" copiesOnScroll="NO" id="iCP-uh-CRl">
<rect key="frame" x="0.0" y="0.0" width="463" height="223"/> <rect key="frame" x="0.0" y="0.0" width="463" height="247"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<textView ambiguous="YES" editable="NO" drawsBackground="NO" importsGraphics="NO" verticallyResizable="YES" smartInsertDelete="YES" id="kWH-Et-k6l"> <textView ambiguous="YES" editable="NO" drawsBackground="NO" importsGraphics="NO" verticallyResizable="YES" smartInsertDelete="YES" id="kWH-Et-k6l">
<rect key="frame" x="0.0" y="0.0" width="463" height="223"/> <rect key="frame" x="0.0" y="0.0" width="463" height="247"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="alternatingContentBackgroundColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="alternatingContentBackgroundColor" catalog="System" colorSpace="catalog"/>
<size key="minSize" width="463" height="223"/> <size key="minSize" width="463" height="247"/>
<size key="maxSize" width="463" height="10000000"/> <size key="maxSize" width="463" height="10000000"/>
<attributedString key="textStorage"> <attributedString key="textStorage">
<fragment> <fragment>
@ -763,9 +763,8 @@ MIT Licensed
</attributes> </attributes>
</fragment> </fragment>
<fragment> <fragment>
<string key="content"> <string key="content" base64-UTF8="YES">
Cgo
dial app icon by IconMark from the Noun Project
</string> </string>
<attributes> <attributes>
<color key="NSColor" name="textColor" catalog="System" colorSpace="catalog"/> <color key="NSColor" name="textColor" catalog="System" colorSpace="catalog"/>
@ -773,6 +772,16 @@ dial app icon by IconMark from the Noun Project
<paragraphStyle key="NSParagraphStyle" alignment="center" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/> <paragraphStyle key="NSParagraphStyle" alignment="center" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
</attributes> </attributes>
</fragment> </fragment>
<fragment>
<string key="content">dial app icon by IconMark from the Noun Project
String+Version by DragonCherry
ProcInfo by Patrick Wardle </string>
<attributes>
<color key="NSColor" name="textColor" catalog="System" colorSpace="catalog"/>
<font key="NSFont" size="11" name="HelveticaNeue"/>
<paragraphStyle key="NSParagraphStyle" alignment="center" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
</attributes>
</fragment>
</attributedString> </attributedString>
<color key="insertionPointColor" name="textColor" catalog="System" colorSpace="catalog"/> <color key="insertionPointColor" name="textColor" catalog="System" colorSpace="catalog"/>
</textView> </textView>
@ -792,7 +801,7 @@ dial app icon by IconMark from the Noun Project
</viewController> </viewController>
<customObject id="N40-nE-NTQ" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/> <customObject id="N40-nE-NTQ" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects> </objects>
<point key="canvasLocation" x="689" y="357"/> <point key="canvasLocation" x="689" y="373"/>
</scene> </scene>
</scenes> </scenes>
</document> </document>

7
RSwitch/c/RSwitch-Bridging-Header.h

@ -0,0 +1,7 @@
//
// Use this file to import your target's public headers that you would like to expose to Swift.
//
#import <Foundation/Foundation.h>
#include "procInfo.h"
#include "procHelper.h"

BIN
RSwitch/c/libprocInfo.a

Binary file not shown.

19
RSwitch/c/procHelper.h

@ -0,0 +1,19 @@
//
// procHelper.h
// RSwitch
//
// Created by hrbrmstr on 8/25/19.
// Copyright © 2019 Bob Rudis. All rights reserved.
//
#ifndef procHelper_h
#define procHelper_h
#include <stdio.h>
#include "procHelper.h"
#include "procInfo.h"
#import <Foundation/Foundation.h>
NSMutableArray *getArgs(pid_t pid);
#endif /* procHelper_h */

18
RSwitch/c/procHelper.m

@ -0,0 +1,18 @@
//
// procHelper.c
// RSwitch
//
// Created by hrbrmstr on 8/25/19.
// Copyright © 2019 Bob Rudis. All rights reserved.
//
#include "procHelper.h"
#include "procInfo.h"
#import <Foundation/Foundation.h>
NSMutableArray *getArgs(pid_t pid) {
Process* process = [[Process alloc] init:pid];
return(process.arguments);
}

205
RSwitch/c/procInfo.h

@ -0,0 +1,205 @@
//
// File: procInfo.h
// Project: Proc Info
//
// Created by: Patrick Wardle
// Copyright: 2017 Objective-See
// License: Creative Commons Attribution-NonCommercial 4.0 International License
//
#ifndef procInfo_h
#define procInfo_h
#import <libproc.h>
#import <sys/sysctl.h>
#import <Foundation/Foundation.h>
/* CLASSES */#import <Foundation/Foundation.h>
@class Binary;
@class Process;
/* DEFINES */
//from audit_kevents.h
#define EVENT_EXIT 1
#define EVENT_FORK 2
#define EVENT_EXECVE 23
#define EVENT_EXEC 27
#define EVENT_SPAWN 43190
//signers
enum Signer{None, Apple, AppStore, DevID, AdHoc};
//signature status
#define KEY_SIGNATURE_STATUS @"signatureStatus"
//signer
#define KEY_SIGNATURE_SIGNER @"signatureSigner"
//signing auths
#define KEY_SIGNATURE_AUTHORITIES @"signatureAuthorities"
//code signing id
#define KEY_SIGNATURE_IDENTIFIER @"signatureIdentifier"
//entitlements
#define KEY_SIGNATURE_ENTITLEMENTS @"signatureEntitlements"
/* TYPEDEFS */
//block for library
typedef void (^ProcessCallbackBlock)(Process* _Nonnull);
/* OBJECT: PROCESS INFO */
@interface ProcInfo : NSObject
//init w/ flag
// flag dictates if CPU-intensive logic (code signing, etc) should be preformed
-(id _Nullable)init:(BOOL)goEasy;
//start monitoring
-(void)start:(ProcessCallbackBlock _Nonnull )callback;
//stop monitoring
-(void)stop;
//get list of running processes
-(NSMutableArray* _Nonnull)currentProcesses;
@end
/* OBJECT: PROCESS */
@interface Process : NSObject
/* PROPERTIES */
//pid
@property pid_t pid;
//ppid
@property pid_t ppid;
//user id
@property uid_t uid;
//type
// used by process mon
@property u_int16_t type;
//exit code
@property u_int32_t exit;
//path
@property(nonatomic, retain)NSString* _Nullable path;
//args
@property(nonatomic, retain)NSMutableArray* _Nonnull arguments;
//ancestors
@property(nonatomic, retain)NSMutableArray* _Nonnull ancestors;
//signing info
@property(nonatomic, retain)NSMutableDictionary* _Nonnull signingInfo;
//Binary object
// has path, hash, etc
@property(nonatomic, retain)Binary* _Nonnull binary;
//timestamp
@property(nonatomic, retain)NSDate* _Nonnull timestamp;
/* METHODS */
//init with a pid
// method will then (try) fill out rest of object
-(id _Nullable)init:(pid_t)processID;
//generate signing info
// also classifies if Apple/from App Store/etc.
-(void)generateSigningInfo:(SecCSFlags)flags;
//set process's path
-(void)pathFromPid;
//generate list of ancestors
-(void)enumerateAncestors;
//class method
// get's parent of arbitrary process
+(pid_t)getParentID:(pid_t)child;
@end
/* OBJECT: BINARY */
@interface Binary : NSObject
{
}
/* PROPERTIES */
//path
@property(nonatomic, retain)NSString* _Nonnull path;
//name
@property(nonatomic, retain)NSString* _Nonnull name;
//icon
@property(nonatomic, retain)NSImage* _Nonnull icon;
//file attributes
@property(nonatomic, retain)NSDictionary* _Nullable attributes;
//spotlight meta data
@property(nonatomic, retain)NSDictionary* _Nullable metadata;
//bundle
// nil for non-apps
@property(nonatomic, retain)NSBundle* _Nullable bundle;
//signing info
@property(nonatomic, retain)NSDictionary* _Nonnull signingInfo;
//hash
@property(nonatomic, retain)NSMutableString* _Nonnull sha256;
//identifier
// either signing id or sha256 hash
@property(nonatomic, retain)NSString* _Nonnull identifier;
/* METHODS */
//init w/ a path
-(id _Nonnull)init:(NSString* _Nonnull)path;
/* the following methods are rather CPU-intensive
as such, if the proc monitoring is run with the 'goEasy' option, they aren't automatically invoked
*/
//get an icon for a process
// for apps, this will be app's icon, otherwise just a standard system one
-(void)getIcon;
//generate signing info (statically)
-(void)generateSigningInfo:(SecCSFlags)flags;
/* the following methods are not invoked automatically
as such, if you code has to manually invoke them if you want this info
*/
//generate hash
// algo: sha256
-(void)generateHash;
//generate id
// either signing id, or sha256 hash
-(void)generateIdentifier;
@end
#endif

0
RSwitch/swift/AboutViewController.swift → RSwitch/c/swift/AboutViewController.swift

0
RSwitch/swift/Alerts.swift → RSwitch/c/swift/Alerts.swift

0
RSwitch/swift/AppDelegate.swift → RSwitch/c/swift/AppDelegate.swift

0
RSwitch/swift/Bundle.swift → RSwitch/c/swift/Bundle.swift

0
RSwitch/swift/DownloadRStudio.swift → RSwitch/c/swift/DownloadRStudio.swift

0
RSwitch/swift/DownloadTarball.swift → RSwitch/c/swift/DownloadTarball.swift

0
RSwitch/swift/HandleSwitch.swift → RSwitch/c/swift/HandleSwitch.swift

25
RSwitch/c/swift/HandleSwitchTo.swift

@ -0,0 +1,25 @@
//
// HandleSwitchTo.swift
// RSwitch
//
// Created by hrbrmstr on 8/25/19.
// Copyright © 2019 Bob Rudis. All rights reserved.
//
import Foundation
import Foundation
import Cocoa
extension AppDelegate {
@objc func switch_to(_ sender: NSMenuItem?) {
let app = sender!.representedObject as! NSRunningApplication
app.activate(options: NSApplication.ActivationOptions.activateIgnoringOtherApps)
}
}

0
RSwitch/swift/HandleUpdate.swift → RSwitch/c/swift/HandleUpdate.swift

64
RSwitch/swift/Menu.swift → RSwitch/c/swift/Menu.swift

@ -19,9 +19,11 @@ extension AppDelegate: NSMenuDelegate {
menu.removeAllItems() menu.removeAllItems()
// add selection to open frameworks dir in Finder // add selection to open frameworks dir in Finder
menu.addItem(NSMenuItem(title: "Open R Frameworks Directory", action: #selector(openFrameworksDir), keyEquivalent: "" )) menu.addItem(NSMenuItem(title: "Open R Frameworks Directory", action: #selector(openFrameworksDir), keyEquivalent: ""))
menu.addItem(NSMenuItem.separator()) menu.addItem(NSMenuItem.separator())
menu.addItem(NSMenuItem(title: "Current R Version:", action: nil, keyEquivalent: ""))
// populate installed versions // populate installed versions
let fm = FileManager.default let fm = FileManager.default
var targetPath:String? = nil var targetPath:String? = nil
@ -79,20 +81,64 @@ extension AppDelegate: NSMenuDelegate {
let rstudioItem = NSMenuItem(title: NSLocalizedString("Download latest RStudio daily build", comment: "Download latest RStudio item"), action: self.rstudio_enabled ? #selector(download_latest_rstudio) : nil, keyEquivalent: "") let rstudioItem = NSMenuItem(title: NSLocalizedString("Download latest RStudio daily build", comment: "Download latest RStudio item"), action: self.rstudio_enabled ? #selector(download_latest_rstudio) : nil, keyEquivalent: "")
rstudioItem.isEnabled = self.rstudio_enabled rstudioItem.isEnabled = self.rstudio_enabled
menu.addItem(rstudioItem) menu.addItem(rstudioItem)
// Add items to open variosu R for macOS pages // Add items to open variosu R for macOS pages
menu.addItem(NSMenuItem.separator()) menu.addItem(NSMenuItem.separator())
menu.addItem(NSMenuItem(title: NSLocalizedString("Open R for macOS Developers Page…", comment: "Open macOS Dev Page item"), action: #selector(browse_r_macos_dev_page), keyEquivalent: ""))
menu.addItem(NSMenuItem(title: NSLocalizedString("Open R for macOS CRAN Page…", comment: "Open macOS CRAN Page item"), action: #selector(browse_r_macos_cran_page), keyEquivalent: ""))
menu.addItem(NSMenuItem(title: NSLocalizedString("Open R-SIG-Mac Archives Page…", comment: "Open R-SIG-Mac Page item"), action: #selector(browse_r_sig_mac_page), keyEquivalent: ""))
menu.addItem(NSMenuItem(title: NSLocalizedString("Open R Installation/Admin macOS Section…", comment: "Open R Install Page item"), action: #selector(browse_r_admin_macos_page), keyEquivalent: ""))
menu.addItem(NSMenuItem(title: NSLocalizedString("Open RStudio macOS Dailies Page…", comment: "Open RStudio macOS Dailies Page item"), action: #selector(browse_rstudio_mac_dailies_page), keyEquivalent: ""))
let webDropdown = NSMenuItem(title: "Web resources", action: nil, keyEquivalent: "")
let webSub = NSMenu()
menu.addItem(webDropdown)
menu.setSubmenu(webSub, for: webDropdown)
webSub.addItem(NSMenuItem(title: NSLocalizedString("R for macOS Developers…", comment: "macOS Dev Page item"), action: #selector(browse_r_macos_dev_page), keyEquivalent: ""))
webSub.addItem(NSMenuItem(title: NSLocalizedString("R for macOS CRAN…", comment: "macOS CRAN Page item"), action: #selector(browse_r_macos_cran_page), keyEquivalent: ""))
webSub.addItem(NSMenuItem(title: NSLocalizedString("R-SIG-Mac Archives…", comment: "R-SIG-Mac Page item"), action: #selector(browse_r_sig_mac_page), keyEquivalent: ""))
webSub.addItem(NSMenuItem(title: NSLocalizedString("R-devel News…", comment: "R-devel News Page item"), action: #selector(browse_r_devel_news_page), keyEquivalent: ""))
webSub.addItem(NSMenuItem(title: NSLocalizedString("R Installation/Admin macOS Section…", comment: "R Install Page item"), action: #selector(browse_r_admin_macos_page), keyEquivalent: ""))
webSub.addItem(NSMenuItem.separator())
webSub.addItem(NSMenuItem(title: NSLocalizedString("RStudio macOS Dailies…", comment: "RStudio macOS Dailies Page item"), action: #selector(browse_rstudio_mac_dailies_page), keyEquivalent: ""))
webSub.addItem(NSMenuItem(title: NSLocalizedString("R StackOverflow…", comment: "R StackOverflow Page item"), action: #selector(browse_r_stackoverflow_page), keyEquivalent: ""))
webSub.addItem(NSMenuItem(title: NSLocalizedString("RStudio Community…", comment: "RStudio Community Page item"), action: #selector(browse_rstudio_community_page), keyEquivalent: ""))
let running_rstudios = NSWorkspace.shared.runningApplications.filter {
$0.bundleIdentifier == "org.rstudio.RStudio"
}
let running_rapps = NSWorkspace.shared.runningApplications.filter {
$0.bundleIdentifier == "org.R-project.R"
}
if ((running_rstudios.count) + (running_rapps.count) > 0) {
menu.addItem(NSMenuItem.separator())
let switchToDropdown = NSMenuItem(title: "Switch to", action: nil, keyEquivalent: "")
let switchToSub = NSMenu()
menu.addItem(switchToDropdown)
menu.setSubmenu(switchToSub, for: switchToDropdown)
for app in running_rstudios + running_rapps {
let args = getArgs(app.processIdentifier)!
let title = app.localizedName! + (args.count > 1 ? " : " + (args[1] as! NSString).lastPathComponent.replacingOccurrences(of: ".Rproj", with: "") : "")
let mi = NSMenuItem(title: title, action: #selector(switch_to), keyEquivalent: "")
mi.representedObject = app
switchToSub.addItem(mi)
}
}
// Add launchers // Add launchers
menu.addItem(NSMenuItem.separator()) menu.addItem(NSMenuItem.separator())
menu.addItem(NSMenuItem(title: NSLocalizedString("Launch R GUI", comment: "Launch R GUI item"), action: #selector(launchRApp), keyEquivalent: ""))
menu.addItem(NSMenuItem(title: NSLocalizedString("Launch RStudio", comment: "Launch RStudio item"), action: #selector(launchRStudio), keyEquivalent: "")) let launch_r = "Launch R GUI" + (NSEvent.modifierFlags.contains(NSEvent.ModifierFlags.control) ? " (new instance)" : "")
let launch_rstudio = "Launch RStudio" + (NSEvent.modifierFlags.contains(NSEvent.ModifierFlags.control) ? " (new instance)" : "")
menu.addItem(NSMenuItem(title: NSLocalizedString(launch_r, comment: "Launch R GUI item"), action: #selector(launchRApp), keyEquivalent: ""))
menu.addItem(NSMenuItem(title: NSLocalizedString(launch_rstudio, comment: "Launch RStudio item"), action: #selector(launchRStudio), keyEquivalent: ""))
// Add a About item // Add a About item
menu.addItem(NSMenuItem.separator()) menu.addItem(NSMenuItem.separator())

0
RSwitch/swift/Notify.swift → RSwitch/c/swift/Notify.swift

0
RSwitch/swift/String+Version.swift → RSwitch/c/swift/String+Version.swift

38
RSwitch/swift/Utils.swift → RSwitch/c/swift/Utils.swift

@ -14,7 +14,6 @@ public func browse(_ urlString : String) {
NSWorkspace.shared.open(url) NSWorkspace.shared.open(url)
} }
extension AppDelegate { extension AppDelegate {
struct app_urls { struct app_urls {
@ -23,26 +22,23 @@ extension AppDelegate {
static let r_sig_mac = "https://stat.ethz.ch/pipermail/r-sig-mac/" static let r_sig_mac = "https://stat.ethz.ch/pipermail/r-sig-mac/"
static let rstudio_dailies = "https://dailies.rstudio.com/rstudio/oss/mac/" static let rstudio_dailies = "https://dailies.rstudio.com/rstudio/oss/mac/"
static let latest_rstudio_dailies = "https://www.rstudio.org/download/latest/daily/desktop/mac/RStudio-latest.dmg" static let latest_rstudio_dailies = "https://www.rstudio.org/download/latest/daily/desktop/mac/RStudio-latest.dmg"
static let browse_r_admin_macos = "https://cran.rstudio.org/doc/manuals/R-admin.html#Installing-R-under-macOS" static let r_admin_macos = "https://cran.rstudio.org/doc/manuals/R-admin.html#Installing-R-under-macOS"
static let r_devel_news = "https://developer.r-project.org/blosxom.cgi/R-devel/NEWS"
static let r_stackoverflow = "https://stackoverflow.com/questions/tagged/r"
static let rstudio_community = "https://community.rstudio.com/"
static let version_check = "https://rud.is/rswitch/releases/current-version.txt" static let version_check = "https://rud.is/rswitch/releases/current-version.txt"
static let releases = "https://git.rud.is/hrbrmstr/RSwitch/releases" static let releases = "https://git.rud.is/hrbrmstr/RSwitch/releases"
} }
// browse macOS dev page
@objc func browse_r_macos_dev_page(_ sender: NSMenuItem?) { browse(app_urls.mac_r_project) } @objc func browse_r_macos_dev_page(_ sender: NSMenuItem?) { browse(app_urls.mac_r_project) }
// browse macOS dev page
@objc func browse_r_macos_cran_page(_ sender: NSMenuItem?) { browse(app_urls.macos_cran) } @objc func browse_r_macos_cran_page(_ sender: NSMenuItem?) { browse(app_urls.macos_cran) }
// browse macOS dev page
@objc func browse_r_sig_mac_page(_ sender: NSMenuItem?) { browse(app_urls.r_sig_mac) } @objc func browse_r_sig_mac_page(_ sender: NSMenuItem?) { browse(app_urls.r_sig_mac) }
// browse RStudio macOS Dailies
@objc func browse_rstudio_mac_dailies_page(_ sender: NSMenuItem?) { browse(app_urls.rstudio_dailies) } @objc func browse_rstudio_mac_dailies_page(_ sender: NSMenuItem?) { browse(app_urls.rstudio_dailies) }
@objc func browse_r_admin_macos_page(_ sender: NSMenuItem?) { browse(app_urls.r_admin_macos) }
// browse R Install/Admin macOS section @objc func browse_r_devel_news_page(_ sender: NSMenuItem?) { browse(app_urls.r_devel_news) }
@objc func browse_r_admin_macos_page(_ sender: NSMenuItem?) { browse(app_urls.browse_r_admin_macos) } @objc func browse_r_stackoverflow_page(_ sender: NSMenuItem?) { browse(app_urls.r_stackoverflow) }
@objc func browse_rstudio_community_page(_ sender: NSMenuItem?) { browse(app_urls.rstudio_community) }
// Show about dialog // Show about dialog
@objc func about(_ sender: NSMenuItem?) { abtController.showWindow(self) } @objc func about(_ sender: NSMenuItem?) { abtController.showWindow(self) }
@ -50,9 +46,21 @@ extension AppDelegate {
@objc func openFrameworksDir(_ sender: NSMenuItem?) { NSWorkspace.shared.openFile(app_dirs.macos_r_framework, withApplication: "Finder") } @objc func openFrameworksDir(_ sender: NSMenuItem?) { NSWorkspace.shared.openFile(app_dirs.macos_r_framework, withApplication: "Finder") }
// Launch RStudio // Launch RStudio
@objc func launchRStudio(_ sender: NSMenuItem?) { NSWorkspace.shared.launchApplication("RStudio.app") } @objc func launchRStudio(_ sender: NSMenuItem?) {
if (NSEvent.modifierFlags.contains(NSEvent.ModifierFlags.control)) {
NSWorkspace.shared.launchApplication(withBundleIdentifier: "org.rstudio.RStudio", options: NSWorkspace.LaunchOptions.newInstance, additionalEventParamDescriptor: nil, launchIdentifier: nil)
} else {
NSWorkspace.shared.launchApplication("RStudio.app")
}
}
// Launch R.app // Launch R.app
@objc func launchRApp(_ sender: NSMenuItem?) { NSWorkspace.shared.launchApplication("R.app") } @objc func launchRApp(_ sender: NSMenuItem?) {
if (NSEvent.modifierFlags.contains(NSEvent.ModifierFlags.control)) {
NSWorkspace.shared.launchApplication(withBundleIdentifier: "org.R-project.R", options: NSWorkspace.LaunchOptions.newInstance, additionalEventParamDescriptor: nil, launchIdentifier: nil)
} else {
NSWorkspace.shared.launchApplication("R.app")
}
}
} }

0
RSwitch/swift/ViewController.swift → RSwitch/c/swift/ViewController.swift

8
build/RSwitch.build/Release/RSwitch.build/DerivedSources/Entitlements.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>com.apple.security.get-task-allow</key>
<true/>
</dict>
</plist>

1
build/RSwitch.build/Release/RSwitch.build/DerivedSources/Pods-RSwitch-checkManifestLockResult.txt

@ -0,0 +1 @@
SUCCESS

1
build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/RSwitch-OutputFileMap.json

@ -0,0 +1 @@
{"":{"dependencies":"/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/RSwitch-master.d","diagnostics":"/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/RSwitch-master.dia","swift-dependencies":"/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/RSwitch-master.swiftdeps"},"/Users/hrbrmstr/Development/rswitch/RSwitch/RSwitch/swift/AboutViewController.swift":{"llvm-bc":"/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/AboutViewController.bc","object":"/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/AboutViewController.o"},"/Users/hrbrmstr/Development/rswitch/RSwitch/RSwitch/swift/Alerts.swift":{"llvm-bc":"/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/Alerts.bc","object":"/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/Alerts.o"},"/Users/hrbrmstr/Development/rswitch/RSwitch/RSwitch/swift/AppDelegate.swift":{"llvm-bc":"/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/AppDelegate.bc","object":"/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/AppDelegate.o"},"/Users/hrbrmstr/Development/rswitch/RSwitch/RSwitch/swift/Bundle.swift":{"llvm-bc":"/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/Bundle.bc","object":"/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/Bundle.o"},"/Users/hrbrmstr/Development/rswitch/RSwitch/RSwitch/swift/DownloadRStudio.swift":{"llvm-bc":"/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/DownloadRStudio.bc","object":"/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/DownloadRStudio.o"},"/Users/hrbrmstr/Development/rswitch/RSwitch/RSwitch/swift/DownloadTarball.swift":{"llvm-bc":"/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/DownloadTarball.bc","object":"/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/DownloadTarball.o"},"/Users/hrbrmstr/Development/rswitch/RSwitch/RSwitch/swift/HandleSwitch.swift":{"llvm-bc":"/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/HandleSwitch.bc","object":"/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/HandleSwitch.o"},"/Users/hrbrmstr/Development/rswitch/RSwitch/RSwitch/swift/HandleUpdate.swift":{"llvm-bc":"/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/HandleUpdate.bc","object":"/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/HandleUpdate.o"},"/Users/hrbrmstr/Development/rswitch/RSwitch/RSwitch/swift/Menu.swift":{"llvm-bc":"/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/Menu.bc","object":"/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/Menu.o"},"/Users/hrbrmstr/Development/rswitch/RSwitch/RSwitch/swift/Notify.swift":{"llvm-bc":"/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/Notify.bc","object":"/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/Notify.o"},"/Users/hrbrmstr/Development/rswitch/RSwitch/RSwitch/swift/String+Version.swift":{"llvm-bc":"/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/String+Version.bc","object":"/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/String+Version.o"},"/Users/hrbrmstr/Development/rswitch/RSwitch/RSwitch/swift/Utils.swift":{"llvm-bc":"/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/Utils.bc","object":"/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/Utils.o"},"/Users/hrbrmstr/Development/rswitch/RSwitch/RSwitch/swift/ViewController.swift":{"llvm-bc":"/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/ViewController.bc","object":"/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/ViewController.o"}}

16
build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/RSwitch-master.d

File diff suppressed because one or more lines are too long

4
build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/RSwitch-master.swiftdeps

@ -0,0 +1,4 @@
version: "Apple Swift version 5.1 (swiftlang-1100.0.270.6 clang-1100.0.32.1)"
options: "31f9dde5ec8ab8a7473738363610d79b"
build_time: [1566730886, 39869000]
inputs:

4
build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/RSwitch-master.swiftdeps~

@ -0,0 +1,4 @@
version: "Apple Swift version 5.1 (swiftlang-1100.0.270.6 clang-1100.0.32.1)"
options: "31f9dde5ec8ab8a7473738363610d79b"
build_time: [1566730710, 120239000]
inputs:

4
build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/RSwitch-master.swiftdeps~moduleonly

@ -0,0 +1,4 @@
version: "Apple Swift version 5.1 (swiftlang-1100.0.270.6 clang-1100.0.32.1)"
options: "31f9dde5ec8ab8a7473738363610d79b"
build_time: [1566730886, 39869000]
inputs:

13
build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/RSwitch.LinkFileList

@ -0,0 +1,13 @@
/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/HandleSwitch.o
/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/HandleUpdate.o
/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/DownloadTarball.o
/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/AboutViewController.o
/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/Bundle.o
/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/Notify.o
/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/DownloadRStudio.o
/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/Menu.o
/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/Alerts.o
/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/ViewController.o
/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/AppDelegate.o
/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/String+Version.o
/Users/hrbrmstr/Development/rswitch/RSwitch/build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/Utils.o

13
build/RSwitch.build/Release/RSwitch.build/Objects-normal/x86_64/RSwitch.SwiftFileList

@ -0,0 +1,13 @@
/Users/hrbrmstr/Development/rswitch/RSwitch/RSwitch/swift/HandleSwitch.swift
/Users/hrbrmstr/Development/rswitch/RSwitch/RSwitch/swift/HandleUpdate.swift
/Users/hrbrmstr/Development/rswitch/RSwitch/RSwitch/swift/DownloadTarball.swift
/Users/hrbrmstr/Development/rswitch/RSwitch/RSwitch/swift/AboutViewController.swift
/Users/hrbrmstr/Development/rswitch/RSwitch/RSwitch/swift/Bundle.swift
/Users/hrbrmstr/Development/rswitch/RSwitch/RSwitch/swift/Notify.swift
/Users/hrbrmstr/Development/rswitch/RSwitch/RSwitch/swift/DownloadRStudio.swift
/Users/hrbrmstr/Development/rswitch/RSwitch/RSwitch/swift/Menu.swift
/Users/hrbrmstr/Development/rswitch/RSwitch/RSwitch/swift/Alerts.swift
/Users/hrbrmstr/Development/rswitch/RSwitch/RSwitch/swift/ViewController.swift
/Users/hrbrmstr/Development/rswitch/RSwitch/RSwitch/swift/AppDelegate.swift
/Users/hrbrmstr/Development/rswitch/RSwitch/RSwitch/swift/String+Version.swift
/Users/hrbrmstr/Development/rswitch/RSwitch/RSwitch/swift/Utils.swift

BIN
build/RSwitch.build/Release/RSwitch.build/RSwitch-all-non-framework-target-headers.hmap

Binary file not shown.

BIN
build/RSwitch.build/Release/RSwitch.build/RSwitch-all-target-headers.hmap

Binary file not shown.

BIN
build/RSwitch.build/Release/RSwitch.build/RSwitch-generated-files.hmap

Binary file not shown.

BIN
build/RSwitch.build/Release/RSwitch.build/RSwitch-own-target-headers.hmap

Binary file not shown.

BIN
build/RSwitch.build/Release/RSwitch.build/RSwitch-project-headers.hmap

Binary file not shown.

8
build/RSwitch.build/Release/RSwitch.build/RSwitch.app.xcent

@ -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>com.apple.security.get-task-allow</key>
<true/>
</dict>
</plist>

BIN
build/RSwitch.build/Release/RSwitch.build/RSwitch.hmap

Binary file not shown.

10
build/RSwitch.build/Release/RSwitch.build/Script-FEB62898714FA5EEEAA0AFDE.sh

@ -0,0 +1,10 @@
#!/bin/sh
diff "${PODS_PODFILE_DIR_PATH}/Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null
if [ $? != 0 ] ; then
# print error to STDERR
echo "error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation." >&2
exit 1
fi
# This output is used by Xcode 'outputs' to avoid re-running this script phase.
echo "SUCCESS" > "${SCRIPT_OUTPUT_FILE_0}"

1
build/RSwitch.build/Release/RSwitch.build/all-product-headers.yaml

@ -0,0 +1 @@
{"case-sensitive":"false","roots":[],"version":0}

BIN
build/XCBuildData/908dad76795ea13c6fc2915c74d69cd9-desc.xcbuild

Binary file not shown.

93
build/XCBuildData/908dad76795ea13c6fc2915c74d69cd9-manifest.xcbuild

File diff suppressed because one or more lines are too long

BIN
build/XCBuildData/BuildDescriptionCacheIndex-a4dabeac050d47b4e44bb951c02cf12a

Binary file not shown.

BIN
build/XCBuildData/build.db

Binary file not shown.

0
guide/.Rhistory

18
guide/_site.yml

@ -0,0 +1,18 @@
name: "RSwitch"
navbar:
title: "RSwitch"
left:
- text: "Use"
href: index.html
- text: "Develop"
href: develop.html
- text: "Acknowledgements"
href: acknowledgements.html
- text: "Landing Page"
href: "https://rud.is/rswitch"
output:
html_document:
toc: true
theme: darkly
include:
after_body: footer.html

362
guide/_site/acknowledgements.html

@ -0,0 +1,362 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="pandoc" />
<meta http-equiv="X-UA-Compatible" content="IE=EDGE" />
<title>Acknowledgements</title>
<script src="site_libs/jquery-1.11.3/jquery.min.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link href="site_libs/bootstrap-3.3.5/css/darkly.min.css" rel="stylesheet" />
<script src="site_libs/bootstrap-3.3.5/js/bootstrap.min.js"></script>
<script src="site_libs/bootstrap-3.3.5/shim/html5shiv.min.js"></script>
<script src="site_libs/bootstrap-3.3.5/shim/respond.min.js"></script>
<script src="site_libs/navigation-1.1/tabsets.js"></script>
<link href="site_libs/highlightjs-9.12.0/default.css" rel="stylesheet" />
<script src="site_libs/highlightjs-9.12.0/highlight.js"></script>
<style type="text/css">code{white-space: pre;}</style>
<style type="text/css">
pre:not([class]) {
background-color: white;
}
</style>
<script type="text/javascript">
if (window.hljs) {
hljs.configure({languages: []});
hljs.initHighlightingOnLoad();
if (document.readyState && document.readyState === "complete") {
window.setTimeout(function() { hljs.initHighlighting(); }, 0);
}
}
</script>
<style type="text/css">
h1 {
font-size: 34px;
}
h1.title {
font-size: 38px;
}
h2 {
font-size: 30px;
}
h3 {
font-size: 24px;
}
h4 {
font-size: 18px;
}
h5 {
font-size: 16px;
}
h6 {
font-size: 12px;
}
.table th:not([align]) {
text-align: left;
}
</style>
<style type = "text/css">
.main-container {
max-width: 940px;
margin-left: auto;
margin-right: auto;
}
code {
color: inherit;
background-color: rgba(0, 0, 0, 0.04);
}
img {
max-width:100%;
height: auto;
}
.tabbed-pane {
padding-top: 12px;
}
.html-widget {
margin-bottom: 20px;
}
button.code-folding-btn:focus {
outline: none;
}
summary {
display: list-item;
}
</style>
<style type="text/css">
/* padding for bootstrap navbar */
body {
padding-top: 60px;
padding-bottom: 40px;
}
/* offset scroll position for anchor links (for fixed navbar) */
.section h1 {
padding-top: 65px;
margin-top: -65px;
}
.section h2 {
padding-top: 65px;
margin-top: -65px;
}
.section h3 {
padding-top: 65px;
margin-top: -65px;
}
.section h4 {
padding-top: 65px;
margin-top: -65px;
}
.section h5 {
padding-top: 65px;
margin-top: -65px;
}
.section h6 {
padding-top: 65px;
margin-top: -65px;
}
.dropdown-submenu {
position: relative;
}
.dropdown-submenu>.dropdown-menu {
top: 0;
left: 100%;
margin-top: -6px;
margin-left: -1px;
border-radius: 0 6px 6px 6px;
}
.dropdown-submenu:hover>.dropdown-menu {
display: block;
}
.dropdown-submenu>a:after {
display: block;
content: " ";
float: right;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
border-width: 5px 0 5px 5px;
border-left-color: #cccccc;
margin-top: 5px;
margin-right: -10px;
}
.dropdown-submenu:hover>a:after {
border-left-color: #ffffff;
}
.dropdown-submenu.pull-left {
float: none;
}
.dropdown-submenu.pull-left>.dropdown-menu {
left: -100%;
margin-left: 10px;
border-radius: 6px 0 6px 6px;
}
</style>
<script>
// manage active state of menu based on current page
$(document).ready(function () {
// active menu anchor
href = window.location.pathname
href = href.substr(href.lastIndexOf('/') + 1)
if (href === "")
href = "index.html";
var menuAnchor = $('a[href="' + href + '"]');
// mark it active
menuAnchor.parent().addClass('active');
// if it's got a parent navbar menu mark it active as well
menuAnchor.closest('li.dropdown').addClass('active');
});
</script>
<!-- tabsets -->
<style type="text/css">
.tabset-dropdown > .nav-tabs {
display: inline-table;
max-height: 500px;
min-height: 44px;
overflow-y: auto;
background: white;
border: 1px solid #ddd;
border-radius: 4px;
}
.tabset-dropdown > .nav-tabs > li.active:before {
content: "";
font-family: 'Glyphicons Halflings';
display: inline-block;
padding: 10px;
border-right: 1px solid #ddd;
}
.tabset-dropdown > .nav-tabs.nav-tabs-open > li.active:before {
content: "&#xe258;";
border: none;
}
.tabset-dropdown > .nav-tabs.nav-tabs-open:before {
content: "";
font-family: 'Glyphicons Halflings';
display: inline-block;
padding: 10px;
border-right: 1px solid #ddd;
}
.tabset-dropdown > .nav-tabs > li.active {
display: block;
}
.tabset-dropdown > .nav-tabs > li > a,
.tabset-dropdown > .nav-tabs > li > a:focus,
.tabset-dropdown > .nav-tabs > li > a:hover {
border: none;
display: inline-block;
border-radius: 4px;
}
.tabset-dropdown > .nav-tabs.nav-tabs-open > li {
display: block;
float: none;
}
.tabset-dropdown > .nav-tabs > li {
display: none;
}
</style>
<!-- code folding -->
</head>
<body>
<div class="container-fluid main-container">
<div class="navbar navbar-default navbar-fixed-top" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="index.html">RSwitch</a>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li>
<a href="index.html">Use</a>
</li>
<li>
<a href="develop.html">Develop</a>
</li>
<li>
<a href="acknowledgements.html">Acknowledgements</a>
</li>
<li>
<a href="https://rud.is/rswitch">Landing Page</a>
</li>
</ul>
<ul class="nav navbar-nav navbar-right">
</ul>
</div><!--/.nav-collapse -->
</div><!--/.container -->
</div><!--/.navbar -->
<div class="fluid-row" id="header">
<h1 class="title toc-ignore">Acknowledgements</h1>
</div>
<p>RSwitch wasn’t my idea. It’s been around forever on the <a href="http://mac.r-project.org/">R for macOS Developer’s Page</a> but stopped working on Catalina since it hadn’t been updated in ages, was only 32-bit (which is a no-go for Catalina), and had no available source code to modify.</p>
<p>Despite having found and old-old copy of the source code by hacking URLs via the Internet Archive, none of that code was used to make this incarnation of RSwitch.</p>
<p>RSwitch uses three external frameworks to accomplish its tasks:</p>
<ul>
<li><a href="https://github.com/scinfu/SwiftSoup">SwiftSoup</a> by Nabil Chatbi</li>
<li><a href="https://github.com/objective-see/ProcInfo">ProcInfo</a> by the infamous Patrick Wardle</li>
<li><a href="https://github.com/DragonCherry/VersionCompare/">VersionCompare</a> by DragonCherry</li>
</ul>
<p>The current (but, likely not final) app icon and menubar icon is based on the <a href="https://thenounproject.com/search/?q=dial&amp;i=866019#">‘dial’ Noun Project font icon</a> created by Icon Mark.</p>
<hr noshade size=1/>
<p>Copyright &copy; 2019 Bob Rudis. All rights reserved.</p>
</div>
<script>
// add bootstrap table styles to pandoc tables
function bootstrapStylePandocTables() {
$('tr.header').parent('thead').parent('table').addClass('table table-condensed');
}
$(document).ready(function () {
bootstrapStylePandocTables();
});
</script>
<!-- tabsets -->
<script>
$(document).ready(function () {
window.buildTabsets("TOC");
});
$(document).ready(function () {
$('.tabset-dropdown > .nav-tabs > li').click(function () {
$(this).parent().toggleClass('nav-tabs-open')
});
});
</script>
<!-- code folding -->
<!-- dynamically load mathjax for compatibility with self-contained -->
<script>
(function () {
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML";
document.getElementsByTagName("head")[0].appendChild(script);
})();
</script>
</body>
</html>

BIN
guide/_site/app-switch.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

376
guide/_site/develop.html

@ -0,0 +1,376 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="pandoc" />
<meta http-equiv="X-UA-Compatible" content="IE=EDGE" />
<title>Developing RSwitch</title>
<script src="site_libs/jquery-1.11.3/jquery.min.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link href="site_libs/bootstrap-3.3.5/css/darkly.min.css" rel="stylesheet" />
<script src="site_libs/bootstrap-3.3.5/js/bootstrap.min.js"></script>
<script src="site_libs/bootstrap-3.3.5/shim/html5shiv.min.js"></script>
<script src="site_libs/bootstrap-3.3.5/shim/respond.min.js"></script>
<script src="site_libs/navigation-1.1/tabsets.js"></script>
<link href="site_libs/highlightjs-9.12.0/default.css" rel="stylesheet" />
<script src="site_libs/highlightjs-9.12.0/highlight.js"></script>
<style type="text/css">code{white-space: pre;}</style>
<style type="text/css">
pre:not([class]) {
background-color: white;
}
</style>
<script type="text/javascript">
if (window.hljs) {
hljs.configure({languages: []});
hljs.initHighlightingOnLoad();
if (document.readyState && document.readyState === "complete") {
window.setTimeout(function() { hljs.initHighlighting(); }, 0);
}
}
</script>
<style type="text/css">
h1 {
font-size: 34px;
}
h1.title {
font-size: 38px;
}
h2 {
font-size: 30px;
}
h3 {
font-size: 24px;
}
h4 {
font-size: 18px;
}
h5 {
font-size: 16px;
}
h6 {
font-size: 12px;
}
.table th:not([align]) {
text-align: left;
}
</style>
<style type = "text/css">
.main-container {
max-width: 940px;
margin-left: auto;
margin-right: auto;
}
code {
color: inherit;
background-color: rgba(0, 0, 0, 0.04);
}
img {
max-width:100%;
height: auto;
}
.tabbed-pane {
padding-top: 12px;
}
.html-widget {
margin-bottom: 20px;
}
button.code-folding-btn:focus {
outline: none;
}
summary {
display: list-item;
}
</style>
<style type="text/css">
/* padding for bootstrap navbar */
body {
padding-top: 60px;
padding-bottom: 40px;
}
/* offset scroll position for anchor links (for fixed navbar) */
.section h1 {
padding-top: 65px;
margin-top: -65px;
}
.section h2 {
padding-top: 65px;
margin-top: -65px;
}
.section h3 {
padding-top: 65px;
margin-top: -65px;
}
.section h4 {
padding-top: 65px;
margin-top: -65px;
}
.section h5 {
padding-top: 65px;
margin-top: -65px;
}
.section h6 {
padding-top: 65px;
margin-top: -65px;
}
.dropdown-submenu {
position: relative;
}
.dropdown-submenu>.dropdown-menu {
top: 0;
left: 100%;
margin-top: -6px;
margin-left: -1px;
border-radius: 0 6px 6px 6px;
}
.dropdown-submenu:hover>.dropdown-menu {
display: block;
}
.dropdown-submenu>a:after {
display: block;
content: " ";
float: right;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
border-width: 5px 0 5px 5px;
border-left-color: #cccccc;
margin-top: 5px;
margin-right: -10px;
}
.dropdown-submenu:hover>a:after {
border-left-color: #ffffff;
}
.dropdown-submenu.pull-left {
float: none;
}
.dropdown-submenu.pull-left>.dropdown-menu {
left: -100%;
margin-left: 10px;
border-radius: 6px 0 6px 6px;
}
</style>
<script>
// manage active state of menu based on current page
$(document).ready(function () {
// active menu anchor
href = window.location.pathname
href = href.substr(href.lastIndexOf('/') + 1)
if (href === "")
href = "index.html";
var menuAnchor = $('a[href="' + href + '"]');
// mark it active
menuAnchor.parent().addClass('active');
// if it's got a parent navbar menu mark it active as well
menuAnchor.closest('li.dropdown').addClass('active');
});
</script>
<!-- tabsets -->
<style type="text/css">
.tabset-dropdown > .nav-tabs {
display: inline-table;
max-height: 500px;
min-height: 44px;
overflow-y: auto;
background: white;
border: 1px solid #ddd;
border-radius: 4px;
}
.tabset-dropdown > .nav-tabs > li.active:before {
content: "";
font-family: 'Glyphicons Halflings';
display: inline-block;
padding: 10px;
border-right: 1px solid #ddd;
}
.tabset-dropdown > .nav-tabs.nav-tabs-open > li.active:before {
content: "&#xe258;";
border: none;
}
.tabset-dropdown > .nav-tabs.nav-tabs-open:before {
content: "";
font-family: 'Glyphicons Halflings';
display: inline-block;
padding: 10px;
border-right: 1px solid #ddd;
}
.tabset-dropdown > .nav-tabs > li.active {
display: block;
}
.tabset-dropdown > .nav-tabs > li > a,
.tabset-dropdown > .nav-tabs > li > a:focus,
.tabset-dropdown > .nav-tabs > li > a:hover {
border: none;
display: inline-block;
border-radius: 4px;
}
.tabset-dropdown > .nav-tabs.nav-tabs-open > li {
display: block;
float: none;
}
.tabset-dropdown > .nav-tabs > li {
display: none;
}
</style>
<!-- code folding -->
</head>
<body>
<div class="container-fluid main-container">
<div class="navbar navbar-default navbar-fixed-top" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="index.html">RSwitch</a>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li>
<a href="index.html">Use</a>
</li>
<li>
<a href="develop.html">Develop</a>
</li>
<li>
<a href="acknowledgements.html">Acknowledgements</a>
</li>
<li>
<a href="https://rud.is/rswitch">Landing Page</a>
</li>
</ul>
<ul class="nav navbar-nav navbar-right">
</ul>
</div><!--/.nav-collapse -->
</div><!--/.container -->
</div><!--/.navbar -->
<div class="fluid-row" id="header">
<h1 class="title toc-ignore">Developing RSwitch</h1>
</div>
<p>Contributions to RSwitch are welcome and encouraged!</p>
<p>You will need:</p>
<ul>
<li><a href="https://developer.apple.com/xcode/">Xcode 11</a> (still in beta as of this writing)</li>
<li>Familiarity with <a href="https://swift.org/blog/swift-5-released/">Swift 5.x</a></li>
<li>Tolerance to use one of the following social coding sites:
<ul>
<li><a href="https://git.rud.is/hrbrmstr/RSwitch">My self-hosted Gitea instance</a></li>
<li><a href="https://git.sr.ht/~hrbrmstr/RSwitch">SourceHut</a></li>
<li><a href="https://gitlab.com/hrbrmstr/RSwitch">GitLab</a></li>
<li><a href="https://bitbucket.com/hrbrmstr/RSwitch">Bitbucket</a></li>
<li><a href="https://github.com/hrbrmstr/RSwitch">GitHub</a></li>
</ul></li>
<li>The ability to use <a href="https://git-scm.com/book/ms/v2/Git-Tools-Signing-Your-Work">signed git commits</a></li>
</ul>
<p>To work on anything related to RSwitch:</p>
<ul>
<li>claim or file a new issue</li>
<li>get concensus on the feature/change</li>
<li>develop and test on a fork &amp; branch</li>
<li>share a copy of the app back to the folks monitoring the issue</li>
<li>submit a PR once the feature/change has been finalized</li>
</ul>
<hr noshade size=1/>
<p>Copyright &copy; 2019 Bob Rudis. All rights reserved.</p>
</div>
<script>
// add bootstrap table styles to pandoc tables
function bootstrapStylePandocTables() {
$('tr.header').parent('thead').parent('table').addClass('table table-condensed');
}
$(document).ready(function () {
bootstrapStylePandocTables();
});
</script>
<!-- tabsets -->
<script>
$(document).ready(function () {
window.buildTabsets("TOC");
});
$(document).ready(function () {
$('.tabset-dropdown > .nav-tabs > li').click(function () {
$(this).parent().toggleClass('nav-tabs-open')
});
});
</script>
<!-- code folding -->
<!-- dynamically load mathjax for compatibility with self-contained -->
<script>
(function () {
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML";
document.getElementsByTagName("head")[0].appendChild(script);
})();
</script>
</body>
</html>

2
guide/_site/footer.html

@ -0,0 +1,2 @@
<hr noshade size=1/>
<p>Copyright &copy; 2019 Bob Rudis. All rights reserved.</p>

596
guide/_site/index.html

@ -0,0 +1,596 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="pandoc" />
<meta http-equiv="X-UA-Compatible" content="IE=EDGE" />
<title>Using RSwitch</title>
<script src="site_libs/jquery-1.11.3/jquery.min.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link href="site_libs/bootstrap-3.3.5/css/darkly.min.css" rel="stylesheet" />
<script src="site_libs/bootstrap-3.3.5/js/bootstrap.min.js"></script>
<script src="site_libs/bootstrap-3.3.5/shim/html5shiv.min.js"></script>
<script src="site_libs/bootstrap-3.3.5/shim/respond.min.js"></script>
<script src="site_libs/jqueryui-1.11.4/jquery-ui.min.js"></script>
<link href="site_libs/tocify-1.9.1/jquery.tocify.css" rel="stylesheet" />
<script src="site_libs/tocify-1.9.1/jquery.tocify.js"></script>
<script src="site_libs/navigation-1.1/tabsets.js"></script>
<link href="site_libs/highlightjs-9.12.0/default.css" rel="stylesheet" />
<script src="site_libs/highlightjs-9.12.0/highlight.js"></script>
<style type="text/css">code{white-space: pre;}</style>
<style type="text/css">
pre:not([class]) {
background-color: white;
}
</style>
<script type="text/javascript">
if (window.hljs) {
hljs.configure({languages: []});
hljs.initHighlightingOnLoad();
if (document.readyState && document.readyState === "complete") {
window.setTimeout(function() { hljs.initHighlighting(); }, 0);
}
}
</script>
<style type="text/css">
h1 {
font-size: 34px;
}
h1.title {
font-size: 38px;
}
h2 {
font-size: 30px;
}
h3 {
font-size: 24px;
}
h4 {
font-size: 18px;
}
h5 {
font-size: 16px;
}
h6 {
font-size: 12px;
}
.table th:not([align]) {
text-align: left;
}
</style>
<style type = "text/css">
.main-container {
max-width: 940px;
margin-left: auto;
margin-right: auto;
}
code {
color: inherit;
background-color: rgba(0, 0, 0, 0.04);
}
img {
max-width:100%;
height: auto;
}
.tabbed-pane {
padding-top: 12px;
}
.html-widget {
margin-bottom: 20px;
}
button.code-folding-btn:focus {
outline: none;
}
summary {
display: list-item;
}
</style>
<style type="text/css">
/* padding for bootstrap navbar */
body {
padding-top: 60px;
padding-bottom: 40px;
}
/* offset scroll position for anchor links (for fixed navbar) */
.section h1 {
padding-top: 65px;
margin-top: -65px;
}
.section h2 {
padding-top: 65px;
margin-top: -65px;
}
.section h3 {
padding-top: 65px;
margin-top: -65px;
}
.section h4 {
padding-top: 65px;
margin-top: -65px;
}
.section h5 {
padding-top: 65px;
margin-top: -65px;
}
.section h6 {
padding-top: 65px;
margin-top: -65px;
}
.dropdown-submenu {
position: relative;
}
.dropdown-submenu>.dropdown-menu {
top: 0;
left: 100%;
margin-top: -6px;
margin-left: -1px;
border-radius: 0 6px 6px 6px;
}
.dropdown-submenu:hover>.dropdown-menu {
display: block;
}
.dropdown-submenu>a:after {
display: block;
content: " ";
float: right;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
border-width: 5px 0 5px 5px;
border-left-color: #cccccc;
margin-top: 5px;
margin-right: -10px;
}
.dropdown-submenu:hover>a:after {
border-left-color: #ffffff;
}
.dropdown-submenu.pull-left {
float: none;
}
.dropdown-submenu.pull-left>.dropdown-menu {
left: -100%;
margin-left: 10px;
border-radius: 6px 0 6px 6px;
}
</style>
<script>
// manage active state of menu based on current page
$(document).ready(function () {
// active menu anchor
href = window.location.pathname
href = href.substr(href.lastIndexOf('/') + 1)
if (href === "")
href = "index.html";
var menuAnchor = $('a[href="' + href + '"]');
// mark it active
menuAnchor.parent().addClass('active');
// if it's got a parent navbar menu mark it active as well
menuAnchor.closest('li.dropdown').addClass('active');
});
</script>
<!-- tabsets -->
<style type="text/css">
.tabset-dropdown > .nav-tabs {
display: inline-table;
max-height: 500px;
min-height: 44px;
overflow-y: auto;
background: white;
border: 1px solid #ddd;
border-radius: 4px;
}
.tabset-dropdown > .nav-tabs > li.active:before {
content: "";
font-family: 'Glyphicons Halflings';
display: inline-block;
padding: 10px;
border-right: 1px solid #ddd;
}
.tabset-dropdown > .nav-tabs.nav-tabs-open > li.active:before {
content: "&#xe258;";
border: none;
}
.tabset-dropdown > .nav-tabs.nav-tabs-open:before {
content: "";
font-family: 'Glyphicons Halflings';
display: inline-block;
padding: 10px;
border-right: 1px solid #ddd;
}
.tabset-dropdown > .nav-tabs > li.active {
display: block;
}
.tabset-dropdown > .nav-tabs > li > a,
.tabset-dropdown > .nav-tabs > li > a:focus,
.tabset-dropdown > .nav-tabs > li > a:hover {
border: none;
display: inline-block;
border-radius: 4px;
}
.tabset-dropdown > .nav-tabs.nav-tabs-open > li {
display: block;
float: none;
}
.tabset-dropdown > .nav-tabs > li {
display: none;
}
</style>
<!-- code folding -->
<style type="text/css">
#TOC {
margin: 25px 0px 20px 0px;
}
@media (max-width: 768px) {
#TOC {
position: relative;
width: 100%;
}
}
.toc-content {
padding-left: 30px;
padding-right: 40px;
}
div.main-container {
max-width: 1200px;
}
div.tocify {
width: 20%;
max-width: 260px;
max-height: 85%;
}
@media (min-width: 768px) and (max-width: 991px) {
div.tocify {
width: 25%;
}
}
@media (max-width: 767px) {
div.tocify {
width: 100%;
max-width: none;
}
}
.tocify ul, .tocify li {
line-height: 20px;
}
.tocify-subheader .tocify-item {
font-size: 0.90em;
}
.tocify .list-group-item {
border-radius: 0px;
}
</style>
</head>
<body>
<div class="container-fluid main-container">
<!-- setup 3col/9col grid for toc_float and main content -->
<div class="row-fluid">
<div class="col-xs-12 col-sm-4 col-md-3">
<div id="TOC" class="tocify">
</div>
</div>
<div class="toc-content col-xs-12 col-sm-8 col-md-9">
<div class="navbar navbar-default navbar-fixed-top" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="index.html">RSwitch</a>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li>
<a href="index.html">Use</a>
</li>
<li>
<a href="develop.html">Develop</a>
</li>
<li>
<a href="acknowledgements.html">Acknowledgements</a>
</li>
<li>
<a href="https://rud.is/rswitch">Landing Page</a>
</li>
</ul>
<ul class="nav navbar-nav navbar-right">
</ul>
</div><!--/.nav-collapse -->
</div><!--/.container -->
</div><!--/.navbar -->
<div class="fluid-row" id="header">
<h1 class="title toc-ignore">Using RSwitch</h1>
</div>
<p>RSwitch is a macOS menubar application that works on macOS 10.14+ and provides handy shortcuts for developing with R on macOS. You can download it from the <a href="https://rud.is/rswitch/">landing page</a> or contribute to the <a href="develop.html">development</a> of the application.</p>
<div id="basiccore-usage" class="section level2">
<h2>Basic/Core Usage</h2>
<p>After downloading and running the application a new menubar item will appear and the core menu will look something like this:</p>
<p><img src="menu-info.png" /></p>
<p>The initial and primary feature of the RSwitch app was to enable switching what your system considers to be the “current” version of R. To understand how that is “computed”, you should use the “R Frameworks Directory” option which opens up <code>/Library/Frameworks/R.framework/Versions</code> in the Finder so you can browse and manipulate the contents of that directory tree on your own.</p>
<pre class="r"><code>fs::dir_tree(path = &quot;/Library/Frameworks/R.framework/Versions&quot;, recurse = FALSE)</code></pre>
<pre><code>/Library/Frameworks/R.framework/Versions
├── 3.5
├── 3.6
├── 3.7
└── Current</code></pre>
<p>The “R Framework” is, well, <em>R</em> on your macOS system. All of the necessary supporting libraries, code, pacakges, configuration elements, etc. exist in the framework directory. Here is the top-level contents of the <code>3.5</code> version of the R Framework:</p>
<pre class="r"><code>fs::dir_tree(path = &quot;/Library/Frameworks/R.framework/Versions/3.5&quot;, recurse = 1)</code></pre>
<pre><code>/Library/Frameworks/R.framework/Versions/3.5
├── Headers
├── PrivateHeaders
│ ├── Defn.h
│ ├── Errormsg.h
│ ├── Fileio.h
│ ├── Graphics.h
│ ├── GraphicsBase.h
│ ├── IOStuff.h
│ ├── Internal.h
│ ├── Makefile.in
│ ├── Makefile.win
│ ├── Parse.h
│ ├── Print.h
│ ├── R.h
│ ├── R_ext
│ ├── Rconnections.h
│ ├── Rdefines.h
│ ├── Rdynpriv.h
│ ├── Rembedded.h
│ ├── Rgraphics.h
│ ├── Rinlinedfuns.h
│ ├── Rinterface.h
│ ├── Rinternals.h
│ ├── Rmath.h0.in
│ ├── Rmodules
│ ├── S.h
│ ├── Startup.h
│ ├── config.h
│ ├── config.h.in
│ ├── rlocale.h
│ ├── stamp-h.in
│ └── vg
├── R
└── Resources
├── COPYING
├── Info.plist
├── R
├── Rscript
├── SVN-REVISION
├── bin
├── doc
├── etc
├── fontconfig
├── include
├── lib
├── library
├── man1
├── modules
├── share
└── tests</code></pre>
<p>When you download and run the <a href="https://cran.r-project.org/bin/macosx/">official R macOS installer</a> files are installed into a versioned tree and the <code>Current</code> symbolic link is updated to point to what you just installed. By making all of the installed resources depend on the <code>Current</code> symbolic link, the R Core team made it possible to switch R versions just by changing that link. For example, The <code>R</code> console application in <code>/usr/local/bin</code> is a symbolc link to:</p>
<p><code>/usr/local/bin/R@ -&gt; /Library/Frameworks/R.framework/Resources/bin/R</code></p>
<p>The <code>Resources</code> directory (and everything else in <code>/Library/Frameworks/R.framework/</code> uses the <code>Current</code> symbolic link to get to the correct targets):</p>
<ul>
<li><code>Headers@ -&gt; Versions/Current/Headers</code></li>
<li><code>Libraries@ -&gt; Versions/Current/Resources/lib</code></li>
<li><code>PrivateHeaders@ -&gt; Versions/Current/PrivateHeaders</code></li>
<li><code>R@ -&gt; Versions/Current/R</code></li>
<li><code>Resources@ -&gt; Versions/Current/Resources</code></li>
<li><code>Versions/</code></li>
</ul>
<p>For the most control, you can install a coexisting version of R <strong>oldrel</strong>-1, <strong>oldrel</strong> (as of the date this document was created those would be R 3.4 and R 3.5), current <strong>release</strong> (R 3.6) and <strong>devel</strong> (3.7) by hand by going to the <a href="https://mac.r-project.org/">R for macOS Developer’s Page</a> and downloading the <code>tar.gz</code> version of those distributions:</p>
<p><img src="r-macos-downloads.png" /></p>
<p>Here are direct <code>https</code> links to the tarballs:</p>
<ul>
<li><a href="https://mac.r-project.org/mavericks/R-3.4-branch/R-3.4-branch-mavericks-sa-x86_64.tar.gz">R 3.4</a> (oldrel-1)</li>
<li><a href="https://mac.r-project.org/el-capitan/R-3.5-branch/R-3.5-branch-el-capitan-sa-x86_64.tar.gz">R 3.5</a> (oldrel)</li>
<li><a href="https://mac.r-project.org/el-capitan/R-3.6-branch/R-3.6-branch-el-capitan-sa-x86_64.tar.gz">R 3.6</a> (current)</li>
<li><a href="https://mac.r-project.org/el-capitan/R-devel/R-devel-el-capitan-sa-x86_64.tar.gz">R 3.7</a> (devel)</li>
</ul>
<p>Once downloaded, you can fire up a terminal prompt, head to the root directory (i.e. <code>cd /</code>) and run <code>tar -xvzf path-to-thing-you-just-downloaded</code> to lay out the contents of the tarball onto the filesystem. (You can also use the <code>.pkg</code> versions if you prefer a clicky-installer wizard.)</p>
<p>Once you install one of these versions, <code>Current</code> gets manipulated to point to it. You can either <code>rm</code> the existing symbolic link and <code>ln -s</code> a new one or <em>just use RSwitch</em>!</p>
<p>Upon initial click, RSwitch figures out which versions of R you have installed and lets you switch them just by selecting the versioned menu item. When the change is made you get a handy notification letting you know the action performed successfully and which R version you changed to:</p>
<p><img src="r-change-notify.png" /></p>
<div class="alert alert-warning" role="alert" style="color:black">
<span class="glyphicon glyphicon-bell" aria-hidden="true"></span> NOTE that it is not a good idea to switch what your Mac thinks is the current version of R while active R sessions exist unless you really know what you’re doing as you may lose work.
</div>
</div>
<div id="keeping-toolsets-current" class="section level2">
<h2>Keeping Toolsets Current</h2>
<p>The main goal of the package was to make it easier to switch the current version of R to something else. If you have that need, chances are that you are playing with the development version of R and said version has nightly builds.</p>
<p>Similarly, if you are living on the cutting edge of R you are also likely doing the same with <a href="https://dailies.rstudio.com/rstudio/oss/mac/">RStudio dailies</a>.</p>
<p>RSwitch provides two handy menu item shortcuts to download either of those resources, but it expects you do <em>some</em> work to use them. When you select either of the “Download latest&amp;hellip” items some checks are performed (mostly to find the current version of the latest RStudio daily) and if it finds either the r-devel tarball or the exact same version of the RStudio disk image in the <code>~/Downloads</code> directory it will let you know you need to clean up after yourself first:</p>
<p><img src="r-devel-exists.png" /></p>
<p><img src="rstudio-exists.png" /></p>
<p>If RSwitch can download the requested resource it will do so in the background and grey out the selected item until the process is complete:</p>
<p><img src="rstudio-in-progress.png" /></p>
<p>When the process is complete (or errors) a notification will be sent:</p>
<p><img src="rstudio-success.png" /></p>
<p>and the Finder will open up to <code>~/Downloads</code> with the target file selected.</p>
</div>
<div id="getting-help-or-resources-from-the-internet" class="section level2">
<h2>Getting Help or Resources from the Internet</h2>
<p>Since RSwitch is designed to help you work with R on macOS it seemed only fitting to provide some handy links to resources like the R for macOS page, the CRAN R page, RStudio dailies link, etc. They’re all available via the fairly obvious sub-menu:</p>
<p><img src="web-help.png" /></p>
<p>and each item will open up in your default web browser. (File an issue if you’d like more links added)</p>
</div>
<div id="even-moar-switching" class="section level2">
<h2>Even Moar Switching</h2>
<p>Since the theme of RSwitch is, well, <em>switching</em> it, further, seemed only fitting to allow you to make any open RStudio or R GUI instance active from the app:</p>
<p><img src="app-switch.png" /></p>
<p>The list is presented in app order (RStudio first since it’s super likely that’s what most macOS R folk are using) and then in app launch order (oldest on top). As shown, if RSwitch can detect what the open RStudio project or package is, that name gets added to the switching title.</p>
</div>
<div id="the-item-that-launched-a-thousand-instances" class="section level2">
<h2>The Item That Launched A Thousand Instances</h2>
<p>While being able to switch to running instances is fine, it would also be handy to be able to launch RStudio or R GUI from the menubar app. If none are currently running you can launch them with the obviously named menu items. If you hold down <code>&lt;Control&gt;</code> as you click on the RSwitch icon you’ll be given the opportunity to launch new, concurrent instances of either application:</p>
<p><img src="launch-new.png" /></p>
</div>
<div id="speaking-of-current" class="section level2">
<h2>Speaking of Current</h2>
<p>RSwitch is under active, heavy development. Even when the development cycle dies down it will receive updates as bugs are fixed and new features are added. Rather than make you subscribe to a blog or monitor Twitter or social coding sites RSwitch now lets you check for updates right within the app. If there are no updates you get a notification telling you so:</p>
<p><img src="latest.png" /></p>
<p>otherwise, a link will open in your default browser so you can download the latest version.</p>
</div>
<div id="always-on" class="section level2">
<h2>Always On</h2>
<p>If you like RSwitch enough to keep it running all the time, just drag the item to the “Login Items” table of your user in the “Users &amp; Groups” pane of “System Preferences”</p>
<p><img src="users-n-grps.png" /></p>
</div>
<div id="getting-help" class="section level2">
<h2>Getting Help</h2>
<p>If you’re having trouble with RSwitch or have a feature request, head on over to any of the following social coding sites and file an issue:</p>
<ul>
<li><a href="https://git.rud.is/hrbrmstr/RSwitch">My self-hosted Gitea instance</a></li>
<li><a href="https://git.sr.ht/~hrbrmstr/RSwitch">SourceHut</a></li>
<li><a href="https://gitlab.com/hrbrmstr/RSwitch">GitLab</a></li>
<li><a href="https://bitbucket.com/hrbrmstr/RSwitch">Bitbucket</a></li>
<li><a href="https://github.com/hrbrmstr/RSwitch">GitHub</a></li>
</ul>
</div>
<hr noshade size=1/>
<p>Copyright &copy; 2019 Bob Rudis. All rights reserved.</p>
</div>
</div>
</div>
<script>
// add bootstrap table styles to pandoc tables
function bootstrapStylePandocTables() {
$('tr.header').parent('thead').parent('table').addClass('table table-condensed');
}
$(document).ready(function () {
bootstrapStylePandocTables();
});
</script>
<!-- tabsets -->
<script>
$(document).ready(function () {
window.buildTabsets("TOC");
});
$(document).ready(function () {
$('.tabset-dropdown > .nav-tabs > li').click(function () {
$(this).parent().toggleClass('nav-tabs-open')
});
});
</script>
<!-- code folding -->
<script>
$(document).ready(function () {
// move toc-ignore selectors from section div to header
$('div.section.toc-ignore')
.removeClass('toc-ignore')
.children('h1,h2,h3,h4,h5').addClass('toc-ignore');
// establish options
var options = {
selectors: "h1,h2,h3",
theme: "bootstrap3",
context: '.toc-content',
hashGenerator: function (text) {
return text.replace(/[.\\/?&!#<>]/g, '').replace(/\s/g, '_').toLowerCase();
},
ignoreSelector: ".toc-ignore",
scrollTo: 0
};
options.showAndHide = true;
options.smoothScroll = true;
// tocify
var toc = $("#TOC").tocify(options).data("toc-tocify");
});
</script>
<!-- dynamically load mathjax for compatibility with self-contained -->
<script>
(function () {
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML";
document.getElementsByTagName("head")[0].appendChild(script);
})();
</script>
</body>
</html>

BIN
guide/_site/latest.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
guide/_site/launch-new.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

BIN
guide/_site/main-menu.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

BIN
guide/_site/menu-info.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 KiB

BIN
guide/_site/r-change-notify.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
guide/_site/r-devel-exists.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
guide/_site/r-macos-downloads.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

BIN
guide/_site/rstudio-exists.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
guide/_site/rstudio-in-progress.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

BIN
guide/_site/rstudio-success.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

587
guide/_site/site_libs/bootstrap-3.3.5/css/bootstrap-theme.css

@ -0,0 +1,587 @@
/*!
* Bootstrap v3.3.5 (http://getbootstrap.com)
* Copyright 2011-2015 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
.btn-default,
.btn-primary,
.btn-success,
.btn-info,
.btn-warning,
.btn-danger {
text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
}
.btn-default:active,
.btn-primary:active,
.btn-success:active,
.btn-info:active,
.btn-warning:active,
.btn-danger:active,
.btn-default.active,
.btn-primary.active,
.btn-success.active,
.btn-info.active,
.btn-warning.active,
.btn-danger.active {
-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
}
.btn-default.disabled,
.btn-primary.disabled,
.btn-success.disabled,
.btn-info.disabled,
.btn-warning.disabled,
.btn-danger.disabled,
.btn-default[disabled],
.btn-primary[disabled],
.btn-success[disabled],
.btn-info[disabled],
.btn-warning[disabled],
.btn-danger[disabled],
fieldset[disabled] .btn-default,
fieldset[disabled] .btn-primary,
fieldset[disabled] .btn-success,
fieldset[disabled] .btn-info,
fieldset[disabled] .btn-warning,
fieldset[disabled] .btn-danger {
-webkit-box-shadow: none;
box-shadow: none;
}
.btn-default .badge,
.btn-primary .badge,
.btn-success .badge,
.btn-info .badge,
.btn-warning .badge,
.btn-danger .badge {
text-shadow: none;
}
.btn:active,
.btn.active {
background-image: none;
}
.btn-default {
text-shadow: 0 1px 0 #fff;
background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);
background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));
background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #dbdbdb;
border-color: #ccc;
}
.btn-default:hover,
.btn-default:focus {
background-color: #e0e0e0;
background-position: 0 -15px;
}
.btn-default:active,
.btn-default.active {
background-color: #e0e0e0;
border-color: #dbdbdb;
}
.btn-default.disabled,
.btn-default[disabled],
fieldset[disabled] .btn-default,
.btn-default.disabled:hover,
.btn-default[disabled]:hover,
fieldset[disabled] .btn-default:hover,
.btn-default.disabled:focus,
.btn-default[disabled]:focus,
fieldset[disabled] .btn-default:focus,
.btn-default.disabled.focus,
.btn-default[disabled].focus,
fieldset[disabled] .btn-default.focus,
.btn-default.disabled:active,
.btn-default[disabled]:active,
fieldset[disabled] .btn-default:active,
.btn-default.disabled.active,
.btn-default[disabled].active,
fieldset[disabled] .btn-default.active {
background-color: #e0e0e0;
background-image: none;
}
.btn-primary {
background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);
background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));
background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #245580;
}
.btn-primary:hover,
.btn-primary:focus {
background-color: #265a88;
background-position: 0 -15px;
}
.btn-primary:active,
.btn-primary.active {
background-color: #265a88;
border-color: #245580;
}
.btn-primary.disabled,
.btn-primary[disabled],
fieldset[disabled] .btn-primary,
.btn-primary.disabled:hover,
.btn-primary[disabled]:hover,
fieldset[disabled] .btn-primary:hover,
.btn-primary.disabled:focus,
.btn-primary[disabled]:focus,
fieldset[disabled] .btn-primary:focus,
.btn-primary.disabled.focus,
.btn-primary[disabled].focus,
fieldset[disabled] .btn-primary.focus,
.btn-primary.disabled:active,
.btn-primary[disabled]:active,
fieldset[disabled] .btn-primary:active,
.btn-primary.disabled.active,
.btn-primary[disabled].active,
fieldset[disabled] .btn-primary.active {
background-color: #265a88;
background-image: none;
}
.btn-success {
background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));
background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #3e8f3e;
}
.btn-success:hover,
.btn-success:focus {
background-color: #419641;
background-position: 0 -15px;
}
.btn-success:active,
.btn-success.active {
background-color: #419641;
border-color: #3e8f3e;
}
.btn-success.disabled,
.btn-success[disabled],
fieldset[disabled] .btn-success,
.btn-success.disabled:hover,
.btn-success[disabled]:hover,
fieldset[disabled] .btn-success:hover,
.btn-success.disabled:focus,
.btn-success[disabled]:focus,
fieldset[disabled] .btn-success:focus,
.btn-success.disabled.focus,
.btn-success[disabled].focus,
fieldset[disabled] .btn-success.focus,
.btn-success.disabled:active,
.btn-success[disabled]:active,
fieldset[disabled] .btn-success:active,
.btn-success.disabled.active,
.btn-success[disabled].active,
fieldset[disabled] .btn-success.active {
background-color: #419641;
background-image: none;
}
.btn-info {
background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));
background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #28a4c9;
}
.btn-info:hover,
.btn-info:focus {
background-color: #2aabd2;
background-position: 0 -15px;
}
.btn-info:active,
.btn-info.active {
background-color: #2aabd2;
border-color: #28a4c9;
}
.btn-info.disabled,
.btn-info[disabled],
fieldset[disabled] .btn-info,
.btn-info.disabled:hover,
.btn-info[disabled]:hover,
fieldset[disabled] .btn-info:hover,
.btn-info.disabled:focus,
.btn-info[disabled]:focus,
fieldset[disabled] .btn-info:focus,
.btn-info.disabled.focus,
.btn-info[disabled].focus,
fieldset[disabled] .btn-info.focus,
.btn-info.disabled:active,
.btn-info[disabled]:active,
fieldset[disabled] .btn-info:active,
.btn-info.disabled.active,
.btn-info[disabled].active,
fieldset[disabled] .btn-info.active {
background-color: #2aabd2;
background-image: none;
}
.btn-warning {
background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));
background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #e38d13;
}
.btn-warning:hover,
.btn-warning:focus {
background-color: #eb9316;
background-position: 0 -15px;
}
.btn-warning:active,
.btn-warning.active {
background-color: #eb9316;
border-color: #e38d13;
}
.btn-warning.disabled,
.btn-warning[disabled],
fieldset[disabled] .btn-warning,
.btn-warning.disabled:hover,
.btn-warning[disabled]:hover,
fieldset[disabled] .btn-warning:hover,
.btn-warning.disabled:focus,
.btn-warning[disabled]:focus,
fieldset[disabled] .btn-warning:focus,
.btn-warning.disabled.focus,
.btn-warning[disabled].focus,
fieldset[disabled] .btn-warning.focus,
.btn-warning.disabled:active,
.btn-warning[disabled]:active,
fieldset[disabled] .btn-warning:active,
.btn-warning.disabled.active,
.btn-warning[disabled].active,
fieldset[disabled] .btn-warning.active {
background-color: #eb9316;
background-image: none;
}
.btn-danger {
background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));
background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #b92c28;
}
.btn-danger:hover,
.btn-danger:focus {
background-color: #c12e2a;
background-position: 0 -15px;
}
.btn-danger:active,
.btn-danger.active {
background-color: #c12e2a;
border-color: #b92c28;
}
.btn-danger.disabled,
.btn-danger[disabled],
fieldset[disabled] .btn-danger,
.btn-danger.disabled:hover,
.btn-danger[disabled]:hover,
fieldset[disabled] .btn-danger:hover,
.btn-danger.disabled:focus,
.btn-danger[disabled]:focus,
fieldset[disabled] .btn-danger:focus,
.btn-danger.disabled.focus,
.btn-danger[disabled].focus,
fieldset[disabled] .btn-danger.focus,
.btn-danger.disabled:active,
.btn-danger[disabled]:active,
fieldset[disabled] .btn-danger:active,
.btn-danger.disabled.active,
.btn-danger[disabled].active,
fieldset[disabled] .btn-danger.active {
background-color: #c12e2a;
background-image: none;
}
.thumbnail,
.img-thumbnail {
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
}
.dropdown-menu > li > a:hover,
.dropdown-menu > li > a:focus {
background-color: #e8e8e8;
background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
background-repeat: repeat-x;
}
.dropdown-menu > .active > a,
.dropdown-menu > .active > a:hover,
.dropdown-menu > .active > a:focus {
background-color: #2e6da4;
background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
background-repeat: repeat-x;
}
.navbar-default {
background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);
background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));
background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-radius: 4px;
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
}
.navbar-default .navbar-nav > .open > a,
.navbar-default .navbar-nav > .active > a {
background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));
background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);
background-repeat: repeat-x;
-webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
}
.navbar-brand,
.navbar-nav > li > a {
text-shadow: 0 1px 0 rgba(255, 255, 255, .25);
}
.navbar-inverse {
background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);
background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));
background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-radius: 4px;
}
.navbar-inverse .navbar-nav > .open > a,
.navbar-inverse .navbar-nav > .active > a {
background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);
background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));
background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);
background-repeat: repeat-x;
-webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
}
.navbar-inverse .navbar-brand,
.navbar-inverse .navbar-nav > li > a {
text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);
}
.navbar-static-top,
.navbar-fixed-top,
.navbar-fixed-bottom {
border-radius: 0;
}
@media (max-width: 767px) {
.navbar .navbar-nav .open .dropdown-menu > .active > a,
.navbar .navbar-nav .open .dropdown-menu > .active > a:hover,
.navbar .navbar-nav .open .dropdown-menu > .active > a:focus {
color: #fff;
background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
background-repeat: repeat-x;
}
}
.alert {
text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
}
.alert-success {
background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));
background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
background-repeat: repeat-x;
border-color: #b2dba1;
}
.alert-info {
background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));
background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
background-repeat: repeat-x;
border-color: #9acfea;
}
.alert-warning {
background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));
background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
background-repeat: repeat-x;
border-color: #f5e79e;
}
.alert-danger {
background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));
background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
background-repeat: repeat-x;
border-color: #dca7a7;
}
.progress {
background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));
background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar {
background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);
background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));
background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar-success {
background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));
background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar-info {
background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));
background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar-warning {
background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));
background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar-danger {
background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));
background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar-striped {
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
}
.list-group {
border-radius: 4px;
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
}
.list-group-item.active,
.list-group-item.active:hover,
.list-group-item.active:focus {
text-shadow: 0 -1px 0 #286090;
background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);
background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));
background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);
background-repeat: repeat-x;
border-color: #2b669a;
}
.list-group-item.active .badge,
.list-group-item.active:hover .badge,
.list-group-item.active:focus .badge {
text-shadow: none;
}
.panel {
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
}
.panel-default > .panel-heading {
background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
background-repeat: repeat-x;
}
.panel-primary > .panel-heading {
background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
background-repeat: repeat-x;
}
.panel-success > .panel-heading {
background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));
background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
background-repeat: repeat-x;
}
.panel-info > .panel-heading {
background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));
background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
background-repeat: repeat-x;
}
.panel-warning > .panel-heading {
background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));
background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
background-repeat: repeat-x;
}
.panel-danger > .panel-heading {
background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));
background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
background-repeat: repeat-x;
}
.well {
background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));
background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
background-repeat: repeat-x;
border-color: #dcdcdc;
-webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
}
/*# sourceMappingURL=bootstrap-theme.css.map */

1
guide/_site/site_libs/bootstrap-3.3.5/css/bootstrap-theme.css.map

File diff suppressed because one or more lines are too long

5
guide/_site/site_libs/bootstrap-3.3.5/css/bootstrap-theme.min.css

File diff suppressed because one or more lines are too long

6799
guide/_site/site_libs/bootstrap-3.3.5/css/bootstrap.css

File diff suppressed because it is too large

1
guide/_site/site_libs/bootstrap-3.3.5/css/bootstrap.css.map

File diff suppressed because one or more lines are too long

5
guide/_site/site_libs/bootstrap-3.3.5/css/bootstrap.min.css

File diff suppressed because one or more lines are too long

11
guide/_site/site_libs/bootstrap-3.3.5/css/cerulean.min.css

File diff suppressed because one or more lines are too long

30
guide/_site/site_libs/bootstrap-3.3.5/css/cosmo.min.css

File diff suppressed because one or more lines are too long

30
guide/_site/site_libs/bootstrap-3.3.5/css/darkly.min.css

File diff suppressed because one or more lines are too long

30
guide/_site/site_libs/bootstrap-3.3.5/css/flatly.min.css

File diff suppressed because one or more lines are too long

BIN
guide/_site/site_libs/bootstrap-3.3.5/css/fonts/Lato.ttf

Binary file not shown.

BIN
guide/_site/site_libs/bootstrap-3.3.5/css/fonts/LatoBold.ttf

Binary file not shown.

BIN
guide/_site/site_libs/bootstrap-3.3.5/css/fonts/LatoItalic.ttf

Binary file not shown.

BIN
guide/_site/site_libs/bootstrap-3.3.5/css/fonts/NewsCycle.ttf

Binary file not shown.

BIN
guide/_site/site_libs/bootstrap-3.3.5/css/fonts/NewsCycleBold.ttf

Binary file not shown.

BIN
guide/_site/site_libs/bootstrap-3.3.5/css/fonts/OpenSans.ttf

Binary file not shown.

BIN
guide/_site/site_libs/bootstrap-3.3.5/css/fonts/OpenSansBold.ttf

Binary file not shown.

BIN
guide/_site/site_libs/bootstrap-3.3.5/css/fonts/OpenSansBoldItalic.ttf

Binary file not shown.

BIN
guide/_site/site_libs/bootstrap-3.3.5/css/fonts/OpenSansItalic.ttf

Binary file not shown.

BIN
guide/_site/site_libs/bootstrap-3.3.5/css/fonts/OpenSansLight.ttf

Binary file not shown.

BIN
guide/_site/site_libs/bootstrap-3.3.5/css/fonts/OpenSansLightItalic.ttf

Binary file not shown.

BIN
guide/_site/site_libs/bootstrap-3.3.5/css/fonts/Raleway.ttf

Binary file not shown.

BIN
guide/_site/site_libs/bootstrap-3.3.5/css/fonts/RalewayBold.ttf

Binary file not shown.

BIN
guide/_site/site_libs/bootstrap-3.3.5/css/fonts/Roboto.ttf

Binary file not shown.

BIN
guide/_site/site_libs/bootstrap-3.3.5/css/fonts/RobotoBold.ttf

Binary file not shown.

BIN
guide/_site/site_libs/bootstrap-3.3.5/css/fonts/RobotoLight.ttf

Binary file not shown.

BIN
guide/_site/site_libs/bootstrap-3.3.5/css/fonts/RobotoMedium.ttf

Binary file not shown.

BIN
guide/_site/site_libs/bootstrap-3.3.5/css/fonts/SourceSansPro.ttf

Binary file not shown.

BIN
guide/_site/site_libs/bootstrap-3.3.5/css/fonts/SourceSansProBold.ttf

Binary file not shown.

BIN
guide/_site/site_libs/bootstrap-3.3.5/css/fonts/SourceSansProItalic.ttf

Binary file not shown.

BIN
guide/_site/site_libs/bootstrap-3.3.5/css/fonts/SourceSansProLight.ttf

Binary file not shown.

BIN
guide/_site/site_libs/bootstrap-3.3.5/css/fonts/Ubuntu.ttf

Binary file not shown.

24
guide/_site/site_libs/bootstrap-3.3.5/css/journal.min.css

File diff suppressed because one or more lines are too long

37
guide/_site/site_libs/bootstrap-3.3.5/css/lumen.min.css

File diff suppressed because one or more lines are too long

36
guide/_site/site_libs/bootstrap-3.3.5/css/paper.min.css

File diff suppressed because one or more lines are too long

24
guide/_site/site_libs/bootstrap-3.3.5/css/readable.min.css

File diff suppressed because one or more lines are too long

24
guide/_site/site_libs/bootstrap-3.3.5/css/sandstone.min.css

File diff suppressed because one or more lines are too long

24
guide/_site/site_libs/bootstrap-3.3.5/css/simplex.min.css

File diff suppressed because one or more lines are too long

36
guide/_site/site_libs/bootstrap-3.3.5/css/spacelab.min.css

File diff suppressed because one or more lines are too long

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save