diff --git a/.gitignore b/.gitignore index 3c3629e..b10777b 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ node_modules +/.idea/ +*.iml \ No newline at end of file diff --git a/index.html b/index-toolbar.html similarity index 87% rename from index.html rename to index-toolbar.html index 2189e06..fced8f7 100644 --- a/index.html +++ b/index-toolbar.html @@ -7,7 +7,7 @@ - + @@ -20,7 +20,6 @@
-
@@ -30,10 +29,6 @@
- - - - + + + + + + + + + + diff --git a/main.js b/main.js index 9b5f640..61c6e9e 100644 --- a/main.js +++ b/main.js @@ -4,53 +4,192 @@ const electron = require('electron') // Module to control application life. const app = electron.app +const ipcMain = electron.ipcMain // Module to create native browser window. const BrowserWindow = electron.BrowserWindow const path = require('path') const url = require('url') +const initialHeight = 600 +const initialWidth = 900 +const toolbarHeight = 82 // Keep a global reference of the window object, if you don't, the window will // be closed automatically when the JavaScript object is garbage collected. -let mainWindow +let mainWindowToolbar +let mainWindowView +function init(){ + mainWindowToolbar = createToolbarWindow() +} +function createToolbarWindow(){ + // Create the browser window. + mainWindowToolbar = new BrowserWindow({ titleBarStyle: 'hidden', frame: false, width: initialWidth, height: toolbarHeight, transparent: true }); //900x600 was initial parameter + mainWindowToolbar.setMaximumSize(mainWindowToolbar.getMaximumSize()[0], mainWindowToolbar.getBounds().height) + mainWindowToolbar.setMinimumSize(mainWindowToolbar.getMinimumSize()[0], mainWindowToolbar.getBounds().height) -function createWindow () { - // Create the browser window. - mainWindow = new BrowserWindow({ titleBarStyle: 'hidden', frame: false, width: 900, height: 600, transparent: true }); + mainWindowToolbar.setPosition(mainWindowToolbar.getBounds().x, mainWindowToolbar.getBounds().y - (600/2)) + mainWindowToolbar.__id = 'mainWindowToolbar' - // and load the index.html of the app. - mainWindow.loadURL(url.format({ - pathname: path.join(__dirname, 'index.html'), - protocol: 'file:', - slashes: true - })) - mainWindow.setAlwaysOnTop(true); - // mainWindow.setIgnoreMouseEvents(true); + // and load the index.html of the app. + mainWindowToolbar.loadURL(url.format({ + pathname: path.join(__dirname, 'index-toolbar.html'), + protocol: 'file:', + slashes: true + })) + + mainWindowToolbar.setAlwaysOnTop(true) + + + // Open the DevTools. + // mainWindowToolbar.webContents.openDevTools() + + mainWindowToolbar.on('close', function () { + clearTimeout(positioningTimeout) + app.quit() + }) - // Open the DevTools. - // mainWindow.webContents.openDevTools() + mainWindowView = createViewWindow(initialHeight - toolbarHeight) +} + +function createViewWindow(height){ + mainWindowView = new BrowserWindow({ titleBarStyle: 'hidden', frame: false, width: initialWidth, height: height, transparent: true }); + + // and load the index.html of the app. + mainWindowView.loadURL(url.format({ + pathname: path.join(__dirname, 'index-view.html'), + protocol: 'file:', + slashes: true + })) + + mainWindowView.setAlwaysOnTop(true) + mainWindowView.__id = 'mainWindowView' + lastHeight = mainWindowView.getBounds().height + // mainWindowView.setSkipTaskbar(skipTaskbar) + // mainWindowView.setIgnoreMouseEvents(true); + + + // Open the DevTools. Warning, if dev tools are open, than the transparent window is disabled. + // mainWindowView.webContents.openDevTools() + + // Emitted when the window is closed. + mainWindowView.on('closed', function () { + app.quit() + }) + + try { + addListener(mainWindowView, 'resize') + addListener(mainWindowView, 'move') + addListener(mainWindowToolbar, 'resize') + addListener(mainWindowToolbar, 'move') + } catch(e){ + console.log(e) + } +} - // Emitted when the window is closed. - mainWindow.on('closed', function () { - mainWindow = null - }) +function addListener(brWindow, name){ + if(name === 'resize'){ + brWindow.on(name, handleResizeEvent) + } else if(name === 'move'){ + brWindow.on(name, handleMoveEvent) + } +} + +function removeListener(brWindow, name){ + if(name === 'resize'){ + brWindow.removeListener(name, handleResizeEvent) + } else if(name === 'move'){ + brWindow.removeListener(name, handleMoveEvent) + } +} +let lastHeight = 0 - mainWindow.on('minimize',function(event){ - console.log("Clickthrough disabled"); - mainWindow.setIgnoreMouseEvents(false); - }); +function handleResizeEvent(event){ + let name = 'resize' + let focusedWindow = BrowserWindow.getFocusedWindow(); + let eventBounds = focusedWindow.getBounds() + let notFocusedWindow = getNotFocusedWindow() + removeListener(notFocusedWindow, name) + + try { + // and load the index.html of the app. + const {height} = notFocusedWindow.getBounds() + if (height- 3 > lastHeight || height + 3 < lastHeight) { + notFocusedWindow.setSize(eventBounds.width, notFocusedWindow.getBounds().height) + lastHeight = notFocusedWindow.getBounds().height + } else { + notFocusedWindow.setSize(eventBounds.width, lastHeight) + } + executePositioning(focusedWindow, eventBounds, notFocusedWindow) + addListener(notFocusedWindow, name) + } catch (e) { + console.log("Error " + e.message); + } +} + +let moveTimeout = null + +function handleMoveEvent(event){ + let name = 'move' + let focusedWindow = BrowserWindow.getFocusedWindow(); + let eventBounds = focusedWindow.getBounds() + let notFocusedWindow = getNotFocusedWindow(); + clearTimeout(moveTimeout) + removeListener(notFocusedWindow, name) + + try { + executePositioning(focusedWindow, eventBounds, notFocusedWindow) + moveTimeout = setTimeout(() => addListener(notFocusedWindow, name), 10) + } catch (e) { + console.log("Error " + e.message); + } +} + +let positioningTimeout = null + +function executePositioning(focusedWindow, eventBounds, notFocusedWindow){ + clearTimeout(positioningTimeout) + notFocusedWindow.webContents.send('css', {key: 'display', value: 'none'}); + let notFocusedWindowBounds = getNotFocusedWindow().getBounds() + let newY + if(isToolbar(focusedWindow)){ + newY = eventBounds.y + eventBounds.height + } else { + newY = notFocusedWindowBounds.y + } + positioningTimeout = setTimeout(() => { + notFocusedWindow.setPosition(eventBounds.x, newY) + notFocusedWindow.webContents.send('css', {key: 'display', value: ''}); + }, 150); +} + +function getNotFocusedWindow() { + let actualWindows = electron.BrowserWindow.getAllWindows(); + if(actualWindows.length !== 2) { + console.warn("This method only supports only two opened windows."); + return undefined; + } + for (let win in actualWindows){ + if(actualWindows[win] !== electron.BrowserWindow.getFocusedWindow()){ + return actualWindows[win]; + } + } + console.warn("Duplicated elements on the window stack."); + return undefined; +} +function isToolbar(browserWindow){ + return browserWindow.__id === 'mainWindowToolbar' } // This method will be called when Electron has finished // initialization and is ready to create browser windows. // Some APIs can only be used after this event occurs. -app.on('ready', createWindow) +app.on('ready', init) // Quit when all windows are closed. app.on('window-all-closed', function () { @@ -64,8 +203,8 @@ app.on('window-all-closed', function () { app.on('activate', function () { // On OS X it's common to re-create a window in the app when the // dock icon is clicked and there are no other windows open. - if (mainWindow === null) { - createWindow() + if (mainWindowView === null || mainWindowToolbar === null) { + init() } }) diff --git a/package-lock.json b/package-lock.json index 3d2d2bb..ed8bc67 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@types/node": { - "version": "7.0.67", - "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.67.tgz", - "integrity": "sha512-DUioEWBd0NG30G1/wI0amNN/sSJ/xuX4/YWm4nNa+bUU6swuS7CF+sH/nifu+SPy5BFqRzQEyEWvi9zIDVP+Lw==", + "version": "7.10.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.9.tgz", + "integrity": "sha512-usSpgoUsRtO5xNV5YEPU8PPnHisFx8u0rokj1BPVn/hDF7zwUDzVLiuKZM38B7z8V2111Fj6kd4rGtQFUZpNOw==", "dev": true }, "abbrev": { @@ -17,15 +17,15 @@ "dev": true }, "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", "dev": true, "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", + "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "ansi-align": { @@ -207,6 +207,14 @@ "dev": true, "requires": { "hoek": "2.x.x" + }, + "dependencies": { + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + } } }, "boxen": { @@ -267,10 +275,16 @@ "concat-map": "0.0.1" } }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, "buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, "builtin-modules": { @@ -442,9 +456,9 @@ "dev": true }, "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -603,9 +617,9 @@ } }, "electron": { - "version": "1.8.2-beta5", - "resolved": "https://registry.npmjs.org/electron/-/electron-1.7.15.tgz", - "integrity": "sha512-2NCG4sgrZOtQ6/Uvy94Pig7d+JOxpLdfeD42HODtPFaoJS8PMtnPSBvOqFn/fDlG3/IzvuvsCIIuzP5FgojhPg==", + "version": "1.7.16", + "resolved": "https://registry.npmjs.org/electron/-/electron-1.7.16.tgz", + "integrity": "sha512-k17+2K3hny6g1etWMkWvzEL06yapZGpqG66O3e5vxfzeHT3FgqrNa3xRF7znjaqvWQmmEdGFdSktQADjUZ0gog==", "dev": true, "requires": { "@types/node": "^7.0.18", @@ -680,9 +694,9 @@ } }, "es6-promise": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", - "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==", + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", "dev": true }, "escape-string-regexp": { @@ -716,15 +730,32 @@ "dev": true }, "extract-zip": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", - "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", "dev": true, "requires": { - "concat-stream": "1.6.2", - "debug": "2.6.9", - "mkdirp": "0.5.1", - "yauzl": "2.4.1" + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } } }, "extsprintf": { @@ -734,9 +765,9 @@ "dev": true }, "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", "dev": true }, "fast-diff": { @@ -745,15 +776,15 @@ "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==" }, "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", "dev": true, "requires": { "pend": "~1.2.0" @@ -775,13 +806,13 @@ "dev": true }, "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "1.0.6", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, @@ -910,12 +941,12 @@ "dev": true }, "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { - "ajv": "^5.1.0", + "ajv": "^6.5.5", "har-schema": "^2.0.0" } }, @@ -948,18 +979,20 @@ "cryptiles": "2.x.x", "hoek": "2.x.x", "sntp": "1.x.x" + }, + "dependencies": { + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + } } }, - "hoek": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, "home-path": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/home-path/-/home-path-1.0.6.tgz", - "integrity": "sha512-wo+yjrdAtoXt43Vy92a+0IPCYViiyLAHyp0QVS4xL/tfvVz5sXIW1ubLZk3nhVkD92fQpUMKX+fzMjr5F489vw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/home-path/-/home-path-1.0.7.tgz", + "integrity": "sha512-tM1pVa+u3ZqQwIkXcWfhUlY3HWS3TsnKsfi2OHHvnhkX52s9etyktPyy1rQotkr0euWimChDq+QkQuDe8ngUlQ==", "dev": true }, "hosted-git-info": { @@ -1049,13 +1082,10 @@ } }, "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true }, "is-fullwidth-code-point": { "version": "1.0.0", @@ -1173,9 +1203,9 @@ "dev": true }, "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "json-stable-stringify": { @@ -2468,7 +2498,8 @@ }, "console-control-strings": { "version": "1.1.0", - "bundled": true + "bundled": true, + "optional": true }, "gauge": { "version": "2.6.0", @@ -2504,6 +2535,7 @@ "string-width": { "version": "1.0.2", "bundled": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2513,26 +2545,30 @@ "code-point-at": { "version": "1.0.0", "bundled": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" }, "dependencies": { "number-is-nan": { "version": "1.0.0", - "bundled": true + "bundled": true, + "optional": true } } }, "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" }, "dependencies": { "number-is-nan": { "version": "1.0.0", - "bundled": true + "bundled": true, + "optional": true } } } @@ -3794,6 +3830,12 @@ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -3908,31 +3950,61 @@ } }, "request": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", - "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "dev": true, "requires": { "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", + "aws4": "^1.8.0", "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "tough-cookie": "~2.3.3", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" + "uuid": "^3.3.2" + }, + "dependencies": { + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } } }, "require-directory": { @@ -4049,6 +4121,14 @@ "dev": true, "requires": { "hoek": "2.x.x" + }, + "dependencies": { + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + } } }, "spawn-please": { @@ -4323,6 +4403,23 @@ "xdg-basedir": "^3.0.0" } }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } + }, "url-parse-lax": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", @@ -4522,12 +4619,13 @@ } }, "yauzl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", - "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", "dev": true, "requires": { - "fd-slicer": "~1.0.1" + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" } } } diff --git a/package.json b/package.json index 53008a3..6832611 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ ], "author": "Mitch Samuels", "devDependencies": { - "electron": "~1.7.11", + "electron": "^1.7.16", "electron-rebuild": "^1.7.3" }, "dependencies": { diff --git a/scripts/scripts.js b/scripts/scripts.js deleted file mode 100644 index 3722293..0000000 --- a/scripts/scripts.js +++ /dev/null @@ -1,141 +0,0 @@ -global.$ = $; - -const { remote } = require('electron'); -const { Menu, BrowserWindow, MenuItem, shell } = remote; -const fs = require("fs"); - - - -$(document).ready(function () { - - var webview = document.getElementById('browserView'); - webview.addEventListener('dom-ready', function () { - webview.insertCSS('*::-webkit-scrollbar { width: 0 !important }') - }); - - // Address bar form - $("#addressBar").submit(function(e) { - e.preventDefault(); - loadURL(); - }); - - // Opacity Slider - $("#transparencyRange").change(function(){ - var opacityValue = $(this).val(); - changeOpacity(opacityValue); - }); - - // Select all text when changing URL - $("input[type='text']").click(function () { - $(this).select(); - }); - -}); - - -// Change window Opacity -// Change window Opacity -// Change window Opacity -function changeOpacity(opacity){ - $("body").css('opacity', opacity); -} - - -// App Controls -// App Controls -// App Controls -function loadURL(){ - var url = $("#urlField").val(); - - if(url.indexOf("http") >= 0){ - loadPage(url); - - }else{ - url = "http://" + url; - loadPage(url); - } -} - -function loadPage(url){ - console.log("Loading " + url); - if (url.toLowerCase().indexOf("youtube.com/watch") >= 0){ - var youtubeID = url.substring(url.indexOf("v=") + 2); - youtubeID = youtubeID.split('&')[0]; - var youtubeURL = "https://www.youtube.com/embed/" + youtubeID; - - $("#urlField").val(youtubeURL); - var webview = document.getElementById('browserView'); - webview.loadURL(youtubeURL); - }else{ - var webview = document.getElementById('browserView'); - webview.loadURL(url); - } -} - - - - -// Go back -function browserBack(){ - var webview = document.getElementById('browserView'); - webview.back; - -} - - -function enableClickThrough(){ - console.log("Clickthrough enabled.") - var window = remote.getCurrentWindow(); - window.setIgnoreMouseEvents(true); - - $("#browserView").addClass("full-size"); - $(".app-controls").slideUp(200, function(){ - $(".window-chrome").slideUp(200); - }); - -} - - -remote.BrowserWindow.getFocusedWindow().on('minimize',function(event){ - - $("body").css('opacity', 0.95); - $("#transparencyRange").val(0.95) - - $("#browserView").removeClass("full-size"); - $(".window-chrome").slideDown(200, function(){ - $(".app-controls").slideDown(200); - }); - // remote.BrowserWindow.getAllWindows().setIgnoreMouseEvents(false); - - console.log("Clickthrough disabled"); -}); - - -// Window Controls -// Window Controls -// Window Controls - -function openWebsite(){ - shell.openExternal("http://mitch.works/apps/glass"); -} -function minimizeWindow(){ - var window = remote.getCurrentWindow(); - window.minimize(); -} -var windowIsMaximized = false; -function maximizeWindow(){ - var window = remote.getCurrentWindow(); - const { width, height } = remote.screen.getPrimaryDisplay().workAreaSize; - if(windowIsMaximized){ - windowIsMaximized = false; - window.setSize(800, 600); - }else{ - window.setSize(Math.ceil(width * .95), Math.ceil(height * .95)); - window.setPosition(Math.ceil(width * .025), Math.ceil(height * .025)) - windowIsMaximized = true; - } -} -function closeWindow(){ - var window = remote.getCurrentWindow(); - window.close(); -} diff --git a/scripts/toolbar-script.js b/scripts/toolbar-script.js new file mode 100644 index 0000000..f883b1e --- /dev/null +++ b/scripts/toolbar-script.js @@ -0,0 +1,136 @@ +global.$ = $; + +const { remote } = require('electron'); +const { Menu, BrowserWindow, MenuItem, shell } = remote; +const fs = require("fs"); + +function getWebViewWindow() { + let actualWindows = remote.BrowserWindow.getAllWindows(); + if(actualWindows.length !== 2) { + console.warn("This method only supports only two opened windows."); + return undefined; + } + for (let win in actualWindows){ + if(actualWindows[win] !== remote.getCurrentWindow()){ + return actualWindows[win]; + } + } + console.warn("Duplicated elements on the window stack."); + return undefined; +} + +function sendToWebViewDocument(functionString) { + let webviewWindow = getWebViewWindow(); + if(webviewWindow === undefined){ + console.error("Cannot find the webview window!"); + return; + } + webviewWindow.webContents.executeJavaScript(functionString); +} + +$(document).ready(function () { + + // Address bar form + $("#addressBar").submit(function(e) { + e.preventDefault(); + loadURL(); + }); + + // Opacity Slider + $("#transparencyRange").change(function(){ + var opacityValue = $(this).val(); + changeOpacity(opacityValue); + }); + + // Select all text when changing URL + $("input[type='text']").click(function () { + $(this).select(); + }); + +}); + + +// Change window Opacity +// Change window Opacity +// Change window Opacity +// Wrapper for the webview window +function changeOpacity(opacity) { + sendToWebViewDocument('changeOpacity(' + opacity + ')'); +} + + +// App Controls +// App Controls +// App Controls +function loadURL(){ + let url = $("#urlField").val(); + + if(url.indexOf("http") >= 0){ + loadPage(url); + + }else{ + url = "http://" + url; + loadPage(url); + } +} + +function loadPage(url) { + sendToWebViewDocument('loadPage(' + url + ')'); +} + + + + +// Go back +function browserBack() { + sendToWebViewDocument('browserBack()'); +} + + +function enableClickThrough() { + if ($(clickthroughButton).children('img').hasClass('set-background-color')) { + $(clickthroughButton).children('img').removeClass('set-background-color'); + sendToWebViewDocument('enableClickThrough(false)'); + } else { + $(clickthroughButton).children('img').addClass('set-background-color'); + sendToWebViewDocument('enableClickThrough(true)'); + } +} + + +// Window Controls +// Window Controls +// Window Controls + +function openWebsite() { + sendToWebViewDocument('openWebsite()'); +} + +function minimizeWindow() { + let window = remote.getCurrentWindow(); + window.minimize(); +} + +let windowIsMaximized = false; + +function maximizeWindow() { + let window = remote.getCurrentWindow(); + if (windowIsMaximized) { + window.unmaximize(); + windowIsMaximized = false; + } else { + window.maximize(); + windowIsMaximized = true; + } + let x = window.getBounds().x; + let y = window.getBounds().y + window.getBounds().height; + let w = window.getBounds().width; + sendToWebViewDocument('maximizeWindow(' + x + ',' + y + ',' + w + ')'); +} + +function closeWindow() { + let webViewWindow = getWebViewWindow(); + if(webViewWindow !== undefined) webViewWindow.close(); + let window = remote.getCurrentWindow(); + window.close(); +} diff --git a/scripts/view-script.js b/scripts/view-script.js new file mode 100644 index 0000000..027fdc7 --- /dev/null +++ b/scripts/view-script.js @@ -0,0 +1,77 @@ +global.$ = $; + +const {remote, ipcRenderer} = require('electron'); +const {Menu, BrowserWindow, MenuItem, shell} = remote; +const fs = require("fs"); + +$(document).ready(function () { + + var webview = document.getElementById('browserView'); + webview.addEventListener('dom-ready', function () { + webview.insertCSS('*::-webkit-scrollbar { width: 0 !important }') + }); + +}); + +ipcRenderer.on('css', (event, data) => { + $("html").css(data.key, data.value) +}) + +function changeOpacity(opacity) { + $("body").css('opacity', opacity); +} + +function loadPage(url) { + console.log("Loading " + url); + if (url.toLowerCase().indexOf("youtube.com/watch") >= 0) { + let youtubeID = url.substring(url.indexOf("v=") + 2); + youtubeID = youtubeID.split('&')[0]; + let youtubeURL = "https://www.youtube.com/embed/" + youtubeID; + + $("#urlField").val(youtubeURL); + let webview = document.getElementById('browserView'); + webview.loadURL(youtubeURL); + } else { + let webview = document.getElementById('browserView'); + webview.loadURL(url); + } +} + +let windowIsMaximized = false; +let lastHeight = 600 + +function maximizeWindow(x, y, w) { + if(windowIsMaximized){ + remote.getCurrentWindow().setBounds({ + x: x, + y: y, + width: w, + height: lastHeight, + }); + } else { + lastHeight = remote.getCurrentWindow().getBounds().height; + remote.getCurrentWindow().setBounds({ + x: x, + y: y, + width: w, + height: remote.screen.getPrimaryDisplay().bounds.height - y, + }); + } + windowIsMaximized = !windowIsMaximized; +} + +// Go back +function browserBack() { + let webview = document.getElementById('browserView'); + webview.back; +} + +function enableClickThrough(activation) { + console.log("Clickthrough change.") + let window = remote.getCurrentWindow(); + window.setIgnoreMouseEvents(activation); +} + +function openWebsite() { + shell.openExternal("http://mitch.works/apps/glass"); +} \ No newline at end of file diff --git a/styles/app.css b/styles/app.css index 1806f9e..bb3876b 100644 --- a/styles/app.css +++ b/styles/app.css @@ -1,4 +1,14 @@ @import url("https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700"); + +html, +body { + width: 100%; + height: 100%; + margin: 0; + padding: 0; +} + + .window-chrome { display: -webkit-box; display: -ms-flexbox; @@ -131,8 +141,6 @@ body { display: block; width: 100%; height: 100%; - height: calc(100vh - 78px) !important; - margin-top: 32px; z-index: 5; background-color: white; } @@ -256,6 +264,10 @@ body { margin-left: 35px; } +.set-background-color { + background-color: #E72525; +} + .app-controls #clickthroughButton:hover { cursor: pointer; -webkit-transition: 0.2s; diff --git a/styles/universal/base.scss b/styles/universal/base.scss index 42cff5a..7a0de75 100644 --- a/styles/universal/base.scss +++ b/styles/universal/base.scss @@ -35,8 +35,6 @@ body{ width: 100%; // width: calc(100% + 22px) !important; height: 100%; - height: calc(100vh - 78px) !important; - margin-top: 32px; // height: 100vh !important; z-index: 5; background-color: white;