From e7c5addfabcd1177a72c550dee7539c190f66bf2 Mon Sep 17 00:00:00 2001 From: Gordon Hall Date: Fri, 6 Jun 2014 14:23:40 -0400 Subject: [PATCH] started adding copay shell to copay --- .gitignore | 5 +- app.js | 5 + package.json | 8 +- shell/README.md | 22 ++++ shell/assets/darwin/Info.plist | 40 +++++++ shell/assets/darwin/copay.icns | Bin 0 -> 32921 bytes shell/assets/linux/Copay.desktop | 7 ++ shell/assets/linux/install.sh | 13 +++ shell/assets/win32/build-installer.nsi | 148 +++++++++++++++++++++++++ shell/assets/win32/logo.ico | Bin 0 -> 99678 bytes shell/bin/README.md | 8 ++ shell/config.json | 10 ++ shell/index.js | 63 +++++++++++ shell/lib/app-menu.js | 143 ++++++++++++++++++++++++ shell/lib/message-handler.js | 81 ++++++++++++++ shell/lib/system-tray.js | 16 +++ shell/scripts/build-linux.js | 70 ++++++++++++ shell/scripts/download-atom-shell.js | 106 ++++++++++++++++++ shell/scripts/launch.js | 39 +++++++ 19 files changed, 781 insertions(+), 3 deletions(-) create mode 100644 shell/README.md create mode 100644 shell/assets/darwin/Info.plist create mode 100644 shell/assets/darwin/copay.icns create mode 100644 shell/assets/linux/Copay.desktop create mode 100755 shell/assets/linux/install.sh create mode 100644 shell/assets/win32/build-installer.nsi create mode 100644 shell/assets/win32/logo.ico create mode 100644 shell/bin/README.md create mode 100644 shell/config.json create mode 100644 shell/index.js create mode 100644 shell/lib/app-menu.js create mode 100644 shell/lib/message-handler.js create mode 100644 shell/lib/system-tray.js create mode 100644 shell/scripts/build-linux.js create mode 100644 shell/scripts/download-atom-shell.js create mode 100644 shell/scripts/launch.js diff --git a/.gitignore b/.gitignore index 27d05ec7c..b25ec853a 100644 --- a/.gitignore +++ b/.gitignore @@ -51,5 +51,8 @@ version.js android/package android/*.apk - coverage/ + +shell/bin/linux +shell/bin/darwin +shell/bin/win32 diff --git a/app.js b/app.js index 69407cdcb..08351a4f5 100644 --- a/app.js +++ b/app.js @@ -13,3 +13,8 @@ app.start = function(port, callback) { }; module.exports = app; + +// if we are running in the copay shell context, initialize the shell bindings +if (process.versions && process.versions['atom-shell']) { + require('./shell')(app); +} diff --git a/package.json b/package.json index 6ca8f3512..7fa71c61d 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,9 @@ "scripts": { "start": "node server.js", "test": "node_modules/.bin/istanbul cover ./node_modules/mocha/bin/_mocha --report lcovonly -- -R spec && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js", - "coverage": "./node_modules/.bin/istanbul cover ./node_modules/.bin/_mocha -- --reporter spec test" + "coverage": "./node_modules/.bin/istanbul cover ./node_modules/.bin/_mocha -- --reporter spec test", + "shell": "node shell/scripts/launch.js", + "setup-shell": "node shell/scripts/download-atom-shell.js" }, "homepage": "https://github.com/bitpay/copay", "devDependencies": { @@ -50,7 +52,9 @@ "sinon": "~1.9.1", "soop": "~0.1.5", "travis-cov": "^0.2.5", - "uglifyify": "~1.2.3" + "uglifyify": "~1.2.3", + "github-releases": "~0.2.0", + "cli-color": "~0.3.2" }, "dependencies": { "mocha": "^1.18.2" diff --git a/shell/README.md b/shell/README.md new file mode 100644 index 000000000..f715bcc73 --- /dev/null +++ b/shell/README.md @@ -0,0 +1,22 @@ +Copay Shell +=========== + +Native application wrapper for [Copay](https://bitpay.github.io/copay) +using [Atom Shell](https://github.com/atom/atom-shell). + +![copay-shell](https://cloud.githubusercontent.com/assets/1188875/3153630/ccaacbae-ea9d-11e3-85d6-ac0ec2820ae2.png) + +## Setup + +Clone the repository and install dependencies. + +``` +~# git clone https://github.com/gordonwritescode/copay-shell.git +~# cd copay-shell && npm install +``` + +To build a distributable package for your platform, run: + +``` +~# npm run-script build +``` diff --git a/shell/assets/darwin/Info.plist b/shell/assets/darwin/Info.plist new file mode 100644 index 000000000..4f1d06bc8 --- /dev/null +++ b/shell/assets/darwin/Info.plist @@ -0,0 +1,40 @@ + + + + + BuildMachineOSBuild + 12F45 + CFBundleDisplayName + Copay + CFBundleExecutable + Copay + CFBundleIconFile + copay.icns + CFBundleIdentifier + com.bitpay.copay + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + Copay + CFBundlePackageType + APPL + CFBundleVersion + 0.0.1 + DTSDKBuild + 13C64 + DTSDKName + macosx + DTXcode + 0511 + DTXcodeBuild + 5B1008 + LSMinimumSystemVersion + 10.8.0 + NSMainNibFile + MainMenu + NSPrincipalClass + AtomApplication + NSSupportsAutomaticGraphicsSwitching + + + diff --git a/shell/assets/darwin/copay.icns b/shell/assets/darwin/copay.icns new file mode 100644 index 0000000000000000000000000000000000000000..c587d6e6022bf2d02a94e1e143cae093961d8032 GIT binary patch literal 32921 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 zFmBbRgXeC)`q0vqOxD-jyl}KQJAQsxfHzs_D{v*wBOqkroS4B)HWfR{MOv| zq5e(Pg@c>YP4lNs@b@s1B!{fURGe$$^9W&UJ4q(n>Yh|yDk;uMoHr@J*PHyE7f!t_ zD5hX=eRts{<-c{d60S>!Hm!_VFm0kgg21vHcnus-_fqf{6Sr&2&mS&Y6+L787=LdM zBR?2L78N$=Vhq=-qoujwdF7eid8wwTh!AfK7`uyaO)qxwwWn3r&+OZfx;T7npdbDo zj@*Sk1Tf8DJ9cK+7({~X=49$J>_wD5kMKYHuN8ZrXIWu2m%kC{*mWaN_`3i7{0I2! zjeo^YM|ITq-wTdJO7rlyBLAwNhPiV^yb5Cc?aROJr>aVDBvSgvcOPUlud`Fct00!a zF2z)EBvO(>B11>St00!aEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>St00!aEyYxD zBvO(>B11>St00!aEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>St00!aEyYxDBvO(> zB11>St00!aEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>S zt00!aEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>St00!a zEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>St00!aEyYxD zBvO(>B11>St00!aEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>St00!aEyYxDBvO(> zB11>St00!aEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>S zt00!aEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>St00!a zEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>St00!aEyYxD zBvO(>B11>St00!aEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>St00!aEyYxDBvO(> zB11>St00!aEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>S zt00!aEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>St00!a zEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>St00!aEyYxD zBvO(>B11>St00!aEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>St00!aEyYxDBvO(> zB11>St00!aEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>S zt00!aEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>St00!a zEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>St00!aEyYxD zBvO(>B11>St00!aEyYxDBvO(>B11>St00!aEyYxDBvO(>B11>St00!aEyYxDBvO(> zB11>St00!aEyYxDBvO(>B11>St04a0{`=$q?Z3aC`!D?a^ZHq{gg}dwzMuE#AN}9# R|HXm=~ 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