├── .gitignore ├── BingPaper.playground ├── Contents.swift ├── Sources │ └── SupportCode.swift └── contents.xcplayground ├── BingPaper.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── BingPaper.xccheckout └── xcshareddata │ └── xcschemes │ └── BingPaper.xcscheme ├── BingPaper.xcworkspace ├── contents.xcworkspacedata └── xcshareddata │ └── IDEWorkspaceChecks.plist ├── BingPaper ├── AboutPreferencesViewController.swift ├── AppDelegate.swift ├── Base.lproj │ ├── AboutPreferencesView.xib │ ├── Credits.rtf │ ├── GeneralPreferencesView.xib │ ├── Localizable.strings │ └── StatusBarView.xib ├── BingPaper.entitlements ├── BingPictureManager.swift ├── GeneralPreferencesViewController.swift ├── Images.xcassets │ ├── AppIcon Bing.appiconset │ │ ├── Contents.json │ │ ├── icon_128x128.png │ │ ├── icon_128x128@2x.png │ │ ├── icon_16x16.png │ │ ├── icon_16x16@2x.png │ │ ├── icon_256x256.png │ │ ├── icon_256x256@2x.png │ │ ├── icon_32x32.png │ │ ├── icon_32x32@2x.png │ │ ├── icon_512x512.png │ │ └── icon_512x512@2x.png │ ├── AppIcon BingPaper.appiconset │ │ ├── Contents.json │ │ ├── Icon128.png │ │ ├── Icon128@2x.png │ │ ├── Icon16.png │ │ ├── Icon16@2x.png │ │ ├── Icon256.png │ │ ├── Icon256@2x.png │ │ ├── Icon32.png │ │ ├── Icon32@2x.png │ │ ├── Icon512.png │ │ └── Icon512@2x.png │ ├── Bing.imageset │ │ ├── Bing.png │ │ ├── Bing@2x.png │ │ ├── Bing@3x.png │ │ └── Contents.json │ ├── Contents.json │ ├── StatusBar │ │ ├── Contents.json │ │ └── StatusBarIcon.imageset │ │ │ ├── Contents.json │ │ │ ├── StatusBarIcon Dark.png │ │ │ ├── StatusBarIcon Dark@2x.png │ │ │ ├── StatusBarIcon Dark@3x.png │ │ │ ├── StatusBarIcon.png │ │ │ ├── StatusBarIcon@2x.png │ │ │ └── StatusBarIcon@3x.png │ └── Toolbar │ │ ├── Contents.json │ │ ├── Envolope.imageset │ │ ├── Contents.json │ │ ├── Envolope.png │ │ ├── Envolope@2x.png │ │ └── Envolope@3x.png │ │ └── Switch.imageset │ │ ├── Contents.json │ │ ├── switch.png │ │ ├── switch@2x.png │ │ └── switch@3x.png ├── Info.plist ├── MenuItem.swift ├── PopUpButtonCell.swift ├── Shared.swift ├── StatusBarView.swift ├── StatusBarViewController.swift ├── en.lproj │ ├── Localize.strings │ └── StatusBar.strings └── zh-Hans.lproj │ ├── AboutPreferencesView.strings │ ├── Credits.rtf │ ├── GeneralPreferencesView.strings │ ├── Localizable.strings │ └── StatusBarView.strings ├── BingPaperLoginItem ├── AppDelegate.swift ├── BingPaperLoginItem.xib ├── Images.xcassets │ ├── AppIcon Bing.appiconset │ │ ├── Contents.json │ │ ├── icon_128x128.png │ │ ├── icon_128x128@2x.png │ │ ├── icon_16x16.png │ │ ├── icon_16x16@2x.png │ │ ├── icon_256x256.png │ │ ├── icon_256x256@2x.png │ │ ├── icon_32x32.png │ │ ├── icon_32x32@2x.png │ │ ├── icon_512x512.png │ │ └── icon_512x512@2x.png │ └── Contents.json └── Info.plist ├── BingPaperLoginItemTests ├── BingPaperLoginItem.entitlements ├── BingPaperLoginItemTests.swift └── Info.plist ├── BingPaperTests ├── BingPaperTests.swift └── Info.plist ├── Design ├── Bing.png └── BingPaper_2015-07-12.pxm ├── LICENSE ├── Podfile ├── Podfile.lock ├── README.md └── Screenshots ├── BingPaper_v0.10.1_en_US.jpg ├── BingPaper_v0.11.1_en_US.jpg ├── BingPaper_v0.9.7_en_US.jpg └── BingPaper_v0.9.7_zh_CN.jpg /.gitignore: -------------------------------------------------------------------------------- 1 | # macOS 2 | .DS_Store 3 | 4 | # Xcode 5 | # 6 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 7 | 8 | ## Build generated 9 | build/ 10 | DerivedData/ 11 | 12 | ## Various settings 13 | *.pbxuser 14 | !default.pbxuser 15 | *.mode1v3 16 | !default.mode1v3 17 | *.mode2v3 18 | !default.mode2v3 19 | *.perspectivev3 20 | !default.perspectivev3 21 | xcuserdata/ 22 | 23 | ## Other 24 | *.moved-aside 25 | *.xcuserstate 26 | 27 | ## Obj-C/Swift specific 28 | *.hmap 29 | *.ipa 30 | *.dSYM.zip 31 | *.dSYM 32 | 33 | ## Playgrounds 34 | timeline.xctimeline 35 | playground.xcworkspace 36 | 37 | # Swift Package Manager 38 | # 39 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 40 | # Packages/ 41 | .build/ 42 | 43 | # CocoaPods 44 | # 45 | # We recommend against adding the Pods directory to your .gitignore. However 46 | # you should judge for yourself, the pros and cons are mentioned at: 47 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 48 | # 49 | # Pods/ 50 | 51 | # Carthage 52 | # 53 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 54 | # Carthage/Checkouts 55 | 56 | Carthage/Build 57 | 58 | # fastlane 59 | # 60 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 61 | # screenshots whenever they are needed. 62 | # For more information about the recommended setup visit: 63 | # https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md 64 | 65 | fastlane/report.xml 66 | fastlane/Preview.html 67 | fastlane/screenshots 68 | fastlane/test_output 69 | 70 | # Dependences 71 | Pods/ 72 | -------------------------------------------------------------------------------- /BingPaper.playground/Contents.swift: -------------------------------------------------------------------------------- 1 | //: Playground - noun: a place where people can play 2 | 3 | import Cocoa 4 | 5 | let hello = "Hello World!" 6 | -------------------------------------------------------------------------------- /BingPaper.playground/Sources/SupportCode.swift: -------------------------------------------------------------------------------- 1 | // 2 | // This file (and all other Swift source files in the Sources directory of this playground) will be precompiled into a framework which is automatically made available to BingPaperPlayground.playground. 3 | // 4 | -------------------------------------------------------------------------------- /BingPaper.playground/contents.xcplayground: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /BingPaper.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 48; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 13F210EC88189653FA3C8CCB /* Pods_BingPaper.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 89CAAB9C49B322AE3723A34D /* Pods_BingPaper.framework */; }; 11 | 7602FDF91B522F7300E6EC7D /* StatusBarView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7602FDFB1B522F7300E6EC7D /* StatusBarView.xib */; }; 12 | 7602FE031B526EC900E6EC7D /* BingPictureManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7602FE021B526EC900E6EC7D /* BingPictureManager.swift */; }; 13 | 7602FE051B52BEF000E6EC7D /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 7602FE071B52BEF000E6EC7D /* Credits.rtf */; }; 14 | 761FBF601DA7824F00F4409E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761FBF5F1DA7824F00F4409E /* AppDelegate.swift */; }; 15 | 761FBF6A1DA7826E00F4409E /* BingPaperLoginItem.app in CopyFiles */ = {isa = PBXBuildFile; fileRef = 761FBF5D1DA7824F00F4409E /* BingPaperLoginItem.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 16 | 761FBF7D1DA78A6500F4409E /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 761FBF7C1DA78A6500F4409E /* Images.xcassets */; }; 17 | 761FBF7F1DA78B1600F4409E /* BingPaperLoginItem.xib in Resources */ = {isa = PBXBuildFile; fileRef = 761FBF7E1DA78B1600F4409E /* BingPaperLoginItem.xib */; }; 18 | 761FBF881DA78F1300F4409E /* BingPaperLoginItemTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761FBF871DA78F1300F4409E /* BingPaperLoginItemTests.swift */; }; 19 | 763C22AA1AB2DCC000BACA07 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 763C22A91AB2DCC000BACA07 /* AppDelegate.swift */; }; 20 | 763C22AE1AB2DCC000BACA07 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 763C22AD1AB2DCC000BACA07 /* Images.xcassets */; }; 21 | 763C22BD1AB2DCC000BACA07 /* BingPaperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 763C22BC1AB2DCC000BACA07 /* BingPaperTests.swift */; }; 22 | 763C22CB1AB2E48400BACA07 /* StatusBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 763C22CA1AB2E48400BACA07 /* StatusBarView.swift */; }; 23 | 763E701B1DA7FA06008AC2E6 /* MenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 763E701A1DA7FA06008AC2E6 /* MenuItem.swift */; }; 24 | 763E701E1DA7FDBE008AC2E6 /* PopUpButtonCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 763E701D1DA7FDBE008AC2E6 /* PopUpButtonCell.swift */; }; 25 | 767B02BB1D9B99D2003BBC47 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 767B02BD1D9B99D2003BBC47 /* Localizable.strings */; }; 26 | 767B02C21D9BB318003BBC47 /* AboutPreferencesView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 767B02C41D9BB318003BBC47 /* AboutPreferencesView.xib */; }; 27 | 767B02C81D9BC4F6003BBC47 /* GeneralPreferencesView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 767B02CA1D9BC4F6003BBC47 /* GeneralPreferencesView.xib */; }; 28 | 7695AB2D1D9AB363006CA215 /* GeneralPreferencesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7695AB2C1D9AB363006CA215 /* GeneralPreferencesViewController.swift */; }; 29 | 7695AB301D9AB388006CA215 /* AboutPreferencesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7695AB2E1D9AB388006CA215 /* AboutPreferencesViewController.swift */; }; 30 | 769EC31C1D9BF7E7001F7CBC /* Shared.swift in Sources */ = {isa = PBXBuildFile; fileRef = 769EC31B1D9BF7E7001F7CBC /* Shared.swift */; }; 31 | 76FB444D1AB2F82F0088432F /* StatusBarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76FB444C1AB2F82F0088432F /* StatusBarViewController.swift */; }; 32 | ED32B9DA9675D670B387772F /* Pods_BingPaperTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7082E9B74124607292FF75C4 /* Pods_BingPaperTests.framework */; }; 33 | /* End PBXBuildFile section */ 34 | 35 | /* Begin PBXContainerItemProxy section */ 36 | 761FBF8A1DA78F1400F4409E /* PBXContainerItemProxy */ = { 37 | isa = PBXContainerItemProxy; 38 | containerPortal = 763C229C1AB2DCC000BACA07 /* Project object */; 39 | proxyType = 1; 40 | remoteGlobalIDString = 761FBF5C1DA7824F00F4409E; 41 | remoteInfo = BingPaperLoginItem; 42 | }; 43 | 763C22B71AB2DCC000BACA07 /* PBXContainerItemProxy */ = { 44 | isa = PBXContainerItemProxy; 45 | containerPortal = 763C229C1AB2DCC000BACA07 /* Project object */; 46 | proxyType = 1; 47 | remoteGlobalIDString = 763C22A31AB2DCC000BACA07; 48 | remoteInfo = BingPaper; 49 | }; 50 | /* End PBXContainerItemProxy section */ 51 | 52 | /* Begin PBXCopyFilesBuildPhase section */ 53 | 761FBF331DA780AB00F4409E /* CopyFiles */ = { 54 | isa = PBXCopyFilesBuildPhase; 55 | buildActionMask = 2147483647; 56 | dstPath = Contents/Library/LoginItems; 57 | dstSubfolderSpec = 1; 58 | files = ( 59 | 761FBF6A1DA7826E00F4409E /* BingPaperLoginItem.app in CopyFiles */, 60 | ); 61 | runOnlyForDeploymentPostprocessing = 0; 62 | }; 63 | /* End PBXCopyFilesBuildPhase section */ 64 | 65 | /* Begin PBXFileReference section */ 66 | 7082E9B74124607292FF75C4 /* Pods_BingPaperTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_BingPaperTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 67 | 7602FDFC1B522F8000E6EC7D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/StatusBarView.xib; sourceTree = ""; }; 68 | 7602FE021B526EC900E6EC7D /* BingPictureManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BingPictureManager.swift; sourceTree = ""; }; 69 | 7602FE041B52961D00E6EC7D /* BingPaper.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = BingPaper.playground; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; 70 | 761A8E8D1DAA402100C69356 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/GeneralPreferencesView.strings"; sourceTree = ""; }; 71 | 761FBF5D1DA7824F00F4409E /* BingPaperLoginItem.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BingPaperLoginItem.app; sourceTree = BUILT_PRODUCTS_DIR; }; 72 | 761FBF5F1DA7824F00F4409E /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 73 | 761FBF661DA7824F00F4409E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 74 | 761FBF7C1DA78A6500F4409E /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 75 | 761FBF7E1DA78B1600F4409E /* BingPaperLoginItem.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BingPaperLoginItem.xib; sourceTree = ""; }; 76 | 761FBF851DA78F1300F4409E /* BingPaperLoginItemTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BingPaperLoginItemTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 77 | 761FBF871DA78F1300F4409E /* BingPaperLoginItemTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BingPaperLoginItemTests.swift; sourceTree = ""; }; 78 | 761FBF891DA78F1400F4409E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 79 | 763C22A41AB2DCC000BACA07 /* BingPaper.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BingPaper.app; sourceTree = BUILT_PRODUCTS_DIR; }; 80 | 763C22A81AB2DCC000BACA07 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 81 | 763C22A91AB2DCC000BACA07 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 82 | 763C22AD1AB2DCC000BACA07 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 83 | 763C22B61AB2DCC000BACA07 /* BingPaperTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BingPaperTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 84 | 763C22BB1AB2DCC000BACA07 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 85 | 763C22BC1AB2DCC000BACA07 /* BingPaperTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BingPaperTests.swift; sourceTree = ""; }; 86 | 763C22CA1AB2E48400BACA07 /* StatusBarView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusBarView.swift; sourceTree = ""; }; 87 | 763E701A1DA7FA06008AC2E6 /* MenuItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MenuItem.swift; sourceTree = ""; }; 88 | 763E701D1DA7FDBE008AC2E6 /* PopUpButtonCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PopUpButtonCell.swift; sourceTree = ""; }; 89 | 767B02BC1D9B99D2003BBC47 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; }; 90 | 767B02BF1D9B99D6003BBC47 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; 91 | 767B02C11D9B9CC4003BBC47 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = Base; path = Base.lproj/Credits.rtf; sourceTree = ""; }; 92 | 767B02C31D9BB318003BBC47 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/AboutPreferencesView.xib; sourceTree = ""; }; 93 | 767B02C61D9BB31A003BBC47 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/AboutPreferencesView.strings"; sourceTree = ""; }; 94 | 767B02C91D9BC4F6003BBC47 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/GeneralPreferencesView.xib; sourceTree = ""; }; 95 | 767B02CE1D9BC62E003BBC47 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/StatusBarView.strings"; sourceTree = ""; }; 96 | 76904C131D8257DE0076C399 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = "zh-Hans"; path = "zh-Hans.lproj/Credits.rtf"; sourceTree = ""; }; 97 | 7695AB2C1D9AB363006CA215 /* GeneralPreferencesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneralPreferencesViewController.swift; sourceTree = ""; }; 98 | 7695AB2E1D9AB388006CA215 /* AboutPreferencesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AboutPreferencesViewController.swift; sourceTree = ""; }; 99 | 769EC31B1D9BF7E7001F7CBC /* Shared.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Shared.swift; sourceTree = ""; }; 100 | 76D0BB5E1DA7955F006716F2 /* BingPaper.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = BingPaper.entitlements; sourceTree = ""; }; 101 | 76D0BB5F1DA7957C006716F2 /* BingPaperLoginItem.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; name = BingPaperLoginItem.entitlements; path = BingPaperLoginItemTests/BingPaperLoginItem.entitlements; sourceTree = SOURCE_ROOT; }; 102 | 76FB444C1AB2F82F0088432F /* StatusBarViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusBarViewController.swift; sourceTree = ""; }; 103 | 89CAAB9C49B322AE3723A34D /* Pods_BingPaper.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_BingPaper.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 104 | 948600370E83C7A1EA54FA4D /* Pods-BingPaperTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BingPaperTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-BingPaperTests/Pods-BingPaperTests.release.xcconfig"; sourceTree = ""; }; 105 | AA072B2BC6186C48BEFCA9F7 /* Pods-BingPaper.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BingPaper.release.xcconfig"; path = "Pods/Target Support Files/Pods-BingPaper/Pods-BingPaper.release.xcconfig"; sourceTree = ""; }; 106 | B3462F8D6EF74A5A88299BB9 /* Pods-BingPaper.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BingPaper.debug.xcconfig"; path = "Pods/Target Support Files/Pods-BingPaper/Pods-BingPaper.debug.xcconfig"; sourceTree = ""; }; 107 | F28A1DC1EC2F3D8A4E2CD43D /* Pods-BingPaperTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BingPaperTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-BingPaperTests/Pods-BingPaperTests.debug.xcconfig"; sourceTree = ""; }; 108 | /* End PBXFileReference section */ 109 | 110 | /* Begin PBXFrameworksBuildPhase section */ 111 | 761FBF5A1DA7824F00F4409E /* Frameworks */ = { 112 | isa = PBXFrameworksBuildPhase; 113 | buildActionMask = 2147483647; 114 | files = ( 115 | ); 116 | runOnlyForDeploymentPostprocessing = 0; 117 | }; 118 | 761FBF821DA78F1300F4409E /* Frameworks */ = { 119 | isa = PBXFrameworksBuildPhase; 120 | buildActionMask = 2147483647; 121 | files = ( 122 | ); 123 | runOnlyForDeploymentPostprocessing = 0; 124 | }; 125 | 763C22A11AB2DCC000BACA07 /* Frameworks */ = { 126 | isa = PBXFrameworksBuildPhase; 127 | buildActionMask = 2147483647; 128 | files = ( 129 | 13F210EC88189653FA3C8CCB /* Pods_BingPaper.framework in Frameworks */, 130 | ); 131 | runOnlyForDeploymentPostprocessing = 0; 132 | }; 133 | 763C22B31AB2DCC000BACA07 /* Frameworks */ = { 134 | isa = PBXFrameworksBuildPhase; 135 | buildActionMask = 2147483647; 136 | files = ( 137 | ED32B9DA9675D670B387772F /* Pods_BingPaperTests.framework in Frameworks */, 138 | ); 139 | runOnlyForDeploymentPostprocessing = 0; 140 | }; 141 | /* End PBXFrameworksBuildPhase section */ 142 | 143 | /* Begin PBXGroup section */ 144 | 2E03EE642DA655B323D59E13 /* Pods */ = { 145 | isa = PBXGroup; 146 | children = ( 147 | B3462F8D6EF74A5A88299BB9 /* Pods-BingPaper.debug.xcconfig */, 148 | AA072B2BC6186C48BEFCA9F7 /* Pods-BingPaper.release.xcconfig */, 149 | F28A1DC1EC2F3D8A4E2CD43D /* Pods-BingPaperTests.debug.xcconfig */, 150 | 948600370E83C7A1EA54FA4D /* Pods-BingPaperTests.release.xcconfig */, 151 | ); 152 | name = Pods; 153 | sourceTree = ""; 154 | }; 155 | 761FBF5E1DA7824F00F4409E /* BingPaperLoginItem */ = { 156 | isa = PBXGroup; 157 | children = ( 158 | 761FBF5F1DA7824F00F4409E /* AppDelegate.swift */, 159 | 761FBF7E1DA78B1600F4409E /* BingPaperLoginItem.xib */, 160 | 761FBF901DA790DD00F4409E /* Supporting Files */, 161 | ); 162 | path = BingPaperLoginItem; 163 | sourceTree = ""; 164 | }; 165 | 761FBF861DA78F1300F4409E /* BingPaperLoginItemTests */ = { 166 | isa = PBXGroup; 167 | children = ( 168 | 761FBF871DA78F1300F4409E /* BingPaperLoginItemTests.swift */, 169 | 761FBF8F1DA790CB00F4409E /* Supporting Files */, 170 | ); 171 | path = BingPaperLoginItemTests; 172 | sourceTree = ""; 173 | }; 174 | 761FBF8F1DA790CB00F4409E /* Supporting Files */ = { 175 | isa = PBXGroup; 176 | children = ( 177 | 761FBF891DA78F1400F4409E /* Info.plist */, 178 | ); 179 | name = "Supporting Files"; 180 | sourceTree = ""; 181 | }; 182 | 761FBF901DA790DD00F4409E /* Supporting Files */ = { 183 | isa = PBXGroup; 184 | children = ( 185 | 761FBF7C1DA78A6500F4409E /* Images.xcassets */, 186 | 761FBF661DA7824F00F4409E /* Info.plist */, 187 | 76D0BB5F1DA7957C006716F2 /* BingPaperLoginItem.entitlements */, 188 | ); 189 | name = "Supporting Files"; 190 | sourceTree = ""; 191 | }; 192 | 763C229B1AB2DCC000BACA07 = { 193 | isa = PBXGroup; 194 | children = ( 195 | 7602FE041B52961D00E6EC7D /* BingPaper.playground */, 196 | 763C22A61AB2DCC000BACA07 /* BingPaper */, 197 | 763C22B91AB2DCC000BACA07 /* BingPaperTests */, 198 | 761FBF5E1DA7824F00F4409E /* BingPaperLoginItem */, 199 | 761FBF861DA78F1300F4409E /* BingPaperLoginItemTests */, 200 | 763C22A51AB2DCC000BACA07 /* Products */, 201 | 2E03EE642DA655B323D59E13 /* Pods */, 202 | B677810806D566C866F5FE61 /* Frameworks */, 203 | ); 204 | sourceTree = ""; 205 | wrapsLines = 0; 206 | }; 207 | 763C22A51AB2DCC000BACA07 /* Products */ = { 208 | isa = PBXGroup; 209 | children = ( 210 | 763C22A41AB2DCC000BACA07 /* BingPaper.app */, 211 | 763C22B61AB2DCC000BACA07 /* BingPaperTests.xctest */, 212 | 761FBF5D1DA7824F00F4409E /* BingPaperLoginItem.app */, 213 | 761FBF851DA78F1300F4409E /* BingPaperLoginItemTests.xctest */, 214 | ); 215 | name = Products; 216 | sourceTree = ""; 217 | }; 218 | 763C22A61AB2DCC000BACA07 /* BingPaper */ = { 219 | isa = PBXGroup; 220 | children = ( 221 | 763C22A91AB2DCC000BACA07 /* AppDelegate.swift */, 222 | 76C618251D92C4BA00D98E38 /* Core */, 223 | 76904C1A1D83EB5F0076C399 /* StatusBar */, 224 | 76904C1B1D83EBD50076C399 /* Preferences */, 225 | 763E701C1DA7FAB3008AC2E6 /* Override Basic */, 226 | 763C22A71AB2DCC000BACA07 /* Supporting Files */, 227 | ); 228 | path = BingPaper; 229 | sourceTree = ""; 230 | }; 231 | 763C22A71AB2DCC000BACA07 /* Supporting Files */ = { 232 | isa = PBXGroup; 233 | children = ( 234 | 763C22AD1AB2DCC000BACA07 /* Images.xcassets */, 235 | 763C22A81AB2DCC000BACA07 /* Info.plist */, 236 | 7602FE071B52BEF000E6EC7D /* Credits.rtf */, 237 | 767B02BD1D9B99D2003BBC47 /* Localizable.strings */, 238 | 76D0BB5E1DA7955F006716F2 /* BingPaper.entitlements */, 239 | ); 240 | name = "Supporting Files"; 241 | sourceTree = ""; 242 | }; 243 | 763C22B91AB2DCC000BACA07 /* BingPaperTests */ = { 244 | isa = PBXGroup; 245 | children = ( 246 | 763C22BC1AB2DCC000BACA07 /* BingPaperTests.swift */, 247 | 763C22BA1AB2DCC000BACA07 /* Supporting Files */, 248 | ); 249 | path = BingPaperTests; 250 | sourceTree = ""; 251 | }; 252 | 763C22BA1AB2DCC000BACA07 /* Supporting Files */ = { 253 | isa = PBXGroup; 254 | children = ( 255 | 763C22BB1AB2DCC000BACA07 /* Info.plist */, 256 | ); 257 | name = "Supporting Files"; 258 | sourceTree = ""; 259 | }; 260 | 763E701C1DA7FAB3008AC2E6 /* Override Basic */ = { 261 | isa = PBXGroup; 262 | children = ( 263 | 763E701A1DA7FA06008AC2E6 /* MenuItem.swift */, 264 | 763E701D1DA7FDBE008AC2E6 /* PopUpButtonCell.swift */, 265 | ); 266 | name = "Override Basic"; 267 | sourceTree = ""; 268 | }; 269 | 76904C1A1D83EB5F0076C399 /* StatusBar */ = { 270 | isa = PBXGroup; 271 | children = ( 272 | 7602FDFB1B522F7300E6EC7D /* StatusBarView.xib */, 273 | 763C22CA1AB2E48400BACA07 /* StatusBarView.swift */, 274 | 76FB444C1AB2F82F0088432F /* StatusBarViewController.swift */, 275 | ); 276 | name = StatusBar; 277 | sourceTree = ""; 278 | }; 279 | 76904C1B1D83EBD50076C399 /* Preferences */ = { 280 | isa = PBXGroup; 281 | children = ( 282 | 767B02CA1D9BC4F6003BBC47 /* GeneralPreferencesView.xib */, 283 | 7695AB2C1D9AB363006CA215 /* GeneralPreferencesViewController.swift */, 284 | 767B02C41D9BB318003BBC47 /* AboutPreferencesView.xib */, 285 | 7695AB2E1D9AB388006CA215 /* AboutPreferencesViewController.swift */, 286 | ); 287 | name = Preferences; 288 | sourceTree = ""; 289 | }; 290 | 76C618251D92C4BA00D98E38 /* Core */ = { 291 | isa = PBXGroup; 292 | children = ( 293 | 769EC31B1D9BF7E7001F7CBC /* Shared.swift */, 294 | 7602FE021B526EC900E6EC7D /* BingPictureManager.swift */, 295 | ); 296 | name = Core; 297 | sourceTree = ""; 298 | }; 299 | B677810806D566C866F5FE61 /* Frameworks */ = { 300 | isa = PBXGroup; 301 | children = ( 302 | 89CAAB9C49B322AE3723A34D /* Pods_BingPaper.framework */, 303 | 7082E9B74124607292FF75C4 /* Pods_BingPaperTests.framework */, 304 | ); 305 | name = Frameworks; 306 | sourceTree = ""; 307 | }; 308 | /* End PBXGroup section */ 309 | 310 | /* Begin PBXNativeTarget section */ 311 | 761FBF5C1DA7824F00F4409E /* BingPaperLoginItem */ = { 312 | isa = PBXNativeTarget; 313 | buildConfigurationList = 761FBF671DA7824F00F4409E /* Build configuration list for PBXNativeTarget "BingPaperLoginItem" */; 314 | buildPhases = ( 315 | 761FBF591DA7824F00F4409E /* Sources */, 316 | 761FBF5A1DA7824F00F4409E /* Frameworks */, 317 | 761FBF5B1DA7824F00F4409E /* Resources */, 318 | ); 319 | buildRules = ( 320 | ); 321 | dependencies = ( 322 | ); 323 | name = BingPaperLoginItem; 324 | productName = BingPaperLoginItem; 325 | productReference = 761FBF5D1DA7824F00F4409E /* BingPaperLoginItem.app */; 326 | productType = "com.apple.product-type.application"; 327 | }; 328 | 761FBF841DA78F1300F4409E /* BingPaperLoginItemTests */ = { 329 | isa = PBXNativeTarget; 330 | buildConfigurationList = 761FBF8C1DA78F1400F4409E /* Build configuration list for PBXNativeTarget "BingPaperLoginItemTests" */; 331 | buildPhases = ( 332 | 761FBF811DA78F1300F4409E /* Sources */, 333 | 761FBF821DA78F1300F4409E /* Frameworks */, 334 | 761FBF831DA78F1300F4409E /* Resources */, 335 | ); 336 | buildRules = ( 337 | ); 338 | dependencies = ( 339 | 761FBF8B1DA78F1400F4409E /* PBXTargetDependency */, 340 | ); 341 | name = BingPaperLoginItemTests; 342 | productName = BingPaperLoginItemTests; 343 | productReference = 761FBF851DA78F1300F4409E /* BingPaperLoginItemTests.xctest */; 344 | productType = "com.apple.product-type.bundle.unit-test"; 345 | }; 346 | 763C22A31AB2DCC000BACA07 /* BingPaper */ = { 347 | isa = PBXNativeTarget; 348 | buildConfigurationList = 763C22C01AB2DCC000BACA07 /* Build configuration list for PBXNativeTarget "BingPaper" */; 349 | buildPhases = ( 350 | 605B15CE0A3F8E4E44964224 /* [CP] Check Pods Manifest.lock */, 351 | 763C22A01AB2DCC000BACA07 /* Sources */, 352 | 763C22A11AB2DCC000BACA07 /* Frameworks */, 353 | 763C22A21AB2DCC000BACA07 /* Resources */, 354 | 761FBF331DA780AB00F4409E /* CopyFiles */, 355 | 2748003AFB0F47C15CA172C2 /* [CP] Embed Pods Frameworks */, 356 | ); 357 | buildRules = ( 358 | ); 359 | dependencies = ( 360 | ); 361 | name = BingPaper; 362 | productName = BingPaper; 363 | productReference = 763C22A41AB2DCC000BACA07 /* BingPaper.app */; 364 | productType = "com.apple.product-type.application"; 365 | }; 366 | 763C22B51AB2DCC000BACA07 /* BingPaperTests */ = { 367 | isa = PBXNativeTarget; 368 | buildConfigurationList = 763C22C31AB2DCC000BACA07 /* Build configuration list for PBXNativeTarget "BingPaperTests" */; 369 | buildPhases = ( 370 | 889E05C623D0AA8A26C3554A /* [CP] Check Pods Manifest.lock */, 371 | 763C22B21AB2DCC000BACA07 /* Sources */, 372 | 763C22B31AB2DCC000BACA07 /* Frameworks */, 373 | 763C22B41AB2DCC000BACA07 /* Resources */, 374 | ); 375 | buildRules = ( 376 | ); 377 | dependencies = ( 378 | 763C22B81AB2DCC000BACA07 /* PBXTargetDependency */, 379 | ); 380 | name = BingPaperTests; 381 | productName = BingPaperTests; 382 | productReference = 763C22B61AB2DCC000BACA07 /* BingPaperTests.xctest */; 383 | productType = "com.apple.product-type.bundle.unit-test"; 384 | }; 385 | /* End PBXNativeTarget section */ 386 | 387 | /* Begin PBXProject section */ 388 | 763C229C1AB2DCC000BACA07 /* Project object */ = { 389 | isa = PBXProject; 390 | attributes = { 391 | LastSwiftMigration = 0730; 392 | LastSwiftUpdateCheck = 0800; 393 | LastUpgradeCheck = 1140; 394 | ORGANIZATIONNAME = "Peng Jingwen"; 395 | TargetAttributes = { 396 | 761FBF5C1DA7824F00F4409E = { 397 | CreatedOnToolsVersion = 8.0; 398 | ProvisioningStyle = Automatic; 399 | SystemCapabilities = { 400 | com.apple.Sandbox = { 401 | enabled = 1; 402 | }; 403 | }; 404 | }; 405 | 761FBF841DA78F1300F4409E = { 406 | CreatedOnToolsVersion = 8.0; 407 | ProvisioningStyle = Automatic; 408 | TestTargetID = 761FBF5C1DA7824F00F4409E; 409 | }; 410 | 763C22A31AB2DCC000BACA07 = { 411 | CreatedOnToolsVersion = 6.2; 412 | LastSwiftMigration = 0800; 413 | ProvisioningStyle = Automatic; 414 | SystemCapabilities = { 415 | com.apple.Sandbox = { 416 | enabled = 0; 417 | }; 418 | com.apple.iCloud = { 419 | enabled = 0; 420 | }; 421 | }; 422 | }; 423 | 763C22B51AB2DCC000BACA07 = { 424 | CreatedOnToolsVersion = 6.2; 425 | LastSwiftMigration = 0800; 426 | TestTargetID = 763C22A31AB2DCC000BACA07; 427 | }; 428 | }; 429 | }; 430 | buildConfigurationList = 763C229F1AB2DCC000BACA07 /* Build configuration list for PBXProject "BingPaper" */; 431 | compatibilityVersion = "Xcode 8.0"; 432 | developmentRegion = en; 433 | hasScannedForEncodings = 0; 434 | knownRegions = ( 435 | en, 436 | Base, 437 | "zh-Hans", 438 | ); 439 | mainGroup = 763C229B1AB2DCC000BACA07; 440 | productRefGroup = 763C22A51AB2DCC000BACA07 /* Products */; 441 | projectDirPath = ""; 442 | projectRoot = ""; 443 | targets = ( 444 | 763C22A31AB2DCC000BACA07 /* BingPaper */, 445 | 763C22B51AB2DCC000BACA07 /* BingPaperTests */, 446 | 761FBF5C1DA7824F00F4409E /* BingPaperLoginItem */, 447 | 761FBF841DA78F1300F4409E /* BingPaperLoginItemTests */, 448 | ); 449 | }; 450 | /* End PBXProject section */ 451 | 452 | /* Begin PBXResourcesBuildPhase section */ 453 | 761FBF5B1DA7824F00F4409E /* Resources */ = { 454 | isa = PBXResourcesBuildPhase; 455 | buildActionMask = 2147483647; 456 | files = ( 457 | 761FBF7D1DA78A6500F4409E /* Images.xcassets in Resources */, 458 | 761FBF7F1DA78B1600F4409E /* BingPaperLoginItem.xib in Resources */, 459 | ); 460 | runOnlyForDeploymentPostprocessing = 0; 461 | }; 462 | 761FBF831DA78F1300F4409E /* Resources */ = { 463 | isa = PBXResourcesBuildPhase; 464 | buildActionMask = 2147483647; 465 | files = ( 466 | ); 467 | runOnlyForDeploymentPostprocessing = 0; 468 | }; 469 | 763C22A21AB2DCC000BACA07 /* Resources */ = { 470 | isa = PBXResourcesBuildPhase; 471 | buildActionMask = 2147483647; 472 | files = ( 473 | 767B02C21D9BB318003BBC47 /* AboutPreferencesView.xib in Resources */, 474 | 767B02C81D9BC4F6003BBC47 /* GeneralPreferencesView.xib in Resources */, 475 | 763C22AE1AB2DCC000BACA07 /* Images.xcassets in Resources */, 476 | 7602FDF91B522F7300E6EC7D /* StatusBarView.xib in Resources */, 477 | 7602FE051B52BEF000E6EC7D /* Credits.rtf in Resources */, 478 | 767B02BB1D9B99D2003BBC47 /* Localizable.strings in Resources */, 479 | ); 480 | runOnlyForDeploymentPostprocessing = 0; 481 | }; 482 | 763C22B41AB2DCC000BACA07 /* Resources */ = { 483 | isa = PBXResourcesBuildPhase; 484 | buildActionMask = 2147483647; 485 | files = ( 486 | ); 487 | runOnlyForDeploymentPostprocessing = 0; 488 | }; 489 | /* End PBXResourcesBuildPhase section */ 490 | 491 | /* Begin PBXShellScriptBuildPhase section */ 492 | 2748003AFB0F47C15CA172C2 /* [CP] Embed Pods Frameworks */ = { 493 | isa = PBXShellScriptBuildPhase; 494 | buildActionMask = 2147483647; 495 | files = ( 496 | ); 497 | inputPaths = ( 498 | "${PODS_ROOT}/Target Support Files/Pods-BingPaper/Pods-BingPaper-frameworks.sh", 499 | "${BUILT_PRODUCTS_DIR}/MASPreferences/MASPreferences.framework", 500 | ); 501 | name = "[CP] Embed Pods Frameworks"; 502 | outputPaths = ( 503 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MASPreferences.framework", 504 | ); 505 | runOnlyForDeploymentPostprocessing = 0; 506 | shellPath = /bin/sh; 507 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-BingPaper/Pods-BingPaper-frameworks.sh\"\n"; 508 | showEnvVarsInLog = 0; 509 | }; 510 | 605B15CE0A3F8E4E44964224 /* [CP] Check Pods Manifest.lock */ = { 511 | isa = PBXShellScriptBuildPhase; 512 | buildActionMask = 2147483647; 513 | files = ( 514 | ); 515 | inputPaths = ( 516 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 517 | "${PODS_ROOT}/Manifest.lock", 518 | ); 519 | name = "[CP] Check Pods Manifest.lock"; 520 | outputPaths = ( 521 | "$(DERIVED_FILE_DIR)/Pods-BingPaper-checkManifestLockResult.txt", 522 | ); 523 | runOnlyForDeploymentPostprocessing = 0; 524 | shellPath = /bin/sh; 525 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 526 | showEnvVarsInLog = 0; 527 | }; 528 | 889E05C623D0AA8A26C3554A /* [CP] Check Pods Manifest.lock */ = { 529 | isa = PBXShellScriptBuildPhase; 530 | buildActionMask = 2147483647; 531 | files = ( 532 | ); 533 | inputPaths = ( 534 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 535 | "${PODS_ROOT}/Manifest.lock", 536 | ); 537 | name = "[CP] Check Pods Manifest.lock"; 538 | outputPaths = ( 539 | "$(DERIVED_FILE_DIR)/Pods-BingPaperTests-checkManifestLockResult.txt", 540 | ); 541 | runOnlyForDeploymentPostprocessing = 0; 542 | shellPath = /bin/sh; 543 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 544 | showEnvVarsInLog = 0; 545 | }; 546 | /* End PBXShellScriptBuildPhase section */ 547 | 548 | /* Begin PBXSourcesBuildPhase section */ 549 | 761FBF591DA7824F00F4409E /* Sources */ = { 550 | isa = PBXSourcesBuildPhase; 551 | buildActionMask = 2147483647; 552 | files = ( 553 | 761FBF601DA7824F00F4409E /* AppDelegate.swift in Sources */, 554 | ); 555 | runOnlyForDeploymentPostprocessing = 0; 556 | }; 557 | 761FBF811DA78F1300F4409E /* Sources */ = { 558 | isa = PBXSourcesBuildPhase; 559 | buildActionMask = 2147483647; 560 | files = ( 561 | 761FBF881DA78F1300F4409E /* BingPaperLoginItemTests.swift in Sources */, 562 | ); 563 | runOnlyForDeploymentPostprocessing = 0; 564 | }; 565 | 763C22A01AB2DCC000BACA07 /* Sources */ = { 566 | isa = PBXSourcesBuildPhase; 567 | buildActionMask = 2147483647; 568 | files = ( 569 | 769EC31C1D9BF7E7001F7CBC /* Shared.swift in Sources */, 570 | 7695AB2D1D9AB363006CA215 /* GeneralPreferencesViewController.swift in Sources */, 571 | 7695AB301D9AB388006CA215 /* AboutPreferencesViewController.swift in Sources */, 572 | 763C22CB1AB2E48400BACA07 /* StatusBarView.swift in Sources */, 573 | 76FB444D1AB2F82F0088432F /* StatusBarViewController.swift in Sources */, 574 | 763E701B1DA7FA06008AC2E6 /* MenuItem.swift in Sources */, 575 | 7602FE031B526EC900E6EC7D /* BingPictureManager.swift in Sources */, 576 | 763E701E1DA7FDBE008AC2E6 /* PopUpButtonCell.swift in Sources */, 577 | 763C22AA1AB2DCC000BACA07 /* AppDelegate.swift in Sources */, 578 | ); 579 | runOnlyForDeploymentPostprocessing = 0; 580 | }; 581 | 763C22B21AB2DCC000BACA07 /* Sources */ = { 582 | isa = PBXSourcesBuildPhase; 583 | buildActionMask = 2147483647; 584 | files = ( 585 | 763C22BD1AB2DCC000BACA07 /* BingPaperTests.swift in Sources */, 586 | ); 587 | runOnlyForDeploymentPostprocessing = 0; 588 | }; 589 | /* End PBXSourcesBuildPhase section */ 590 | 591 | /* Begin PBXTargetDependency section */ 592 | 761FBF8B1DA78F1400F4409E /* PBXTargetDependency */ = { 593 | isa = PBXTargetDependency; 594 | target = 761FBF5C1DA7824F00F4409E /* BingPaperLoginItem */; 595 | targetProxy = 761FBF8A1DA78F1400F4409E /* PBXContainerItemProxy */; 596 | }; 597 | 763C22B81AB2DCC000BACA07 /* PBXTargetDependency */ = { 598 | isa = PBXTargetDependency; 599 | target = 763C22A31AB2DCC000BACA07 /* BingPaper */; 600 | targetProxy = 763C22B71AB2DCC000BACA07 /* PBXContainerItemProxy */; 601 | }; 602 | /* End PBXTargetDependency section */ 603 | 604 | /* Begin PBXVariantGroup section */ 605 | 7602FDFB1B522F7300E6EC7D /* StatusBarView.xib */ = { 606 | isa = PBXVariantGroup; 607 | children = ( 608 | 7602FDFC1B522F8000E6EC7D /* Base */, 609 | 767B02CE1D9BC62E003BBC47 /* zh-Hans */, 610 | ); 611 | name = StatusBarView.xib; 612 | sourceTree = ""; 613 | }; 614 | 7602FE071B52BEF000E6EC7D /* Credits.rtf */ = { 615 | isa = PBXVariantGroup; 616 | children = ( 617 | 76904C131D8257DE0076C399 /* zh-Hans */, 618 | 767B02C11D9B9CC4003BBC47 /* Base */, 619 | ); 620 | name = Credits.rtf; 621 | sourceTree = ""; 622 | }; 623 | 767B02BD1D9B99D2003BBC47 /* Localizable.strings */ = { 624 | isa = PBXVariantGroup; 625 | children = ( 626 | 767B02BC1D9B99D2003BBC47 /* Base */, 627 | 767B02BF1D9B99D6003BBC47 /* zh-Hans */, 628 | ); 629 | name = Localizable.strings; 630 | sourceTree = ""; 631 | }; 632 | 767B02C41D9BB318003BBC47 /* AboutPreferencesView.xib */ = { 633 | isa = PBXVariantGroup; 634 | children = ( 635 | 767B02C31D9BB318003BBC47 /* Base */, 636 | 767B02C61D9BB31A003BBC47 /* zh-Hans */, 637 | ); 638 | name = AboutPreferencesView.xib; 639 | sourceTree = ""; 640 | }; 641 | 767B02CA1D9BC4F6003BBC47 /* GeneralPreferencesView.xib */ = { 642 | isa = PBXVariantGroup; 643 | children = ( 644 | 767B02C91D9BC4F6003BBC47 /* Base */, 645 | 761A8E8D1DAA402100C69356 /* zh-Hans */, 646 | ); 647 | name = GeneralPreferencesView.xib; 648 | sourceTree = ""; 649 | }; 650 | /* End PBXVariantGroup section */ 651 | 652 | /* Begin XCBuildConfiguration section */ 653 | 761FBF681DA7824F00F4409E /* Debug */ = { 654 | isa = XCBuildConfiguration; 655 | buildSettings = { 656 | ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon Bing"; 657 | CLANG_ANALYZER_NONNULL = YES; 658 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 659 | CLANG_WARN_SUSPICIOUS_MOVES = YES; 660 | CODE_SIGN_ENTITLEMENTS = BingPaperLoginItemTests/BingPaperLoginItem.entitlements; 661 | CODE_SIGN_IDENTITY = "Mac Developer"; 662 | COMBINE_HIDPI_IMAGES = YES; 663 | CURRENT_PROJECT_VERSION = 45; 664 | DEBUG_INFORMATION_FORMAT = dwarf; 665 | DEVELOPMENT_TEAM = 9AXW95X4H5; 666 | ENABLE_HARDENED_RUNTIME = YES; 667 | INFOPLIST_FILE = BingPaperLoginItem/Info.plist; 668 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 669 | MACOSX_DEPLOYMENT_TARGET = 10.15; 670 | MARKETING_VERSION = 0.10.1; 671 | PRODUCT_BUNDLE_IDENTIFIER = io.pjw.mac.BingPaperLoginItem; 672 | PRODUCT_NAME = "$(TARGET_NAME)"; 673 | SKIP_INSTALL = YES; 674 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 675 | SWIFT_VERSION = 5.0; 676 | }; 677 | name = Debug; 678 | }; 679 | 761FBF691DA7824F00F4409E /* Release */ = { 680 | isa = XCBuildConfiguration; 681 | buildSettings = { 682 | ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon Bing"; 683 | CLANG_ANALYZER_NONNULL = YES; 684 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 685 | CLANG_WARN_SUSPICIOUS_MOVES = YES; 686 | CODE_SIGN_ENTITLEMENTS = BingPaperLoginItemTests/BingPaperLoginItem.entitlements; 687 | CODE_SIGN_IDENTITY = "Mac Developer"; 688 | COMBINE_HIDPI_IMAGES = YES; 689 | CURRENT_PROJECT_VERSION = 45; 690 | DEVELOPMENT_TEAM = 9AXW95X4H5; 691 | ENABLE_HARDENED_RUNTIME = YES; 692 | INFOPLIST_FILE = BingPaperLoginItem/Info.plist; 693 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 694 | MACOSX_DEPLOYMENT_TARGET = 10.15; 695 | MARKETING_VERSION = 0.10.1; 696 | PRODUCT_BUNDLE_IDENTIFIER = io.pjw.mac.BingPaperLoginItem; 697 | PRODUCT_NAME = "$(TARGET_NAME)"; 698 | SKIP_INSTALL = YES; 699 | SWIFT_VERSION = 5.0; 700 | }; 701 | name = Release; 702 | }; 703 | 761FBF8D1DA78F1400F4409E /* Debug */ = { 704 | isa = XCBuildConfiguration; 705 | buildSettings = { 706 | BUNDLE_LOADER = "$(TEST_HOST)"; 707 | CLANG_ANALYZER_NONNULL = YES; 708 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 709 | CLANG_WARN_SUSPICIOUS_MOVES = YES; 710 | CODE_SIGN_IDENTITY = "-"; 711 | COMBINE_HIDPI_IMAGES = YES; 712 | DEBUG_INFORMATION_FORMAT = dwarf; 713 | INFOPLIST_FILE = BingPaperLoginItemTests/Info.plist; 714 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 715 | MACOSX_DEPLOYMENT_TARGET = 10.10; 716 | PRODUCT_BUNDLE_IDENTIFIER = io.pjw.mac.BingPaperLoginItemTests; 717 | PRODUCT_NAME = "$(TARGET_NAME)"; 718 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 719 | SWIFT_VERSION = 5.0; 720 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/BingPaperLoginItem.app/Contents/MacOS/BingPaperLoginItem"; 721 | }; 722 | name = Debug; 723 | }; 724 | 761FBF8E1DA78F1400F4409E /* Release */ = { 725 | isa = XCBuildConfiguration; 726 | buildSettings = { 727 | BUNDLE_LOADER = "$(TEST_HOST)"; 728 | CLANG_ANALYZER_NONNULL = YES; 729 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 730 | CLANG_WARN_SUSPICIOUS_MOVES = YES; 731 | CODE_SIGN_IDENTITY = "-"; 732 | COMBINE_HIDPI_IMAGES = YES; 733 | INFOPLIST_FILE = BingPaperLoginItemTests/Info.plist; 734 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 735 | MACOSX_DEPLOYMENT_TARGET = 10.10; 736 | PRODUCT_BUNDLE_IDENTIFIER = io.pjw.mac.BingPaperLoginItemTests; 737 | PRODUCT_NAME = "$(TARGET_NAME)"; 738 | SWIFT_VERSION = 5.0; 739 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/BingPaperLoginItem.app/Contents/MacOS/BingPaperLoginItem"; 740 | }; 741 | name = Release; 742 | }; 743 | 763C22BE1AB2DCC000BACA07 /* Debug */ = { 744 | isa = XCBuildConfiguration; 745 | buildSettings = { 746 | ALWAYS_SEARCH_USER_PATHS = NO; 747 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 748 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 749 | CLANG_CXX_LIBRARY = "libc++"; 750 | CLANG_ENABLE_MODULES = YES; 751 | CLANG_ENABLE_OBJC_ARC = YES; 752 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 753 | CLANG_WARN_BOOL_CONVERSION = YES; 754 | CLANG_WARN_COMMA = YES; 755 | CLANG_WARN_CONSTANT_CONVERSION = YES; 756 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 757 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 758 | CLANG_WARN_EMPTY_BODY = YES; 759 | CLANG_WARN_ENUM_CONVERSION = YES; 760 | CLANG_WARN_INFINITE_RECURSION = YES; 761 | CLANG_WARN_INT_CONVERSION = YES; 762 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 763 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 764 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 765 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 766 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 767 | CLANG_WARN_STRICT_PROTOTYPES = YES; 768 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 769 | CLANG_WARN_UNREACHABLE_CODE = YES; 770 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 771 | CODE_SIGN_IDENTITY = ""; 772 | COPY_PHASE_STRIP = NO; 773 | ENABLE_STRICT_OBJC_MSGSEND = YES; 774 | ENABLE_TESTABILITY = YES; 775 | GCC_C_LANGUAGE_STANDARD = gnu99; 776 | GCC_DYNAMIC_NO_PIC = NO; 777 | GCC_NO_COMMON_BLOCKS = YES; 778 | GCC_OPTIMIZATION_LEVEL = 0; 779 | GCC_PREPROCESSOR_DEFINITIONS = ( 780 | "DEBUG=1", 781 | "$(inherited)", 782 | ); 783 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 784 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 785 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 786 | GCC_WARN_UNDECLARED_SELECTOR = YES; 787 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 788 | GCC_WARN_UNUSED_FUNCTION = YES; 789 | GCC_WARN_UNUSED_VARIABLE = YES; 790 | MACOSX_DEPLOYMENT_TARGET = 10.10; 791 | MTL_ENABLE_DEBUG_INFO = YES; 792 | ONLY_ACTIVE_ARCH = YES; 793 | SDKROOT = macosx; 794 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 795 | }; 796 | name = Debug; 797 | }; 798 | 763C22BF1AB2DCC000BACA07 /* Release */ = { 799 | isa = XCBuildConfiguration; 800 | buildSettings = { 801 | ALWAYS_SEARCH_USER_PATHS = NO; 802 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 803 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 804 | CLANG_CXX_LIBRARY = "libc++"; 805 | CLANG_ENABLE_MODULES = YES; 806 | CLANG_ENABLE_OBJC_ARC = YES; 807 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 808 | CLANG_WARN_BOOL_CONVERSION = YES; 809 | CLANG_WARN_COMMA = YES; 810 | CLANG_WARN_CONSTANT_CONVERSION = YES; 811 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 812 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 813 | CLANG_WARN_EMPTY_BODY = YES; 814 | CLANG_WARN_ENUM_CONVERSION = YES; 815 | CLANG_WARN_INFINITE_RECURSION = YES; 816 | CLANG_WARN_INT_CONVERSION = YES; 817 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 818 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 819 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 820 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 821 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 822 | CLANG_WARN_STRICT_PROTOTYPES = YES; 823 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 824 | CLANG_WARN_UNREACHABLE_CODE = YES; 825 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 826 | CODE_SIGN_IDENTITY = ""; 827 | COPY_PHASE_STRIP = NO; 828 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 829 | ENABLE_NS_ASSERTIONS = NO; 830 | ENABLE_STRICT_OBJC_MSGSEND = YES; 831 | GCC_C_LANGUAGE_STANDARD = gnu99; 832 | GCC_NO_COMMON_BLOCKS = YES; 833 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 834 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 835 | GCC_WARN_UNDECLARED_SELECTOR = YES; 836 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 837 | GCC_WARN_UNUSED_FUNCTION = YES; 838 | GCC_WARN_UNUSED_VARIABLE = YES; 839 | MACOSX_DEPLOYMENT_TARGET = 10.10; 840 | MTL_ENABLE_DEBUG_INFO = NO; 841 | SDKROOT = macosx; 842 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 843 | }; 844 | name = Release; 845 | }; 846 | 763C22C11AB2DCC000BACA07 /* Debug */ = { 847 | isa = XCBuildConfiguration; 848 | baseConfigurationReference = B3462F8D6EF74A5A88299BB9 /* Pods-BingPaper.debug.xcconfig */; 849 | buildSettings = { 850 | ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon Bing"; 851 | CODE_SIGN_ENTITLEMENTS = BingPaper/BingPaper.entitlements; 852 | CODE_SIGN_IDENTITY = "Apple Development"; 853 | COMBINE_HIDPI_IMAGES = YES; 854 | CURRENT_PROJECT_VERSION = 46; 855 | DEVELOPMENT_TEAM = 9AXW95X4H5; 856 | ENABLE_HARDENED_RUNTIME = YES; 857 | INFOPLIST_FILE = BingPaper/Info.plist; 858 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 859 | MACOSX_DEPLOYMENT_TARGET = 10.15; 860 | MARKETING_VERSION = 0.11.1; 861 | PRODUCT_BUNDLE_IDENTIFIER = io.pjw.mac.BingPaper; 862 | PRODUCT_NAME = "$(TARGET_NAME)"; 863 | SWIFT_VERSION = 5.0; 864 | }; 865 | name = Debug; 866 | }; 867 | 763C22C21AB2DCC000BACA07 /* Release */ = { 868 | isa = XCBuildConfiguration; 869 | baseConfigurationReference = AA072B2BC6186C48BEFCA9F7 /* Pods-BingPaper.release.xcconfig */; 870 | buildSettings = { 871 | ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon Bing"; 872 | CODE_SIGN_ENTITLEMENTS = BingPaper/BingPaper.entitlements; 873 | CODE_SIGN_IDENTITY = "Apple Development"; 874 | COMBINE_HIDPI_IMAGES = YES; 875 | CURRENT_PROJECT_VERSION = 46; 876 | DEVELOPMENT_TEAM = 9AXW95X4H5; 877 | ENABLE_HARDENED_RUNTIME = YES; 878 | INFOPLIST_FILE = BingPaper/Info.plist; 879 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 880 | MACOSX_DEPLOYMENT_TARGET = 10.15; 881 | MARKETING_VERSION = 0.11.1; 882 | PRODUCT_BUNDLE_IDENTIFIER = io.pjw.mac.BingPaper; 883 | PRODUCT_NAME = "$(TARGET_NAME)"; 884 | SWIFT_VERSION = 5.0; 885 | }; 886 | name = Release; 887 | }; 888 | 763C22C41AB2DCC000BACA07 /* Debug */ = { 889 | isa = XCBuildConfiguration; 890 | baseConfigurationReference = F28A1DC1EC2F3D8A4E2CD43D /* Pods-BingPaperTests.debug.xcconfig */; 891 | buildSettings = { 892 | BUNDLE_LOADER = "$(TEST_HOST)"; 893 | CODE_SIGN_IDENTITY = "-"; 894 | COMBINE_HIDPI_IMAGES = YES; 895 | FRAMEWORK_SEARCH_PATHS = ( 896 | "$(DEVELOPER_FRAMEWORKS_DIR)", 897 | "$(inherited)", 898 | ); 899 | GCC_PREPROCESSOR_DEFINITIONS = ( 900 | "DEBUG=1", 901 | "$(inherited)", 902 | ); 903 | INFOPLIST_FILE = BingPaperTests/Info.plist; 904 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 905 | PRODUCT_BUNDLE_IDENTIFIER = "io.pjw.mac.$(PRODUCT_NAME:rfc1034identifier)"; 906 | PRODUCT_NAME = "$(TARGET_NAME)"; 907 | SWIFT_VERSION = 5.0; 908 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/BingPaper.app/Contents/MacOS/BingPaper"; 909 | }; 910 | name = Debug; 911 | }; 912 | 763C22C51AB2DCC000BACA07 /* Release */ = { 913 | isa = XCBuildConfiguration; 914 | baseConfigurationReference = 948600370E83C7A1EA54FA4D /* Pods-BingPaperTests.release.xcconfig */; 915 | buildSettings = { 916 | BUNDLE_LOADER = "$(TEST_HOST)"; 917 | CODE_SIGN_IDENTITY = "-"; 918 | COMBINE_HIDPI_IMAGES = YES; 919 | FRAMEWORK_SEARCH_PATHS = ( 920 | "$(DEVELOPER_FRAMEWORKS_DIR)", 921 | "$(inherited)", 922 | ); 923 | INFOPLIST_FILE = BingPaperTests/Info.plist; 924 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 925 | PRODUCT_BUNDLE_IDENTIFIER = "io.pjw.mac.$(PRODUCT_NAME:rfc1034identifier)"; 926 | PRODUCT_NAME = "$(TARGET_NAME)"; 927 | SWIFT_VERSION = 5.0; 928 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/BingPaper.app/Contents/MacOS/BingPaper"; 929 | }; 930 | name = Release; 931 | }; 932 | /* End XCBuildConfiguration section */ 933 | 934 | /* Begin XCConfigurationList section */ 935 | 761FBF671DA7824F00F4409E /* Build configuration list for PBXNativeTarget "BingPaperLoginItem" */ = { 936 | isa = XCConfigurationList; 937 | buildConfigurations = ( 938 | 761FBF681DA7824F00F4409E /* Debug */, 939 | 761FBF691DA7824F00F4409E /* Release */, 940 | ); 941 | defaultConfigurationIsVisible = 0; 942 | defaultConfigurationName = Release; 943 | }; 944 | 761FBF8C1DA78F1400F4409E /* Build configuration list for PBXNativeTarget "BingPaperLoginItemTests" */ = { 945 | isa = XCConfigurationList; 946 | buildConfigurations = ( 947 | 761FBF8D1DA78F1400F4409E /* Debug */, 948 | 761FBF8E1DA78F1400F4409E /* Release */, 949 | ); 950 | defaultConfigurationIsVisible = 0; 951 | defaultConfigurationName = Release; 952 | }; 953 | 763C229F1AB2DCC000BACA07 /* Build configuration list for PBXProject "BingPaper" */ = { 954 | isa = XCConfigurationList; 955 | buildConfigurations = ( 956 | 763C22BE1AB2DCC000BACA07 /* Debug */, 957 | 763C22BF1AB2DCC000BACA07 /* Release */, 958 | ); 959 | defaultConfigurationIsVisible = 0; 960 | defaultConfigurationName = Release; 961 | }; 962 | 763C22C01AB2DCC000BACA07 /* Build configuration list for PBXNativeTarget "BingPaper" */ = { 963 | isa = XCConfigurationList; 964 | buildConfigurations = ( 965 | 763C22C11AB2DCC000BACA07 /* Debug */, 966 | 763C22C21AB2DCC000BACA07 /* Release */, 967 | ); 968 | defaultConfigurationIsVisible = 0; 969 | defaultConfigurationName = Release; 970 | }; 971 | 763C22C31AB2DCC000BACA07 /* Build configuration list for PBXNativeTarget "BingPaperTests" */ = { 972 | isa = XCConfigurationList; 973 | buildConfigurations = ( 974 | 763C22C41AB2DCC000BACA07 /* Debug */, 975 | 763C22C51AB2DCC000BACA07 /* Release */, 976 | ); 977 | defaultConfigurationIsVisible = 0; 978 | defaultConfigurationName = Release; 979 | }; 980 | /* End XCConfigurationList section */ 981 | }; 982 | rootObject = 763C229C1AB2DCC000BACA07 /* Project object */; 983 | } 984 | -------------------------------------------------------------------------------- /BingPaper.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /BingPaper.xcodeproj/project.xcworkspace/xcshareddata/BingPaper.xccheckout: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDESourceControlProjectFavoriteDictionaryKey 6 | 7 | IDESourceControlProjectIdentifier 8 | 9CDD46C7-8C1C-425E-BE44-7D22398A2DE2 9 | IDESourceControlProjectName 10 | BingPaper 11 | IDESourceControlProjectOriginsDictionary 12 | 13 | C5FCA44F01B362C61930A33E2A8DE7B664433B4A 14 | github.com:pengsrc/BingPaper.git 15 | 16 | IDESourceControlProjectPath 17 | BingPaper.xcodeproj 18 | IDESourceControlProjectRelativeInstallPathDictionary 19 | 20 | C5FCA44F01B362C61930A33E2A8DE7B664433B4A 21 | ../.. 22 | 23 | IDESourceControlProjectURL 24 | github.com:pengsrc/BingPaper.git 25 | IDESourceControlProjectVersion 26 | 111 27 | IDESourceControlProjectWCCIdentifier 28 | C5FCA44F01B362C61930A33E2A8DE7B664433B4A 29 | IDESourceControlProjectWCConfigurations 30 | 31 | 32 | IDESourceControlRepositoryExtensionIdentifierKey 33 | public.vcs.git 34 | IDESourceControlWCCIdentifierKey 35 | C5FCA44F01B362C61930A33E2A8DE7B664433B4A 36 | IDESourceControlWCCName 37 | BingPaper 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /BingPaper.xcodeproj/xcshareddata/xcschemes/BingPaper.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 53 | 55 | 61 | 62 | 63 | 64 | 70 | 72 | 78 | 79 | 80 | 81 | 83 | 84 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /BingPaper.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /BingPaper.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /BingPaper/AboutPreferencesViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AboutPreferencesViewController.swift 3 | // BingPaper 4 | // 5 | // Created by Jingwen Peng on 2016-09-27. 6 | // Copyright © 2016 Jingwen Peng. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | import MASPreferences 11 | 12 | class AboutPreferencesViewController: NSViewController, MASPreferencesViewController { 13 | 14 | var viewIdentifier: String = "About" 15 | var toolbarItemImage: NSImage? = #imageLiteral(resourceName: "Envolope") 16 | var toolbarItemLabel: String? = NSLocalizedString("About", comment: "N/A") 17 | 18 | @IBOutlet weak var versionAndBuildString: NSTextField! 19 | 20 | required init?(coder: NSCoder) { 21 | fatalError("init(coder:) has not been implemented") 22 | } 23 | 24 | init() { 25 | super.init(nibName: "AboutPreferencesView", bundle: Bundle()) 26 | } 27 | 28 | override func viewDidLoad() { 29 | super.viewDidLoad() 30 | 31 | loadStrings() 32 | } 33 | 34 | func loadStrings() { 35 | let prefix = "\(NSLocalizedString("Version", comment: "N/A")): " 36 | let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] 37 | let build = Bundle.main.infoDictionary?["CFBundleVersion"] 38 | 39 | versionAndBuildString.stringValue = "\(prefix)\(version!) (\(build!))" 40 | } 41 | 42 | @IBAction func openEmail(_ sender: NSButton) { 43 | NSWorkspace.shared.open(NSURL(string: "mailto:hi@pjw.io")! as URL) 44 | } 45 | 46 | @IBAction func openWebsite(_ sender: NSButton) { 47 | NSWorkspace.shared.open(NSURL(string: "https://pjw.io")! as URL) 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /BingPaper/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // BingPaper 4 | // 5 | // Created by Jingwen Peng on 2015-03-13. 6 | // Copyright (c) 2015 Jingwen Peng. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | @NSApplicationMain 12 | class AppDelegate: NSObject, NSApplicationDelegate { 13 | 14 | @IBOutlet weak var popover: NSPopover! 15 | 16 | override func awakeFromNib(){ 17 | 18 | let statusBarItem = NSStatusBar.system.statusItem(withLength: -1); 19 | 20 | statusBarItem.view = StatusBarView(image: #imageLiteral(resourceName: "StatusBarIcon"), statusItem: statusBarItem, popover: self.popover) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /BingPaper/Base.lproj/AboutPreferencesView.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 94 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | -------------------------------------------------------------------------------- /BingPaper/Base.lproj/Credits.rtf: -------------------------------------------------------------------------------- 1 | {\rtf1\ansi\ansicpg936\cocoartf1504 2 | {\fonttbl\f0\fnil\fcharset134 PingFangSC-Regular;} 3 | {\colortbl;\red255\green255\blue255;} 4 | {\*\expandedcolortbl;\csgray\c100000;} 5 | \vieww9600\viewh8400\viewkind0 6 | \pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\qc\partightenfactor0 7 | 8 | \f0\fs22 \cf0 Email: hi@pjw.io\ 9 | \pard\tx566\tx1133\tx1592\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\qc\partightenfactor0 10 | \cf0 Website: {\field{\*\fldinst{HYPERLINK "https://pjw.io"}}{\fldrslt https://pjw.io}}} -------------------------------------------------------------------------------- /BingPaper/Base.lproj/GeneralPreferencesView.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 67 | 78 | 89 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 159 | 170 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | -------------------------------------------------------------------------------- /BingPaper/Base.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | Localizable.strings 3 | BingPaper 4 | 5 | Created by Jingwen Peng on 2016-09-28. 6 | Copyright © 2016 Jingwen Peng. All rights reserved. 7 | */ 8 | 9 | "BingPaper Preferences" = "BingPaper Preferences"; 10 | 11 | "General" = "General"; 12 | "About" = "About"; 13 | 14 | "Version" = "Version"; 15 | 16 | "Reset Warning" = "Reset Warning"; 17 | "Are you sure to reset you would like to reset the preferences?" = "Are you sure to reset you would like to reset the preferences?"; 18 | "Reset" = "Reset"; 19 | "Cancel" = "Cancel"; 20 | 21 | "Fetching..." = "Fetching..."; 22 | -------------------------------------------------------------------------------- /BingPaper/Base.lproj/StatusBarView.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 31 | 42 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 73 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 104 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | -------------------------------------------------------------------------------- /BingPaper/BingPaper.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.assets.pictures.read-write 8 | 9 | com.apple.security.files.user-selected.read-write 10 | 11 | com.apple.security.network.client 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /BingPaper/BingPictureManager.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BingPictureManager.swift 3 | // BingPaper 4 | // 5 | // Created by Jingwen Peng on 2015-07-12. 6 | // Copyright (c) 2015 Jingwen Peng. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | class BingPictureManager { 12 | let netRequest = NSMutableURLRequest() 13 | let fileManager = FileManager.default 14 | 15 | var pastWallpapersRange = 15 16 | 17 | init() { 18 | netRequest.cachePolicy = NSURLRequest.CachePolicy.useProtocolCachePolicy 19 | netRequest.timeoutInterval = 15 20 | netRequest.httpMethod = "GET" 21 | } 22 | 23 | fileprivate func buildInfoPath(workDir: String, onDate: String, atRegion: String) -> String { 24 | if atRegion == "" { 25 | return "\(workDir)/\(onDate).json" 26 | } 27 | return "\(workDir)/\(onDate)_\(atRegion).json" 28 | } 29 | 30 | fileprivate func buildImagePath(workDir: String, onDate: String, atRegion: String) -> String { 31 | if atRegion == "" { 32 | return "\(workDir)/\(onDate).jpg" 33 | } 34 | return "\(workDir)/\(onDate)_\(atRegion).jpg" 35 | } 36 | 37 | fileprivate func checkAndCreateWorkDirectory(workDir: String) { 38 | try? fileManager.createDirectory(atPath: workDir, withIntermediateDirectories: true, attributes: nil) 39 | } 40 | 41 | fileprivate func obtainWallpaper(workDir: String, atIndex: Int, atRegion: String) { 42 | let baseURL = "http://www.bing.com/HpImageArchive.aspx" 43 | netRequest.url = URL(string: "\(baseURL)?format=js&n=1&idx=\(atIndex)&cc=\(atRegion)") 44 | let reponseData = try? NSURLConnection.sendSynchronousRequest(netRequest as URLRequest, returning: nil) 45 | 46 | if let dataValue = reponseData { 47 | let data = try? JSONSerialization.jsonObject(with: dataValue, options: []) as AnyObject 48 | 49 | if let objects = data?.value(forKey: "images") as? [NSObject] { 50 | if let startDateString = objects[0].value(forKey: "startdate") as? String, 51 | let urlString = objects[0].value(forKey: "url") as? String { 52 | 53 | let formatter = DateFormatter() 54 | formatter.dateFormat = "yyyyMMdd" 55 | if let startDate = formatter.date(from: startDateString) { 56 | formatter.dateFormat = "yyyy-MM-dd" 57 | let dateString = formatter.string(from: startDate) 58 | 59 | let infoPath = buildInfoPath(workDir: workDir, onDate: dateString, atRegion: atRegion) 60 | let imagePath = buildImagePath(workDir: workDir, onDate: dateString, atRegion: atRegion) 61 | 62 | if !fileManager.fileExists(atPath: infoPath) { 63 | checkAndCreateWorkDirectory(workDir: workDir) 64 | 65 | try? dataValue.write(to: URL(fileURLWithPath: infoPath), options: [.atomic]) 66 | } 67 | 68 | if !fileManager.fileExists(atPath: imagePath) { 69 | checkAndCreateWorkDirectory(workDir: workDir) 70 | 71 | if urlString.contains("http://") || urlString.contains("https://") { 72 | netRequest.url = URL.init(string: urlString) 73 | } else { 74 | netRequest.url = URL.init(string: "https://www.bing.com\(urlString)") 75 | } 76 | 77 | let imageResponData = try? NSURLConnection.sendSynchronousRequest(netRequest as URLRequest, returning: nil) 78 | try? imageResponData?.write(to: URL(fileURLWithPath: imagePath), options: [.atomic]) 79 | } 80 | } 81 | } 82 | } 83 | } 84 | } 85 | 86 | func fetchWallpapers(workDir: String, atRegin: String) { 87 | for index in -1...pastWallpapersRange { 88 | obtainWallpaper(workDir: workDir, atIndex: index, atRegion: atRegin) 89 | } 90 | } 91 | 92 | func fetchLastWallpaper(workDir: String, atRegin: String) { 93 | for index in -1...0 { 94 | obtainWallpaper(workDir: workDir, atIndex: index, atRegion: atRegin) 95 | } 96 | } 97 | 98 | func checkWallpaperExist(workDir: String, onDate: String, atRegion: String) -> Bool { 99 | if fileManager.fileExists(atPath: buildImagePath(workDir: workDir, onDate: onDate, atRegion: atRegion)) { 100 | return true 101 | } 102 | return false 103 | } 104 | 105 | func getWallpaperInfo(workDir: String, onDate: String, atRegion: String) -> (copyright: String, copyrightLink: String) { 106 | let jsonString = try? String.init(contentsOfFile: buildInfoPath(workDir: workDir, onDate: onDate, atRegion: atRegion)) 107 | 108 | if let jsonData = jsonString?.data(using: String.Encoding.utf8) { 109 | let data = try? JSONSerialization.jsonObject(with: jsonData, options: []) as AnyObject 110 | 111 | if let objects = data?.value(forKey: "images") as? [NSObject] { 112 | if let copyrightString = objects[0].value(forKey: "copyright") as? String, 113 | let copyrightLinkString = objects[0].value(forKey: "copyrightlink") as? String { 114 | return (copyrightString, copyrightLinkString) 115 | } 116 | } 117 | } 118 | 119 | return ("", "") 120 | } 121 | 122 | func setWallpaper(workDir: String, onDate: String, atRegion: String) { 123 | if checkWallpaperExist(workDir: workDir, onDate: onDate, atRegion: atRegion) { 124 | NSScreen.screens.forEach({ (screen) in 125 | try? NSWorkspace.shared.setDesktopImageURL( 126 | URL(fileURLWithPath: buildImagePath(workDir: workDir, onDate: onDate, atRegion: atRegion)), 127 | for: screen, 128 | options: [:] 129 | ) 130 | }) 131 | } 132 | } 133 | } 134 | -------------------------------------------------------------------------------- /BingPaper/GeneralPreferencesViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GeneralPreferencesViewController.swift 3 | // BingPaper 4 | // 5 | // Created by Jingwen Peng on 2016-09-27. 6 | // Copyright © 2016 Jingwen Peng. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | import ServiceManagement 11 | import MASPreferences 12 | 13 | class GeneralPreferencesViewController: NSViewController, MASPreferencesViewController { 14 | var viewIdentifier: String = "General" 15 | var toolbarItemImage: NSImage? = #imageLiteral(resourceName: "Switch") 16 | var toolbarItemLabel: String? = NSLocalizedString("General", comment: "N/A") 17 | 18 | @IBOutlet weak var autoStartCheckButton: NSButton! 19 | @IBOutlet weak var dockIconCheckButton: NSButton! 20 | @IBOutlet weak var autoDownloadCheckButton: NSButton! 21 | @IBOutlet weak var autoChangeWallpaperCheckButton: NSButton! 22 | @IBOutlet weak var regionSelectPopUp: PopUpButtonCell! 23 | @IBOutlet weak var regionSelectMenu: NSMenu! 24 | @IBOutlet weak var storagePathButton: NSButton! 25 | 26 | required init?(coder: NSCoder) { 27 | fatalError("init(coder:) has not been implemented") 28 | } 29 | 30 | init() { 31 | super.init(nibName: "GeneralPreferencesView", bundle: Bundle()) 32 | } 33 | 34 | override func viewDidLoad() { 35 | super.viewDidLoad() 36 | 37 | loadOptions() 38 | loadPreferences() 39 | } 40 | 41 | func loadOptions() { 42 | for regionName in SharedBingRegion.All.keys.sorted() { 43 | let regionValue = SharedBingRegion.All[regionName] 44 | let item = MenuItem.init(title: regionName, action: #selector(self.selectRegion(_:)), keyEquivalent: "") 45 | item.target = self 46 | item.value = regionValue 47 | self.regionSelectMenu.addItem(item) 48 | } 49 | } 50 | 51 | func loadPreferences() { 52 | autoStartCheckButton.state = NSControl.StateValue(rawValue: SharedPreferences.bool(forKey: SharedPreferences.Key.WillLaunchOnSystemStartup) ? 1 : 0) 53 | dockIconCheckButton.state = NSControl.StateValue(rawValue: SharedPreferences.bool(forKey: SharedPreferences.Key.WillDisplayIconInDock) ? 1 : 0) 54 | 55 | autoDownloadCheckButton.state = NSControl.StateValue(rawValue: SharedPreferences.bool(forKey: SharedPreferences.Key.WillAutoDownloadNewImages) ? 1 : 0) 56 | 57 | autoChangeWallpaperCheckButton.state = NSControl.StateValue(rawValue: SharedPreferences.bool(forKey: SharedPreferences.Key.WillAutoChangeWallpaper) ? 1 : 0) 58 | autoChangeWallpaperCheckButton.isEnabled = SharedPreferences.bool(forKey: SharedPreferences.Key.WillAutoDownloadNewImages) 59 | 60 | if let region = SharedPreferences.string(forKey: SharedPreferences.Key.CurrentSelectedBingRegion) { 61 | self.regionSelectPopUp.selectItem(withValue: region) 62 | } 63 | 64 | if let storagePath = SharedPreferences.string(forKey: SharedPreferences.Key.DownloadedImagesStoragePath) { 65 | self.storagePathButton.title = storagePath 66 | } 67 | } 68 | 69 | @IBAction func toggleLaunchOnSystemStartup(_ sender: NSButton) { 70 | let isEnabled = sender.state.rawValue == 1 ? true : false 71 | 72 | SharedPreferences.set(isEnabled, forKey: SharedPreferences.Key.WillLaunchOnSystemStartup) 73 | 74 | SMLoginItemSetEnabled("io.pjw.mac.BingPaperLoginItem" as CFString, isEnabled) 75 | } 76 | 77 | @IBAction func toggleDockIcon(_ sender: NSButton) { 78 | let isOn = sender.state.rawValue == 1 ? true : false 79 | 80 | SharedPreferences.set(isOn, forKey: SharedPreferences.Key.WillDisplayIconInDock) 81 | 82 | if isOn { 83 | NSApplication.shared.setActivationPolicy(NSApplication.ActivationPolicy.regular) 84 | } else { 85 | NSApplication.shared.setActivationPolicy(NSApplication.ActivationPolicy.accessory) 86 | } 87 | } 88 | 89 | @IBAction func toggleDownload(_ sender: NSButton) { 90 | let isEnabled = sender.state.rawValue == 1 ? true : false 91 | 92 | SharedPreferences.set(sender.state.rawValue == 1 ? true : false, forKey: SharedPreferences.Key.WillAutoDownloadNewImages) 93 | 94 | autoChangeWallpaperCheckButton.isEnabled = isEnabled 95 | } 96 | 97 | @IBAction func toggleChangeWallpaper(_ sender: NSButton) { 98 | SharedPreferences.set(sender.state.rawValue == 1 ? true : false, forKey: SharedPreferences.Key.WillAutoChangeWallpaper) 99 | } 100 | 101 | @IBAction func selectRegion(_ sender: MenuItem) { 102 | if let value = sender.value { 103 | SharedPreferences.set(value, forKey: SharedPreferences.Key.CurrentSelectedBingRegion) 104 | } 105 | } 106 | 107 | @IBAction func viewStoragePath(_ sender: NSButton) { 108 | NSWorkspace.shared.openFile(self.storagePathButton.title) 109 | } 110 | 111 | @IBAction func changeStoragePath(_ sender: NSButton) { 112 | let openPanel = NSOpenPanel(); 113 | openPanel.showsResizeIndicator = true 114 | openPanel.showsHiddenFiles = false 115 | openPanel.canChooseFiles = false; 116 | openPanel.canChooseDirectories = true 117 | openPanel.canCreateDirectories = true 118 | openPanel.allowsMultipleSelection = false 119 | 120 | openPanel.beginSheetModal(for: self.view.window!) { (response) -> Void in 121 | if response == NSApplication.ModalResponse.OK { 122 | if let path = openPanel.url?.path { 123 | SharedPreferences.set(path, forKey: SharedPreferences.Key.DownloadedImagesStoragePath) 124 | 125 | self.loadPreferences() 126 | } 127 | } 128 | } 129 | } 130 | 131 | @IBAction func resetPreferences(_ sender: NSButton) { 132 | let alert = NSAlert() 133 | alert.messageText = NSLocalizedString("Reset Warning", comment: "N/A") 134 | alert.informativeText = NSLocalizedString("Are you sure to reset you would like to reset the preferences?", comment: "N/A") 135 | alert.addButton(withTitle: NSLocalizedString("Reset", comment: "N/A")) 136 | alert.addButton(withTitle: NSLocalizedString("Cancel", comment: "N/A")) 137 | alert.alertStyle = NSAlert.Style.warning 138 | 139 | alert.beginSheetModal(for: self.view.window!, completionHandler: { (response) -> Void in 140 | if response == NSApplication.ModalResponse.alertFirstButtonReturn { 141 | SharedPreferences.clear() 142 | 143 | self.loadPreferences() 144 | } 145 | }) 146 | } 147 | } 148 | -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/AppIcon Bing.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "16x16", 5 | "idiom" : "mac", 6 | "filename" : "icon_16x16.png", 7 | "scale" : "1x" 8 | }, 9 | { 10 | "size" : "16x16", 11 | "idiom" : "mac", 12 | "filename" : "icon_16x16@2x.png", 13 | "scale" : "2x" 14 | }, 15 | { 16 | "size" : "32x32", 17 | "idiom" : "mac", 18 | "filename" : "icon_32x32.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "32x32", 23 | "idiom" : "mac", 24 | "filename" : "icon_32x32@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "128x128", 29 | "idiom" : "mac", 30 | "filename" : "icon_128x128.png", 31 | "scale" : "1x" 32 | }, 33 | { 34 | "size" : "128x128", 35 | "idiom" : "mac", 36 | "filename" : "icon_128x128@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "256x256", 41 | "idiom" : "mac", 42 | "filename" : "icon_256x256.png", 43 | "scale" : "1x" 44 | }, 45 | { 46 | "size" : "256x256", 47 | "idiom" : "mac", 48 | "filename" : "icon_256x256@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "512x512", 53 | "idiom" : "mac", 54 | "filename" : "icon_512x512.png", 55 | "scale" : "1x" 56 | }, 57 | { 58 | "size" : "512x512", 59 | "idiom" : "mac", 60 | "filename" : "icon_512x512@2x.png", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/AppIcon Bing.appiconset/icon_128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/AppIcon Bing.appiconset/icon_128x128.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/AppIcon Bing.appiconset/icon_128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/AppIcon Bing.appiconset/icon_128x128@2x.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/AppIcon Bing.appiconset/icon_16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/AppIcon Bing.appiconset/icon_16x16.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/AppIcon Bing.appiconset/icon_16x16@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/AppIcon Bing.appiconset/icon_16x16@2x.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/AppIcon Bing.appiconset/icon_256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/AppIcon Bing.appiconset/icon_256x256.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/AppIcon Bing.appiconset/icon_256x256@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/AppIcon Bing.appiconset/icon_256x256@2x.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/AppIcon Bing.appiconset/icon_32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/AppIcon Bing.appiconset/icon_32x32.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/AppIcon Bing.appiconset/icon_32x32@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/AppIcon Bing.appiconset/icon_32x32@2x.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/AppIcon Bing.appiconset/icon_512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/AppIcon Bing.appiconset/icon_512x512.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/AppIcon Bing.appiconset/icon_512x512@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/AppIcon Bing.appiconset/icon_512x512@2x.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/AppIcon BingPaper.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "16x16", 5 | "idiom" : "mac", 6 | "filename" : "Icon16.png", 7 | "scale" : "1x" 8 | }, 9 | { 10 | "size" : "16x16", 11 | "idiom" : "mac", 12 | "filename" : "Icon16@2x.png", 13 | "scale" : "2x" 14 | }, 15 | { 16 | "size" : "32x32", 17 | "idiom" : "mac", 18 | "filename" : "Icon32.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "32x32", 23 | "idiom" : "mac", 24 | "filename" : "Icon32@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "128x128", 29 | "idiom" : "mac", 30 | "filename" : "Icon128.png", 31 | "scale" : "1x" 32 | }, 33 | { 34 | "size" : "128x128", 35 | "idiom" : "mac", 36 | "filename" : "Icon128@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "256x256", 41 | "idiom" : "mac", 42 | "filename" : "Icon256.png", 43 | "scale" : "1x" 44 | }, 45 | { 46 | "size" : "256x256", 47 | "idiom" : "mac", 48 | "filename" : "Icon256@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "512x512", 53 | "idiom" : "mac", 54 | "filename" : "Icon512.png", 55 | "scale" : "1x" 56 | }, 57 | { 58 | "size" : "512x512", 59 | "idiom" : "mac", 60 | "filename" : "Icon512@2x.png", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/AppIcon BingPaper.appiconset/Icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/AppIcon BingPaper.appiconset/Icon128.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/AppIcon BingPaper.appiconset/Icon128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/AppIcon BingPaper.appiconset/Icon128@2x.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/AppIcon BingPaper.appiconset/Icon16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/AppIcon BingPaper.appiconset/Icon16.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/AppIcon BingPaper.appiconset/Icon16@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/AppIcon BingPaper.appiconset/Icon16@2x.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/AppIcon BingPaper.appiconset/Icon256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/AppIcon BingPaper.appiconset/Icon256.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/AppIcon BingPaper.appiconset/Icon256@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/AppIcon BingPaper.appiconset/Icon256@2x.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/AppIcon BingPaper.appiconset/Icon32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/AppIcon BingPaper.appiconset/Icon32.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/AppIcon BingPaper.appiconset/Icon32@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/AppIcon BingPaper.appiconset/Icon32@2x.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/AppIcon BingPaper.appiconset/Icon512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/AppIcon BingPaper.appiconset/Icon512.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/AppIcon BingPaper.appiconset/Icon512@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/AppIcon BingPaper.appiconset/Icon512@2x.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/Bing.imageset/Bing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/Bing.imageset/Bing.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/Bing.imageset/Bing@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/Bing.imageset/Bing@2x.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/Bing.imageset/Bing@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/Bing.imageset/Bing@3x.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/Bing.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Bing.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "Bing@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "Bing@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/StatusBar/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/StatusBar/StatusBarIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "StatusBarIcon.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "appearances" : [ 10 | { 11 | "appearance" : "luminosity", 12 | "value" : "dark" 13 | } 14 | ], 15 | "filename" : "StatusBarIcon Dark.png", 16 | "idiom" : "universal", 17 | "scale" : "1x" 18 | }, 19 | { 20 | "filename" : "StatusBarIcon@2x.png", 21 | "idiom" : "universal", 22 | "scale" : "2x" 23 | }, 24 | { 25 | "appearances" : [ 26 | { 27 | "appearance" : "luminosity", 28 | "value" : "dark" 29 | } 30 | ], 31 | "filename" : "StatusBarIcon Dark@2x.png", 32 | "idiom" : "universal", 33 | "scale" : "2x" 34 | }, 35 | { 36 | "filename" : "StatusBarIcon@3x.png", 37 | "idiom" : "universal", 38 | "scale" : "3x" 39 | }, 40 | { 41 | "appearances" : [ 42 | { 43 | "appearance" : "luminosity", 44 | "value" : "dark" 45 | } 46 | ], 47 | "filename" : "StatusBarIcon Dark@3x.png", 48 | "idiom" : "universal", 49 | "scale" : "3x" 50 | } 51 | ], 52 | "info" : { 53 | "author" : "xcode", 54 | "version" : 1 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/StatusBar/StatusBarIcon.imageset/StatusBarIcon Dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/StatusBar/StatusBarIcon.imageset/StatusBarIcon Dark.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/StatusBar/StatusBarIcon.imageset/StatusBarIcon Dark@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/StatusBar/StatusBarIcon.imageset/StatusBarIcon Dark@2x.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/StatusBar/StatusBarIcon.imageset/StatusBarIcon Dark@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/StatusBar/StatusBarIcon.imageset/StatusBarIcon Dark@3x.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/StatusBar/StatusBarIcon.imageset/StatusBarIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/StatusBar/StatusBarIcon.imageset/StatusBarIcon.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/StatusBar/StatusBarIcon.imageset/StatusBarIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/StatusBar/StatusBarIcon.imageset/StatusBarIcon@2x.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/StatusBar/StatusBarIcon.imageset/StatusBarIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/StatusBar/StatusBarIcon.imageset/StatusBarIcon@3x.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/Toolbar/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/Toolbar/Envolope.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Envolope.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Envolope@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Envolope@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/Toolbar/Envolope.imageset/Envolope.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/Toolbar/Envolope.imageset/Envolope.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/Toolbar/Envolope.imageset/Envolope@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/Toolbar/Envolope.imageset/Envolope@2x.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/Toolbar/Envolope.imageset/Envolope@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/Toolbar/Envolope.imageset/Envolope@3x.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/Toolbar/Switch.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "switch.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "switch@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "switch@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/Toolbar/Switch.imageset/switch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/Toolbar/Switch.imageset/switch.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/Toolbar/Switch.imageset/switch@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/Toolbar/Switch.imageset/switch@2x.png -------------------------------------------------------------------------------- /BingPaper/Images.xcassets/Toolbar/Switch.imageset/switch@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaper/Images.xcassets/Toolbar/Switch.imageset/switch@3x.png -------------------------------------------------------------------------------- /BingPaper/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | $(PRODUCT_NAME) 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleGetInfoString 12 | 13 | CFBundleIconFile 14 | 15 | CFBundleIdentifier 16 | $(PRODUCT_BUNDLE_IDENTIFIER) 17 | CFBundleInfoDictionaryVersion 18 | 6.0 19 | CFBundleName 20 | $(PRODUCT_NAME) 21 | CFBundlePackageType 22 | APPL 23 | CFBundleShortVersionString 24 | $(MARKETING_VERSION) 25 | CFBundleVersion 26 | $(CURRENT_PROJECT_VERSION) 27 | LSApplicationCategoryType 28 | public.app-category.utilities 29 | LSMinimumSystemVersion 30 | $(MACOSX_DEPLOYMENT_TARGET) 31 | NSAppTransportSecurity 32 | 33 | NSAllowsArbitraryLoads 34 | 35 | 36 | NSHumanReadableCopyright 37 | Copyright © 2015-2020 Jingwen Peng. All rights reserved. 38 | NSMainNibFile 39 | StatusBarView 40 | NSPrincipalClass 41 | NSApplication 42 | 43 | 44 | -------------------------------------------------------------------------------- /BingPaper/MenuItem.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MenuItem.swift 3 | // BingPaper 4 | // 5 | // Created by Jingwen Peng on 2016-10-07. 6 | // Copyright © 2016 Jingwen Peng. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | class MenuItem: NSMenuItem { 12 | 13 | @IBInspectable 14 | var value: String? 15 | } 16 | -------------------------------------------------------------------------------- /BingPaper/PopUpButtonCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PopUpButtonCell.swift 3 | // BingPaper 4 | // 5 | // Created by Jingwen Peng on 2016-10-07. 6 | // Copyright © 2016年 Jingwen Peng. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | class PopUpButtonCell: NSPopUpButtonCell { 12 | 13 | func selectItem(withValue: String) { 14 | for index in 0 ..< numberOfItems { 15 | if let menuItem = item(at: index) as? MenuItem? { 16 | if menuItem?.value == withValue { 17 | selectItem(at: index) 18 | return 19 | } 20 | } 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /BingPaper/Shared.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Shared.swift 3 | // BingPaper 4 | // 5 | // Created by Jingwen Peng on 2016-09-28. 6 | // Copyright © 2016 Jingwen Peng. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | class SharedBingRegion { 12 | static let All = [ 13 | "Argentina": "AR", 14 | "Australia": "AU", 15 | "Austria": "AT", 16 | "Belgium": "BE", 17 | "Brazil": "BR", 18 | "Canada": "CA", 19 | "Chile": "CL", 20 | "Denmark": "DK", 21 | "Finland": "FI", 22 | "France": "FR", 23 | "Germany": "DE", 24 | "Hong Kong SAR": "HK", 25 | "India": "IN", 26 | "Indonesia": "ID", 27 | "Italy": "IT", 28 | "Japan": "JP", 29 | "Korea": "KR", 30 | "Malaysia": "MY", 31 | "Mexico": "MX", 32 | "Netherlands": "NL", 33 | "New Zealand": "NZ", 34 | "Norway": "NO", 35 | "China": "CN", 36 | "Poland": "PL", 37 | "Portugal": "PT", 38 | "Philippines": "PH", 39 | "Russia": "RU", 40 | "Saudi Arabia": "SA", 41 | "South Africa": "ZA", 42 | "Spain": "ES", 43 | "Sweden": "SE", 44 | "Switzerland": "CH", 45 | "Taiwan": "TW", 46 | "Turkey": "TR", 47 | "United Kingdom": "GB", 48 | "United States": "US", 49 | ] 50 | } 51 | 52 | class SharedPreferences { 53 | 54 | class Key { 55 | static let WillLaunchOnSystemStartup = "WillLaunchOnSystemStartup" 56 | static let WillDisplayIconInDock = "WillDisplayIconInDock" 57 | static let WillAutoDownloadNewImages = "WillAutoDownloadNewImages" 58 | static let WillAutoChangeWallpaper = "WillAutoChangeWallpaper" 59 | static let DownloadedImagesStoragePath = "DownloadedImagesStoragePath" 60 | static let CurrentSelectedBingRegion = "CurrentSelectedBingRegion" 61 | static let CurrentSelectedImageDate = "CurrentSelectedImageDate" 62 | } 63 | 64 | static let Defaults = [ 65 | Key.DownloadedImagesStoragePath: "\(NSHomeDirectory())/Pictures/BingPaper", 66 | Key.CurrentSelectedBingRegion: "", 67 | ] 68 | 69 | static func bool(forKey: String) -> Bool { 70 | return UserDefaults.standard.bool(forKey: forKey) 71 | } 72 | 73 | static func boolInt(forKey: String) -> Int { 74 | return bool(forKey: forKey) ? 1 : 0 75 | } 76 | 77 | static func set(_ value: Bool, forKey defaultName: String) { 78 | UserDefaults.standard.set(value, forKey: defaultName) 79 | } 80 | 81 | static func string(forKey: String) -> String? { 82 | if let value = UserDefaults.standard.string(forKey: forKey) { 83 | return value 84 | } 85 | return Defaults[forKey] 86 | } 87 | 88 | static func set(_ value: String, forKey defaultName: String) { 89 | UserDefaults.standard.set(value, forKey: defaultName) 90 | } 91 | 92 | static func clear() { 93 | for item in UserDefaults.standard.dictionaryRepresentation() { 94 | UserDefaults.standard.removeObject(forKey: item.key) 95 | } 96 | } 97 | } 98 | 99 | 100 | -------------------------------------------------------------------------------- /BingPaper/StatusBarView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StatusBarView.swift 3 | // BingPaper 4 | // 5 | // Created by Jingwen Peng on 2015-03-13. 6 | // Copyright (c) 2015 Jingwen Peng. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | class StatusBarView: NSView { 12 | 13 | fileprivate var image: NSImage 14 | fileprivate var statusItem: NSStatusItem 15 | fileprivate var popover: NSPopover 16 | 17 | fileprivate var popoverTransiencyMonitor: AnyObject? 18 | 19 | required init?(coder: NSCoder) { 20 | fatalError("init(coder:) has not been implemented") 21 | } 22 | 23 | init(image: NSImage, statusItem: NSStatusItem, popover: NSPopover){ 24 | self.image = image 25 | self.statusItem = statusItem 26 | self.popover = popover 27 | 28 | popoverTransiencyMonitor = nil 29 | 30 | let thickness = NSStatusBar.system.thickness 31 | let rect = CGRect(x: 0, y: 0, width: thickness, height: thickness) 32 | 33 | super.init(frame: rect) 34 | } 35 | 36 | override func draw(_ dirtyRect: NSRect){ 37 | statusItem.drawStatusBarBackground(in: dirtyRect, withHighlight: false) 38 | 39 | let size = image.size 40 | let rect = CGRect(x: 2, y: 2, width: size.width, height: size.height) 41 | 42 | image.draw(in: rect) 43 | } 44 | 45 | override func mouseDown(with theEvent: NSEvent){ 46 | if (popoverTransiencyMonitor == nil) { 47 | popover.show(relativeTo: frame, of: self, preferredEdge: NSRectEdge.minY) 48 | 49 | popoverTransiencyMonitor = NSEvent.addGlobalMonitorForEvents( 50 | matching: NSEvent.EventTypeMask.leftMouseUp, handler: { (event: NSEvent) -> Void in 51 | NSEvent.removeMonitor(self.popoverTransiencyMonitor!) 52 | self.popoverTransiencyMonitor = nil 53 | self.popover.close() 54 | }) as AnyObject? 55 | } else { 56 | NSEvent.removeMonitor(popoverTransiencyMonitor!) 57 | popoverTransiencyMonitor = nil 58 | popover.close() 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /BingPaper/StatusBarViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StatusBarViewController.swift 3 | // BingPaper 4 | // 5 | // Created by Peng Jingwen on 2015-03-13. 6 | // Copyright (c) 2015 Peng Jingwen. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | import MASPreferences 11 | 12 | class StatusBarViewController: NSViewController { 13 | var timerTask = Timer() 14 | var bingPictureManager = BingPictureManager() 15 | 16 | var previousDateString = "" 17 | var nextDateString = "" 18 | var wallpaperInfoUrlString = "" 19 | 20 | var preferencesWindowController: NSWindowController? 21 | 22 | @IBOutlet weak var previousDayButton: NSButton! 23 | @IBOutlet weak var todayButton: NSButton! 24 | @IBOutlet weak var nextDayButton: NSButton! 25 | @IBOutlet weak var dateTextField: NSTextField! 26 | @IBOutlet weak var wallpaperInfoButton: NSButton! 27 | 28 | 29 | override func awakeFromNib() { 30 | setupDockIcon() 31 | setupTimerTask() 32 | 33 | if let currentDate = SharedPreferences.string(forKey: SharedPreferences.Key.CurrentSelectedImageDate) { 34 | _ = jumpToDate(currentDate) 35 | } else { 36 | jumpToToday() 37 | } 38 | 39 | downloadWallpapers() 40 | } 41 | 42 | func setupDockIcon() { 43 | if SharedPreferences.bool(forKey: SharedPreferences.Key.WillDisplayIconInDock) { 44 | NSApplication.shared.setActivationPolicy(NSApplication.ActivationPolicy.regular) 45 | } else { 46 | NSApplication.shared.setActivationPolicy(NSApplication.ActivationPolicy.accessory) 47 | } 48 | } 49 | 50 | func setupTimerTask() { 51 | timerTask = Timer.scheduledTimer( 52 | timeInterval: 3600, 53 | target: self, 54 | selector: #selector(StatusBarViewController.downloadWallpapers), 55 | userInfo: nil, 56 | repeats: true 57 | ) 58 | } 59 | 60 | @objc func downloadWallpapers() { 61 | DispatchQueue.main.async { 62 | if SharedPreferences.bool(forKey: SharedPreferences.Key.WillAutoDownloadNewImages) { 63 | if let workDir = SharedPreferences.string(forKey: SharedPreferences.Key.DownloadedImagesStoragePath), 64 | let region = SharedPreferences.string(forKey: SharedPreferences.Key.CurrentSelectedBingRegion) { 65 | self.bingPictureManager.fetchWallpapers(workDir: workDir, atRegin: region) 66 | } 67 | 68 | if SharedPreferences.bool(forKey: SharedPreferences.Key.WillAutoChangeWallpaper) { 69 | let formatter = DateFormatter() 70 | formatter.dateFormat = "yyyy-MM-dd" 71 | _ = self.jumpToDate(formatter.string(from: Date())) 72 | } 73 | } 74 | } 75 | } 76 | 77 | func jumpToDate(_ date: String) -> Bool { 78 | if let workDir = SharedPreferences.string(forKey: SharedPreferences.Key.DownloadedImagesStoragePath), 79 | let region = SharedPreferences.string(forKey: SharedPreferences.Key.CurrentSelectedBingRegion) { 80 | 81 | if bingPictureManager.checkWallpaperExist(workDir: workDir, onDate: date, atRegion: region) { 82 | let info = bingPictureManager.getWallpaperInfo(workDir: workDir, onDate: date, atRegion: region) 83 | var infoString = info.copyright 84 | infoString = infoString.replacingOccurrences(of: ",", with: "\n") 85 | infoString = infoString.replacingOccurrences(of: "(", with: "\n") 86 | infoString = infoString.replacingOccurrences(of: ")", with: "") 87 | 88 | wallpaperInfoButton.title = infoString 89 | wallpaperInfoUrlString = info.copyrightLink 90 | 91 | dateTextField.stringValue = date 92 | SharedPreferences.set(date, forKey: SharedPreferences.Key.CurrentSelectedImageDate) 93 | 94 | bingPictureManager.setWallpaper(workDir: workDir, onDate: date, atRegion: region) 95 | 96 | let searchLimit = 365 97 | let formatter = DateFormatter() 98 | formatter.dateFormat = "yyyy-MM-dd" 99 | 100 | if let date = formatter.date(from: date) { 101 | previousDayButton.isEnabled = false 102 | for index in 1...searchLimit { 103 | let timeInterval = TimeInterval(-3600 * 24 * index) 104 | let anotherDay = date.addingTimeInterval(timeInterval) 105 | let anotherDayString = formatter.string(from: anotherDay) 106 | 107 | if bingPictureManager.checkWallpaperExist(workDir: workDir, onDate: anotherDayString, atRegion: region) { 108 | previousDateString = anotherDayString 109 | previousDayButton.isEnabled = true 110 | 111 | break 112 | } 113 | } 114 | } 115 | 116 | if let date = formatter.date(from: date) { 117 | nextDayButton.isEnabled = false 118 | for index in 1...searchLimit { 119 | let timeInterval = TimeInterval(3600 * 24 * index) 120 | let anotherDay = date.addingTimeInterval(timeInterval) 121 | let anotherDayString = formatter.string(from: anotherDay) 122 | 123 | if bingPictureManager.checkWallpaperExist(workDir: workDir, onDate: anotherDayString, atRegion: region) { 124 | nextDateString = anotherDayString 125 | nextDayButton.isEnabled = true 126 | 127 | break 128 | } 129 | } 130 | } 131 | 132 | return true 133 | } 134 | } 135 | 136 | return false 137 | } 138 | 139 | func jumpToToday() { 140 | DispatchQueue.main.async { 141 | self.todayButton.isEnabled = false 142 | self.todayButton.title = NSLocalizedString("Fetching...", comment: "N/A") 143 | 144 | if let workDir = SharedPreferences.string(forKey: SharedPreferences.Key.DownloadedImagesStoragePath), 145 | let currentRegion = SharedPreferences.string(forKey: SharedPreferences.Key.CurrentSelectedBingRegion) { 146 | self.bingPictureManager.fetchLastWallpaper(workDir: workDir, atRegin: currentRegion) 147 | } 148 | 149 | let formatter = DateFormatter() 150 | formatter.dateFormat = "yyyy-MM-dd" 151 | let ok = self.jumpToDate(formatter.string(from: Date())) 152 | if !ok { 153 | // Try to use last day's picture. 154 | _ = self.jumpToDate(formatter.string(from: Date().addingTimeInterval(-(3600 * 24)))) 155 | } 156 | 157 | self.todayButton.isEnabled = true 158 | self.todayButton.title = NSLocalizedString("Today !", comment: "N/A") 159 | } 160 | } 161 | 162 | @IBAction func logoClicked(_ sender: NSButton) { 163 | if let path = SharedPreferences.string(forKey: SharedPreferences.Key.DownloadedImagesStoragePath) { 164 | NSWorkspace.shared.openFile(path) 165 | } 166 | } 167 | 168 | @IBAction func previousDay(_ sender: NSButton) { 169 | _ = jumpToDate(previousDateString) 170 | } 171 | 172 | @IBAction func today(_ sender: NSButton) { 173 | jumpToToday() 174 | } 175 | 176 | @IBAction func nextDay(_ sender: NSButton) { 177 | _ = jumpToDate(nextDateString) 178 | } 179 | 180 | @IBAction func wallpaperInfoButtonClicked(_ sender: NSButton) { 181 | NSWorkspace.shared.open(NSURL(string: wallpaperInfoUrlString)! as URL) 182 | } 183 | 184 | @IBAction func launchPreferencesWindow(_ sender: NSButton) { 185 | if (preferencesWindowController == nil) { 186 | preferencesWindowController = MASPreferencesWindowController.init( 187 | viewControllers: [GeneralPreferencesViewController(), AboutPreferencesViewController()], 188 | title: NSLocalizedString("BingPaper Preferences", comment: "N/A") 189 | ) 190 | } 191 | 192 | preferencesWindowController?.showWindow(self) 193 | preferencesWindowController?.window?.makeKeyAndOrderFront(self) 194 | 195 | NSApplication.shared.activate(ignoringOtherApps: true) 196 | } 197 | 198 | @IBAction func quitApplication(_ sender: NSButton) { 199 | NSApplication.shared.terminate(nil) 200 | } 201 | 202 | } 203 | -------------------------------------------------------------------------------- /BingPaper/en.lproj/Localize.strings: -------------------------------------------------------------------------------- 1 | /* 2 | Localize.strings 3 | BingPaper 4 | 5 | Created by Aspire on 2016-09-28. 6 | Copyright © 2016年 Peng Jingwen. All rights reserved. 7 | */ 8 | -------------------------------------------------------------------------------- /BingPaper/en.lproj/StatusBar.strings: -------------------------------------------------------------------------------- 1 | 2 | /* Class = "NSTextFieldCell"; placeholderString = "2016-09-09"; ObjectID = "077-MH-XsJ"; */ 3 | "077-MH-XsJ.placeholderString" = "2016-09-09"; 4 | 5 | /* Class = "NSTextFieldCell"; title = "Loading..."; ObjectID = "077-MH-XsJ"; */ 6 | "077-MH-XsJ.title" = "Loading..."; 7 | 8 | /* Class = "NSButtonCell"; title = "Preferences"; ObjectID = "6M6-Uk-yrH"; */ 9 | "6M6-Uk-yrH.title" = "Preferences"; 10 | 11 | /* Class = "NSButtonCell"; title = "Quit"; ObjectID = "Hr4-sd-meE"; */ 12 | "Hr4-sd-meE.title" = "Quit"; 13 | 14 | /* Class = "NSButtonCell"; alternateTitle = "苏拉群岛上的苏格兰松树\n松恩-菲尤拉讷\n挪威 \n© Orsolya Haarberg "; ObjectID = "R7D-hG-r6g"; */ 15 | "R7D-hG-r6g.alternateTitle" = "苏拉群岛上的苏格兰松树\n松恩-菲尤拉讷\n挪威 \n© Orsolya Haarberg "; 16 | 17 | /* Class = "NSButtonCell"; title = "Loading..."; ObjectID = "R7D-hG-r6g"; */ 18 | "R7D-hG-r6g.title" = "Loading..."; 19 | 20 | /* Class = "NSTextFieldCell"; title = "BingPaper"; ObjectID = "VwN-ZN-Spn"; */ 21 | "VwN-ZN-Spn.title" = "BingPaper"; 22 | 23 | /* Class = "NSButtonCell"; title = "Today !"; ObjectID = "jDq-jy-kaQ"; */ 24 | "jDq-jy-kaQ.title" = "Today !"; 25 | -------------------------------------------------------------------------------- /BingPaper/zh-Hans.lproj/AboutPreferencesView.strings: -------------------------------------------------------------------------------- 1 | 2 | /* Class = "NSButtonCell"; title = "hi@pjw.io"; ObjectID = "4YV-gI-R2O"; */ 3 | "4YV-gI-R2O.title" = "hi@pjw.io"; 4 | 5 | /* Class = "NSTextFieldCell"; title = "Website: "; ObjectID = "6kH-Rn-scH"; */ 6 | "6kH-Rn-scH.title" = "网站: "; 7 | 8 | /* Class = "NSTextFieldCell"; title = "All rights reserved."; ObjectID = "HEo-Iz-SY1"; */ 9 | "HEo-Iz-SY1.title" = "保留所有权利."; 10 | 11 | /* Class = "NSTextFieldCell"; title = "Copyright © 2015-2020 Jingwen Peng."; ObjectID = "JYS-CU-ihO"; */ 12 | "JYS-CU-ihO.title" = "版权所有 © 2015-2020 Jingwen Peng."; 13 | 14 | /* Class = "NSButtonCell"; title = "https://pjw.io"; ObjectID = "bW2-4j-5G7"; */ 15 | "bW2-4j-5G7.title" = "https://pjw.io"; 16 | 17 | /* Class = "NSTextFieldCell"; placeholderString = "Version& Build String"; ObjectID = "tQu-DK-Ukt"; */ 18 | "tQu-DK-Ukt.placeholderString" = "Version & Build String"; 19 | 20 | /* Class = "NSTextFieldCell"; title = "BingPaper"; ObjectID = "tXO-Gc-lIP"; */ 21 | "tXO-Gc-lIP.title" = "BingPaper"; 22 | 23 | /* Class = "NSTextFieldCell"; title = "Email: "; ObjectID = "tgA-N9-W8J"; */ 24 | "tgA-N9-W8J.title" = "邮箱: "; 25 | -------------------------------------------------------------------------------- /BingPaper/zh-Hans.lproj/Credits.rtf: -------------------------------------------------------------------------------- 1 | {\rtf1\ansi\ansicpg936\cocoartf1504 2 | {\fonttbl\f0\fnil\fcharset134 PingFangSC-Regular;} 3 | {\colortbl;\red255\green255\blue255;} 4 | {\*\expandedcolortbl;\csgray\c100000;} 5 | \vieww9600\viewh8400\viewkind0 6 | \pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\qc\partightenfactor0 7 | 8 | \f0\fs22 \cf0 \'d3\'ca\'cf\'e4: hi@pjw.io\ 9 | \pard\tx566\tx1133\tx1592\tx1700\tx2267\tx2834\tx3401\tqr\tx3648\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\tx7681\tx7942\tx9420\tx11206\tx13986\tx16375\pardirnatural\qc\partightenfactor0 10 | \cf0 \'cd\'f8\'d5\'be: {\field{\*\fldinst{HYPERLINK "https://pjw.io"}}{\fldrslt https://pjw.io}}} -------------------------------------------------------------------------------- /BingPaper/zh-Hans.lproj/GeneralPreferencesView.strings: -------------------------------------------------------------------------------- 1 | 2 | /* Class = "NSTextFieldCell"; title = "Download:"; ObjectID = "0eT-PJ-pN4"; */ 3 | "0eT-PJ-pN4.title" = "下载:"; 4 | 5 | /* Class = "NSButtonCell"; title = "Dowload images of all regions"; ObjectID = "4bR-do-jIa"; */ 6 | "4bR-do-jIa.title" = "下载所有区域的图片"; 7 | 8 | /* Class = "NSTextFieldCell"; title = "Reset:"; ObjectID = "A4s-r2-Ccn"; */ 9 | "A4s-r2-Ccn.title" = "重置:"; 10 | 11 | /* Class = "NSButtonCell"; title = "Auto change wallpaper"; ObjectID = "FVl-LU-XPO"; */ 12 | "FVl-LU-XPO.title" = "自动更换壁纸"; 13 | 14 | /* Class = "NSButtonCell"; title = "Display icon in Dock"; ObjectID = "J2a-iz-FQL"; */ 15 | "J2a-iz-FQL.title" = "在 Dock 栏显示图标"; 16 | 17 | /* Class = "NSBox"; title = "Title"; ObjectID = "MOt-5t-uG5"; */ 18 | "MOt-5t-uG5.title" = "标题"; 19 | 20 | /* Class = "NSMenuItem"; title = "Automatic"; ObjectID = "ZUS-Yh-ryZ"; */ 21 | "ZUS-Yh-ryZ.title" = "自动"; 22 | 23 | /* Class = "NSButtonCell"; title = "Launch on system startup"; ObjectID = "aLU-uz-xpO"; */ 24 | "aLU-uz-xpO.title" = "系统启动时运行程序"; 25 | 26 | /* Class = "NSTextFieldCell"; title = "Bing Region:"; ObjectID = "bn3-Oe-K8J"; */ 27 | "bn3-Oe-K8J.title" = "Bing 区域:"; 28 | 29 | /* Class = "NSTextFieldCell"; title = "Storage:"; ObjectID = "boj-iS-7tj"; */ 30 | "boj-iS-7tj.title" = "存储:"; 31 | 32 | /* Class = "NSTextFieldCell"; title = "Behavior:"; ObjectID = "e38-0K-htm"; */ 33 | "e38-0K-htm.title" = "行为:"; 34 | 35 | /* Class = "NSButtonCell"; title = "Change"; ObjectID = "eN3-Up-aKr"; */ 36 | "eN3-Up-aKr.title" = "变更"; 37 | 38 | /* Class = "NSButtonCell"; title = "Please select storage path"; ObjectID = "gjF-Cz-ybT"; */ 39 | "gjF-Cz-ybT.title" = "请选择存储路径"; 40 | 41 | /* Class = "NSBox"; title = "Title"; ObjectID = "j2y-xJ-9qN"; */ 42 | "j2y-xJ-9qN.title" = "标题"; 43 | 44 | /* Class = "NSButtonCell"; title = "Reset Preferences"; ObjectID = "jhq-2f-dwF"; */ 45 | "jhq-2f-dwF.title" = "重置偏好设置"; 46 | 47 | /* Class = "NSBox"; title = "Title"; ObjectID = "rHS-sH-tjK"; */ 48 | "rHS-sH-tjK.title" = "标题"; 49 | 50 | /* Class = "NSButtonCell"; title = "Auto dowload new images"; ObjectID = "vf6-xn-PcF"; */ 51 | "vf6-xn-PcF.title" = "自动下载新图片"; 52 | -------------------------------------------------------------------------------- /BingPaper/zh-Hans.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | Localizable.strings 3 | BingPaper 4 | 5 | Created by Jingwen Peng on 2016-09-28. 6 | Copyright © 2016 Jingwen Peng. All rights reserved. 7 | */ 8 | 9 | "BingPaper Preferences" = "BingPaper 偏好设置"; 10 | 11 | "General" = "通用"; 12 | "About" = "关于"; 13 | 14 | "Version" = "版本"; 15 | 16 | "Reset Warning" = "重置警告"; 17 | "Are you sure to reset you would like to reset the preferences?" = "确定要重置所有的偏好设置吗?"; 18 | "Reset" = "重置"; 19 | "Cancel" = "取消"; 20 | 21 | "Fetching..." = "获取中..."; 22 | -------------------------------------------------------------------------------- /BingPaper/zh-Hans.lproj/StatusBarView.strings: -------------------------------------------------------------------------------- 1 | 2 | /* Class = "NSTextFieldCell"; title = "2016-09-09"; ObjectID = "077-MH-XsJ"; */ 3 | "077-MH-XsJ.title" = "2016-09-09"; 4 | 5 | /* Class = "NSButtonCell"; title = "Prefs"; ObjectID = "6M6-Uk-yrH"; */ 6 | "6M6-Uk-yrH.title" = "设置"; 7 | 8 | /* Class = "NSButtonCell"; title = "Quit"; ObjectID = "Hr4-sd-meE"; */ 9 | "Hr4-sd-meE.title" = "退出"; 10 | 11 | /* Class = "NSButtonCell"; title = "苏拉群岛上的苏格兰松树\n松恩-菲尤拉讷\n挪威\n© Orsolya Haarberg"; ObjectID = "R7D-hG-r6g"; */ 12 | "R7D-hG-r6g.title" = "苏拉群岛上的苏格兰松树\n松恩-菲尤拉讷\n挪威\n© Orsolya Haarberg"; 13 | 14 | /* Class = "NSTextFieldCell"; title = "BingPaper"; ObjectID = "VwN-ZN-Spn"; */ 15 | "VwN-ZN-Spn.title" = "BingPaper"; 16 | 17 | /* Class = "NSButtonCell"; title = "Today !"; ObjectID = "jDq-jy-kaQ"; */ 18 | "jDq-jy-kaQ.title" = "Today !"; 19 | -------------------------------------------------------------------------------- /BingPaperLoginItem/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // BingPaperLoginItem 4 | // 5 | // Created by Jingwen Peng on 2016-10-07. 6 | // Copyright © 2016 Jingwen Peng. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | @NSApplicationMain 12 | class AppDelegate: NSObject, NSApplicationDelegate { 13 | 14 | func applicationDidFinishLaunching(_ aNotification: Notification) { 15 | var alreadyRunning = false 16 | let runningApplications = NSWorkspace.shared.runningApplications; 17 | for application in runningApplications { 18 | if application.bundleIdentifier == "io.pjw.mac.BingPaper" { 19 | alreadyRunning = true 20 | } 21 | } 22 | 23 | if (!alreadyRunning) { 24 | let path = Bundle.main.bundlePath 25 | var pathComponents = path.components(separatedBy: "/") 26 | pathComponents.removeLast(4) 27 | NSWorkspace.shared.launchApplication(pathComponents.joined(separator: "/")) 28 | } 29 | 30 | NSApp.terminate(nil) 31 | } 32 | } 33 | 34 | -------------------------------------------------------------------------------- /BingPaperLoginItem/Images.xcassets/AppIcon Bing.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "16x16", 5 | "idiom" : "mac", 6 | "filename" : "icon_16x16.png", 7 | "scale" : "1x" 8 | }, 9 | { 10 | "size" : "16x16", 11 | "idiom" : "mac", 12 | "filename" : "icon_16x16@2x.png", 13 | "scale" : "2x" 14 | }, 15 | { 16 | "size" : "32x32", 17 | "idiom" : "mac", 18 | "filename" : "icon_32x32.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "32x32", 23 | "idiom" : "mac", 24 | "filename" : "icon_32x32@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "128x128", 29 | "idiom" : "mac", 30 | "filename" : "icon_128x128.png", 31 | "scale" : "1x" 32 | }, 33 | { 34 | "size" : "128x128", 35 | "idiom" : "mac", 36 | "filename" : "icon_128x128@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "256x256", 41 | "idiom" : "mac", 42 | "filename" : "icon_256x256.png", 43 | "scale" : "1x" 44 | }, 45 | { 46 | "size" : "256x256", 47 | "idiom" : "mac", 48 | "filename" : "icon_256x256@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "512x512", 53 | "idiom" : "mac", 54 | "filename" : "icon_512x512.png", 55 | "scale" : "1x" 56 | }, 57 | { 58 | "size" : "512x512", 59 | "idiom" : "mac", 60 | "filename" : "icon_512x512@2x.png", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /BingPaperLoginItem/Images.xcassets/AppIcon Bing.appiconset/icon_128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaperLoginItem/Images.xcassets/AppIcon Bing.appiconset/icon_128x128.png -------------------------------------------------------------------------------- /BingPaperLoginItem/Images.xcassets/AppIcon Bing.appiconset/icon_128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaperLoginItem/Images.xcassets/AppIcon Bing.appiconset/icon_128x128@2x.png -------------------------------------------------------------------------------- /BingPaperLoginItem/Images.xcassets/AppIcon Bing.appiconset/icon_16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaperLoginItem/Images.xcassets/AppIcon Bing.appiconset/icon_16x16.png -------------------------------------------------------------------------------- /BingPaperLoginItem/Images.xcassets/AppIcon Bing.appiconset/icon_16x16@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaperLoginItem/Images.xcassets/AppIcon Bing.appiconset/icon_16x16@2x.png -------------------------------------------------------------------------------- /BingPaperLoginItem/Images.xcassets/AppIcon Bing.appiconset/icon_256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaperLoginItem/Images.xcassets/AppIcon Bing.appiconset/icon_256x256.png -------------------------------------------------------------------------------- /BingPaperLoginItem/Images.xcassets/AppIcon Bing.appiconset/icon_256x256@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaperLoginItem/Images.xcassets/AppIcon Bing.appiconset/icon_256x256@2x.png -------------------------------------------------------------------------------- /BingPaperLoginItem/Images.xcassets/AppIcon Bing.appiconset/icon_32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaperLoginItem/Images.xcassets/AppIcon Bing.appiconset/icon_32x32.png -------------------------------------------------------------------------------- /BingPaperLoginItem/Images.xcassets/AppIcon Bing.appiconset/icon_32x32@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaperLoginItem/Images.xcassets/AppIcon Bing.appiconset/icon_32x32@2x.png -------------------------------------------------------------------------------- /BingPaperLoginItem/Images.xcassets/AppIcon Bing.appiconset/icon_512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaperLoginItem/Images.xcassets/AppIcon Bing.appiconset/icon_512x512.png -------------------------------------------------------------------------------- /BingPaperLoginItem/Images.xcassets/AppIcon Bing.appiconset/icon_512x512@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/BingPaperLoginItem/Images.xcassets/AppIcon Bing.appiconset/icon_512x512@2x.png -------------------------------------------------------------------------------- /BingPaperLoginItem/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /BingPaperLoginItem/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | $(MARKETING_VERSION) 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | LSApplicationCategoryType 24 | public.app-category.utilities 25 | LSBackgroundOnly 26 | 27 | LSMinimumSystemVersion 28 | $(MACOSX_DEPLOYMENT_TARGET) 29 | LSUIElement 30 | 31 | NSHumanReadableCopyright 32 | Copyright © 2016 Jingwen Peng. All rights reserved. 33 | NSMainNibFile 34 | BingPaperLoginItem 35 | NSPrincipalClass 36 | NSApplication 37 | 38 | 39 | -------------------------------------------------------------------------------- /BingPaperLoginItemTests/BingPaperLoginItem.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /BingPaperLoginItemTests/BingPaperLoginItemTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BingPaperLoginItemTests.swift 3 | // BingPaperLoginItemTests 4 | // 5 | // Created by Jingwen Peng on 2016-10-07. 6 | // Copyright © 2016 Jingwen Peng. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | import XCTest 11 | 12 | class BingPaperLoginItemTests: XCTestCase { 13 | 14 | override func setUp() { 15 | super.setUp() 16 | // Put setup code here. This method is called before the invocation of each test method in the class. 17 | } 18 | 19 | override func tearDown() { 20 | // Put teardown code here. This method is called after the invocation of each test method in the class. 21 | super.tearDown() 22 | } 23 | 24 | func testExample() { 25 | // This is an example of a functional test case. 26 | // Use XCTAssert and related functions to verify your tests produce the correct results. 27 | } 28 | 29 | func testPerformanceExample() { 30 | // This is an example of a performance test case. 31 | self.measure { 32 | // Put the code you want to measure the time of here. 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /BingPaperLoginItemTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /BingPaperTests/BingPaperTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BingPaperTests.swift 3 | // BingPaperTests 4 | // 5 | // Created by Jingwen Peng on 2015-03-13. 6 | // Copyright (c) 2015 Jingwen Peng. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | import XCTest 11 | 12 | class BingPaperTests: XCTestCase { 13 | 14 | override func setUp() { 15 | super.setUp() 16 | // Put setup code here. This method is called before the invocation of each test method in the class. 17 | } 18 | 19 | override func tearDown() { 20 | // Put teardown code here. This method is called after the invocation of each test method in the class. 21 | super.tearDown() 22 | } 23 | 24 | func testExample() { 25 | // This is an example of a functional test case. 26 | XCTAssert(true, "Pass") 27 | } 28 | 29 | func testPerformanceExample() { 30 | // This is an example of a performance test case. 31 | self.measure() { 32 | // Put the code you want to measure the time of here. 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /BingPaperTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Design/Bing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/Design/Bing.png -------------------------------------------------------------------------------- /Design/BingPaper_2015-07-12.pxm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/Design/BingPaper_2015-07-12.pxm -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment this line to define a global platform for your project 2 | platform :osx, '10.15' 3 | 4 | target 'BingPaper' do 5 | # Comment this line if you're not using Swift and don't want to use dynamic frameworks 6 | use_frameworks! 7 | 8 | # Pods for BingPaper 9 | pod 'MASPreferences', '~> 1.3' 10 | 11 | target 'BingPaperTests' do 12 | inherit! :search_paths 13 | # Pods for testing 14 | end 15 | 16 | end 17 | -------------------------------------------------------------------------------- /Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - MASPreferences (1.3) 3 | 4 | DEPENDENCIES: 5 | - MASPreferences (~> 1.3) 6 | 7 | SPEC REPOS: 8 | trunk: 9 | - MASPreferences 10 | 11 | SPEC CHECKSUMS: 12 | MASPreferences: c08b8622dd17b47da87669e741efd7c92e970e8c 13 | 14 | PODFILE CHECKSUM: 715dcffa6b398886896c9149a1efe29fa60eba2f 15 | 16 | COCOAPODS: 1.9.1 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # BingPaper 2 | 3 | Use Bing daily photo as your wallpaper for macOS. 4 | 5 | ## Screenshots 6 | 7 | #### Version 0.11.1 8 | Screenshot 9 | 10 | #### Version 0.10.1 11 | Screenshot 12 | 13 | #### Version 0.9.7 14 | 15 | Screenshot 16 | Screenshot 17 | 18 | ## Features 19 | 20 | - Automatic start at system startup 21 | - Auto download new Bing images 22 | - Auto change wallpaper 23 | - Show the Bing image information 24 | - Use history images as wallpaper 25 | - Choose Bing region 26 | - Choose image storage location 27 | - Hide/Show the dock icon 28 | - Dark mode 29 | 30 | _Feel free to [give feedback](https://github.com/pengsrc/BingPaper/issues/new) or contribute to this project._ 31 | 32 | ## Usage 33 | 34 | ### Download the Application 35 | 36 | You can download the application directly from the [releases tab](https://github.com/pengsrc/BingPaper/releases), and put the `BingPaper.app` application in to your `/Applications` folder. 37 | 38 | ___Notice:___ _I did't signed the released application, so you have to disable the gatekeeper on your mac to run it._ 39 | 40 | ### Build from Source 41 | 42 | Also can you build the application from source code. 43 | 44 | ___Download or Clone the Project___ 45 | 46 | ``` bash 47 | $ git clone git@github.com:pengsrc/BingPaper.git 48 | ``` 49 | 50 | ___Install the Dependences___ 51 | 52 | [CocoaPods](https://cocoapods.org) was used to manage the project dependences. 53 | 54 | ``` bash 55 | $ pod install 56 | ``` 57 | 58 | ___Build and Run___ 59 | 60 | Finally, just hit `⌘ + R` to run the application or `⌘ + B` to build the application, then you can drag the built app into your `/Applications` folder. 61 | 62 | ## Contributing 63 | 64 | 1. Fork it ( https://github.com/pengsrc/BingPaper/fork ) 65 | 2. Create your feature branch (`git checkout -b the-new-feature`) 66 | 3. Commit your changes (`git commit -asm 'Add some feature'`) 67 | 4. Push to the branch (`git push origin the-new-feature`) 68 | 5. Create a new Pull Request 69 | 70 | ## LICENSE 71 | 72 | The GPLv3 License. Read [GNU General Public License](https://www.gnu.org/licenses/gpl-3.0.en.html) for further information. 73 | -------------------------------------------------------------------------------- /Screenshots/BingPaper_v0.10.1_en_US.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/Screenshots/BingPaper_v0.10.1_en_US.jpg -------------------------------------------------------------------------------- /Screenshots/BingPaper_v0.11.1_en_US.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/Screenshots/BingPaper_v0.11.1_en_US.jpg -------------------------------------------------------------------------------- /Screenshots/BingPaper_v0.9.7_en_US.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/Screenshots/BingPaper_v0.9.7_en_US.jpg -------------------------------------------------------------------------------- /Screenshots/BingPaper_v0.9.7_zh_CN.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengsrc/BingPaper/61b35dcc32f80119310c7e34e176070e00672b7f/Screenshots/BingPaper_v0.9.7_zh_CN.jpg --------------------------------------------------------------------------------