const { fileURL, loadScript, hideCursor, showCursor } = require('./utils.js') let { remote } = require('electron') const webFrame = require('electron').webFrame // UO: Disable unintended zoom of fullscreen page if user wants to zoom // only parts like Eyevisit info cards. console.log('Disable pinch zoom', webFrame) webFrame.setVisualZoomLevelLimits(1, 1) let padContainer = null let hideCursorTimeout = null let debug = false let urlPadMap = new Map() window.urlPadMap = urlPadMap window.padLoadedHandler = [] window.nodeDirname = __dirname function pageSize() { var w = window, d = document, e = d.documentElement, g = d.getElementsByTagName('body')[0], width = w.innerWidth || e.clientWidth || g.clientWidth, height = w.innerHeight || e.clientHeight || g.clientHeight return [width, height] } let size = pageSize() let pageWidth = size[0] let pageHeight = size[1] /* Open a new at x, y position. */ function openPad(url, x, y) { console.log('openPad') if (remote.getGlobal('useBrowserView')) { return ipcRenderer.send('loadBrowserView', { url, x, y }) } const { Pad } = require('./pad.js') const { minimalPad } = require('./padMinimal.js') pad = null if (urlPadMap.has(url)) { let pad = urlPadMap.get(url) pad.scatter.bringToFront() /*TweenMax.to(pad.frame, 0.5, { boxShadow: "0 0 25px 5px white", onComplete: () => { TweenMax.to(pad.frame, 0.5, { boxShadow: "none" }) } })*/ TweenMax.to(pad.frame, 0.2, { scale: '1.01', onComplete: () => { TweenMax.to(pad.frame, 0.2, { scale: '1' }) } }) // pad.scatter.moveTo(x, y) return pad } y + 1600 > pageHeight ? (y = pageHeight - 1600) : (y = y) if (remote.getGlobal('useMinimalPad')) { pad = new minimalPad(padContainer, { x: x, y: y, url: url, tabbedView: true, hasTtitleBar: false, hideOnStart: false, startScale: 1, width: 1000, height: 1500, scalable: true, rotatable: true }) } if (!remote.getGlobal('useMinimalPad')) { pad = new Pad(padContainer, { x: x, y: y, url: url, hideOnStart: false, startScale: 1, width: 1000, height: 1500, scalable: true, rotatable: true }) } urlPadMap.set(url, pad) for (let callback of window.padLoadedHandler) { callback(pad, url) } } window.padLoadedHandler.push((pad, url) => { console.log('Add specific behavior') }) /* According to https://electron.atom.io/docs/faq/ "I can not use jQuery/RequireJS/Meteor/AngularJS in Electron" we have to rename the symbols in the page before including other libraries. Remember to use nodeRequire after this point. */ window.nodeRequire = require delete window.require delete window.exports delete window.module /* Create a DOMPadContainer, i.e. a special DOMScatterContainer, as a wrapper of the document body. */ window.addEventListener('load', e => { console.log('preloading') // ../iwmlib/dist/iwmlib.3rdparty.js // loadScript('../iwmlib/lib/3rdparty/preload.js', () => { loadScript('../../iwmlib/dist/iwmlib.3rdparty.preload.js', () => { //console.log("../iwmlib/dist/iwmlib.3rdparty.js loaded") console.log('greensock loaded') // loadScript('../iwmlib/dist/iwmlib.js', () => { loadScript('../../iwmlib/dist/iwmlib.js', () => { console.log('../iwmlib/dist/iwmlib.js loaded') /* const { Pad, DOMPadContainer } = nodeRequire('./pad.js') padContainer = new DOMPadContainer(document.body) window.nodePadContainer = padContainer ipcRenderer.send('padContainerLoaded') */ /*Register a handler for mousemove events. Hide the cursor a few *seconds after the last move event. */ document.body.addEventListener('mousemove', e => { showCursor() clearTimeout(hideCursorTimeout) hideCursorTimeout = setTimeout(hideCursor, 3000) }) }) if (debug) { loadScript('../iwmlib/dist/iwmlib.pixi.js', () => { console.log('../iwmlib/dist/iwmlib.pixi.js loaded') const DebugApp = require('./debug.js') let debugApp = new DebugApp(document.body) debugApp.setup() debugApp.run() }) } }) }) /* Register a handler for all click events and check whether the link target opens a new window. If the link target is blank, prevent the default behavior and create a Pad scatter object instead. */ window.addEventListener('click', e => { let node = e.target let url = '' let target = '' let multiUserMode = false // remote.getGlobal('multiUserMode') // DOMScatter && remote.getGlobal('multiUserMode') // console.log("click", multiUserMode, remote.getGlobal('multiUserMode')) if (multiUserMode) { while (node !== null) { if (node.tagName === 'A' || node.tagName === 'a') { if (node.target instanceof SVGAnimatedString) { url = node.href.baseVal target = node.target.baseVal } else { url = node.href target = node.target } if (target === '_blank') { e.preventDefault() openPad(url, e.clientX, e.clientY) } return } node = node.parentNode } } }) /* Register a handler for contextmenu events and check whether the link target // opens a new window. If the link target is blank, prevent the default behavior and show a popup menu with the option to open a pad instead. */ window.addEventListener('contextmenu', e => { let node = e.target let url = null if (remote.getGlobal('multiUserMode')) { while (node !== null) { if (node.tagName === 'A' || node.tagName === 'a') { if (node.target instanceof SVGAnimatedString) { url = node.href.baseVal } else { url = node.href } e.preventDefault() let point = { x: e.clientX, y: e.clientY } PopupMenu.open( { 'Open new Pad': () => openPad(url, e.clientX, e.clientY) }, point, { fontSize: '0.8em' } ) return } node = node.parentNode } } }) /* Special error handling if the rendere process sends a error notification log this error on the main console. */ let { Console } = require('console') let debugConsole = new Console(process.stdout, process.stderr) let { ipcRenderer } = require('electron') window.addEventListener('error', event => { debugConsole.error('PAGE ERROR', event.error, event.filename) debugConsole.error('open', window.location.href) ipcRenderer.send('error', 1) }) ipcRenderer.on('newPad', (e, data) => { openPad(data, 0, 0) })