diff --git a/Gruntfile.js b/Gruntfile.js index 8998344..deec44c 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -5,10 +5,10 @@ module.exports = function (grunt) { grunt.util.linefeed = '\n'; // Platforms - var inputPlatforms = (grunt.cli.tasks.length === 1 && ['win','nsis','mac','linux32','linux64'].indexOf(grunt.cli.tasks[0]) !== -1) + var inputPlatforms = (grunt.cli.tasks.length === 1 && ['win','nsis','osx','mac','linux32','linux64'].indexOf(grunt.cli.tasks[0]) !== -1) ? grunt.cli.tasks[0] : 'all', buildPlatforms = { - mac: /mac|all/.test(inputPlatforms), + mac: /mac|osx|all/.test(inputPlatforms), win: /win|nsis|all/.test(inputPlatforms), linux32: /linux32|all/.test(inputPlatforms), linux64: /linux64|all/.test(inputPlatforms) @@ -19,8 +19,9 @@ module.exports = function (grunt) { // Metadata. pkg: grunt.file.readJSON('package.json'), app: grunt.file.readJSON('app/package.json'), - twister_win_ia32_url: 'https://dl.dropboxusercontent.com/s/5hwve6gxncnli4g/twister-0.9.22-win32.zip', + twister_win_ia32_url: 'https://dl.dropboxusercontent.com/s/pmshsw59a42opzg/twister-0.9.25-win32.zip', twister_mac_x64_url: 'http://twisterd.net/osx_bin.zip', + twister_bootstrap_db48_url: 'https://dl.dropboxusercontent.com/s/oy7wetm2jcgvnxz/bootstrap48.zip', nsis_path: process.platform === 'win32' ? (process.arch === 'x64' ? '%ProgramFiles(x86)%' : '%ProgramFiles%') + '\\NSIS\\' : '', // Task configuration. @@ -44,25 +45,25 @@ module.exports = function (grunt) { { cwd: 'build/themes/twister-html-master', src: ['**'], - dest: 'build/releases/twister/win/twister/html/default/', + dest: 'build/twister/win/html/default/', expand: true }, { cwd: 'build/themes/twister-html-master', src: ['**'], - dest: 'build/releases/twister/mac/twister.app/Contents/Resources/html/default/', + dest: 'build/twister/osx/twister.app/Contents/Resources/html/default/', expand: true }, { cwd: 'build/themes/twister-html-master', src: ['**'], - dest: 'build/releases/twister/linux32/twister/html/default/', + dest: 'build/twister/linux32/html/default/', expand: true }, { cwd: 'build/themes/twister-html-master', src: ['**'], - dest: 'build/releases/twister/linux64/twister/html/default/', + dest: 'build/twister/linux64/html/default/', expand: true } ] @@ -72,52 +73,118 @@ module.exports = function (grunt) { { cwd: 'build/themes/twister-calm-master', src: ['**'], - dest: 'build/releases/twister/win/twister/html/calm/', + dest: 'build/twister/win/html/calm/', expand: true }, { cwd: 'build/themes/twister-calm-master', src: ['**'], - dest: 'build/releases/twister/mac/twister.app/Contents/Resources/html/calm/', + dest: 'build/twister/osx/twister.app/Contents/Resources/html/calm/', expand: true }, { cwd: 'build/themes/twister-calm-master', src: ['**'], - dest: 'build/releases/twister/linux32/twister/html/calm/', + dest: 'build/twister/linux32/html/calm/', expand: true }, { cwd: 'build/themes/twister-calm-master', src: ['**'], - dest: 'build/releases/twister/linux64/twister/html/calm/', + dest: 'build/twister/linux64/html/calm/', + expand: true + } + ] + }, + theme_nin: { + files: [ + { + cwd: 'build/themes/twister-nin-master', + src: ['**'], + dest: 'build/twister/win/html/nin/', + expand: true + }, + { + cwd: 'build/themes/twister-nin-master', + src: ['**'], + dest: 'build/twister/osx/twister.app/Contents/Resources/html/nin/', + expand: true + }, + { + cwd: 'build/themes/twister-nin-master', + src: ['**'], + dest: 'build/twister/linux32/html/nin/', + expand: true + }, + { + cwd: 'build/themes/twister-nin-master', + src: ['**'], + dest: 'build/twister/linux64/html/nin/', expand: true } ] }, empty: { files: { - 'build/releases/twister/win/twister/html/': 'empty.html', - 'build/releases/twister/mac/twister.app/Contents/Resources/html/': 'empty.html', - 'build/releases/twister/linux32/twister/html/': 'empty.html', - 'build/releases/twister/linux64/twister/html/': 'empty.html' + 'build/twister/win/html/': 'empty.html', + 'build/twister/osx/twister.app/Contents/Resources/html/': 'empty.html', + 'build/twister/linux32/html/': 'empty.html', + 'build/twister/linux64/html/': 'empty.html' } }, + bootstrap: { + files: [ + { + cwd: 'build/bootstrap/db48', + src: ['**'], + dest: 'build/twister/win/bootstrap/', + expand: true + }/*, + { + cwd: 'build/bootstrap', + src: ['**'], + dest: 'build/twister/osx/twister.app/Contents/Resources/bootstrap/', + expand: true + }, + { + cwd: 'build/bootstrap', + src: ['**'], + dest: 'build/twister/linux32/bootstrap/', + expand: true + }, + { + cwd: 'build/bootstrap', + src: ['**'], + dest: 'build/twister/linux64/bootstrap/', + expand: true + }*/ + ] + }, + twister_win_ia32: { + files: [ + { + cwd: 'build/twister-win32-bundle', + src: ['**'], + dest: 'build/twister/win/bin/', + expand: true + } + ] + }, twister_osx_x64: { files: [ { cwd: 'build/download/twister-osx-bundle/bin', src: ['**'], - dest: 'build/releases/twister/mac/twister.app/Contents/Resources/bin/', - mode: 777, // =c777 + dest: 'build/twister/osx/twister.app/Contents/Resources/bin/', + mode: 511, // =0777 expand: true } - ] + ] }, nsis: { files: [ { - cwd: 'build/releases/twister/win/twister/', + cwd: 'build/twister/win/', src: ['**'], dest: 'build-win/source', expand: true @@ -134,6 +201,12 @@ module.exports = function (grunt) { dest: 'build-win/source/html/calm/', expand: true }, + { + cwd: 'build/themes/twister-nin-master', + src: ['**'], + dest: 'build-win/source/html/nin/', + expand: true + }, { cwd: 'build/twister-win32-bundle/', src: ['twisterd.exe', '*.dll'], @@ -164,7 +237,7 @@ module.exports = function (grunt) { }, files: [ { - cwd: 'build/releases/twister/win/twister', + cwd: 'build/twister/win', src: ['**'], expand: true } @@ -177,17 +250,17 @@ module.exports = function (grunt) { }, files: [ { - cwd: 'build/releases/twister/mac/', + cwd: 'build/twister/osx/', src: ['**'], mode: 484, // = 0744 expand: true - }, + }/*, { cwd: 'build-mac/', src: ['build-twister.sh'], mode: 484, // = 0744 expand: true - } + }*/ ] }, twister_linux_ia32: { @@ -197,27 +270,27 @@ module.exports = function (grunt) { }, files: [ { - cwd: 'build/releases/twister/linux32/', - src: ['twister/html/**', 'twister/nw.pak', 'twister/libffmpegsumo.so'], + cwd: 'build/twister/linux32/', + src: ['html/**', 'nw.pak', 'libffmpegsumo.so'], expand: true }, { - cwd: 'build/releases/twister/linux32/', - src: ['twister/twister'], + cwd: 'build/twister/linux32/', + src: ['twister'], mode: 484, // = 0744 expand: true }, { cwd: 'build-linux/', src: ['twister.sh', 'build-twister.sh'], - dest: 'twister/', +// dest: 'twister/', mode: 484, // = 0744 expand: true }, { cwd: 'build-linux/', src: ['*.png'], - dest: 'twister/', +// dest: 'twister/', expand: true } ] @@ -229,27 +302,27 @@ module.exports = function (grunt) { }, files: [ { - cwd: 'build/releases/twister/linux64/', - src: ['twister/html/**', 'twister/nw.pak', 'twister/libffmpegsumo.so'], + cwd: 'build/twister/linux64/', + src: ['html/**', 'nw.pak', 'libffmpegsumo.so'], expand: true }, { - cwd: 'build/releases/twister/linux64/', - src: ['twister/twister'], + cwd: 'build/twister/linux64/', + src: ['twister'], mode: 484, // = 0744 expand: true }, { cwd: 'build-linux/', src: ['twister.sh', 'build-twister.sh'], - dest: 'twister/', +// dest: 'twister/', mode: 484, // = 0744 expand: true }, { cwd: 'build-linux/', src: ['*.png'], - dest: 'twister/', +// dest: 'twister/', expand: true } ] @@ -266,6 +339,15 @@ module.exports = function (grunt) { 'build/download/twister-theme-calm.zip': 'https://codeload.github.com/iHedgehog/twister-calm/zip/master' } }, + twister_theme_nin: { + files: { + 'build/download/twister-theme-nin.zip': 'https://codeload.github.com/myleneb/twister-nin/zip/master' + } + }, + bootstrap_db48: { + src: '<%= twister_bootstrap_db48_url %>', + dest: 'build/download/bootstrap48.zip' + }, twister_win_ia32: { src: '<%= twister_win_ia32_url %>', dest: 'build/download/twister-win32-bundle.zip' @@ -284,6 +366,14 @@ module.exports = function (grunt) { src: 'build/download/twister-theme-calm.zip', dest: 'build/themes' }, + twister_nin: { + src: 'build/download/twister-theme-nin.zip', + dest: 'build/themes' + }, + bootstrap_db48: { + src: 'build/download/bootstrap48.zip', + dest: 'build/bootstrap/db48' + }, twister_win_ia32: { src: 'build/download/twister-win32-bundle.zip', dest: 'build/twister-win32-bundle' @@ -314,84 +404,139 @@ module.exports = function (grunt) { // Default task. grunt.registerTask('default', [ + // make node-webkit app 'copy:app', 'nodewebkit', + // add themes 'curl:twister_theme_default', 'curl:twister_theme_calm', - 'curl:twister_win_ia32', - 'curl:twister_osx_x64', + 'curl:twister_theme_nin', 'unzip:twister_default', 'unzip:twister_calm', - 'unzip:twister_win_ia32', - 'unzip:twister_osx_x64', - 'copy:twister_osx_x64', + 'unzip:twister_nin', 'copy:theme_default', 'copy:theme_calm', + 'copy:theme_nin', 'copy:empty', + // add blockchain bootstrap + 'curl:bootstrap_db48', + 'unzip:bootstrap_db48', + 'copy:bootstrap', + // add binaries + 'curl:twister_win_ia32', + 'curl:twister_osx_x64', + 'unzip:twister_win_ia32', + 'unzip:twister_osx_x64', + 'copy:twister_win_ia32', + 'copy:twister_osx_x64', + // final compressing 'compress' ]); // Win32 grunt.registerTask('win', [ + // make node-webkit app 'copy:app', 'nodewebkit', + // add themes 'curl:twister_theme_default', 'curl:twister_theme_calm', - 'curl:twister_win_ia32', + 'curl:twister_theme_nin', 'unzip:twister_default', 'unzip:twister_calm', - 'unzip:twister_win_ia32', + 'unzip:twister_nin', 'copy:theme_default', 'copy:theme_calm', + 'copy:theme_nin', 'copy:empty', + // add blockchain bootstrap + 'curl:bootstrap_db48', + 'unzip:bootstrap_db48', + 'copy:bootstrap', + // add binaries + 'curl:twister_win_ia32', + 'unzip:twister_win_ia32', + 'copy:twister_win_ia32', + // final compressing 'compress:twister_win_ia32' ]); // Mac OSX - grunt.registerTask('mac', [ + grunt.registerTask('osx', [ + // make node-webkit app 'copy:app', 'nodewebkit', + // add themes 'curl:twister_theme_default', 'curl:twister_theme_calm', - 'curl:twister_osx_x64', + 'curl:twister_theme_nin', 'unzip:twister_default', 'unzip:twister_calm', - 'unzip:twister_osx_x64', - 'copy:twister_osx_x64', + 'unzip:twister_nin', 'copy:theme_default', 'copy:theme_calm', + 'copy:theme_nin', 'copy:empty', + // add blockchain bootstrap +// 'curl:bootstrap_db48', +// 'unzip:bootstrap_db48', + 'copy:bootstrap', + // add binaries + 'curl:twister_osx_x64', + 'unzip:twister_osx_x64', + 'copy:twister_osx_x64', + // final compressing 'compress:twister_osx_x64' ]); // Linux32 grunt.registerTask('linux32', [ + // make node-webkit app 'copy:app', 'nodewebkit', + // add themes 'curl:twister_theme_default', 'curl:twister_theme_calm', + 'curl:twister_theme_nin', 'unzip:twister_default', 'unzip:twister_calm', + 'unzip:twister_nin', 'copy:theme_default', 'copy:theme_calm', + 'copy:theme_nin', 'copy:empty', + // add blockchain bootstrap +// 'curl:bootstrap_db48', +// 'unzip:bootstrap_db48', + 'copy:bootstrap', + // add binaries + // final compressing 'compress:twister_linux_ia32' ]); // Linux64 grunt.registerTask('linux64', [ + // make node-webkit app 'copy:app', 'nodewebkit', + // add themes 'curl:twister_theme_default', 'curl:twister_theme_calm', + 'curl:twister_theme_nin', 'unzip:twister_default', 'unzip:twister_calm', + 'unzip:twister_nin', 'copy:theme_default', 'copy:theme_calm', + 'copy:theme_nin', 'copy:empty', + // add blockchain bootstrap +// 'curl:bootstrap_db48', +// 'unzip:bootstrap_db48', + 'copy:bootstrap', + // add binaries + // final compressing 'compress:twister_linux_x64' ]); // Win32 - NSIS grunt.registerTask('nsis', [ 'win', -// 'curl:twister_win_ia32', -// 'unzip:twister_win_ia32', 'copy:nsis', 'exec:nsis' ]); diff --git a/app/js/interface.js b/app/js/interface.js index d984214..f640ded 100644 --- a/app/js/interface.js +++ b/app/js/interface.js @@ -136,7 +136,7 @@ */ win.setWaitCursor = function (wait) { var doc = window.getIframeDocument(); - if (doc) { + if (doc && doc.body) { doc.body.style.cursor = wait ? 'progress' : ''; } }; @@ -162,6 +162,8 @@ if (confirm(msg)) { twister.restart(win.onTwisterStart); + } else { + win.close(); } }); diff --git a/app/js/settings.js b/app/js/settings.js index 247e3ea..1f36a27 100644 --- a/app/js/settings.js +++ b/app/js/settings.js @@ -21,6 +21,7 @@ * @property twisterdPath * @property twisterdDatadir * @property proxy + * @property twisterNodes */ window.Settings = function () { var that = this; @@ -39,7 +40,13 @@ window.Settings = function () { rpcPassword: '', twisterdPath: '', twisterdDatadir: '', - proxy: '' + proxy: '', + twisterNodes: [ + 'seed3.twister.net.co', + 'seed2.twister.net.co', + 'seed.twister.net.co', + 'dnsseed.gombadi.com' + ] }; var fileSettings = appDir + ds + 'settings.ini'; diff --git a/app/js/tray.js b/app/js/tray.js index a7d9b7f..0c90edb 100644 --- a/app/js/tray.js +++ b/app/js/tray.js @@ -125,6 +125,9 @@ window.addEventListener('init', function () { } } settings.theme = theme; + if (window.$ && window.$.localStorage) { + window.$.localStorage.set('options:theme', theme); + } win.updateTheme(); } })); diff --git a/app/js/twister.js b/app/js/twister.js index b5485da..e8fd13d 100644 --- a/app/js/twister.js +++ b/app/js/twister.js @@ -12,22 +12,29 @@ window.Twister = function () { function getDefaultDataDir() { if (isMac) { - return process.env.HOME + '/.twister'; + return process.env.HOME + '/Library/Application Support/Twister'; } else { return process.env.HOME + ds + '.twister'; } } + var isCygwin = false; function escapePath(path) { if (isWin32) { - path = path.split(':'); - if (path[1]) { - path = '/cygdrive/' + path[0].toLowerCase() + path[1].replace(/\\/g, '/'); + if (isCygwin) { + // Cygwin escaping + path = path.split(':'); + if (path[1]) { + path = '/cygdrive/' + path[0].toLowerCase() + path[1].replace(/\\/g, '/'); + } else { + path = path[0].replace(/\\/g, '/') + } } else { - path = path[0].replace(/\\/g, '/') + // MinGW escaping + path = path.replace(/\//g, '\\').replace(/([()%!^"<>&|;, ])/g, '^$1'); } } else { - path = path.replace(/ /g, '\\ '); + path = path.replace(/[^a-zA-Z0-9_]/g, '\\$1'); } return path; } @@ -63,12 +70,6 @@ window.Twister = function () { var that = this, twisterd_themes_dir = './html', twisterd_args_common = [], - twisterNodes = [ - 'seed3.twister.net.co', - 'seed2.twister.net.co', - 'seed.twister.net.co', - 'dnsseed.gombadi.com' - ], curNodeIndex = Infinity, childDaemon = null, checkRunningId = 0, @@ -99,7 +100,7 @@ window.Twister = function () { } catch (e) { console.log(e); } - copyRecursiveSync(appDir + ds + 'data', settings.twisterdDatadir); + copyRecursiveSync(appDir + ds + 'bootstrap', settings.twisterdDatadir); } } catch (e) { console.log(e); @@ -182,12 +183,10 @@ window.Twister = function () { } childDaemon = rpcCall(twisterd_args_daemon, function (error) { + childDaemon = null; if (error && error.killed === true) { win.emit('twisterstop'); - childDaemon = null; - return; - } - if (!isTwisterdOn) { + } else if (!isTwisterdOn && !isStop) { var event = new CustomEvent('twisterfail'); event.error = { message: error.message, @@ -195,7 +194,6 @@ window.Twister = function () { }; window.dispatchEvent(event); } - childDaemon = null; }); waitTwisterStart(callback); @@ -207,7 +205,7 @@ window.Twister = function () { */ this.tryStart = function (callback) { if (checkRunningId) { - clearInterval(); + clearInterval(checkRunningId); checkRunningId = 0; } @@ -243,12 +241,13 @@ window.Twister = function () { win.removeAllListeners('twisterstop'); }); - rpcCall(['stop'], function () { + rpcCall(['stop'], function (error) { if (childDaemon) { childDaemon.stdout.destroy(); childDaemon.stderr.destroy(); childDaemon.unref(); } + curNodeIndex = Infinity; setTimeout(function () { if (childDaemon) { try { @@ -296,8 +295,8 @@ window.Twister = function () { */ function loopAddNodes() { setTimeout(function () { - if (curNodeIndex < twisterNodes.length) { - addNode(twisterNodes[curNodeIndex++]); + if (curNodeIndex < settings.twisterNodes.length) { + addNode(settings.twisterNodes[curNodeIndex++]); loopAddNodes(); } }, addNodeInterval); @@ -352,7 +351,7 @@ window.Twister = function () { */ this.isWorking = function (callback) { var req = new XMLHttpRequest(); - req.open('GET', 'http://' + settings.rpcHost + ':' + settings.rpcPort + '/empty.html'); + req.open('POST', 'http://' + settings.rpcHost + ':' + settings.rpcPort + '/empty.html'); req.timeout = rpcCheckTimeout; req.withCredentials = true; req.setRequestHeader('Authorization', 'Basic ' + btoa(settings.rpcUser + ':' + settings.rpcPassword)); @@ -391,4 +390,4 @@ window.Twister = function () { var isWorking = isRunning(); window.dispatchEvent(new CustomEvent(isWorking ? 'twisterrun' : 'twisterdie')); } -}; +}; \ No newline at end of file diff --git a/app/js/winstate.js b/app/js/winstate.js index ded0a77..dfb17ca 100644 --- a/app/js/winstate.js +++ b/app/js/winstate.js @@ -1,35 +1,42 @@ 'use strict'; - /** * Cross-platform window state preservation. * Yes this code is quite complicated, but this is the best I came up with for * current state of node-webkit Window API (v0.7.3 and later). * * Known issues: - * - unmaximization not always sets the window (x, y) in the lastly used coordinates - * - unmaximization animation sometimes looks wierd - * - extra height added to window, at least in linux x64 gnome-shell env. It seems that + * - Unmaximization not always sets the window (x, y) in the lastly used coordinates. + * - Unmaximization animation sometimes looks wierd. + * - Extra height added to window, at least in linux x64 gnome-shell env. It seems that * when we read height then it returns it with window frame, but if we resize window * then it applies dimensions only to internal document without external frame. * Need to test in other environments with different visual themes. * * Change log: - * 2013.12.01 - * - workaround of extra height in gnome-shell added + * 2013-12-01 + * - Workaround of extra height in gnome-shell added. + * + * 2014-03-22 + * - Repared workaround (from 2013-12-01) behaviour when use frameless window. + * Now it works correctly. */ (function () { -// var gui = require('nw.gui'); -// var win = gui.Window.get(); + //var gui = require('nw.gui'); + //var win = gui.Window.get(); var winState; var currWinMode; var resizeTimeout; var isMaximizationEvent = false; var defaultWidth = 917; var defaultHeight = 600; + var minHeight = 240; -// extra height added in linux x64 gnome-shell env, use it as workaround - var deltaHeight = false; + // extra height added in linux x64 gnome-shell env, use it as workaround + var deltaHeight = (function () { + // use deltaHeight only in windows with frame enabled + if (gui.App.manifest.window.frame) return true; else return 'disabled'; + })(); function initWindowState() { @@ -43,7 +50,7 @@ } } else { currWinMode = 'normal'; - deltaHeight = 0; + if (deltaHeight !== 'disabled') deltaHeight = 0; win.resizeTo(defaultWidth, defaultHeight); dumpWindowState(); } @@ -72,7 +79,7 @@ winState.height = win.height; // save delta only of it is not zero - if (deltaHeight !== 0 && currWinMode !== 'maximized') { + if (deltaHeight !== 'disabled') { winState.deltaHeight = deltaHeight; } } @@ -80,12 +87,12 @@ function restoreWindowState() { // deltaHeight already saved, so just restore it and adjust window height - if (typeof winState.deltaHeight !== 'undefined') { + if (deltaHeight !== 'disabled' && typeof winState.deltaHeight !== 'undefined') { deltaHeight = winState.deltaHeight; winState.height = winState.height - deltaHeight; } - win.resizeTo(winState.width, winState.height); + win.resizeTo(winState.width, Math.max(winState.height, minHeight)); win.moveTo(winState.x, winState.y); } @@ -131,7 +138,7 @@ } // there is no deltaHeight yet, calculate it and adjust window size - if (deltaHeight === false) { + if (deltaHeight !== 'disabled' && deltaHeight === false) { deltaHeight = win.height - winState.height; // set correct size @@ -147,9 +154,7 @@ win.on('close', function () { saveWindowState(); -// setTimeout(function () { -// this.close(true); -// }, 50); + //this.close(true); }); })(); \ No newline at end of file diff --git a/app/package.json b/app/package.json index 6cf00f7..62a72c8 100644 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "main": "index.html", "name": "twister", - "version": "0.9.22.0", + "version": "0.9.25.0", "description": "P2P microbloging system", "chromium-args": "--auth-schemes='basic'", "window": { diff --git a/package.json b/package.json index 5e751a3..c866cd4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "twister", - "version": "0.9.22", + "version": "0.9.25", "description": "P2P microbloging system", "licenses": [ { @@ -24,13 +24,13 @@ "dependencies": {}, "devDependencies": { "grunt-cli": "~0.1.13", - "grunt": "~0.4.3", - "grunt-contrib-clean": "~0.5.0", + "grunt": "~0.4.5", + "grunt-contrib-clean": "~0.6.0", "grunt-contrib-compress": "https://github.com/dryabov/grunt-contrib-compress/tarball/39ad2e2a5af4531ef39ebd31bef7ceb05241336c", "grunt-contrib-copy": "~0.5.0", - "grunt-exec": "~0.4.5", - "grunt-node-webkit-builder": "~0.1.17", - "grunt-zip": "~0.13.0", + "grunt-exec": "~0.4.6", + "grunt-node-webkit-builder": "~0.2.0", + "grunt-zip": "~0.16.0", "grunt-curl": "~2.0.2" }, "devDependenciesBackup": {