diff options
author | Pascal Ronecker | 2018-06-21 14:09:25 +0200 |
---|---|---|
committer | Pascal Ronecker | 2018-06-21 14:09:25 +0200 |
commit | a5962f1b3f3f142a9b0fd2dca1439094565ca48a (patch) | |
tree | 737671d62c67cd55916be8133208fb1f05e20d18 | |
parent | 67fd52712f675f061c7c9ea78b8c221d6d8fce28 (diff) | |
download | aur-a5962f1b3f3f142a9b0fd2dca1439094565ca48a.tar.gz |
preview of tray actions, waiting for upstream pull request
-rw-r--r-- | .SRCINFO | 4 | ||||
-rw-r--r-- | PKGBUILD | 11 | ||||
-rw-r--r-- | wrappedWindow.js | 195 |
3 files changed, 205 insertions, 5 deletions
@@ -1,7 +1,7 @@ pkgbase = google-chat-linux-git pkgdesc = Unofficial electron-based desktop client for Google Chat pkgver = r15.2d1d3c9 - pkgrel = 2 + pkgrel = 3 url = https://github.com/robyf/google-chat-linux arch = x86_64 arch = i686 @@ -14,11 +14,13 @@ pkgbase = google-chat-linux-git source = google-chat-linux.sh source = package.json source = chat-favicon-new-non-notif-256dp.png + source = wrappedWindow.js sha256sums = SKIP sha256sums = e65b8b9b0556dded2521aa12b6d8e87c59f08a79b9e8cbee4273a7a659f72a6a sha256sums = d23052d27c870090987d1844e7c82bc42b878afa42c8af9a363d8414560ea34d sha256sums = 25b73ffc5ea40317faffaa277243617b1a2daed5bec7ddfb39e31274c5a88a79 sha256sums = 807fa77054d1b9ebeccaabfe5200e9e52c2dc603bdba3647c2da7c0cc34c2a83 + sha256sums = 3fa6a230ace92e1d61a6a0e18e33dc26f8b5f45fcc75598bc836b68e11ddb836 pkgname = google-chat-linux-git @@ -1,7 +1,7 @@ # Maintainer: Squalou <squalou.jenkins [at] gmail [dot] com> pkgname=google-chat-linux-git pkgver=r15.2d1d3c9 -pkgrel=2 +pkgrel=3 pkgdesc="Unofficial electron-based desktop client for Google Chat" arch=('x86_64' 'i686') url="https://github.com/robyf/google-chat-linux" @@ -15,13 +15,15 @@ source=("${pkgname%-git}::git+${url}#branch=master" "${pkgname%-git}.desktop" "${pkgname%-git}.sh" "package.json" - "chat-favicon-new-non-notif-256dp.png") + "chat-favicon-new-non-notif-256dp.png" + "wrappedWindow.js") sha256sums=('SKIP' 'e65b8b9b0556dded2521aa12b6d8e87c59f08a79b9e8cbee4273a7a659f72a6a' 'd23052d27c870090987d1844e7c82bc42b878afa42c8af9a363d8414560ea34d' '25b73ffc5ea40317faffaa277243617b1a2daed5bec7ddfb39e31274c5a88a79' - '807fa77054d1b9ebeccaabfe5200e9e52c2dc603bdba3647c2da7c0cc34c2a83') + '807fa77054d1b9ebeccaabfe5200e9e52c2dc603bdba3647c2da7c0cc34c2a83' + '3fa6a230ace92e1d61a6a0e18e33dc26f8b5f45fcc75598bc836b68e11ddb836') pkgver() { cd "$srcdir/${pkgname%-git}" @@ -33,7 +35,8 @@ pkgver() { build() { cp "$srcdir/package.json" "$srcdir/${pkgname%-git}/" - cp "$srcdir/chat-favicon-new-non-notif-256dp.png" "$srcdir/${pkgname%-git}/assets/icon" + cp "$srcdir/chat-favicon-new-non-notif-256dp.png" "$srcdir/${pkgname%-git}/assets/icon/" + cp "$srcdir/wrappedWindow.js" "$srcdir/${pkgname%-git}/" cd "$srcdir/${pkgname%-git}" npm install --production=false } diff --git a/wrappedWindow.js b/wrappedWindow.js new file mode 100644 index 000000000000..323621034697 --- /dev/null +++ b/wrappedWindow.js @@ -0,0 +1,195 @@ +'use strict'; + +var fs = require('fs'); +var path = require('path'); +var crypto = require('crypto'); +const electron = require('electron'); +var app = electron.app; // Module to control application life. +var BrowserWindow = electron.BrowserWindow; // Module to create native browser window. +var ipc = electron.ipcMain; +var shell = electron.shell; +var Tray = electron.Tray; +var Menu = electron.Menu; +var localShortcut = require('electron-localshortcut'); // Module to register keyboard shortcuts + +var appIcon = undefined; + +const contextMenu = require('electron-context-menu'); + +contextMenu({ showInspectElement: false }); + +const ICON_NO_NEW_MSG = path.join(__dirname, 'assets/icon/chat-favicon-no-new-256dp.png'); +const ICON_NEW_NON_NOTIF_MSG = path.join(__dirname, 'assets/icon/chat-favicon-new-non-notif-256dp.png'); +const ICON_NEW_NOTIF_MSG = path.join(__dirname, 'assets/icon/chat-favicon-new-notif-256dp.png'); +const ICON_OFFLINE_MSG = path.join(__dirname, 'assets/icon/chat-favicon-offline-256dp.png'); + +module.exports = function createWrappedWindow(opts) { + // Thanks imskull! (https://github.com/atom/electron/issues/526#issuecomment-132942967) + // Try to load saved window bounds + var initPath = path.join(app.getPath("userData"), 'init.json'); + var data; + try { + data = JSON.parse(fs.readFileSync(initPath, 'utf8')); + } + catch(e) { } + + var sha = crypto.createHash('sha256'); + sha.update(opts.name); + var hash = sha.digest('hex'); + + const iconPath = path.join(__dirname, 'assets/icon/icon.png'); + + // Create the browser window. + var windowOpts = (data && data[hash] && data[hash].bounds) ? data[hash].bounds : { width: 800, height: 600 }; + windowOpts['auto-hide-menu-bar'] = true; + windowOpts['web-preferences'] = { 'node-integration': false }; + windowOpts['icon'] = iconPath; + var window = new BrowserWindow(windowOpts); + window.setMenu(null); + //window.webContents.openDevTools(); + + if (data && data[hash] && data[hash].shouldBeMaximized) { + window.maximize(); + } + + // and load the url ;) + window.loadURL(opts.url); + + // Register common navigation shortcuts + function goBack() { + if (window.webContents.canGoBack()) { + window.webContents.goBack(); + } + } + function goForward() { + if (window.webContents.canGoForward()) { + window.webContents.goForward(); + } + } + localShortcut.register(window, 'Alt+Left', goBack); + localShortcut.register(window, 'Alt+Right', goForward); + localShortcut.register(window, 'F5', window.webContents.reload); + + // Open EXTERNAL LINKS in the default browser + // Example: electron-wrap messenger.com + // Links on messenger.com that link to messenger.com will be followed in-app + // Links on messenger.com that link elsewhere (e.g., imgur.com) will be opened externally + + // http://stackoverflow.com/a/23945027/5136076 + function extractDomain(url) { + var domain; + //find & remove protocol (http, ftp, etc.) and get domain + if (url.indexOf("://") > -1) { + domain = url.split('/')[2]; + } + else { + domain = url.split('/')[0]; + } + + //find & remove port number + domain = domain.split(':')[0]; + + return domain; + } + var handleRedirect = function(e, url) { + if (!opts.openLocally && extractDomain(url) !== extractDomain(window.webContents.getURL()) && extractDomain(url) !== "accounts.google.com" && extractDomain(url) !== "accounts.youtube.com" && extractDomain(url) !== "support.google.com" && extractDomain(url) !== "chat.google.com") { + require('electron').shell.openExternal(url); + e.preventDefault(); +/* + } else { + var nested = createWrappedWindow({ + name: opts.name, + url: url, + openLocally: opts.openLocally + }); + nested.on('closed', function() { + nested = null; + }); +*/ + } + }; + + window.webContents.on('will-navigate', handleRedirect); + window.webContents.on('new-window', handleRedirect); + + // Save the window bounds on close + window.on('close', function() { + var maximized = window.isMaximized(); + var newData = data || {}; + newData[hash] = { bounds: window.getBounds() }; + if (window.isMaximized()) { + newData[hash].shouldBeMaximized = true; + } + fs.writeFileSync(initPath, JSON.stringify(newData)); + }); + + window.webContents.on('dom-ready', () => { + const scriptPath = path.join('file://', __dirname, 'node_modules/jquery/dist/jquery.min.js'); + window.webContents.executeJavaScript('var ipc = require(\'electron\').ipcRenderer; document.addEventListener("click", (evt) => { if (evt.target && evt.target.localName == "a" && evt.target.target == "_blank" && evt.target.href.startsWith("http")) { ipc.send("open-link", evt.target.href); evt.preventDefault(); } }, true);'); + window.webContents.executeJavaScript('var fi = document.querySelector("link#favicon256"); ipc.send("favicon-changed", fi.href); var callback = function(mutationList) { ipc.send("favicon-changed", fi.href); }; var observer = new MutationObserver(callback); observer.observe(fi, { attributes: true });'); + }); + + appIcon = new Tray(ICON_OFFLINE_MSG); + const contextMenu = Menu.buildFromTemplate([ + { + label: 'Show', click: function () { + window.show() + } + },{ + label: 'Hide', click: function () { + window.minimize() + } + },{ + label: 'Quit', click: function () { + app.isQuiting = true + app.quit() + } + } + ]); + appIcon.setContextMenu(contextMenu); + + appIcon.on('click', function(e){ + if (window.isMinimized()){ + window.show(); + }else{ + window.focus(); + } + }); + + return window; +}; + + + +ipc.on('open-link', (evt, href) => { + shell.openExternal(href); +}); + +function iconForType(itype) { + if (itype == "NORMAL") { + return ICON_NO_NEW_MSG; + }else if (itype == "UNREAD") { + return ICON_NEW_NON_NOTIF_MSG; + }else if (itype == "ATTENTION") { + return ICON_NEW_NOTIF_MSG; + } + return ICON_OFFLINE_MSG; +} + +ipc.on('favicon-changed', (evt, href) => { + /* console.log("Favicon changed: ", href); */ + + var itype = ""; + if (href.match(/chat-favicon-no-new/)) { + itype = "NORMAL"; + }else if (href.match(/chat-favicon-new-non-notif/)) { + itype = "UNREAD"; + }else if (href.match(/chat-favicon-new-notif/)) { + itype = "ATTENTION"; + }else if (href.match(/^data:image\/png;base64,iVBOR.+/)) { + itype = "OFFLINE"; + } + + appIcon.setImage(iconForType(itype)); + +}); |